2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
5 * Copyright (C) Gerald (Jerry) Carter 2005.
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.
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.
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/>.
24 #define DBGC_CLASS DBGC_RPC_SRV
26 /********************************************************************
27 ********************************************************************/
29 static char* get_device_path(TALLOC_CTX
*mem_ctx
, const char *device
)
31 return talloc_asprintf(mem_ctx
, "ROOT\\Legacy_%s\\0000", device
);
34 /********************************************************************
35 ********************************************************************/
37 WERROR
_PNP_GetVersion(pipes_struct
*p
,
38 struct PNP_GetVersion
*r
)
40 *r
->out
.version
= 0x0400; /* no idea what this means */
45 /********************************************************************
46 ********************************************************************/
48 WERROR
_PNP_GetDeviceListSize(pipes_struct
*p
,
49 struct PNP_GetDeviceListSize
*r
)
53 if (!r
->in
.devicename
) {
54 return WERR_ACCESS_DENIED
;
57 if (!(devicepath
= get_device_path(p
->mem_ctx
, r
->in
.devicename
))) {
61 *r
->out
.size
= strlen(devicepath
) + 2;
63 TALLOC_FREE(devicepath
);
68 /****************************************************************
70 ****************************************************************/
72 WERROR
_PNP_GetDeviceList(pipes_struct
*p
,
73 struct PNP_GetDeviceList
*r
)
79 struct lsa_StringLarge s
;
80 enum ndr_err_code ndr_err
;
83 return WERR_ACCESS_DENIED
;
85 if (!(devicepath
= get_device_path(p
->mem_ctx
, r
->in
.filter
))) {
89 size
= strlen(devicepath
) + 2;
91 if (*r
->in
.length
< size
) {
92 return WERR_CM_BUFFER_SMALL
;
95 s
.string
= r
->in
.filter
;
97 /* This has to be DOUBLE NULL terminated */
98 ndr_err
= ndr_push_struct_blob(&blob
, p
->mem_ctx
, NULL
, &s
,
99 (ndr_push_flags_fn_t
)ndr_push_lsa_StringLarge
);
100 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
101 return ntstatus_to_werror(ndr_map_error2ntstatus(ndr_err
));
104 r
->out
.buffer
= (uint16_t *)talloc_memdup(p
->mem_ctx
, blob
.data
, blob
.length
);
105 if (!r
->out
.buffer
) {
112 /********************************************************************
113 _PNP_GetDeviceRegProp
114 ********************************************************************/
116 WERROR
_PNP_GetDeviceRegProp(pipes_struct
*p
,
117 struct PNP_GetDeviceRegProp
*r
)
123 switch( r
->in
.property
) {
124 case DEV_REGPROP_DESC
:
126 /* just parse the service name from the device path and then
127 lookup the display name */
128 if ( !(ptr
= strrchr_m( r
->in
.devicepath
, '\\' )) )
129 return WERR_GENERAL_FAILURE
;
132 if ( !(ptr
= strrchr_m( r
->in
.devicepath
, '_' )) )
133 return WERR_GENERAL_FAILURE
;
136 if ( !(values
= svcctl_fetch_regvalues(
137 ptr
, p
->server_info
->ptok
)))
138 return WERR_GENERAL_FAILURE
;
140 if ( !(val
= regval_ctr_getvalue( values
, "DisplayName" )) ) {
141 TALLOC_FREE( values
);
142 return WERR_GENERAL_FAILURE
;
145 if (*r
->in
.buffer_size
< val
->size
) {
146 *r
->out
.needed
= val
->size
;
147 *r
->out
.buffer_size
= 0;
148 TALLOC_FREE( values
);
149 return WERR_CM_BUFFER_SMALL
;
152 r
->out
.buffer
= (uint8_t *)talloc_memdup(p
->mem_ctx
, val
->data_p
, val
->size
);
154 if (!r
->out
.buffer
) {
158 *r
->out
.reg_data_type
= REG_SZ
; /* always 1...tested using a remove device manager connection */
159 *r
->out
.buffer_size
= val
->size
;
160 *r
->out
.needed
= val
->size
;
165 *r
->out
.reg_data_type
= 0x00437c98; /* ??? */
166 return WERR_CM_NO_SUCH_VALUE
;
172 /********************************************************************
173 ********************************************************************/
175 WERROR
_PNP_ValidateDeviceInstance(pipes_struct
*p
,
176 struct PNP_ValidateDeviceInstance
*r
)
182 /********************************************************************
183 ********************************************************************/
185 WERROR
_PNP_GetHwProfInfo(pipes_struct
*p
,
186 struct PNP_GetHwProfInfo
*r
)
188 /* steal the incoming buffer */
190 r
->out
.info
= r
->in
.info
;
192 /* Take the 5th Ammentment */
194 return WERR_CM_NO_MORE_HW_PROFILES
;
197 /********************************************************************
198 ********************************************************************/
200 WERROR
_PNP_HwProfFlags(pipes_struct
*p
,
201 struct PNP_HwProfFlags
*r
)
203 /* just nod your head */
208 /****************************************************************
209 ****************************************************************/
211 WERROR
_PNP_Disconnect(pipes_struct
*p
,
212 struct PNP_Disconnect
*r
)
214 p
->rng_fault_state
= true;
215 return WERR_NOT_SUPPORTED
;
218 /****************************************************************
219 ****************************************************************/
221 WERROR
_PNP_Connect(pipes_struct
*p
,
222 struct PNP_Connect
*r
)
224 p
->rng_fault_state
= true;
225 return WERR_NOT_SUPPORTED
;
228 /****************************************************************
229 ****************************************************************/
231 WERROR
_PNP_GetGlobalState(pipes_struct
*p
,
232 struct PNP_GetGlobalState
*r
)
234 p
->rng_fault_state
= true;
235 return WERR_NOT_SUPPORTED
;
238 /****************************************************************
239 ****************************************************************/
241 WERROR
_PNP_InitDetection(pipes_struct
*p
,
242 struct PNP_InitDetection
*r
)
244 p
->rng_fault_state
= true;
245 return WERR_NOT_SUPPORTED
;
248 /****************************************************************
249 ****************************************************************/
251 WERROR
_PNP_ReportLogOn(pipes_struct
*p
,
252 struct PNP_ReportLogOn
*r
)
254 p
->rng_fault_state
= true;
255 return WERR_NOT_SUPPORTED
;
258 /****************************************************************
259 ****************************************************************/
261 WERROR
_PNP_GetRootDeviceInstance(pipes_struct
*p
,
262 struct PNP_GetRootDeviceInstance
*r
)
264 p
->rng_fault_state
= true;
265 return WERR_NOT_SUPPORTED
;
268 /****************************************************************
269 ****************************************************************/
271 WERROR
_PNP_GetRelatedDeviceInstance(pipes_struct
*p
,
272 struct PNP_GetRelatedDeviceInstance
*r
)
274 p
->rng_fault_state
= true;
275 return WERR_NOT_SUPPORTED
;
278 /****************************************************************
279 ****************************************************************/
281 WERROR
_PNP_EnumerateSubKeys(pipes_struct
*p
,
282 struct PNP_EnumerateSubKeys
*r
)
284 p
->rng_fault_state
= true;
285 return WERR_NOT_SUPPORTED
;
288 /****************************************************************
289 ****************************************************************/
291 WERROR
_PNP_GetDepth(pipes_struct
*p
,
292 struct PNP_GetDepth
*r
)
294 p
->rng_fault_state
= true;
295 return WERR_NOT_SUPPORTED
;
298 /****************************************************************
299 ****************************************************************/
301 WERROR
_PNP_SetDeviceRegProp(pipes_struct
*p
,
302 struct PNP_SetDeviceRegProp
*r
)
304 p
->rng_fault_state
= true;
305 return WERR_NOT_SUPPORTED
;
308 /****************************************************************
309 ****************************************************************/
311 WERROR
_PNP_GetClassInstance(pipes_struct
*p
,
312 struct PNP_GetClassInstance
*r
)
314 p
->rng_fault_state
= true;
315 return WERR_NOT_SUPPORTED
;
318 /****************************************************************
319 ****************************************************************/
321 WERROR
_PNP_CreateKey(pipes_struct
*p
,
322 struct PNP_CreateKey
*r
)
324 p
->rng_fault_state
= true;
325 return WERR_NOT_SUPPORTED
;
328 /****************************************************************
329 ****************************************************************/
331 WERROR
_PNP_DeleteRegistryKey(pipes_struct
*p
,
332 struct PNP_DeleteRegistryKey
*r
)
334 p
->rng_fault_state
= true;
335 return WERR_NOT_SUPPORTED
;
338 /****************************************************************
339 ****************************************************************/
341 WERROR
_PNP_GetClassCount(pipes_struct
*p
,
342 struct PNP_GetClassCount
*r
)
344 p
->rng_fault_state
= true;
345 return WERR_NOT_SUPPORTED
;
348 /****************************************************************
349 ****************************************************************/
351 WERROR
_PNP_GetClassName(pipes_struct
*p
,
352 struct PNP_GetClassName
*r
)
354 p
->rng_fault_state
= true;
355 return WERR_NOT_SUPPORTED
;
358 /****************************************************************
359 ****************************************************************/
361 WERROR
_PNP_DeleteClassKey(pipes_struct
*p
,
362 struct PNP_DeleteClassKey
*r
)
364 p
->rng_fault_state
= true;
365 return WERR_NOT_SUPPORTED
;
368 /****************************************************************
369 ****************************************************************/
371 WERROR
_PNP_GetInterfaceDeviceAlias(pipes_struct
*p
,
372 struct PNP_GetInterfaceDeviceAlias
*r
)
374 p
->rng_fault_state
= true;
375 return WERR_NOT_SUPPORTED
;
378 /****************************************************************
379 ****************************************************************/
381 WERROR
_PNP_GetInterfaceDeviceList(pipes_struct
*p
,
382 struct PNP_GetInterfaceDeviceList
*r
)
384 p
->rng_fault_state
= true;
385 return WERR_NOT_SUPPORTED
;
388 /****************************************************************
389 ****************************************************************/
391 WERROR
_PNP_GetInterfaceDeviceListSize(pipes_struct
*p
,
392 struct PNP_GetInterfaceDeviceListSize
*r
)
394 p
->rng_fault_state
= true;
395 return WERR_NOT_SUPPORTED
;
398 /****************************************************************
399 ****************************************************************/
401 WERROR
_PNP_RegisterDeviceClassAssociation(pipes_struct
*p
,
402 struct PNP_RegisterDeviceClassAssociation
*r
)
404 p
->rng_fault_state
= true;
405 return WERR_NOT_SUPPORTED
;
408 /****************************************************************
409 ****************************************************************/
411 WERROR
_PNP_UnregisterDeviceClassAssociation(pipes_struct
*p
,
412 struct PNP_UnregisterDeviceClassAssociation
*r
)
414 p
->rng_fault_state
= true;
415 return WERR_NOT_SUPPORTED
;
418 /****************************************************************
419 ****************************************************************/
421 WERROR
_PNP_GetClassRegProp(pipes_struct
*p
,
422 struct PNP_GetClassRegProp
*r
)
424 p
->rng_fault_state
= true;
425 return WERR_NOT_SUPPORTED
;
428 /****************************************************************
429 ****************************************************************/
431 WERROR
_PNP_SetClassRegProp(pipes_struct
*p
,
432 struct PNP_SetClassRegProp
*r
)
434 p
->rng_fault_state
= true;
435 return WERR_NOT_SUPPORTED
;
438 /****************************************************************
439 ****************************************************************/
441 WERROR
_PNP_CreateDevInst(pipes_struct
*p
,
442 struct PNP_CreateDevInst
*r
)
444 p
->rng_fault_state
= true;
445 return WERR_NOT_SUPPORTED
;
448 /****************************************************************
449 ****************************************************************/
451 WERROR
_PNP_DeviceInstanceAction(pipes_struct
*p
,
452 struct PNP_DeviceInstanceAction
*r
)
454 p
->rng_fault_state
= true;
455 return WERR_NOT_SUPPORTED
;
458 /****************************************************************
459 ****************************************************************/
461 WERROR
_PNP_GetDeviceStatus(pipes_struct
*p
,
462 struct PNP_GetDeviceStatus
*r
)
464 p
->rng_fault_state
= true;
465 return WERR_NOT_SUPPORTED
;
468 /****************************************************************
469 ****************************************************************/
471 WERROR
_PNP_SetDeviceProblem(pipes_struct
*p
,
472 struct PNP_SetDeviceProblem
*r
)
474 p
->rng_fault_state
= true;
475 return WERR_NOT_SUPPORTED
;
478 /****************************************************************
479 ****************************************************************/
481 WERROR
_PNP_DisableDevInst(pipes_struct
*p
,
482 struct PNP_DisableDevInst
*r
)
484 p
->rng_fault_state
= true;
485 return WERR_NOT_SUPPORTED
;
488 /****************************************************************
489 ****************************************************************/
491 WERROR
_PNP_UninstallDevInst(pipes_struct
*p
,
492 struct PNP_UninstallDevInst
*r
)
494 p
->rng_fault_state
= true;
495 return WERR_NOT_SUPPORTED
;
498 /****************************************************************
499 ****************************************************************/
501 WERROR
_PNP_AddID(pipes_struct
*p
,
504 p
->rng_fault_state
= true;
505 return WERR_NOT_SUPPORTED
;
508 /****************************************************************
509 ****************************************************************/
511 WERROR
_PNP_RegisterDriver(pipes_struct
*p
,
512 struct PNP_RegisterDriver
*r
)
514 p
->rng_fault_state
= true;
515 return WERR_NOT_SUPPORTED
;
518 /****************************************************************
519 ****************************************************************/
521 WERROR
_PNP_QueryRemove(pipes_struct
*p
,
522 struct PNP_QueryRemove
*r
)
524 p
->rng_fault_state
= true;
525 return WERR_NOT_SUPPORTED
;
528 /****************************************************************
529 ****************************************************************/
531 WERROR
_PNP_RequestDeviceEject(pipes_struct
*p
,
532 struct PNP_RequestDeviceEject
*r
)
534 p
->rng_fault_state
= true;
535 return WERR_NOT_SUPPORTED
;
538 /****************************************************************
539 ****************************************************************/
541 WERROR
_PNP_IsDockStationPresent(pipes_struct
*p
,
542 struct PNP_IsDockStationPresent
*r
)
544 p
->rng_fault_state
= true;
545 return WERR_NOT_SUPPORTED
;
548 /****************************************************************
549 ****************************************************************/
551 WERROR
_PNP_RequestEjectPC(pipes_struct
*p
,
552 struct PNP_RequestEjectPC
*r
)
554 p
->rng_fault_state
= true;
555 return WERR_NOT_SUPPORTED
;
558 /****************************************************************
559 ****************************************************************/
561 WERROR
_PNP_AddEmptyLogConf(pipes_struct
*p
,
562 struct PNP_AddEmptyLogConf
*r
)
564 p
->rng_fault_state
= true;
565 return WERR_NOT_SUPPORTED
;
568 /****************************************************************
569 ****************************************************************/
571 WERROR
_PNP_FreeLogConf(pipes_struct
*p
,
572 struct PNP_FreeLogConf
*r
)
574 p
->rng_fault_state
= true;
575 return WERR_NOT_SUPPORTED
;
578 /****************************************************************
579 ****************************************************************/
581 WERROR
_PNP_GetFirstLogConf(pipes_struct
*p
,
582 struct PNP_GetFirstLogConf
*r
)
584 p
->rng_fault_state
= true;
585 return WERR_NOT_SUPPORTED
;
588 /****************************************************************
589 ****************************************************************/
591 WERROR
_PNP_GetNextLogConf(pipes_struct
*p
,
592 struct PNP_GetNextLogConf
*r
)
594 p
->rng_fault_state
= true;
595 return WERR_NOT_SUPPORTED
;
598 /****************************************************************
599 ****************************************************************/
601 WERROR
_PNP_GetLogConfPriority(pipes_struct
*p
,
602 struct PNP_GetLogConfPriority
*r
)
604 p
->rng_fault_state
= true;
605 return WERR_NOT_SUPPORTED
;
608 /****************************************************************
609 ****************************************************************/
611 WERROR
_PNP_AddResDes(pipes_struct
*p
,
612 struct PNP_AddResDes
*r
)
614 p
->rng_fault_state
= true;
615 return WERR_NOT_SUPPORTED
;
618 /****************************************************************
619 ****************************************************************/
621 WERROR
_PNP_FreeResDes(pipes_struct
*p
,
622 struct PNP_FreeResDes
*r
)
624 p
->rng_fault_state
= true;
625 return WERR_NOT_SUPPORTED
;
628 /****************************************************************
629 ****************************************************************/
631 WERROR
_PNP_GetNextResDes(pipes_struct
*p
,
632 struct PNP_GetNextResDes
*r
)
634 p
->rng_fault_state
= true;
635 return WERR_NOT_SUPPORTED
;
638 /****************************************************************
639 ****************************************************************/
641 WERROR
_PNP_GetResDesData(pipes_struct
*p
,
642 struct PNP_GetResDesData
*r
)
644 p
->rng_fault_state
= true;
645 return WERR_NOT_SUPPORTED
;
648 /****************************************************************
649 ****************************************************************/
651 WERROR
_PNP_GetResDesDataSize(pipes_struct
*p
,
652 struct PNP_GetResDesDataSize
*r
)
654 p
->rng_fault_state
= true;
655 return WERR_NOT_SUPPORTED
;
658 /****************************************************************
659 ****************************************************************/
661 WERROR
_PNP_ModifyResDes(pipes_struct
*p
,
662 struct PNP_ModifyResDes
*r
)
664 p
->rng_fault_state
= true;
665 return WERR_NOT_SUPPORTED
;
668 /****************************************************************
669 ****************************************************************/
671 WERROR
_PNP_DetectResourceLimit(pipes_struct
*p
,
672 struct PNP_DetectResourceLimit
*r
)
674 p
->rng_fault_state
= true;
675 return WERR_NOT_SUPPORTED
;
678 /****************************************************************
679 ****************************************************************/
681 WERROR
_PNP_QueryResConfList(pipes_struct
*p
,
682 struct PNP_QueryResConfList
*r
)
684 p
->rng_fault_state
= true;
685 return WERR_NOT_SUPPORTED
;
688 /****************************************************************
689 ****************************************************************/
691 WERROR
_PNP_SetHwProf(pipes_struct
*p
,
692 struct PNP_SetHwProf
*r
)
694 p
->rng_fault_state
= true;
695 return WERR_NOT_SUPPORTED
;
698 /****************************************************************
699 ****************************************************************/
701 WERROR
_PNP_QueryArbitratorFreeData(pipes_struct
*p
,
702 struct PNP_QueryArbitratorFreeData
*r
)
704 p
->rng_fault_state
= true;
705 return WERR_NOT_SUPPORTED
;
708 /****************************************************************
709 ****************************************************************/
711 WERROR
_PNP_QueryArbitratorFreeSize(pipes_struct
*p
,
712 struct PNP_QueryArbitratorFreeSize
*r
)
714 p
->rng_fault_state
= true;
715 return WERR_NOT_SUPPORTED
;
718 /****************************************************************
719 ****************************************************************/
721 WERROR
_PNP_RunDetection(pipes_struct
*p
,
722 struct PNP_RunDetection
*r
)
724 p
->rng_fault_state
= true;
725 return WERR_NOT_SUPPORTED
;
728 /****************************************************************
729 ****************************************************************/
731 WERROR
_PNP_RegisterNotification(pipes_struct
*p
,
732 struct PNP_RegisterNotification
*r
)
734 p
->rng_fault_state
= true;
735 return WERR_NOT_SUPPORTED
;
738 /****************************************************************
739 ****************************************************************/
741 WERROR
_PNP_UnregisterNotification(pipes_struct
*p
,
742 struct PNP_UnregisterNotification
*r
)
744 p
->rng_fault_state
= true;
745 return WERR_NOT_SUPPORTED
;
748 /****************************************************************
749 ****************************************************************/
751 WERROR
_PNP_GetCustomDevProp(pipes_struct
*p
,
752 struct PNP_GetCustomDevProp
*r
)
754 p
->rng_fault_state
= true;
755 return WERR_NOT_SUPPORTED
;
758 /****************************************************************
759 ****************************************************************/
761 WERROR
_PNP_GetVersionInternal(pipes_struct
*p
,
762 struct PNP_GetVersionInternal
*r
)
764 p
->rng_fault_state
= true;
765 return WERR_NOT_SUPPORTED
;
768 /****************************************************************
769 ****************************************************************/
771 WERROR
_PNP_GetBlockedDriverInfo(pipes_struct
*p
,
772 struct PNP_GetBlockedDriverInfo
*r
)
774 p
->rng_fault_state
= true;
775 return WERR_NOT_SUPPORTED
;
778 /****************************************************************
779 ****************************************************************/
781 WERROR
_PNP_GetServerSideDeviceInstallFlags(pipes_struct
*p
,
782 struct PNP_GetServerSideDeviceInstallFlags
*r
)
784 p
->rng_fault_state
= true;
785 return WERR_NOT_SUPPORTED
;