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 + -
显示快捷键?