summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2005-02-24 14:05:52 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:10:53 -0500
commit68ce448fbdbe9f7be3db6189110e46ce23aca18a (patch)
tree7fe830732b9acb38f320d02b43f98b29750fdca8
parentb14727583d6108f11427ec8033986e9d617320c5 (diff)
downloadsamba-68ce448fbdbe9f7be3db6189110e46ce23aca18a.tar.gz
samba-68ce448fbdbe9f7be3db6189110e46ce23aca18a.tar.bz2
samba-68ce448fbdbe9f7be3db6189110e46ce23aca18a.zip
r5537: - make use of bitmaps and enums
- add and fix some PrinterInfo levels - add and fix some DriverInfo levels - fix EnumPrinterDriver torture test the curent RPC-SPOOLSS now passes on w2k3 metze (This used to be commit 14b88ca20dc64702f1c1b457a09b1f13b1964654)
-rw-r--r--source4/librpc/idl/spoolss.idl174
-rw-r--r--source4/torture/rpc/spoolss.c43
2 files changed, 168 insertions, 49 deletions
diff --git a/source4/librpc/idl/spoolss.idl b/source4/librpc/idl/spoolss.idl
index ee33aa9eea..85c49566b0 100644
--- a/source4/librpc/idl/spoolss.idl
+++ b/source4/librpc/idl/spoolss.idl
@@ -93,14 +93,83 @@
uint8 private[driverextra];
} spoolss_DeviceMode;
- typedef [public] struct {
- uint32 flags;
+ typedef bitmap {
+ PRINTER_ENUM_DEFAULT = 0x00000001,
+ PRINTER_ENUM_LOCAL = 0x00000002,
+ PRINTER_ENUM_CONNECTIONS = 0x00000004,
+ PRINTER_ENUM_FAVORITE = 0x00000004,
+ PRINTER_ENUM_NAME = 0x00000008,
+ PRINTER_ENUM_REMOTE = 0x00000010,
+ PRINTER_ENUM_SHARED = 0x00000020,
+ PRINTER_ENUM_NETWORK = 0x00000040,
+ PRINTER_ENUM_EXPAND = 0x00004000,
+ PRINTER_ENUM_CONTAINER = 0x00008000,
+ PRINTER_ENUM_ICON1 = 0x00010000,
+ PRINTER_ENUM_ICON2 = 0x00020000,
+ PRINTER_ENUM_ICON3 = 0x00040000,
+ PRINTER_ENUM_ICON4 = 0x00080000,
+ PRINTER_ENUM_ICON5 = 0x00100000,
+ PRINTER_ENUM_ICON6 = 0x00200000,
+ PRINTER_ENUM_ICON7 = 0x00400000,
+ PRINTER_ENUM_ICON8 = 0x00800000,
+ PRINTER_ENUM_HIDE = 0x01000000
+ } spoolss_EnumPrinterFlags;
+
+ typedef struct {
+ spoolss_EnumPrinterFlags flags;
[relative] nstring *name;
[relative] nstring *description;
[relative] nstring *comment;
} spoolss_PrinterInfo1;
- typedef [public] struct {
+ typedef bitmap {
+ PRINTER_ATTRIBUTE_QUEUED = 0x00000001,
+ PRINTER_ATTRIBUTE_DIRECT = 0x00000002,
+ PRINTER_ATTRIBUTE_DEFAULT = 0x00000004,
+ PRINTER_ATTRIBUTE_SHARED = 0x00000008,
+ PRINTER_ATTRIBUTE_NETWORK = 0x00000010,
+ PRINTER_ATTRIBUTE_HIDDEN = 0x00000020,
+ PRINTER_ATTRIBUTE_LOCAL = 0x00000040,
+ PRINTER_ATTRIBUTE_ENABLE_DEVQ = 0x00000080,
+ PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS = 0x00000100,
+ PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST = 0x00000200,
+ PRINTER_ATTRIBUTE_WORK_OFFLINE = 0x00000400,
+ PRINTER_ATTRIBUTE_ENABLE_BIDI = 0x00000800,
+ PRINTER_ATTRIBUTE_RAW_ONLY = 0x00001000,
+ PRINTER_ATTRIBUTE_PUBLISHED = 0x00002000,
+ PRINTER_ATTRIBUTE_FAX = 0x00004000,
+ PRINTER_ATTRIBUTE_TS = 0x00008000
+ } spoolss_PrinterAttributes;
+
+ typedef bitmap {
+ PRINTER_STATUS_PAUSED = 0x00000001,
+ PRINTER_STATUS_ERROR = 0x00000002,
+ PRINTER_STATUS_PENDING_DELETION = 0x00000004,
+ PRINTER_STATUS_PAPER_JAM = 0x00000008,
+ PRINTER_STATUS_PAPER_OUT = 0x00000010,
+ PRINTER_STATUS_MANUAL_FEED = 0x00000020,
+ PRINTER_STATUS_PAPER_PROBLEM = 0x00000040,
+ PRINTER_STATUS_OFFLINE = 0x00000080,
+ PRINTER_STATUS_IO_ACTIVE = 0x00000100,
+ PRINTER_STATUS_BUSY = 0x00000200,
+ PRINTER_STATUS_PRINTING = 0x00000400,
+ PRINTER_STATUS_OUTPUT_BIN_FULL = 0x00000800,
+ PRINTER_STATUS_NOT_AVAILABLE = 0x00001000,
+ PRINTER_STATUS_WAITING = 0x00002000,
+ PRINTER_STATUS_PROCESSING = 0x00004000,
+ PRINTER_STATUS_INITIALIZING = 0x00008000,
+ PRINTER_STATUS_WARMING_UP = 0x00010000,
+ PRINTER_STATUS_TONER_LOW = 0x00020000,
+ PRINTER_STATUS_NO_TONER = 0x00040000,
+ PRINTER_STATUS_PAGE_PUNT = 0x00080000,
+ PRINTER_STATUS_USER_INTERVENTION= 0x00100000,
+ PRINTER_STATUS_OUT_OF_MEMORY = 0x00200000,
+ PRINTER_STATUS_DOOR_OPEN = 0x00400000,
+ PRINTER_STATUS_SERVER_UNKNOWN = 0x00800000,
+ PRINTER_STATUS_POWER_SAVE = 0x01000000
+ } spoolss_PrinterStatus;
+
+ typedef struct {
[relative] nstring *servername;
[relative] nstring *printername;
[relative] nstring *sharename;
@@ -114,12 +183,12 @@
[relative] nstring *datatype;
[relative] nstring *parameters;
[relative,subcontext(0)] security_descriptor *secdesc;
- uint32 attributes;
+ spoolss_PrinterAttributes attributes;
uint32 priority;
uint32 defaultpriority;
uint32 starttime;
uint32 untiltime;
- uint32 status;
+ spoolss_PrinterStatus status;
uint32 cjobs;
uint32 averageppm;
} spoolss_PrinterInfo2;
@@ -131,26 +200,38 @@
typedef struct {
[relative] nstring *printername;
[relative] nstring *servername;
- uint32 attributes;
+ spoolss_PrinterAttributes attributes;
} spoolss_PrinterInfo4;
- typedef [public] struct {
+ typedef struct {
[relative] nstring *printername;
[relative] nstring *portname;
- uint32 attributes;
+ spoolss_PrinterAttributes attributes;
uint32 device_not_selected_timeout;
uint32 transmission_retry_timeout;
} spoolss_PrinterInfo5;
typedef struct {
- uint32 unknown;
+ spoolss_PrinterStatus status;
} spoolss_PrinterInfo6;
+ typedef bitmap {
+ DSPRINT_PUBLISH = 0x00000001,
+ DSPRINT_UPDATE = 0x00000002,
+ DSPRINT_UNPUBLISH = 0x00000004,
+ DSPRINT_REPUBLISH = 0x00000008,
+ DSPRINT_PENDING = 0x80000000
+ } spoolss_DsPrintAction;
+
typedef struct {
[relative] nstring *guid; /* text form of printer guid */
- uint32 action;
+ spoolss_DsPrintAction action;
} spoolss_PrinterInfo7;
+ typedef struct {
+ [relative] spoolss_DeviceMode *devmode;
+ } spoolss_DeviceModeInfo;
+
typedef [nodiscriminant,public] union {
[case(0)] spoolss_PrinterInfo0 info0;
[case(1)] spoolss_PrinterInfo1 info1;
@@ -160,21 +241,14 @@
[case(5)] spoolss_PrinterInfo5 info5;
[case(6)] spoolss_PrinterInfo6 info6;
[case(7)] spoolss_PrinterInfo7 info7;
+ [case(8)] spoolss_DeviceModeInfo info8;
+ [case(9)] spoolss_DeviceModeInfo info9;
} spoolss_PrinterInfo;
- const int PRINTER_ENUM_DEFAULT = 0x00000001;
- const int PRINTER_ENUM_LOCAL = 0x00000002;
- const int PRINTER_ENUM_CONNECTIONS = 0x00000004;
- const int PRINTER_ENUM_FAVORITE = 0x00000004;
- const int PRINTER_ENUM_NAME = 0x00000008;
- const int PRINTER_ENUM_REMOTE = 0x00000010;
- const int PRINTER_ENUM_SHARED = 0x00000020;
- const int PRINTER_ENUM_NETWORK = 0x00000040;
-
/******************/
/* Function: 0x00 */
[noprint,nopull,nopush] WERROR spoolss_EnumPrinters(
- [in] uint32 flags,
+ [in] spoolss_EnumPrinterFlags flags,
[in] unistr *server,
[in] uint32 level,
[in] DATA_BLOB *buffer,
@@ -293,8 +367,15 @@
[relative] nstring *driver_name;
} spoolss_DriverInfo1;
+ typedef [v1_enum] enum {
+ SPOOLSS_DRIVER_VERSION_9X = 0,
+ SPOOLSS_DRIVER_VERSION_NT35 = 1,
+ SPOOLSS_DRIVER_VERSION_NT4 = 2,
+ SPOOLSS_DRIVER_VERSION_200X = 3
+ } spoolss_DriverOSVersion;
+
typedef struct {
- uint32 version;
+ spoolss_DriverOSVersion version;
[relative] nstring *driver_name;
[relative] nstring *architecture;
[relative] nstring *driver_path;
@@ -303,7 +384,7 @@
} spoolss_DriverInfo2;
typedef struct {
- uint32 version;
+ spoolss_DriverOSVersion version;
[relative] nstring *driver_name;
[relative] nstring *architecture;
[relative] nstring *driver_path;
@@ -315,10 +396,59 @@
[relative] nstring *default_datatype;
} spoolss_DriverInfo3;
+ typedef struct {
+ spoolss_DriverOSVersion version;
+ [relative] nstring *driver_name;
+ [relative] nstring *architecture;
+ [relative] nstring *driver_path;
+ [relative] nstring *data_file;
+ [relative] nstring *config_file;
+ [relative] nstring *help_file;
+ [relative] nstring *dependent_files; /* array */
+ [relative] nstring *monitor_name;
+ [relative] nstring *default_datatype;
+ [relative] nstring *previous_names; /* array */
+ } spoolss_DriverInfo4;
+
+ typedef struct {
+ spoolss_DriverOSVersion version;
+ [relative] nstring *driver_name;
+ [relative] nstring *architecture;
+ [relative] nstring *driver_path;
+ [relative] nstring *data_file;
+ [relative] nstring *config_file;
+ uint32 driver_attributes;
+ uint32 config_version;
+ uint32 driver_version;
+ } spoolss_DriverInfo5;
+
+ typedef struct {
+ spoolss_DriverOSVersion version;
+ [relative] nstring *driver_name;
+ [relative] nstring *architecture;
+ [relative] nstring *driver_path;
+ [relative] nstring *data_file;
+ [relative] nstring *config_file;
+ [relative] nstring *help_file;
+ [relative] nstring *dependent_files; /* array */
+ [relative] nstring *monitor_name;
+ [relative] nstring *default_datatype;
+ [relative] nstring *previous_names; /* array */
+ NTTIME driver_data;
+ hyper driver_version;
+ [relative] nstring *manufacturer_name;
+ [relative] nstring *manufacturer_url;
+ [relative] nstring *hardware_id;
+ [relative] nstring *provider;
+ } spoolss_DriverInfo6;
+
typedef [nodiscriminant,public] union {
[case(1)] spoolss_DriverInfo1 info1;
[case(2)] spoolss_DriverInfo2 info2;
[case(3)] spoolss_DriverInfo3 info3;
+ [case(4)] spoolss_DriverInfo4 info4;
+ [case(5)] spoolss_DriverInfo5 info5;
+ [case(6)] spoolss_DriverInfo6 info6;
} spoolss_DriverInfo;
/******************/
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index 18b9e23b75..eb4b3c5da9 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -27,7 +27,7 @@ static BOOL test_GetPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
{
NTSTATUS status;
struct spoolss_GetPrinter r;
- uint16_t levels[] = {1, 2, 3, 4, 5, 6, 7};
+ uint16_t levels[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
int i;
BOOL ret = True;
@@ -684,7 +684,7 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
opEx.in.userlevel.level1 = NULL;
opEx.out.handle = &handle;
- printf("\nTesting OpenPrinter(%s) with bad name\n", opEx.in.printername);
+ printf("\nTesting OpenPrinterEx(%s) with bad name\n", opEx.in.printername);
status = dcerpc_spoolss_OpenPrinterEx(p, mem_ctx, &opEx);
if (!NT_STATUS_IS_OK(status)) {
@@ -711,6 +711,7 @@ static BOOL test_OpenPrinter_badnames(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx
ret &= test_OpenPrinter_badname(p, mem_ctx, "__INVALID_PRINTER__");
ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\127.0.0.1");
ret &= test_OpenPrinter_badname(p, mem_ctx, "\\\\localhost");
+ ret &= test_OpenPrinter_badname(p, mem_ctx, "");
name = talloc_asprintf(mem_ctx, "\\\\%s\\", dcerpc_server_name(p));
ret &= test_OpenPrinter_badname(p, mem_ctx, name);
@@ -868,12 +869,12 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
union spoolss_PrinterInfo *info;
int j;
- r.in.flags = 0x02;
- r.in.server = "";
- r.in.level = levels[i];
- r.in.buffer = NULL;
- r.in.buf_size = &buf_size;
- r.out.buf_size = &buf_size;
+ r.in.flags = PRINTER_ENUM_LOCAL;
+ r.in.server = "";
+ r.in.level = levels[i];
+ r.in.buffer = NULL;
+ r.in.buf_size = &buf_size;
+ r.out.buf_size = &buf_size;
printf("\nTesting EnumPrinters level %u\n", r.in.level);
@@ -883,14 +884,14 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
ret = False;
continue;
}
-
+
if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size);
data_blob_clear(&blob);
r.in.buffer = &blob;
status = dcerpc_spoolss_EnumPrinters(p, mem_ctx, &r);
}
-
+
if (!NT_STATUS_IS_OK(status) ||
!W_ERROR_IS_OK(r.out.result)) {
printf("EnumPrinters failed - %s/%s\n",
@@ -920,10 +921,11 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
}
}
}
-
+
return ret;
}
+#if 0
static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct policy_handle *handle,
const char *driver_name)
@@ -963,19 +965,18 @@ static BOOL test_GetPrinterDriver2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
return True;
}
+#endif
static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
{
struct spoolss_EnumPrinterDrivers r;
NTSTATUS status;
- uint16_t levels[] = {1, 2, 3};
+ uint16_t levels[] = {1, 2, 3, 4, 5, 6};
int i;
BOOL ret = True;
for (i=0;i<ARRAY_SIZE(levels);i++) {
uint32_t buf_size;
- union spoolss_DriverInfo *info;
- uint32_t j;
r.in.server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));
r.in.environment = "Windows NT x86";
@@ -1009,6 +1010,7 @@ static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
!W_ERROR_IS_OK(r.out.result)) {
printf("EnumPrinterDrivers failed - %s/%s\n",
nt_errstr(status), win_errstr(r.out.result));
+ ret = False;
break;
}
@@ -1016,19 +1018,6 @@ static BOOL test_EnumPrinterDrivers(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
printf("No printer drivers returned");
break;
}
-
- info = *r.out.info;
-
- if (r.in.level != 1) continue;
-
- for (j=0;j<r.out.count;j++) {
- struct policy_handle handle;
-
- if (!call_OpenPrinterEx(p, mem_ctx, "",&handle)) {
- continue;
- }
- ret &=test_GetPrinterDriver2(p, mem_ctx, &handle, info[j].info1.driver_name);
- }
}
return ret;