2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
5 * Copyright (C) Gerald (Jerry) Carter 2005.
6 * Copyright (C) Guenther Deschner 2008,2009.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, see <http://www.gnu.org/licenses/>.
23 #include "../librpc/gen_ndr/srv_ntsvcs.h"
26 #define DBGC_CLASS DBGC_RPC_SRV
28 /********************************************************************
29 ********************************************************************/
31 static char* get_device_path(TALLOC_CTX
*mem_ctx
, const char *device
)
33 return talloc_asprintf(mem_ctx
, "ROOT\\Legacy_%s\\0000", device
);
36 /********************************************************************
37 ********************************************************************/
39 WERROR
_PNP_GetVersion(struct pipes_struct
*p
,
40 struct PNP_GetVersion
*r
)
42 *r
->out
.version
= 0x0400; /* no idea what this means */
47 /********************************************************************
48 ********************************************************************/
50 WERROR
_PNP_GetDeviceListSize(struct pipes_struct
*p
,
51 struct PNP_GetDeviceListSize
*r
)
55 if ((r
->in
.flags
& CM_GETIDLIST_FILTER_SERVICE
) &&
56 (!r
->in
.devicename
)) {
57 return WERR_CM_INVALID_POINTER
;
60 if (!(devicepath
= get_device_path(p
->mem_ctx
, r
->in
.devicename
))) {
64 *r
->out
.size
= strlen(devicepath
) + 2;
66 TALLOC_FREE(devicepath
);
71 /****************************************************************
73 ****************************************************************/
75 WERROR
_PNP_GetDeviceList(struct pipes_struct
*p
,
76 struct PNP_GetDeviceList
*r
)
80 const char **multi_sz
= NULL
;
83 if ((r
->in
.flags
& CM_GETIDLIST_FILTER_SERVICE
) &&
85 return WERR_CM_INVALID_POINTER
;
88 if (!(devicepath
= get_device_path(p
->mem_ctx
, r
->in
.filter
))) {
92 size
= strlen(devicepath
) + 2;
94 if (*r
->in
.length
< size
) {
95 return WERR_CM_BUFFER_SMALL
;
98 multi_sz
= talloc_zero_array(p
->mem_ctx
, const char *, 2);
103 multi_sz
[0] = devicepath
;
105 if (!push_reg_multi_sz(multi_sz
, &blob
, multi_sz
)) {
109 if (*r
->in
.length
< blob
.length
/2) {
110 return WERR_CM_BUFFER_SMALL
;
113 memcpy(r
->out
.buffer
, blob
.data
, blob
.length
);
118 /********************************************************************
119 _PNP_GetDeviceRegProp
120 ********************************************************************/
122 WERROR
_PNP_GetDeviceRegProp(struct pipes_struct
*p
,
123 struct PNP_GetDeviceRegProp
*r
)
128 TALLOC_CTX
*mem_ctx
= NULL
;
130 switch( r
->in
.property
) {
131 case DEV_REGPROP_DESC
:
133 /* just parse the service name from the device path and then
134 lookup the display name */
135 if ( !(ptr
= strrchr_m( r
->in
.devicepath
, '\\' )) )
136 return WERR_GENERAL_FAILURE
;
139 if ( !(ptr
= strrchr_m( r
->in
.devicepath
, '_' )) )
140 return WERR_GENERAL_FAILURE
;
143 mem_ctx
= talloc_stackframe();
145 result
= svcctl_lookup_dispname(mem_ctx
, ptr
, p
->server_info
->ptok
);
146 if (result
== NULL
) {
147 return WERR_GENERAL_FAILURE
;
150 if (!push_reg_sz(mem_ctx
, &blob
, result
)) {
151 talloc_free(mem_ctx
);
152 return WERR_GENERAL_FAILURE
;
155 if (*r
->in
.buffer_size
< blob
.length
) {
156 *r
->out
.needed
= blob
.length
;
157 *r
->out
.buffer_size
= 0;
158 talloc_free(mem_ctx
);
159 return WERR_CM_BUFFER_SMALL
;
162 r
->out
.buffer
= (uint8_t *)talloc_memdup(p
->mem_ctx
, blob
.data
, blob
.length
);
163 talloc_free(mem_ctx
);
164 if (!r
->out
.buffer
) {
168 *r
->out
.reg_data_type
= REG_SZ
; /* always 1...tested using a remove device manager connection */
169 *r
->out
.buffer_size
= blob
.length
;
170 *r
->out
.needed
= blob
.length
;
175 *r
->out
.reg_data_type
= 0x00437c98; /* ??? */
176 return WERR_CM_NO_SUCH_VALUE
;
182 /********************************************************************
183 ********************************************************************/
185 WERROR
_PNP_ValidateDeviceInstance(struct pipes_struct
*p
,
186 struct PNP_ValidateDeviceInstance
*r
)
192 /********************************************************************
193 ********************************************************************/
195 WERROR
_PNP_GetHwProfInfo(struct pipes_struct
*p
,
196 struct PNP_GetHwProfInfo
*r
)
198 /* steal the incoming buffer */
200 r
->out
.info
= r
->in
.info
;
202 /* Take the 5th Ammentment */
204 return WERR_CM_NO_MORE_HW_PROFILES
;
207 /********************************************************************
208 ********************************************************************/
210 WERROR
_PNP_HwProfFlags(struct pipes_struct
*p
,
211 struct PNP_HwProfFlags
*r
)
213 /* just nod your head */
218 /****************************************************************
219 ****************************************************************/
221 WERROR
_PNP_Disconnect(struct pipes_struct
*p
,
222 struct PNP_Disconnect
*r
)
224 p
->rng_fault_state
= true;
225 return WERR_NOT_SUPPORTED
;
228 /****************************************************************
229 ****************************************************************/
231 WERROR
_PNP_Connect(struct pipes_struct
*p
,
232 struct PNP_Connect
*r
)
234 p
->rng_fault_state
= true;
235 return WERR_NOT_SUPPORTED
;
238 /****************************************************************
239 ****************************************************************/
241 WERROR
_PNP_GetGlobalState(struct pipes_struct
*p
,
242 struct PNP_GetGlobalState
*r
)
244 p
->rng_fault_state
= true;
245 return WERR_NOT_SUPPORTED
;
248 /****************************************************************
249 ****************************************************************/
251 WERROR
_PNP_InitDetection(struct pipes_struct
*p
,
252 struct PNP_InitDetection
*r
)
254 p
->rng_fault_state
= true;
255 return WERR_NOT_SUPPORTED
;
258 /****************************************************************
259 ****************************************************************/
261 WERROR
_PNP_ReportLogOn(struct pipes_struct
*p
,
262 struct PNP_ReportLogOn
*r
)
264 p
->rng_fault_state
= true;
265 return WERR_NOT_SUPPORTED
;
268 /****************************************************************
269 ****************************************************************/
271 WERROR
_PNP_GetRootDeviceInstance(struct pipes_struct
*p
,
272 struct PNP_GetRootDeviceInstance
*r
)
274 p
->rng_fault_state
= true;
275 return WERR_NOT_SUPPORTED
;
278 /****************************************************************
279 ****************************************************************/
281 WERROR
_PNP_GetRelatedDeviceInstance(struct pipes_struct
*p
,
282 struct PNP_GetRelatedDeviceInstance
*r
)
284 p
->rng_fault_state
= true;
285 return WERR_NOT_SUPPORTED
;
288 /****************************************************************
289 ****************************************************************/
291 WERROR
_PNP_EnumerateSubKeys(struct pipes_struct
*p
,
292 struct PNP_EnumerateSubKeys
*r
)
294 p
->rng_fault_state
= true;
295 return WERR_NOT_SUPPORTED
;
298 /****************************************************************
299 ****************************************************************/
301 WERROR
_PNP_GetDepth(struct pipes_struct
*p
,
302 struct PNP_GetDepth
*r
)
304 p
->rng_fault_state
= true;
305 return WERR_NOT_SUPPORTED
;
308 /****************************************************************
309 ****************************************************************/
311 WERROR
_PNP_SetDeviceRegProp(struct pipes_struct
*p
,
312 struct PNP_SetDeviceRegProp
*r
)
314 p
->rng_fault_state
= true;
315 return WERR_NOT_SUPPORTED
;
318 /****************************************************************
319 ****************************************************************/
321 WERROR
_PNP_GetClassInstance(struct pipes_struct
*p
,
322 struct PNP_GetClassInstance
*r
)
324 p
->rng_fault_state
= true;
325 return WERR_NOT_SUPPORTED
;
328 /****************************************************************
329 ****************************************************************/
331 WERROR
_PNP_CreateKey(struct pipes_struct
*p
,
332 struct PNP_CreateKey
*r
)
334 p
->rng_fault_state
= true;
335 return WERR_NOT_SUPPORTED
;
338 /****************************************************************
339 ****************************************************************/
341 WERROR
_PNP_DeleteRegistryKey(struct pipes_struct
*p
,
342 struct PNP_DeleteRegistryKey
*r
)
344 p
->rng_fault_state
= true;
345 return WERR_NOT_SUPPORTED
;
348 /****************************************************************
349 ****************************************************************/
351 WERROR
_PNP_GetClassCount(struct pipes_struct
*p
,
352 struct PNP_GetClassCount
*r
)
354 p
->rng_fault_state
= true;
355 return WERR_NOT_SUPPORTED
;
358 /****************************************************************
359 ****************************************************************/
361 WERROR
_PNP_GetClassName(struct pipes_struct
*p
,
362 struct PNP_GetClassName
*r
)
364 p
->rng_fault_state
= true;
365 return WERR_NOT_SUPPORTED
;
368 /****************************************************************
369 ****************************************************************/
371 WERROR
_PNP_DeleteClassKey(struct pipes_struct
*p
,
372 struct PNP_DeleteClassKey
*r
)
374 p
->rng_fault_state
= true;
375 return WERR_NOT_SUPPORTED
;
378 /****************************************************************
379 ****************************************************************/
381 WERROR
_PNP_GetInterfaceDeviceAlias(struct pipes_struct
*p
,
382 struct PNP_GetInterfaceDeviceAlias
*r
)
384 p
->rng_fault_state
= true;
385 return WERR_NOT_SUPPORTED
;
388 /****************************************************************
389 ****************************************************************/
391 WERROR
_PNP_GetInterfaceDeviceList(struct pipes_struct
*p
,
392 struct PNP_GetInterfaceDeviceList
*r
)
394 p
->rng_fault_state
= true;
395 return WERR_NOT_SUPPORTED
;
398 /****************************************************************
399 ****************************************************************/
401 WERROR
_PNP_GetInterfaceDeviceListSize(struct pipes_struct
*p
,
402 struct PNP_GetInterfaceDeviceListSize
*r
)
404 p
->rng_fault_state
= true;
405 return WERR_NOT_SUPPORTED
;
408 /****************************************************************
409 ****************************************************************/
411 WERROR
_PNP_RegisterDeviceClassAssociation(struct pipes_struct
*p
,
412 struct PNP_RegisterDeviceClassAssociation
*r
)
414 p
->rng_fault_state
= true;
415 return WERR_NOT_SUPPORTED
;
418 /****************************************************************
419 ****************************************************************/
421 WERROR
_PNP_UnregisterDeviceClassAssociation(struct pipes_struct
*p
,
422 struct PNP_UnregisterDeviceClassAssociation
*r
)
424 p
->rng_fault_state
= true;
425 return WERR_NOT_SUPPORTED
;
428 /****************************************************************
429 ****************************************************************/
431 WERROR
_PNP_GetClassRegProp(struct pipes_struct
*p
,
432 struct PNP_GetClassRegProp
*r
)
434 p
->rng_fault_state
= true;
435 return WERR_NOT_SUPPORTED
;
438 /****************************************************************
439 ****************************************************************/
441 WERROR
_PNP_SetClassRegProp(struct pipes_struct
*p
,
442 struct PNP_SetClassRegProp
*r
)
444 p
->rng_fault_state
= true;
445 return WERR_NOT_SUPPORTED
;
448 /****************************************************************
449 ****************************************************************/
451 WERROR
_PNP_CreateDevInst(struct pipes_struct
*p
,
452 struct PNP_CreateDevInst
*r
)
454 p
->rng_fault_state
= true;
455 return WERR_NOT_SUPPORTED
;
458 /****************************************************************
459 ****************************************************************/
461 WERROR
_PNP_DeviceInstanceAction(struct pipes_struct
*p
,
462 struct PNP_DeviceInstanceAction
*r
)
464 p
->rng_fault_state
= true;
465 return WERR_NOT_SUPPORTED
;
468 /****************************************************************
469 ****************************************************************/
471 WERROR
_PNP_GetDeviceStatus(struct pipes_struct
*p
,
472 struct PNP_GetDeviceStatus
*r
)
474 p
->rng_fault_state
= true;
475 return WERR_NOT_SUPPORTED
;
478 /****************************************************************
479 ****************************************************************/
481 WERROR
_PNP_SetDeviceProblem(struct pipes_struct
*p
,
482 struct PNP_SetDeviceProblem
*r
)
484 p
->rng_fault_state
= true;
485 return WERR_NOT_SUPPORTED
;
488 /****************************************************************
489 ****************************************************************/
491 WERROR
_PNP_DisableDevInst(struct pipes_struct
*p
,
492 struct PNP_DisableDevInst
*r
)
494 p
->rng_fault_state
= true;
495 return WERR_NOT_SUPPORTED
;
498 /****************************************************************
499 ****************************************************************/
501 WERROR
_PNP_UninstallDevInst(struct pipes_struct
*p
,
502 struct PNP_UninstallDevInst
*r
)
504 p
->rng_fault_state
= true;
505 return WERR_NOT_SUPPORTED
;
508 /****************************************************************
509 ****************************************************************/
511 WERROR
_PNP_AddID(struct pipes_struct
*p
,
514 p
->rng_fault_state
= true;
515 return WERR_NOT_SUPPORTED
;
518 /****************************************************************
519 ****************************************************************/
521 WERROR
_PNP_RegisterDriver(struct pipes_struct
*p
,
522 struct PNP_RegisterDriver
*r
)
524 p
->rng_fault_state
= true;
525 return WERR_NOT_SUPPORTED
;
528 /****************************************************************
529 ****************************************************************/
531 WERROR
_PNP_QueryRemove(struct pipes_struct
*p
,
532 struct PNP_QueryRemove
*r
)
534 p
->rng_fault_state
= true;
535 return WERR_NOT_SUPPORTED
;
538 /****************************************************************
539 ****************************************************************/
541 WERROR
_PNP_RequestDeviceEject(struct pipes_struct
*p
,
542 struct PNP_RequestDeviceEject
*r
)
544 p
->rng_fault_state
= true;
545 return WERR_NOT_SUPPORTED
;
548 /****************************************************************
549 ****************************************************************/
551 WERROR
_PNP_IsDockStationPresent(struct pipes_struct
*p
,
552 struct PNP_IsDockStationPresent
*r
)
554 p
->rng_fault_state
= true;
555 return WERR_NOT_SUPPORTED
;
558 /****************************************************************
559 ****************************************************************/
561 WERROR
_PNP_RequestEjectPC(struct pipes_struct
*p
,
562 struct PNP_RequestEjectPC
*r
)
564 p
->rng_fault_state
= true;
565 return WERR_NOT_SUPPORTED
;
568 /****************************************************************
569 ****************************************************************/
571 WERROR
_PNP_AddEmptyLogConf(struct pipes_struct
*p
,
572 struct PNP_AddEmptyLogConf
*r
)
574 p
->rng_fault_state
= true;
575 return WERR_NOT_SUPPORTED
;
578 /****************************************************************
579 ****************************************************************/
581 WERROR
_PNP_FreeLogConf(struct pipes_struct
*p
,
582 struct PNP_FreeLogConf
*r
)
584 p
->rng_fault_state
= true;
585 return WERR_NOT_SUPPORTED
;
588 /****************************************************************
589 ****************************************************************/
591 WERROR
_PNP_GetFirstLogConf(struct pipes_struct
*p
,
592 struct PNP_GetFirstLogConf
*r
)
594 p
->rng_fault_state
= true;
595 return WERR_NOT_SUPPORTED
;
598 /****************************************************************
599 ****************************************************************/
601 WERROR
_PNP_GetNextLogConf(struct pipes_struct
*p
,
602 struct PNP_GetNextLogConf
*r
)
604 p
->rng_fault_state
= true;
605 return WERR_NOT_SUPPORTED
;
608 /****************************************************************
609 ****************************************************************/
611 WERROR
_PNP_GetLogConfPriority(struct pipes_struct
*p
,
612 struct PNP_GetLogConfPriority
*r
)
614 p
->rng_fault_state
= true;
615 return WERR_NOT_SUPPORTED
;
618 /****************************************************************
619 ****************************************************************/
621 WERROR
_PNP_AddResDes(struct pipes_struct
*p
,
622 struct PNP_AddResDes
*r
)
624 p
->rng_fault_state
= true;
625 return WERR_NOT_SUPPORTED
;
628 /****************************************************************
629 ****************************************************************/
631 WERROR
_PNP_FreeResDes(struct pipes_struct
*p
,
632 struct PNP_FreeResDes
*r
)
634 p
->rng_fault_state
= true;
635 return WERR_NOT_SUPPORTED
;
638 /****************************************************************
639 ****************************************************************/
641 WERROR
_PNP_GetNextResDes(struct pipes_struct
*p
,
642 struct PNP_GetNextResDes
*r
)
644 p
->rng_fault_state
= true;
645 return WERR_NOT_SUPPORTED
;
648 /****************************************************************
649 ****************************************************************/
651 WERROR
_PNP_GetResDesData(struct pipes_struct
*p
,
652 struct PNP_GetResDesData
*r
)
654 p
->rng_fault_state
= true;
655 return WERR_NOT_SUPPORTED
;
658 /****************************************************************
659 ****************************************************************/
661 WERROR
_PNP_GetResDesDataSize(struct pipes_struct
*p
,
662 struct PNP_GetResDesDataSize
*r
)
664 p
->rng_fault_state
= true;
665 return WERR_NOT_SUPPORTED
;
668 /****************************************************************
669 ****************************************************************/
671 WERROR
_PNP_ModifyResDes(struct pipes_struct
*p
,
672 struct PNP_ModifyResDes
*r
)
674 p
->rng_fault_state
= true;
675 return WERR_NOT_SUPPORTED
;
678 /****************************************************************
679 ****************************************************************/
681 WERROR
_PNP_DetectResourceLimit(struct pipes_struct
*p
,
682 struct PNP_DetectResourceLimit
*r
)
684 p
->rng_fault_state
= true;
685 return WERR_NOT_SUPPORTED
;
688 /****************************************************************
689 ****************************************************************/
691 WERROR
_PNP_QueryResConfList(struct pipes_struct
*p
,
692 struct PNP_QueryResConfList
*r
)
694 p
->rng_fault_state
= true;
695 return WERR_NOT_SUPPORTED
;
698 /****************************************************************
699 ****************************************************************/
701 WERROR
_PNP_SetHwProf(struct pipes_struct
*p
,
702 struct PNP_SetHwProf
*r
)
704 p
->rng_fault_state
= true;
705 return WERR_NOT_SUPPORTED
;
708 /****************************************************************
709 ****************************************************************/
711 WERROR
_PNP_QueryArbitratorFreeData(struct pipes_struct
*p
,
712 struct PNP_QueryArbitratorFreeData
*r
)
714 p
->rng_fault_state
= true;
715 return WERR_NOT_SUPPORTED
;
718 /****************************************************************
719 ****************************************************************/
721 WERROR
_PNP_QueryArbitratorFreeSize(struct pipes_struct
*p
,
722 struct PNP_QueryArbitratorFreeSize
*r
)
724 p
->rng_fault_state
= true;
725 return WERR_NOT_SUPPORTED
;
728 /****************************************************************
729 ****************************************************************/
731 WERROR
_PNP_RunDetection(struct pipes_struct
*p
,
732 struct PNP_RunDetection
*r
)
734 p
->rng_fault_state
= true;
735 return WERR_NOT_SUPPORTED
;
738 /****************************************************************
739 ****************************************************************/
741 WERROR
_PNP_RegisterNotification(struct pipes_struct
*p
,
742 struct PNP_RegisterNotification
*r
)
744 p
->rng_fault_state
= true;
745 return WERR_NOT_SUPPORTED
;
748 /****************************************************************
749 ****************************************************************/
751 WERROR
_PNP_UnregisterNotification(struct pipes_struct
*p
,
752 struct PNP_UnregisterNotification
*r
)
754 p
->rng_fault_state
= true;
755 return WERR_NOT_SUPPORTED
;
758 /****************************************************************
759 ****************************************************************/
761 WERROR
_PNP_GetCustomDevProp(struct pipes_struct
*p
,
762 struct PNP_GetCustomDevProp
*r
)
764 p
->rng_fault_state
= true;
765 return WERR_NOT_SUPPORTED
;
768 /****************************************************************
769 ****************************************************************/
771 WERROR
_PNP_GetVersionInternal(struct pipes_struct
*p
,
772 struct PNP_GetVersionInternal
*r
)
774 p
->rng_fault_state
= true;
775 return WERR_NOT_SUPPORTED
;
778 /****************************************************************
779 ****************************************************************/
781 WERROR
_PNP_GetBlockedDriverInfo(struct pipes_struct
*p
,
782 struct PNP_GetBlockedDriverInfo
*r
)
784 p
->rng_fault_state
= true;
785 return WERR_NOT_SUPPORTED
;
788 /****************************************************************
789 ****************************************************************/
791 WERROR
_PNP_GetServerSideDeviceInstallFlags(struct pipes_struct
*p
,
792 struct PNP_GetServerSideDeviceInstallFlags
*r
)
794 p
->rng_fault_state
= true;
795 return WERR_NOT_SUPPORTED
;