spoolss.c
来自「samba最新软件」· C语言 代码 · 共 1,770 行 · 第 1/4 页
C
1,770 行
struct policy_handle *handle, uint32_t job_id){ NTSTATUS status; struct spoolss_GetJob r; r.in.handle = handle; r.in.job_id = job_id; r.in.level = 1; r.in.buffer = NULL; r.in.offered = 0; torture_comment(tctx, "Testing GetJob\n"); status = dcerpc_spoolss_GetJob(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "GetJob 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_GetJob(p, tctx, &r); torture_assert(tctx, r.out.info, "No job info returned"); } return true;}static bool test_SetJob(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle, uint32_t job_id, enum spoolss_JobControl command){ NTSTATUS status; struct spoolss_SetJob r; r.in.handle = handle; r.in.job_id = job_id; r.in.ctr = NULL; r.in.command = command; torture_comment(tctx, "Testing SetJob\n"); status = dcerpc_spoolss_SetJob(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "SetJob failed"); torture_assert_werr_ok(tctx, r.out.result, "SetJob failed"); return true;}static bool test_EnumJobs(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle){ NTSTATUS status; struct spoolss_EnumJobs r; r.in.handle = handle; r.in.firstjob = 0; r.in.numjobs = 0xffffffff; r.in.level = 1; r.in.buffer = NULL; r.in.offered = 0; torture_comment(tctx, "Testing EnumJobs\n"); status = dcerpc_spoolss_EnumJobs(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumJobs failed"); if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { union spoolss_JobInfo *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_EnumJobs(p, tctx, &r); torture_assert(tctx, r.out.info, "No jobs returned"); info = r.out.info; for (j = 0; j < r.out.count; j++) { test_GetJob(tctx, p, handle, info[j].info1.job_id); test_SetJob(tctx, p, handle, info[j].info1.job_id, SPOOLSS_JOB_CONTROL_PAUSE); test_SetJob(tctx, p, handle, info[j].info1.job_id, SPOOLSS_JOB_CONTROL_RESUME); } } else { torture_assert_werr_ok(tctx, r.out.result, "EnumJobs failed"); } return true;}static bool test_DoPrintTest(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle){ bool ret = true; NTSTATUS status; struct spoolss_StartDocPrinter s; struct spoolss_DocumentInfo1 info1; struct spoolss_StartPagePrinter sp; struct spoolss_WritePrinter w; struct spoolss_EndPagePrinter ep; struct spoolss_EndDocPrinter e; int i; uint32_t job_id; torture_comment(tctx, "Testing StartDocPrinter\n"); s.in.handle = handle; s.in.level = 1; s.in.info.info1 = &info1; info1.document_name = "TorturePrintJob"; info1.output_file = NULL; info1.datatype = "RAW"; status = dcerpc_spoolss_StartDocPrinter(p, tctx, &s); torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_StartDocPrinter failed"); torture_assert_werr_ok(tctx, s.out.result, "StartDocPrinter failed"); job_id = s.out.job_id; for (i=1; i < 4; i++) { torture_comment(tctx, "Testing StartPagePrinter: Page[%d]\n", i); sp.in.handle = handle; status = dcerpc_spoolss_StartPagePrinter(p, tctx, &sp); torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_StartPagePrinter failed"); torture_assert_werr_ok(tctx, sp.out.result, "StartPagePrinter failed"); torture_comment(tctx, "Testing WritePrinter: Page[%d]\n", i); w.in.handle = handle; w.in.data = data_blob_string_const(talloc_asprintf(tctx,"TortureTestPage: %d\nData\n",i)); status = dcerpc_spoolss_WritePrinter(p, tctx, &w); torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_WritePrinter failed"); torture_assert_werr_ok(tctx, w.out.result, "WritePrinter failed"); torture_comment(tctx, "Testing EndPagePrinter: Page[%d]\n", i); ep.in.handle = handle; status = dcerpc_spoolss_EndPagePrinter(p, tctx, &ep); torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EndPagePrinter failed"); torture_assert_werr_ok(tctx, ep.out.result, "EndPagePrinter failed"); } torture_comment(tctx, "Testing EndDocPrinter\n"); e.in.handle = handle; status = dcerpc_spoolss_EndDocPrinter(p, tctx, &e); torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EndDocPrinter failed"); torture_assert_werr_ok(tctx, e.out.result, "EndDocPrinter failed"); ret &= test_EnumJobs(tctx, p, handle); ret &= test_SetJob(tctx, p, handle, job_id, SPOOLSS_JOB_CONTROL_DELETE); return ret;}static bool test_PausePrinter(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle){ NTSTATUS status; struct spoolss_SetPrinter r; r.in.handle = handle; r.in.level = 0; r.in.info.info1 = NULL; r.in.devmode_ctr.devmode= NULL; r.in.secdesc_ctr.sd = NULL; r.in.command = SPOOLSS_PRINTER_CONTROL_PAUSE; torture_comment(tctx, "Testing SetPrinter: SPOOLSS_PRINTER_CONTROL_PAUSE\n"); status = dcerpc_spoolss_SetPrinter(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "SetPrinter failed"); torture_assert_werr_ok(tctx, r.out.result, "SetPrinter failed"); return true;}static bool test_ResumePrinter(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle){ NTSTATUS status; struct spoolss_SetPrinter r; r.in.handle = handle; r.in.level = 0; r.in.info.info1 = NULL; r.in.devmode_ctr.devmode= NULL; r.in.secdesc_ctr.sd = NULL; r.in.command = SPOOLSS_PRINTER_CONTROL_RESUME; torture_comment(tctx, "Testing SetPrinter: SPOOLSS_PRINTER_CONTROL_RESUME\n"); status = dcerpc_spoolss_SetPrinter(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "SetPrinter failed"); torture_assert_werr_ok(tctx, r.out.result, "SetPrinter failed"); return true;}static bool test_GetPrinterData(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle, const char *value_name){ NTSTATUS status; struct spoolss_GetPrinterData r; r.in.handle = handle; r.in.value_name = value_name; r.in.offered = 0; torture_comment(tctx, "Testing GetPrinterData\n"); status = dcerpc_spoolss_GetPrinterData(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "GetPrinterData failed"); if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) { r.in.offered = r.out.needed; status = dcerpc_spoolss_GetPrinterData(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "GetPrinterData failed"); torture_assert_werr_ok(tctx, r.out.result, "GetPrinterData failed"); } return true;}static bool test_GetPrinterDataEx(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle, const char *key_name, const char *value_name){ NTSTATUS status; struct spoolss_GetPrinterDataEx r; r.in.handle = handle; r.in.key_name = key_name; r.in.value_name = value_name; r.in.offered = 0; torture_comment(tctx, "Testing GetPrinterDataEx\n"); status = dcerpc_spoolss_GetPrinterDataEx(p, tctx, &r); if (!NT_STATUS_IS_OK(status)) { if (NT_STATUS_EQUAL(status,NT_STATUS_NET_WRITE_FAULT) && p->last_fault_code == DCERPC_FAULT_OP_RNG_ERROR) { torture_skip(tctx, "GetPrinterDataEx not supported by server\n"); } torture_assert_ntstatus_ok(tctx, status, "GetPrinterDataEx failed"); } if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) { r.in.offered = r.out.needed; status = dcerpc_spoolss_GetPrinterDataEx(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "GetPrinterDataEx failed"); torture_assert_werr_ok(tctx, r.out.result, "GetPrinterDataEx failed"); } return true;}static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle){ NTSTATUS status; struct spoolss_EnumPrinterData r; ZERO_STRUCT(r); r.in.handle = handle; r.in.enum_index = 0; do { uint32_t value_size = 0; uint32_t data_size = 0; uint32_t printerdata_type = 0; DATA_BLOB data = data_blob(NULL,0); r.in.value_offered = value_size; r.out.value_needed = &value_size; r.in.data_offered = data_size; r.out.data_needed = &data_size; r.out.printerdata_type = &printerdata_type; r.out.buffer = &data; torture_comment(tctx, "Testing EnumPrinterData\n"); status = dcerpc_spoolss_EnumPrinterData(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumPrinterData failed"); r.in.value_offered = value_size; r.in.data_offered = data_size; status = dcerpc_spoolss_EnumPrinterData(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumPrinterData failed"); test_GetPrinterData(tctx, p, handle, r.out.value_name); test_GetPrinterDataEx(tctx, p, handle, "PrinterDriverData", r.out.value_name); r.in.enum_index++; } while (W_ERROR_IS_OK(r.out.result)); return true;}static bool test_EnumPrinterDataEx(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle){ NTSTATUS status; struct spoolss_EnumPrinterDataEx r; r.in.handle = handle; r.in.key_name = "PrinterDriverData"; r.in.offered = 0; torture_comment(tctx, "Testing EnumPrinterDataEx\n"); status = dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDataEx failed"); r.in.offered = r.out.needed; status = dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDataEx failed"); return true;}static bool test_DeletePrinterData(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle, const char *value_name){ NTSTATUS status; struct spoolss_DeletePrinterData r; r.in.handle = handle; r.in.value_name = value_name; torture_comment(tctx, "Testing DeletePrinterData\n"); status = dcerpc_spoolss_DeletePrinterData(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "DeletePrinterData failed"); return true;}static bool test_SetPrinterData(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle){ NTSTATUS status; struct spoolss_SetPrinterData r; const char *value_name = "spottyfoot"; r.in.handle = handle; r.in.value_name = value_name; r.in.type = SPOOLSS_PRINTER_DATA_TYPE_STRING; r.in.data.string = "dog"; torture_comment(tctx, "Testing SetPrinterData\n"); status = dcerpc_spoolss_SetPrinterData(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "SetPrinterData failed"); if (!test_GetPrinterData(tctx, p, handle, value_name)) { return false; } if (!test_DeletePrinterData(tctx, p, handle, value_name)) { return false; } return true;}static bool test_SecondaryClosePrinter(struct torture_context *tctx, struct dcerpc_pipe *p, struct policy_handle *handle){ NTSTATUS status; struct dcerpc_binding *b; struct dcerpc_pipe *p2; struct spoolss_ClosePrinter cp; /* only makes sense on SMB */ if (p->conn->transport.transport != NCACN_NP) { return true; } torture_comment(tctx, "testing close on secondary pipe\n"); status = dcerpc_parse_binding(tctx, p->conn->binding_string, &b); torture_assert_ntstatus_ok(tctx, status, "Failed to parse dcerpc binding"); status = dcerpc_secondary_connection(p, &p2, b); torture_assert_ntstatus_ok(tctx, status, "Failed to create secondary connection"); status = dcerpc_bind_auth_none(p2, &ndr_table_spoolss); torture_assert_ntstatus_ok(tctx, status, "Failed to create bind on secondary connection"); cp.in.handle = handle; cp.out.handle = handle; status = dcerpc_spoolss_ClosePrinter(p2, tctx, &cp);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?