spoolss.c
来自「samba最新软件」· C语言 代码 · 共 1,770 行 · 第 1/4 页
C
1,770 行
r.in.offered = r.out.needed; status = dcerpc_spoolss_EnumPrintProcessors(p, ctx, &r); torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrintProcessors failed"); torture_assert_werr_ok(tctx, r.out.result, "EnumPrintProcessors failed"); ctx->print_processor_count[level] = r.out.count; ctx->print_processors[level] = r.out.info; } for (i=1;i<ARRAY_SIZE(levels);i++) { int level = levels[i]; int old_level = levels[i-1]; torture_assert_int_equal(tctx, ctx->print_processor_count[level], ctx->print_processor_count[old_level], "EnumPrintProcessors failed"); } for (i=0;i<ARRAY_SIZE(levels);i++) { int level = levels[i]; for (j=0;j<ctx->print_processor_count[level];j++) {#if 0 union spoolss_PrintProcessorInfo *cur = &ctx->print_processors[level][j]; union spoolss_PrintProcessorInfo *ref = &ctx->print_processors[1][j];#endif switch (level) { case 1: /* level 1 is our reference, and it makes no sense to compare it to itself */ break; } } } return true;}static bool test_EnumPrinters(struct torture_context *tctx, struct dcerpc_pipe *p, struct test_spoolss_context *ctx){ struct spoolss_EnumPrinters r; NTSTATUS status; uint16_t levels[] = { 0, 1, 2, 4, 5 }; int i, j; for (i=0;i<ARRAY_SIZE(levels);i++) { int level = levels[i]; DATA_BLOB blob; r.in.flags = PRINTER_ENUM_LOCAL; r.in.server = ""; r.in.level = level; r.in.buffer = NULL; r.in.offered = 0; torture_comment(tctx, "Testing EnumPrinters level %u\n", r.in.level); status = dcerpc_spoolss_EnumPrinters(p, ctx, &r); torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrinters failed"); if (W_ERROR_IS_OK(r.out.result)) { /* TODO: do some more checks here */ continue; } torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, "EnumPrinters unexpected return code"); blob = data_blob_talloc(ctx, NULL, r.out.needed); data_blob_clear(&blob); r.in.buffer = &blob; r.in.offered = r.out.needed; status = dcerpc_spoolss_EnumPrinters(p, ctx, &r); torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrinters failed"); torture_assert_werr_ok(tctx, r.out.result, "EnumPrinters failed"); ctx->printer_count[level] = r.out.count; ctx->printers[level] = r.out.info; } for (i=1;i<ARRAY_SIZE(levels);i++) { int level = levels[i]; int old_level = levels[i-1]; torture_assert_int_equal(tctx, ctx->printer_count[level], ctx->printer_count[old_level], "EnumPrinters invalid value"); } for (i=0;i<ARRAY_SIZE(levels);i++) { int level = levels[i]; for (j=0;j<ctx->printer_count[level];j++) { union spoolss_PrinterInfo *cur = &ctx->printers[level][j]; union spoolss_PrinterInfo *ref = &ctx->printers[2][j]; switch (level) { case 0: COMPARE_STRING(tctx, cur->info0, ref->info2, printername); COMPARE_STRING(tctx, cur->info0, ref->info2, servername); COMPARE_UINT32(tctx, cur->info0, ref->info2, cjobs); /*COMPARE_UINT32(tctx, cur->info0, ref->info2, total_jobs); COMPARE_UINT32(tctx, cur->info0, ref->info2, total_bytes); COMPARE_SPOOLSS_TIME(cur->info0, ref->info2, spoolss_Time time); COMPARE_UINT32(tctx, cur->info0, ref->info2, global_counter); COMPARE_UINT32(tctx, cur->info0, ref->info2, total_pages); COMPARE_UINT32(tctx, cur->info0, ref->info2, version); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown10); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown11); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown12); COMPARE_UINT32(tctx, cur->info0, ref->info2, session_counter); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown14); COMPARE_UINT32(tctx, cur->info0, ref->info2, printer_errors); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown16); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown17); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown18); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown19); COMPARE_UINT32(tctx, cur->info0, ref->info2, change_id); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown21);*/ COMPARE_UINT32(tctx, cur->info0, ref->info2, status); /*COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown23); COMPARE_UINT32(tctx, cur->info0, ref->info2, c_setprinter); COMPARE_UINT16(cur->info0, ref->info2, unknown25); COMPARE_UINT16(cur->info0, ref->info2, unknown26); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown27); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown28); COMPARE_UINT32(tctx, cur->info0, ref->info2, unknown29);*/ break; case 1: /*COMPARE_UINT32(tctx, cur->info1, ref->info2, flags);*/ /*COMPARE_STRING(tctx, cur->info1, ref->info2, name);*/ /*COMPARE_STRING(tctx, cur->info1, ref->info2, description);*/ COMPARE_STRING(tctx, cur->info1, ref->info2, comment); break; case 2: /* level 2 is our reference, and it makes no sense to compare it to itself */ break; case 4: COMPARE_STRING(tctx, cur->info4, ref->info2, printername); COMPARE_STRING(tctx, cur->info4, ref->info2, servername); COMPARE_UINT32(tctx, cur->info4, ref->info2, attributes); break; case 5: COMPARE_STRING(tctx, cur->info5, ref->info2, printername); COMPARE_STRING(tctx, cur->info5, ref->info2, portname); COMPARE_UINT32(tctx, cur->info5, ref->info2, attributes); /*COMPARE_UINT32(tctx, cur->info5, ref->info2, device_not_selected_timeout); COMPARE_UINT32(tctx, cur->info5, ref->info2, transmission_retry_timeout);*/ break; } } } /* TODO: * - verify that the port of a printer was in the list returned by EnumPorts */ return true;}static bool test_GetPrinter(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle){ NTSTATUS status; struct spoolss_GetPrinter r; uint16_t levels[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; int i; for (i=0;i<ARRAY_SIZE(levels);i++) { r.in.handle = handle; r.in.level = levels[i]; r.in.buffer = NULL; r.in.offered = 0; torture_comment(tctx, "Testing GetPrinter level %u\n", r.in.level); status = dcerpc_spoolss_GetPrinter(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "GetPrinter 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_GetPrinter(p, tctx, &r); } torture_assert_ntstatus_ok(tctx, status, "GetPrinter failed"); torture_assert_werr_ok(tctx, r.out.result, "GetPrinter failed"); } return true;}static bool test_ClosePrinter(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle){ NTSTATUS status; struct spoolss_ClosePrinter r; r.in.handle = handle; r.out.handle = handle; torture_comment(tctx, "Testing ClosePrinter\n"); status = dcerpc_spoolss_ClosePrinter(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "ClosePrinter failed"); return true;}static bool test_GetForm(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle, const char *form_name){ NTSTATUS status; struct spoolss_GetForm r; r.in.handle = handle; r.in.form_name = form_name; r.in.level = 1; r.in.buffer = NULL; r.in.offered = 0; torture_comment(tctx, "Testing GetForm\n"); status = dcerpc_spoolss_GetForm(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "GetForm 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_GetForm(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "GetForm failed"); torture_assert_werr_ok(tctx, r.out.result, "GetForm failed"); torture_assert(tctx, r.out.info, "No form info returned"); } torture_assert_werr_ok(tctx, r.out.result, "GetForm failed"); return true;}static bool test_EnumForms(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle, bool print_server){ NTSTATUS status; struct spoolss_EnumForms r; bool ret = true; r.in.handle = handle; r.in.level = 1; r.in.buffer = NULL; r.in.offered = 0; torture_comment(tctx, "Testing EnumForms\n"); status = dcerpc_spoolss_EnumForms(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumForms failed"); if (print_server && W_ERROR_EQUAL(r.out.result, WERR_BADFID)) torture_fail(tctx, "EnumForms on the PrintServer isn't supported by test server (NT4)"); if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { union spoolss_FormInfo *info; int j; 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_EnumForms(p, tctx, &r); torture_assert(tctx, r.out.info, "No forms returned"); info = r.out.info; for (j = 0; j < r.out.count; j++) { if (!print_server) ret &= test_GetForm(tctx, p, handle, info[j].info1.form_name); } } torture_assert_ntstatus_ok(tctx, status, "EnumForms failed"); torture_assert_werr_ok(tctx, r.out.result, "EnumForms failed"); return true;}static bool test_DeleteForm(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle, const char *form_name){ NTSTATUS status; struct spoolss_DeleteForm r; r.in.handle = handle; r.in.form_name = form_name; status = dcerpc_spoolss_DeleteForm(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "DeleteForm failed"); torture_assert_werr_ok(tctx, r.out.result, "DeleteForm failed"); return true;}static bool test_AddForm(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle, bool print_server){ struct spoolss_AddForm r; struct spoolss_AddFormInfo1 addform; const char *form_name = "testform3"; NTSTATUS status; bool ret = true; r.in.handle = handle; r.in.level = 1; r.in.info.info1 = &addform; addform.flags = SPOOLSS_FORM_USER; addform.form_name = form_name; addform.size.width = 50; addform.size.height = 25; addform.area.left = 5; addform.area.top = 10; addform.area.right = 45; addform.area.bottom = 15; status = dcerpc_spoolss_AddForm(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "AddForm failed"); torture_assert_werr_ok(tctx, r.out.result, "AddForm failed"); if (!print_server) ret &= test_GetForm(tctx, p, handle, form_name); { struct spoolss_SetForm sf; struct spoolss_AddFormInfo1 setform; sf.in.handle = handle; sf.in.form_name = form_name; sf.in.level = 1; sf.in.info.info1= &setform; setform.flags = addform.flags; setform.form_name = addform.form_name; setform.size = addform.size; setform.area = addform.area; setform.size.width = 1234; status = dcerpc_spoolss_SetForm(p, tctx, &sf); torture_assert_ntstatus_ok(tctx, status, "SetForm failed"); torture_assert_werr_ok(tctx, r.out.result, "SetForm failed"); } if (!print_server) ret &= test_GetForm(tctx, p, handle, form_name); if (!test_DeleteForm(tctx, p, handle, form_name)) { ret = false; } return ret;}static bool test_EnumPorts_old(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct spoolss_EnumPorts r; r.in.servername = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.level = 2; r.in.buffer = NULL; r.in.offered = 0; torture_comment(tctx, "Testing EnumPorts\n"); status = dcerpc_spoolss_EnumPorts(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumPorts 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_EnumPorts(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumPorts failed"); torture_assert(tctx, r.out.info, "No ports returned"); } return true;}static bool test_AddPort(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct spoolss_AddPort r; r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.unknown = 0; r.in.monitor_name = "foo"; torture_comment(tctx, "Testing AddPort\n"); status = dcerpc_spoolss_AddPort(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "AddPort failed"); /* win2k3 returns WERR_NOT_SUPPORTED */#if 0 if (!W_ERROR_IS_OK(r.out.result)) { printf("AddPort failed - %s\n", win_errstr(r.out.result)); return false; }#endif return true;}static bool test_GetJob(struct torture_context *tctx, struct dcerpc_pipe *p,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?