spoolss.c
来自「samba最新软件」· C语言 代码 · 共 1,770 行 · 第 1/4 页
C
1,770 行
torture_assert_ntstatus_equal(tctx, status, NT_STATUS_NET_WRITE_FAULT, "ERROR: Allowed close on secondary connection"); torture_assert_int_equal(tctx, p2->last_fault_code, DCERPC_FAULT_CONTEXT_MISMATCH, "Unexpected fault code"); talloc_free(p2); return true;}static bool test_OpenPrinter_badname(struct torture_context *tctx, struct dcerpc_pipe *p, const char *name){ NTSTATUS status; struct spoolss_OpenPrinter op; struct spoolss_OpenPrinterEx opEx; struct policy_handle handle; bool ret = true; op.in.printername = name; op.in.datatype = NULL; op.in.devmode_ctr.devmode= NULL; op.in.access_mask = 0; op.out.handle = &handle; torture_comment(tctx, "\nTesting OpenPrinter(%s) with bad name\n", op.in.printername); status = dcerpc_spoolss_OpenPrinter(p, tctx, &op); torture_assert_ntstatus_ok(tctx, status, "OpenPrinter failed"); if (!W_ERROR_EQUAL(WERR_INVALID_PRINTER_NAME,op.out.result)) { torture_comment(tctx, "OpenPrinter(%s) unexpected result[%s] should be WERR_INVALID_PRINTER_NAME\n", name, win_errstr(op.out.result)); } if (W_ERROR_IS_OK(op.out.result)) { ret &=test_ClosePrinter(tctx, p, &handle); } opEx.in.printername = name; opEx.in.datatype = NULL; opEx.in.devmode_ctr.devmode = NULL; opEx.in.access_mask = 0; opEx.in.level = 1; opEx.in.userlevel.level1 = NULL; opEx.out.handle = &handle; torture_comment(tctx, "Testing OpenPrinterEx(%s) with bad name\n", opEx.in.printername); status = dcerpc_spoolss_OpenPrinterEx(p, tctx, &opEx); torture_assert_ntstatus_ok(tctx, status, "OpenPrinterEx failed"); if (!W_ERROR_EQUAL(WERR_INVALID_PARAM,opEx.out.result)) { torture_comment(tctx, "OpenPrinterEx(%s) unexpected result[%s] should be WERR_INVALID_PARAM\n", name, win_errstr(opEx.out.result)); } if (W_ERROR_IS_OK(opEx.out.result)) { ret &=test_ClosePrinter(tctx, p, &handle); } return ret;}static bool test_OpenPrinter(struct torture_context *tctx, struct dcerpc_pipe *p, const char *name){ NTSTATUS status; struct spoolss_OpenPrinter r; struct policy_handle handle; bool ret = true; r.in.printername = talloc_asprintf(tctx, "\\\\%s\\%s", dcerpc_server_name(p), name); r.in.datatype = NULL; r.in.devmode_ctr.devmode= NULL; r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; r.out.handle = &handle; torture_comment(tctx, "Testing OpenPrinter(%s)\n", r.in.printername); status = dcerpc_spoolss_OpenPrinter(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "OpenPrinter failed"); torture_assert_werr_ok(tctx, r.out.result, "OpenPrinter failed"); if (!test_GetPrinter(tctx, p, &handle)) { ret = false; } if (!test_SecondaryClosePrinter(tctx, p, &handle)) { ret = false; } if (!test_ClosePrinter(tctx, p, &handle)) { ret = false; } return ret;}static bool call_OpenPrinterEx(struct torture_context *tctx, struct dcerpc_pipe *p, const char *name, struct policy_handle *handle){ struct spoolss_OpenPrinterEx r; struct spoolss_UserLevel1 userlevel1; NTSTATUS status; if (name && name[0]) { r.in.printername = talloc_asprintf(tctx, "\\\\%s\\%s", dcerpc_server_name(p), name); } else { r.in.printername = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); } r.in.datatype = NULL; r.in.devmode_ctr.devmode= NULL; r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; r.in.level = 1; r.in.userlevel.level1 = &userlevel1; r.out.handle = handle; userlevel1.size = 1234; userlevel1.client = "hello"; userlevel1.user = "spottyfoot!"; userlevel1.build = 1; userlevel1.major = 2; userlevel1.minor = 3; userlevel1.processor = 4; torture_comment(tctx, "Testing OpenPrinterEx(%s)\n", r.in.printername); status = dcerpc_spoolss_OpenPrinterEx(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "OpenPrinterEx failed"); torture_assert_werr_ok(tctx, r.out.result, "OpenPrinterEx failed"); return true;}static bool test_OpenPrinterEx(struct torture_context *tctx, struct dcerpc_pipe *p, const char *name){ struct policy_handle handle; bool ret = true; if (!call_OpenPrinterEx(tctx, p, name, &handle)) { return false; } if (!test_GetPrinter(tctx, p, &handle)) { ret = false; } if (!test_EnumForms(tctx, p, &handle, false)) { ret = false; } if (!test_AddForm(tctx, p, &handle, false)) { ret = false; } if (!test_EnumPrinterData(tctx, p, &handle)) { ret = false; } if (!test_EnumPrinterDataEx(tctx, p, &handle)) { ret = false; } if (!test_PausePrinter(tctx, p, &handle)) { ret = false; } if (!test_DoPrintTest(tctx, p, &handle)) { ret = false; } if (!test_ResumePrinter(tctx, p, &handle)) { ret = false; } if (!test_SetPrinterData(tctx, p, &handle)) { ret = false; } if (!test_SecondaryClosePrinter(tctx, p, &handle)) { ret = false; } if (!test_ClosePrinter(tctx, p, &handle)) { ret = false; } return ret;}static bool test_EnumPrinters_old(struct torture_context *tctx, struct dcerpc_pipe *p){ struct spoolss_EnumPrinters r; NTSTATUS status; uint16_t levels[] = {1, 2, 4, 5}; int i; bool ret = true; for (i=0;i<ARRAY_SIZE(levels);i++) { union spoolss_PrinterInfo *info; int j; r.in.flags = PRINTER_ENUM_LOCAL; r.in.server = ""; r.in.level = levels[i]; r.in.buffer = NULL; r.in.offered = 0; torture_comment(tctx, "Testing EnumPrinters level %u\n", r.in.level); status = dcerpc_spoolss_EnumPrinters(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumPrinters failed"); if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { DATA_BLOB blob = data_blob_talloc(tctx, NULL, r.out.needed); data_blob_clear(&blob); r.in.buffer = &blob; r.in.offered = r.out.needed; status = dcerpc_spoolss_EnumPrinters(p, tctx, &r); } torture_assert_ntstatus_ok(tctx, status, "EnumPrinters failed"); torture_assert_werr_ok(tctx, r.out.result, "EnumPrinters failed"); if (!r.out.info) { torture_comment(tctx, "No printers returned\n"); return true; } info = r.out.info; for (j=0;j<r.out.count;j++) { if (r.in.level == 1) { /* the names appear to be comma-separated name lists? */ char *name = talloc_strdup(tctx, info[j].info1.name); char *comma = strchr(name, ','); if (comma) *comma = 0; if (!test_OpenPrinter(tctx, p, name)) { ret = false; } if (!test_OpenPrinterEx(tctx, p, name)) { ret = false; } } } } return ret;}#if 0static bool test_GetPrinterDriver2(struct dcerpc_pipe *p, struct policy_handle *handle, const char *driver_name){ NTSTATUS status; struct spoolss_GetPrinterDriver2 r; r.in.handle = handle; r.in.architecture = "W32X86"; r.in.level = 1; r.in.buffer = NULL; r.in.offered = 0; r.in.client_major_version = 0; r.in.client_minor_version = 0; printf("Testing GetPrinterDriver2\n"); status = dcerpc_spoolss_GetPrinterDriver2(p, tctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("GetPrinterDriver2 failed - %s\n", nt_errstr(status)); return false; } if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { r.in.offered = r.out.needed; status = dcerpc_spoolss_GetPrinterDriver2(p, tctx, &r); } if (!NT_STATUS_IS_OK(status)) { printf("GetPrinterDriver2 failed - %s\n", nt_errstr(status)); return false; } if (!W_ERROR_IS_OK(r.out.result)) { printf("GetPrinterDriver2 failed - %s\n", win_errstr(r.out.result)); return false; } return true;}#endifstatic bool test_EnumPrinterDrivers_old(struct torture_context *tctx, struct dcerpc_pipe *p){ struct spoolss_EnumPrinterDrivers r; NTSTATUS status; uint16_t levels[] = {1, 2, 3, 4, 5, 6}; int i; for (i=0;i<ARRAY_SIZE(levels);i++) { r.in.server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.environment = "Windows NT x86"; r.in.level = levels[i]; r.in.buffer = NULL; r.in.offered = 0; torture_comment(tctx, "Testing EnumPrinterDrivers level %u\n", r.in.level); status = dcerpc_spoolss_EnumPrinterDrivers(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDrivers failed"); if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { DATA_BLOB blob = data_blob_talloc(tctx, NULL, r.out.needed); data_blob_clear(&blob); r.in.buffer = &blob; r.in.offered = r.out.needed; status = dcerpc_spoolss_EnumPrinterDrivers(p, tctx, &r); } torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDrivers failed"); torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterDrivers failed"); if (!r.out.info) { torture_comment(tctx, "No printer drivers returned\n"); break; } } return true;}/** Test that makes sure that calling ReplyOpenPrinter() * on Samba 4 will cause an irpc broadcast call. */static bool test_ReplyOpenPrinter(struct torture_context *tctx, struct dcerpc_pipe *pipe){ struct spoolss_ReplyOpenPrinter r; struct spoolss_ReplyClosePrinter s; struct policy_handle h; r.in.server_name = "earth"; r.in.printer_local = 2; r.in.type = REG_DWORD; r.in.unknown1 = 0; r.in.unknown2 = 0; r.out.handle = &h; torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_ReplyOpenPrinter(pipe, tctx, &r), "spoolss_ReplyOpenPrinter call failed"); torture_assert_werr_ok(tctx, r.out.result, "error return code"); s.in.handle = &h; s.out.handle = &h; torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_ReplyClosePrinter(pipe, tctx, &s), "spoolss_ReplyClosePrinter call failed"); torture_assert_werr_ok(tctx, r.out.result, "error return code"); return true;}bool torture_rpc_spoolss(struct torture_context *torture){ NTSTATUS status; struct dcerpc_pipe *p; bool ret = true; struct test_spoolss_context *ctx; status = torture_rpc_connection(torture, &p, &ndr_table_spoolss); if (!NT_STATUS_IS_OK(status)) { return false; } ctx = talloc_zero(torture, struct test_spoolss_context); ret &= test_OpenPrinter_server(torture, p, ctx); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "W3SvcInstalled"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "BeepEnabled"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "EventLog"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "NetPopup"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "NetPopupToComputer"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "MajorVersion"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "MinorVersion"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "DefaultSpoolDirectory"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "Architecture"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "DsPresent"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "OSVersion"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "OSVersionEx"); ret &= test_GetPrinterData(torture, p, &ctx->server_handle, "DNSMachineName"); ret &= test_EnumForms(torture, p, &ctx->server_handle, true); ret &= test_AddForm(torture, p, &ctx->server_handle, true); ret &= test_EnumPorts(torture, p, ctx); ret &= test_GetPrinterDriverDirectory(torture, p, ctx); ret &= test_EnumPrinterDrivers(torture, p, ctx); ret &= test_EnumMonitors(torture, p, ctx); ret &= test_EnumPrintProcessors(torture, p, ctx); ret &= test_EnumPrinters(torture, p, ctx); ret &= test_OpenPrinter_badname(torture, p, "__INVALID_PRINTER__"); ret &= test_OpenPrinter_badname(torture, p, "\\\\__INVALID_HOST__"); ret &= test_OpenPrinter_badname(torture, p, ""); ret &= test_OpenPrinter_badname(torture, p, "\\\\\\"); ret &= test_OpenPrinter_badname(torture, p, "\\\\\\__INVALID_PRINTER__"); ret &= test_OpenPrinter_badname(torture, p, talloc_asprintf(torture, "\\\\%s\\", dcerpc_server_name(p))); ret &= test_OpenPrinter_badname(torture, p, talloc_asprintf(torture, "\\\\%s\\__INVALID_PRINTER__", dcerpc_server_name(p))); ret &= test_AddPort(torture, p); ret &= test_EnumPorts_old(torture, p); ret &= test_EnumPrinters_old(torture, p); ret &= test_EnumPrinterDrivers_old(torture, p); ret &= test_ReplyOpenPrinter(torture, p); return ret;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?