1
0
mirror of https://github.com/samba-team/samba.git synced 2025-12-18 08:23:51 +03:00

* basic implementation of SPOOLSS_DELETEPRINTERDATAEX and

SPOOLSS_DELETEPRINTERKEY
* stub funnctions for SPOOLSS_ADDPRINTERDRIVEREX and
  SPOOLSS_DELETEPRINTERDRIVEREX
This commit is contained in:
Gerald Carter
-
parent 9c93f89089
commit d675974d0c
4 changed files with 350 additions and 4 deletions

View File

@@ -49,9 +49,6 @@
#define SPOOLSS_REMOTEFINDFIRSTPRINTERCHANGENOTIFICATION0x3e
#define SPOOLSS_SPOOLERINIT 0x3f
#define SPOOLSS_RESETPRINTEREX 0x40
#define SPOOLSS_DELETEPRINTERDATAEX 0x51
#define SPOOLSS_DELETEPRINTERDRIVEREX 0x54
#define SPOOLSS_ADDPRINTERDRIVEREX 0x59
*/
/* those are implemented */
@@ -107,6 +104,10 @@
#define SPOOLSS_GETPRINTERDATAEX 0x4e
#define SPOOLSS_ENUMPRINTERDATAEX 0x4f
#define SPOOLSS_ENUMPRINTERKEY 0x50
#define SPOOLSS_DELETEPRINTERDATAEX 0x51
#define SPOOLSS_DELETEPRINTERKEY 0x52
#define SPOOLSS_DELETEPRINTERDRIVEREX 0x54
#define SPOOLSS_ADDPRINTERDRIVEREX 0x59
#define PRINTER_CONTROL_UNPAUSE 0x00000000
@@ -398,6 +399,20 @@ PRINTER_MESSAGE_INFO;
#define PRINTER_ENUM_ICON7 0x00400000
#define PRINTER_ENUM_ICON8 0x00800000
/* FLAGS for SPOOLSS_DELETEPRINTERDRIVEREX */
#define DPD_DELETE_UNUSED_FILES 0x00000001
#define DPD_DELETE_SPECIFIC_VERSION 0x00000002
#define DPD_DELETE_ALL_FILES 0x00000004
/* FLAGS for SPOOLSS_ADDPRINTERDRIVEREX */
#define APD_STRICT_UPGRADE 0x00000001
#define APD_STRICT_DOWNGRADE 0x00000002
#define APD_COPY_ALL_FILES 0x00000004
#define APD_COPY_NEW_FILES 0x00000008
/* this struct is undocumented */
/* thanks to the ddk ... */
typedef struct spool_user_1
@@ -681,6 +696,21 @@ typedef struct spool_r_deleteprinterdriver
}
SPOOL_R_DELETEPRINTERDRIVER;
typedef struct spool_q_deleteprinterdriverex
{
uint32 server_ptr;
UNISTR2 server;
UNISTR2 arch;
UNISTR2 driver;
}
SPOOL_Q_DELETEPRINTERDRIVEREX;
typedef struct spool_r_deleteprinterdriverex
{
WERROR status;
}
SPOOL_R_DELETEPRINTERDRIVEREX;
typedef struct spool_doc_info_1
{
@@ -1649,6 +1679,21 @@ typedef struct spool_r_addprinterdriver
}
SPOOL_R_ADDPRINTERDRIVER;
typedef struct spool_q_addprinterdriverex
{
uint32 server_name_ptr;
UNISTR2 server_name;
uint32 level;
SPOOL_PRINTER_DRIVER_INFO_LEVEL info;
}
SPOOL_Q_ADDPRINTERDRIVEREX;
typedef struct spool_r_addprinterdriverex
{
WERROR status;
}
SPOOL_R_ADDPRINTERDRIVEREX;
typedef struct driver_directory_1
{
@@ -2037,6 +2082,21 @@ typedef struct spool_r_setprinterdataex
SPOOL_R_SETPRINTERDATAEX;
typedef struct spool_q_deleteprinterdataex
{
POLICY_HND handle;
UNISTR2 keyname;
UNISTR2 valuename;
}
SPOOL_Q_DELETEPRINTERDATAEX;
typedef struct spool_r_deleteprinterdataex
{
WERROR status;
}
SPOOL_R_DELETEPRINTERDATAEX;
typedef struct spool_q_enumprinterkey
{
POLICY_HND handle;
@@ -2053,6 +2113,19 @@ typedef struct spool_r_enumprinterkey
}
SPOOL_R_ENUMPRINTERKEY;
typedef struct spool_q_deleteprinterkey
{
POLICY_HND handle;
UNISTR2 keyname;
}
SPOOL_Q_DELETEPRINTERKEY;
typedef struct spool_r_deleteprinterkey
{
WERROR status;
}
SPOOL_R_DELETEPRINTERKEY;
typedef struct printer_enum_values
{
UNISTR valuename;

View File

@@ -1263,6 +1263,48 @@ BOOL spoolss_io_r_deleteprinterdata(char *desc, SPOOL_R_DELETEPRINTERDATA *r_u,
return True;
}
/*******************************************************************
* read a structure.
* called from spoolss_q_deleteprinterdataex (srv_spoolss.c)
********************************************************************/
BOOL spoolss_io_q_deleteprinterdataex(char *desc, SPOOL_Q_DELETEPRINTERDATAEX *q_u, prs_struct *ps, int depth)
{
if (q_u == NULL)
return False;
prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdataex");
depth++;
if (!prs_align(ps))
return False;
if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
return False;
if (!smb_io_unistr2("keyname ", &q_u->keyname, True, ps, depth))
return False;
if (!smb_io_unistr2("valuename", &q_u->valuename, True, ps, depth))
return False;
return True;
}
/*******************************************************************
* write a structure.
* called from spoolss_r_deleteprinterdataex (srv_spoolss.c)
********************************************************************/
BOOL spoolss_io_r_deleteprinterdataex(char *desc, SPOOL_R_DELETEPRINTERDATAEX *r_u, prs_struct *ps, int depth)
{
prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdataex");
depth++;
if(!prs_werror("status", ps, depth, &r_u->status))
return False;
return True;
}
/*******************************************************************
* write a structure.
* called from spoolss_r_getprinterdata (srv_spoolss.c)
@@ -6880,6 +6922,44 @@ BOOL spoolss_io_r_enumprinterkey(char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_st
return True;
}
/*******************************************************************
* read a structure.
********************************************************************/
BOOL spoolss_io_q_deleteprinterkey(char *desc, SPOOL_Q_DELETEPRINTERKEY *q_u, prs_struct *ps, int depth)
{
prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterkey");
depth++;
if(!prs_align(ps))
return False;
if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
return False;
if(!smb_io_unistr2("", &q_u->keyname, True, ps, depth))
return False;
return True;
}
/*******************************************************************
* write a structure.
********************************************************************/
BOOL spoolss_io_r_deleteprinterkey(char *desc, SPOOL_R_DELETEPRINTERKEY *r_u, prs_struct *ps, int depth)
{
prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterkey");
depth++;
if(!prs_align(ps))
return False;
if(!prs_werror("status", ps, depth, &r_u->status))
return False;
return True;
}
/*******************************************************************
* read a structure.

View File

@@ -1402,6 +1402,123 @@ static BOOL api_spoolss_getprintprocessordirectory(pipes_struct *p)
return True;
}
/****************************************************************************
****************************************************************************/
static BOOL api_spoolss_deleteprinterdataex(pipes_struct *p)
{
SPOOL_Q_DELETEPRINTERDATAEX q_u;
SPOOL_R_DELETEPRINTERDATAEX r_u;
prs_struct *data = &p->in_data.data;
prs_struct *rdata = &p->out_data.rdata;
ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u);
if(!spoolss_io_q_deleteprinterdataex("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_deleteprinterdataex: unable to unmarshall SPOOL_Q_DELETEPRINTERDATAEX.\n"));
return False;
}
r_u.status = _spoolss_deleteprinterdataex(p, &q_u, &r_u);
if(!spoolss_io_r_deleteprinterdataex("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_deleteprinterdataex: unable to marshall SPOOL_R_DELETEPRINTERDATAEX.\n"));
return False;
}
return True;
}
/****************************************************************************
****************************************************************************/
static BOOL api_spoolss_deleteprinterkey(pipes_struct *p)
{
SPOOL_Q_DELETEPRINTERKEY q_u;
SPOOL_R_DELETEPRINTERKEY r_u;
prs_struct *data = &p->in_data.data;
prs_struct *rdata = &p->out_data.rdata;
ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u);
if(!spoolss_io_q_deleteprinterkey("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_deleteprinterkey: unable to unmarshall SPOOL_Q_DELETEPRINTERKEY.\n"));
return False;
}
r_u.status = _spoolss_deleteprinterkey(p, &q_u, &r_u);
if(!spoolss_io_r_deleteprinterkey("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_deleteprinterkey: unable to marshall SPOOL_R_DELETEPRINTERKEY.\n"));
return False;
}
return True;
}
#if 0 /* JERRY */
/****************************************************************************
****************************************************************************/
static BOOL api_spoolss_addprinterdrriverex(pipes_struct *p)
{
SPOOL_Q_ADDPRINTERDRIVEREX q_u;
SPOOL_R_ADDPRINTERDRIVEREX r_u;
prs_struct *data = &p->in_data.data;
prs_struct *rdata = &p->out_data.rdata;
ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u);
if(!spoolss_io_q_addprinterdriverex("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_addprinterdriverex: unable to unmarshall SPOOL_Q_ADDPRINTERDRIVEREX.\n"));
return False;
}
r_u.status = _spoolss_addprinterdriverex(p, &q_u, &r_u);
if(!spoolss_io_r_addprinterdriverex("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_addprinterdriverex: unable to marshall SPOOL_R_ADDPRINTERDRIVEREX.\n"));
return False;
}
return True;
}
/****************************************************************************
****************************************************************************/
static BOOL api_spoolss_deleteprinterdriverex(pipes_struct *p)
{
SPOOL_Q_DELETEPRINTERDRIVEREX q_u;
SPOOL_R_DELETEPRINTERDRIVEREX r_u;
prs_struct *data = &p->in_data.data;
prs_struct *rdata = &p->out_data.rdata;
ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u);
if(!spoolss_io_q_deleteprinterdriverex("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_deleteprinterdriverex: unable to unmarshall SPOOL_Q_DELETEPRINTERDRIVEREX.\n"));
return False;
}
r_u.status = _spoolss_deleteprinterdriverex(p, &q_u, &r_u);
if(!spoolss_io_r_deleteprinterdriverex("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_deleteprinterdriverex: unable to marshall SPOOL_R_DELETEPRINTERDRIVEREX.\n"));
return False;
}
return True;
}
#endif /* JERRY */
/*******************************************************************
\pipe\spoolss commands
********************************************************************/
@@ -1452,9 +1569,15 @@ struct api_struct api_spoolss_cmds[] =
{"SPOOLSS_ENUMPRINTPROCDATATYPES", SPOOLSS_ENUMPRINTPROCDATATYPES, api_spoolss_enumprintprocdatatypes },
{"SPOOLSS_GETPRINTERDATAEX", SPOOLSS_GETPRINTERDATAEX, api_spoolss_getprinterdataex },
{"SPOOLSS_SETPRINTERDATAEX", SPOOLSS_SETPRINTERDATAEX, api_spoolss_setprinterdataex },
{"SPOOLSS_ENUMPRINTERKEY", SPOOLSS_ENUMPRINTERKEY, api_spoolss_enumprinterkey },
{"SPOOLSS_DELETEPRINTERDATAEX", SPOOLSS_DELETEPRINTERDATAEX, api_spoolss_deleteprinterdataex },
{"SPOOLSS_ENUMPRINTERDATAEX", SPOOLSS_ENUMPRINTERDATAEX, api_spoolss_enumprinterdataex },
{"SPOOLSS_ENUMPRINTERKEY", SPOOLSS_ENUMPRINTERKEY, api_spoolss_enumprinterkey },
{"SPOOLSS_DELETEPRINTERKEY", SPOOLSS_DELETEPRINTERKEY, api_spoolss_deleteprinterkey },
{"SPOOLSS_GETPRINTPROCESSORDIRECTORY",SPOOLSS_GETPRINTPROCESSORDIRECTORY,api_spoolss_getprintprocessordirectory},
#if 0 /* JERRY */
{"SPOOLSS_ADDPRINTERDRIVEREX", SPOOLSS_ADDPRINTERDRIVEREX, api_spoolss_addprinterdriverex },
{"SPOOLSS_DELETEPRINTERDRIVEREX", SPOOLSS_DELETEPRINTERDRIVEREX, api_spoolss_deleteprinterdriverex },
#endif
{ NULL, 0, NULL }
};

