1 /*
2    Unix SMB/CIFS implementation.
3    RPC pipe client
4 
5    Copyright (C) Günther Deschner 2008
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 #include "includes.h"
22 #include "rpcclient.h"
23 #include "../librpc/gen_ndr/ndr_ntsvcs_c.h"
24 
cmd_ntsvcs_get_version(struct rpc_pipe_client * cli,TALLOC_CTX * mem_ctx,int argc,const char ** argv)25 static WERROR cmd_ntsvcs_get_version(struct rpc_pipe_client *cli,
26 				     TALLOC_CTX *mem_ctx,
27 				     int argc,
28 				     const char **argv)
29 {
30 	struct dcerpc_binding_handle *b = cli->binding_handle;
31 	NTSTATUS status;
32 	WERROR werr;
33 	uint16_t version;
34 
35 	status = dcerpc_PNP_GetVersion(b, mem_ctx,
36 				       &version, &werr);
37 	if (!NT_STATUS_IS_OK(status)) {
38 		return ntstatus_to_werror(status);
39 	}
40 
41 	if (W_ERROR_IS_OK(werr)) {
42 		printf("version: %d\n", version);
43 	}
44 
45 	return werr;
46 }
47 
cmd_ntsvcs_validate_dev_inst(struct rpc_pipe_client * cli,TALLOC_CTX * mem_ctx,int argc,const char ** argv)48 static WERROR cmd_ntsvcs_validate_dev_inst(struct rpc_pipe_client *cli,
49 					   TALLOC_CTX *mem_ctx,
50 					   int argc,
51 					   const char **argv)
52 {
53 	struct dcerpc_binding_handle *b = cli->binding_handle;
54 	NTSTATUS status;
55 	WERROR werr;
56 	const char *devicepath = NULL;
57 	uint32_t flags = 0;
58 
59 	if (argc < 2 || argc > 3) {
60 		printf("usage: %s [devicepath] <flags>\n", argv[0]);
61 		return WERR_OK;
62 	}
63 
64 	devicepath = argv[1];
65 
66 	if (argc >= 3) {
67 		flags = atoi(argv[2]);
68 	}
69 
70 	status = dcerpc_PNP_ValidateDeviceInstance(b, mem_ctx,
71 						   devicepath,
72 						   flags,
73 						   &werr);
74 	if (!NT_STATUS_IS_OK(status)) {
75 		return ntstatus_to_werror(status);
76 	}
77 
78 	return werr;
79 }
80 
cmd_ntsvcs_hw_prof_flags(struct rpc_pipe_client * cli,TALLOC_CTX * mem_ctx,int argc,const char ** argv)81 static WERROR cmd_ntsvcs_hw_prof_flags(struct rpc_pipe_client *cli,
82 				       TALLOC_CTX *mem_ctx,
83 				       int argc,
84 				       const char **argv)
85 {
86 	struct dcerpc_binding_handle *b = cli->binding_handle;
87 	NTSTATUS status;
88 	WERROR werr;
89 	const char *devicepath = NULL;
90 	uint32_t profile_flags = 0;
91 	uint16_t veto_type = 0;
92 	const char *unk5 = NULL;
93 	const char *unk5a = NULL;
94 
95 	if (argc < 2) {
96 		printf("usage: %s [devicepath]\n", argv[0]);
97 		return WERR_OK;
98 	}
99 
100 	devicepath = argv[1];
101 
102 	status = dcerpc_PNP_HwProfFlags(b, mem_ctx,
103 					0,
104 					devicepath,
105 					0,
106 					&profile_flags,
107 					&veto_type,
108 					unk5,
109 					&unk5a,
110 					0,
111 					0,
112 					&werr);
113 	if (!NT_STATUS_IS_OK(status)) {
114 		return ntstatus_to_werror(status);
115 	}
116 
117 	return werr;
118 }
119 
cmd_ntsvcs_get_hw_prof_info(struct rpc_pipe_client * cli,TALLOC_CTX * mem_ctx,int argc,const char ** argv)120 static WERROR cmd_ntsvcs_get_hw_prof_info(struct rpc_pipe_client *cli,
121 					  TALLOC_CTX *mem_ctx,
122 					  int argc,
123 					  const char **argv)
124 {
125 	struct dcerpc_binding_handle *b = cli->binding_handle;
126 	NTSTATUS status;
127 	WERROR werr;
128 	uint32_t idx = 0;
129 	struct PNP_HwProfInfo info;
130 	uint32_t size = 0, flags = 0;
131 
132 	ZERO_STRUCT(info);
133 
134 	status = dcerpc_PNP_GetHwProfInfo(b, mem_ctx,
135 					  idx,
136 					  &info,
137 					  size,
138 					  flags,
139 					  &werr);
140 	if (!NT_STATUS_IS_OK(status)) {
141 		return ntstatus_to_werror(status);
142 	}
143 
144 	return werr;
145 }
146 
cmd_ntsvcs_get_dev_reg_prop(struct rpc_pipe_client * cli,TALLOC_CTX * mem_ctx,int argc,const char ** argv)147 static WERROR cmd_ntsvcs_get_dev_reg_prop(struct rpc_pipe_client *cli,
148 					  TALLOC_CTX *mem_ctx,
149 					  int argc,
150 					  const char **argv)
151 {
152 	struct dcerpc_binding_handle *b = cli->binding_handle;
153 	NTSTATUS status;
154 	WERROR werr;
155 	const char *devicepath = NULL;
156 	uint32_t property = DEV_REGPROP_DESC;
157 	uint32_t reg_data_type = REG_NONE;
158 	uint8_t *buffer;
159 	uint32_t buffer_size = 0;
160 	uint32_t needed = 0;
161 	uint32_t flags = 0;
162 
163 	if (argc < 2) {
164 		printf("usage: %s [devicepath] [buffersize]\n", argv[0]);
165 		return WERR_OK;
166 	}
167 
168 	devicepath = argv[1];
169 
170 	if (argc >= 3) {
171 		buffer_size = atoi(argv[2]);
172 		needed = buffer_size;
173 	}
174 
175 	buffer = talloc_array(mem_ctx, uint8_t, buffer_size);
176 	W_ERROR_HAVE_NO_MEMORY(buffer);
177 
178 	status = dcerpc_PNP_GetDeviceRegProp(b, mem_ctx,
179 					     devicepath,
180 					     property,
181 					     &reg_data_type,
182 					     buffer,
183 					     &buffer_size,
184 					     &needed,
185 					     flags,
186 					     &werr);
187 	if (!NT_STATUS_IS_OK(status)) {
188 		return ntstatus_to_werror(status);
189 	}
190 
191 	return werr;
192 }
193 
cmd_ntsvcs_get_dev_list_size(struct rpc_pipe_client * cli,TALLOC_CTX * mem_ctx,int argc,const char ** argv)194 static WERROR cmd_ntsvcs_get_dev_list_size(struct rpc_pipe_client *cli,
195 					   TALLOC_CTX *mem_ctx,
196 					   int argc,
197 					   const char **argv)
198 {
199 	struct dcerpc_binding_handle *b = cli->binding_handle;
200 	NTSTATUS status;
201 	WERROR werr;
202 	uint32_t size = 0;
203 	uint32_t flags = 0;
204 	const char *filter = NULL;
205 
206 	if (argc > 3) {
207 		printf("usage: %s [filter] [flags]\n", argv[0]);
208 		return WERR_OK;
209 	}
210 
211 	if (argc >= 2) {
212 		filter = argv[1];
213 	}
214 
215 	if (argc >= 3) {
216 		flags = atoi(argv[2]);
217 	}
218 
219 	status = dcerpc_PNP_GetDeviceListSize(b, mem_ctx,
220 					      filter,
221 					      &size,
222 					      flags,
223 					      &werr);
224 	if (!NT_STATUS_IS_OK(status)) {
225 		return ntstatus_to_werror(status);
226 	}
227 
228 	printf("size: %d\n", size);
229 
230 	return werr;
231 }
232 
cmd_ntsvcs_get_dev_list(struct rpc_pipe_client * cli,TALLOC_CTX * mem_ctx,int argc,const char ** argv)233 static WERROR cmd_ntsvcs_get_dev_list(struct rpc_pipe_client *cli,
234 				      TALLOC_CTX *mem_ctx,
235 				      int argc,
236 				      const char **argv)
237 {
238 	struct dcerpc_binding_handle *b = cli->binding_handle;
239 	NTSTATUS status;
240 	WERROR werr;
241 	const char *filter = NULL;
242 	uint16_t *buffer = NULL;
243 	uint32_t length = 0;
244 	uint32_t flags = 0;
245 
246 	if (argc > 4) {
247 		printf("usage: %s [filter] [length] [flags]\n", argv[0]);
248 		return WERR_OK;
249 	}
250 
251 	if (argc >= 2) {
252 		filter = argv[1];
253 	}
254 
255 	if (argc >= 3) {
256 		length = atoi(argv[2]);
257 	}
258 
259 	if (argc >= 4) {
260 		flags = atoi(argv[3]);
261 	}
262 
263 	buffer = talloc(mem_ctx, uint16_t);
264 	if (!buffer) {
265 		return WERR_NOT_ENOUGH_MEMORY;
266 	}
267 
268 	status = dcerpc_PNP_GetDeviceList(b, mem_ctx,
269 					  filter,
270 					  buffer,
271 					  &length,
272 					  flags,
273 					  &werr);
274 	if (!NT_STATUS_IS_OK(status)) {
275 		return ntstatus_to_werror(status);
276 	}
277 
278 	printf("devlist needs size: %d\n", length);
279 
280 	return werr;
281 }
282 
283 struct cmd_set ntsvcs_commands[] = {
284 
285 	{
286 		.name = "NTSVCS",
287 	},
288 	{
289 		.name               = "ntsvcs_getversion",
290 		.returntype         = RPC_RTYPE_WERROR,
291 		.ntfn               = NULL,
292 		.wfn                = cmd_ntsvcs_get_version,
293 		.table              = &ndr_table_ntsvcs,
294 		.rpc_pipe           = NULL,
295 		.description        = "Query NTSVCS version",
296 		.usage              = "",
297 	},
298 	{
299 		.name               = "ntsvcs_validatedevinst",
300 		.returntype         = RPC_RTYPE_WERROR,
301 		.ntfn               = NULL,
302 		.wfn                = cmd_ntsvcs_validate_dev_inst,
303 		.table              = &ndr_table_ntsvcs,
304 		.rpc_pipe           = NULL,
305 		.description        = "Query NTSVCS device instance",
306 		.usage              = "",
307 	},
308 	{
309 		.name               = "ntsvcs_hwprofflags",
310 		.returntype         = RPC_RTYPE_WERROR,
311 		.ntfn               = NULL,
312 		.wfn                = cmd_ntsvcs_hw_prof_flags,
313 		.table              = &ndr_table_ntsvcs,
314 		.rpc_pipe           = NULL,
315 		.description        = "Query NTSVCS HW prof flags",
316 		.usage              = "",
317 	},
318 	{
319 		.name               = "ntsvcs_hwprofinfo",
320 		.returntype         = RPC_RTYPE_WERROR,
321 		.ntfn               = NULL,
322 		.wfn                = cmd_ntsvcs_get_hw_prof_info,
323 		.table              = &ndr_table_ntsvcs,
324 		.rpc_pipe           = NULL,
325 		.description        = "Query NTSVCS HW prof info",
326 		.usage              = "",
327 	},
328 	{
329 		.name               = "ntsvcs_getdevregprop",
330 		.returntype         = RPC_RTYPE_WERROR,
331 		.ntfn               = NULL,
332 		.wfn                = cmd_ntsvcs_get_dev_reg_prop,
333 		.table              = &ndr_table_ntsvcs,
334 		.rpc_pipe           = NULL,
335 		.description        = "Query NTSVCS device registry property",
336 		.usage              = "",
337 	},
338 	{
339 		.name               = "ntsvcs_getdevlistsize",
340 		.returntype         = RPC_RTYPE_WERROR,
341 		.ntfn               = NULL,
342 		.wfn                = cmd_ntsvcs_get_dev_list_size,
343 		.table              = &ndr_table_ntsvcs,
344 		.rpc_pipe           = NULL,
345 		.description        = "Query NTSVCS device list size",
346 		.usage              = "",
347 	},
348 	{
349 		.name               = "ntsvcs_getdevlist",
350 		.returntype         = RPC_RTYPE_WERROR,
351 		.ntfn               = NULL,
352 		.wfn                = cmd_ntsvcs_get_dev_list,
353 		.table              = &ndr_table_ntsvcs,
354 		.rpc_pipe           = NULL,
355 		.description        = "Query NTSVCS device list",
356 		.usage              = "",
357 	},
358 	{
359 		.name = NULL,
360 	},
361 };
362