diff options
-rw-r--r-- | source4/librpc/idl/spoolss.idl | 174 | ||||
-rw-r--r-- | source4/torture/rpc/spoolss.c | 43 |
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; |