View File

@@ -7967,6 +7967,34 @@ WERROR _spoolss_setprinterdataex(pipes_struct *p, SPOOL_Q_SETPRINTERDATAEX *q_u,
return _spoolss_setprinterdata(p, &q_u_local, &r_u_local);
}
/********************************************************************
* spoolss_deleteprinterdataex
********************************************************************/
WERROR _spoolss_deleteprinterdataex(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATAEX *q_u, SPOOL_R_DELETEPRINTERDATAEX *r_u)
{
SPOOL_Q_DELETEPRINTERDATA q_u_local;
SPOOL_R_DELETEPRINTERDATA r_u_local;
fstring key;
/* From MSDN documentation of SetPrinterDataEx: pass request to
SetPrinterData if key is "PrinterDriverData" */
unistr2_to_ascii(key, &q_u->keyname, sizeof(key) - 1);
if (strcmp(key, "PrinterDriverData") != 0)
return WERR_INVALID_PARAM;
memcpy(&q_u_local.handle, &q_u->handle, sizeof(POLICY_HND));
copy_unistr2(&q_u_local.valuename, &q_u->valuename);
return _spoolss_deleteprinterdata( p, &q_u_local, &r_u_local );
}
/********************************************************************
* spoolss_enumprinterkey
********************************************************************/
@@ -8227,3 +8255,45 @@ WERROR _spoolss_getprintprocessordirectory(pipes_struct *p, SPOOL_Q_GETPRINTPROC
return result;
}
/********************************************************************
* spoolss_addprinterdriverex
********************************************************************/
WERROR _spoolss_addprinterdriverex(pipes_struct *p, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, SPOOL_R_ADDPRINTERDRIVEREX *r_u)
{
return WERR_OK;
}
/********************************************************************
* spoolss_deleteprinterdriverex
********************************************************************/
WERROR _spoolss_deleteprinterdriverex(pipes_struct *p, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, SPOOL_R_DELETEPRINTERDRIVEREX *r_u)
{
return WERR_OK;
}
/********************************************************************
* spoolss_deleteprinterkey
********************************************************************/
WERROR _spoolss_deleteprinterkey(pipes_struct *p, SPOOL_Q_DELETEPRINTERKEY *q_u, SPOOL_R_DELETEPRINTERKEY *r_u)
{
fstring key;
unistr2_to_ascii(key, &q_u->keyname, sizeof(key) - 1);
if (strcmp(key, "PrinterDriverData") != 0)
return WERR_INVALID_PARAM;
/*
* this is what 2k returns when you try to delete the "PrinterDriverData"
* key
*/
return WERR_ACCESS_DENIED;
}