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:
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 }
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user