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(pipes_struct
*p
,
40 struct PNP_GetVersion
*r
)
42 *r
->out
.version
= 0x0400; /* no idea what this means */
47 /********************************************************************
48 ********************************************************************/
50 WERROR
_PNP_GetDeviceListSize(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(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(pipes_struct
*p
,
123 struct PNP_GetDeviceRegProp
*r
)
126 struct regval_ctr
*values
;
127 struct regval_blob
*val
;
129 switch( r
->in
.property
) {
130 case DEV_REGPROP_DESC
:
132 /* just parse the service name from the device path and then
133 lookup the display name */
134 if ( !(ptr
= strrchr_m( r
->in
.devicepath
, '\\' )) )
135 return WERR_GENERAL_FAILURE
;
138 if ( !(ptr
= strrchr_m( r
->in
.devicepath
, '_' )) )
139 return WERR_GENERAL_FAILURE
;
142 if ( !(values
= svcctl_fetch_regvalues(
143 ptr
, p
->server_info
->ptok
)))
144 return WERR_GENERAL_FAILURE
;
146 if ( !(val
= regval_ctr_getvalue( values
, "DisplayName" )) ) {
147 TALLOC_FREE( values
);
148 return WERR_GENERAL_FAILURE
;
151 if (*r
->in
.buffer_size
< val
->size
) {
152 *r
->out
.needed
= val
->size
;
153 *r
->out
.buffer_size
= 0;
154 TALLOC_FREE( values
);
155 return WERR_CM_BUFFER_SMALL
;
158 r
->out
.buffer
= (uint8_t *)talloc_memdup(p
->mem_ctx
, val
->data_p
, val
->size
);
160 if (!r
->out
.buffer
) {
164 *r
->out
.reg_data_type
= REG_SZ
; /* always 1...tested using a remove device manager connection */
165 *r
->out
.buffer_size
= val
->size
;
166 *r
->out
.needed
= val
->size
;
171 *r
->out
.reg_data_type
= 0x00437c98; /* ??? */
172 return WERR_CM_NO_SUCH_VALUE
;
178 /********************************************************************
179 ********************************************************************/
181 WERROR
_PNP_ValidateDeviceInstance(pipes_struct
*p
,
182 struct PNP_ValidateDeviceInstance
*r
)
188 /********************************************************************
189 ********************************************************************/
191 WERROR
_PNP_GetHwProfInfo(pipes_struct
*p
,
192 struct PNP_GetHwProfInfo
*r
)
194 /* steal the incoming buffer */
196 r
->out
.info
= r
->in
.info
;
198 /* Take the 5th Ammentment */
200 return WERR_CM_NO_MORE_HW_PROFILES
;
203 /********************************************************************
204 ********************************************************************/
206 WERROR
_PNP_HwProfFlags(pipes_struct
*p
,
207 struct PNP_HwProfFlags
*r
)
209 /* just nod your head */
214 /****************************************************************
215 ****************************************************************/
217 WERROR
_PNP_Disconnect(pipes_struct
*p
,
218 struct PNP_Disconnect
*r
)
220 p
->rng_fault_state
= true;
221 return WERR_NOT_SUPPORTED
;
224 /****************************************************************
225 ****************************************************************/
227 WERROR
_PNP_Connect(pipes_struct
*p
,
228 struct PNP_Connect
*r
)
230 p
->rng_fault_state
= true;
231 return WERR_NOT_SUPPORTED
;
234 /****************************************************************
235 ****************************************************************/
237 WERROR
_PNP_GetGlobalState(pipes_struct
*p
,
238 struct PNP_GetGlobalState
*r
)
240 p
->rng_fault_state
= true;
241 return WERR_NOT_SUPPORTED
;
244 /****************************************************************
245 ****************************************************************/
247 WERROR
_PNP_InitDetection(pipes_struct
*p
,
248 struct PNP_InitDetection
*r
)
250 p
->rng_fault_state
= true;
251 return WERR_NOT_SUPPORTED
;
254 /****************************************************************
255 ****************************************************************/
257 WERROR
_PNP_ReportLogOn(pipes_struct
*p
,
258 struct PNP_ReportLogOn
*r
)
260 p
->rng_fault_state
= true;
261 return WERR_NOT_SUPPORTED
;
264 /****************************************************************
265 ****************************************************************/
267 WERROR
_PNP_GetRootDeviceInstance(pipes_struct
*p
,
268 struct PNP_GetRootDeviceInstance
*r
)
270 p
->rng_fault_state
= true;
271 return WERR_NOT_SUPPORTED
;
274 /****************************************************************
275 ****************************************************************/
277 WERROR
_PNP_GetRelatedDeviceInstance(pipes_struct
*p
,
278 struct PNP_GetRelatedDeviceInstance
*r
)
280 p
->rng_fault_state
= true;
281 return WERR_NOT_SUPPORTED
;
284 /****************************************************************
285 ****************************************************************/
287 WERROR
_PNP_EnumerateSubKeys(pipes_struct
*p
,
288 struct PNP_EnumerateSubKeys
*r
)
290 p
->rng_fault_state
= true;
291 return WERR_NOT_SUPPORTED
;
294 /****************************************************************
295 ****************************************************************/
297 WERROR
_PNP_GetDepth(pipes_struct
*p
,
298 struct PNP_GetDepth
*r
)
300 p
->rng_fault_state
= true;
301 return WERR_NOT_SUPPORTED
;
304 /****************************************************************
305 ****************************************************************/
307 WERROR
_PNP_SetDeviceRegProp(pipes_struct
*p
,
308 struct PNP_SetDeviceRegProp
*r
)
310 p
->rng_fault_state
= true;
311 return WERR_NOT_SUPPORTED
;
314 /****************************************************************
315 ****************************************************************/
317 WERROR
_PNP_GetClassInstance(pipes_struct
*p
,
318 struct PNP_GetClassInstance
*r
)
320 p
->rng_fault_state
= true;
321 return WERR_NOT_SUPPORTED
;
324 /****************************************************************
325 ****************************************************************/
327 WERROR
_PNP_CreateKey(pipes_struct
*p
,
328 struct PNP_CreateKey
*r
)
330 p
->rng_fault_state
= true;
331 return WERR_NOT_SUPPORTED
;
334 /****************************************************************
335 ****************************************************************/
337 WERROR
_PNP_DeleteRegistryKey(pipes_struct
*p
,
338 struct PNP_DeleteRegistryKey
*r
)
340 p
->rng_fault_state
= true;
341 return WERR_NOT_SUPPORTED
;
344 /****************************************************************
345 ****************************************************************/
347 WERROR
_PNP_GetClassCount(pipes_struct
*p
,
348 struct PNP_GetClassCount
*r
)
350 p
->rng_fault_state
= true;
351 return WERR_NOT_SUPPORTED
;
354 /****************************************************************
355 ****************************************************************/
357 WERROR
_PNP_GetClassName(pipes_struct
*p
,
358 struct PNP_GetClassName
*r
)
360 p
->rng_fault_state
= true;
361 return WERR_NOT_SUPPORTED
;
364 /****************************************************************
365 ****************************************************************/
367 WERROR
_PNP_DeleteClassKey(pipes_struct
*p
,
368 struct PNP_DeleteClassKey
*r
)
370 p
->rng_fault_state
= true;
371 return WERR_NOT_SUPPORTED
;
374 /****************************************************************
375 ****************************************************************/
377 WERROR
_PNP_GetInterfaceDeviceAlias(pipes_struct
*p
,
378 struct PNP_GetInterfaceDeviceAlias
*r
)
380 p
->rng_fault_state
= true;
381 return WERR_NOT_SUPPORTED
;
384 /****************************************************************
385 ****************************************************************/
387 WERROR
_PNP_GetInterfaceDeviceList(pipes_struct
*p
,
388 struct PNP_GetInterfaceDeviceList
*r
)
390 p
->rng_fault_state
= true;
391 return WERR_NOT_SUPPORTED
;
394 /****************************************************************
395 ****************************************************************/
397 WERROR
_PNP_GetInterfaceDeviceListSize(pipes_struct
*p
,
398 struct PNP_GetInterfaceDeviceListSize
*r
)
400 p
->rng_fault_state
= true;
401 return WERR_NOT_SUPPORTED
;
404 /****************************************************************
405 ****************************************************************/
407 WERROR
_PNP_RegisterDeviceClassAssociation(pipes_struct
*p
,
408 struct PNP_RegisterDeviceClassAssociation
*r
)
410 p
->rng_fault_state
= true;
411 return WERR_NOT_SUPPORTED
;
414 /****************************************************************
415 ****************************************************************/
417 WERROR
_PNP_UnregisterDeviceClassAssociation(pipes_struct
*p
,
418 struct PNP_UnregisterDeviceClassAssociation
*r
)
420 p
->rng_fault_state
= true;
421 return WERR_NOT_SUPPORTED
;
424 /****************************************************************
425 ****************************************************************/
427 WERROR
_PNP_GetClassRegProp(pipes_struct
*p
,
428 struct PNP_GetClassRegProp
*r
)
430 p
->rng_fault_state
= true;
431 return WERR_NOT_SUPPORTED
;
434 /****************************************************************
435 ****************************************************************/
437 WERROR
_PNP_SetClassRegProp(pipes_struct
*p
,
438 struct PNP_SetClassRegProp
*r
)
440 p
->rng_fault_state
= true;
441 return WERR_NOT_SUPPORTED
;
444 /****************************************************************
445 ****************************************************************/
447 WERROR
_PNP_CreateDevInst(pipes_struct
*p
,
448 struct PNP_CreateDevInst
*r
)
450 p
->rng_fault_state
= true;
451 return WERR_NOT_SUPPORTED
;
454 /****************************************************************
455 ****************************************************************/
457 WERROR
_PNP_DeviceInstanceAction(pipes_struct
*p
,
458 struct PNP_DeviceInstanceAction
*r
)
460 p
->rng_fault_state
= true;
461 return WERR_NOT_SUPPORTED
;
464 /****************************************************************
465 ****************************************************************/
467 WERROR
_PNP_GetDeviceStatus(pipes_struct
*p
,
468 struct PNP_GetDeviceStatus
*r
)
470 p
->rng_fault_state
= true;
471 return WERR_NOT_SUPPORTED
;
474 /****************************************************************
475 ****************************************************************/
477 WERROR
_PNP_SetDeviceProblem(pipes_struct
*p
,
478 struct PNP_SetDeviceProblem
*r
)
480 p
->rng_fault_state
= true;
481 return WERR_NOT_SUPPORTED
;
484 /****************************************************************
485 ****************************************************************/
487 WERROR
_PNP_DisableDevInst(pipes_struct
*p
,
488 struct PNP_DisableDevInst
*r
)
490 p
->rng_fault_state
= true;
491 return WERR_NOT_SUPPORTED
;
494 /****************************************************************
495 ****************************************************************/
497 WERROR
_PNP_UninstallDevInst(pipes_struct
*p
,
498 struct PNP_UninstallDevInst
*r
)
500 p
->rng_fault_state
= true;
501 return WERR_NOT_SUPPORTED
;
504 /****************************************************************
505 ****************************************************************/
507 WERROR
_PNP_AddID(pipes_struct
*p
,
510 p
->rng_fault_state
= true;
511 return WERR_NOT_SUPPORTED
;
514 /****************************************************************
515 ****************************************************************/
517 WERROR
_PNP_RegisterDriver(pipes_struct
*p
,
518 struct PNP_RegisterDriver
*r
)
520 p
->rng_fault_state
= true;
521 return WERR_NOT_SUPPORTED
;
524 /****************************************************************
525 ****************************************************************/
527 WERROR
_PNP_QueryRemove(pipes_struct
*p
,
528 struct PNP_QueryRemove
*r
)
530 p
->rng_fault_state
= true;
531 return WERR_NOT_SUPPORTED
;
534 /****************************************************************
535 ****************************************************************/
537 WERROR
_PNP_RequestDeviceEject(pipes_struct
*p
,
538 struct PNP_RequestDeviceEject
*r
)
540 p
->rng_fault_state
= true;
541 return WERR_NOT_SUPPORTED
;
544 /****************************************************************
545 ****************************************************************/
547 WERROR
_PNP_IsDockStationPresent(pipes_struct
*p
,
548 struct PNP_IsDockStationPresent
*r
)
550 p
->rng_fault_state
= true;
551 return WERR_NOT_SUPPORTED
;
554 /****************************************************************
555 ****************************************************************/
557 WERROR
_PNP_RequestEjectPC(pipes_struct
*p
,
558 struct PNP_RequestEjectPC
*r
)
560 p
->rng_fault_state
= true;
561 return WERR_NOT_SUPPORTED
;
564 /****************************************************************
565 ****************************************************************/
567 WERROR
_PNP_AddEmptyLogConf(pipes_struct
*p
,
568 struct PNP_AddEmptyLogConf
*r
)
570 p
->rng_fault_state
= true;
571 return WERR_NOT_SUPPORTED
;
574 /****************************************************************
575 ****************************************************************/
577 WERROR
_PNP_FreeLogConf(pipes_struct
*p
,
578 struct PNP_FreeLogConf
*r
)
580 p
->rng_fault_state
= true;
581 return WERR_NOT_SUPPORTED
;
584 /****************************************************************
585 ****************************************************************/
587 WERROR
_PNP_GetFirstLogConf(pipes_struct
*p
,
588 struct PNP_GetFirstLogConf
*r
)
590 p
->rng_fault_state
= true;
591 return WERR_NOT_SUPPORTED
;
594 /****************************************************************
595 ****************************************************************/
597 WERROR
_PNP_GetNextLogConf(pipes_struct
*p
,
598 struct PNP_GetNextLogConf
*r
)
600 p
->rng_fault_state
= true;
601 return WERR_NOT_SUPPORTED
;
604 /****************************************************************
605 ****************************************************************/
607 WERROR
_PNP_GetLogConfPriority(pipes_struct
*p
,
608 struct PNP_GetLogConfPriority
*r
)
610 p
->rng_fault_state
= true;
611 return WERR_NOT_SUPPORTED
;
614 /****************************************************************
615 ****************************************************************/
617 WERROR
_PNP_AddResDes(pipes_struct
*p
,
618 struct PNP_AddResDes
*r
)
620 p
->rng_fault_state
= true;
621 return WERR_NOT_SUPPORTED
;
624 /****************************************************************
625 ****************************************************************/
627 WERROR
_PNP_FreeResDes(pipes_struct
*p
,
628 struct PNP_FreeResDes
*r
)
630 p
->rng_fault_state
= true;
631 return WERR_NOT_SUPPORTED
;
634 /****************************************************************
635 ****************************************************************/
637 WERROR
_PNP_GetNextResDes(pipes_struct
*p
,
638 struct PNP_GetNextResDes
*r
)
640 p
->rng_fault_state
= true;
641 return WERR_NOT_SUPPORTED
;
644 /****************************************************************
645 ****************************************************************/
647 WERROR
_PNP_GetResDesData(pipes_struct
*p
,
648 struct PNP_GetResDesData
*r
)
650 p
->rng_fault_state
= true;
651 return WERR_NOT_SUPPORTED
;
654 /****************************************************************
655 ****************************************************************/
657 WERROR
_PNP_GetResDesDataSize(pipes_struct
*p
,
658 struct PNP_GetResDesDataSize
*r
)
660 p
->rng_fault_state
= true;
661 return WERR_NOT_SUPPORTED
;
664 /****************************************************************
665 ****************************************************************/
667 WERROR
_PNP_ModifyResDes(pipes_struct
*p
,
668 struct PNP_ModifyResDes
*r
)
670 p
->rng_fault_state
= true;
671 return WERR_NOT_SUPPORTED
;
674 /****************************************************************
675 ****************************************************************/
677 WERROR
_PNP_DetectResourceLimit(pipes_struct
*p
,
678 struct PNP_DetectResourceLimit
*r
)
680 p
->rng_fault_state
= true;
681 return WERR_NOT_SUPPORTED
;
684 /****************************************************************
685 ****************************************************************/
687 WERROR
_PNP_QueryResConfList(pipes_struct
*p
,
688 struct PNP_QueryResConfList
*r
)
690 p
->rng_fault_state
= true;
691 return WERR_NOT_SUPPORTED
;
694 /****************************************************************
695 ****************************************************************/
697 WERROR
_PNP_SetHwProf(pipes_struct
*p
,
698 struct PNP_SetHwProf
*r
)
700 p
->rng_fault_state
= true;
701 return WERR_NOT_SUPPORTED
;
704 /****************************************************************
705 ****************************************************************/
707 WERROR
_PNP_QueryArbitratorFreeData(pipes_struct
*p
,
708 struct PNP_QueryArbitratorFreeData
*r
)
710 p
->rng_fault_state
= true;
711 return WERR_NOT_SUPPORTED
;
714 /****************************************************************
715 ****************************************************************/
717 WERROR
_PNP_QueryArbitratorFreeSize(pipes_struct
*p
,
718 struct PNP_QueryArbitratorFreeSize
*r
)
720 p
->rng_fault_state
= true;
721 return WERR_NOT_SUPPORTED
;
724 /****************************************************************
725 ****************************************************************/
727 WERROR
_PNP_RunDetection(pipes_struct
*p
,
728 struct PNP_RunDetection
*r
)
730 p
->rng_fault_state
= true;
731 return WERR_NOT_SUPPORTED
;
734 /****************************************************************
735 ****************************************************************/
737 WERROR
_PNP_RegisterNotification(pipes_struct
*p
,
738 struct PNP_RegisterNotification
*r
)
740 p
->rng_fault_state
= true;
741 return WERR_NOT_SUPPORTED
;
744 /****************************************************************
745 ****************************************************************/
747 WERROR
_PNP_UnregisterNotification(pipes_struct
*p
,
748 struct PNP_UnregisterNotification
*r
)
750 p
->rng_fault_state
= true;
751 return WERR_NOT_SUPPORTED
;
754 /****************************************************************
755 ****************************************************************/
757 WERROR
_PNP_GetCustomDevProp(pipes_struct
*p
,
758 struct PNP_GetCustomDevProp
*r
)
760 p
->rng_fault_state
= true;
761 return WERR_NOT_SUPPORTED
;
764 /****************************************************************
765 ****************************************************************/
767 WERROR
_PNP_GetVersionInternal(pipes_struct
*p
,
768 struct PNP_GetVersionInternal
*r
)
770 p
->rng_fault_state
= true;
771 return WERR_NOT_SUPPORTED
;
774 /****************************************************************
775 ****************************************************************/
777 WERROR
_PNP_GetBlockedDriverInfo(pipes_struct
*p
,
778 struct PNP_GetBlockedDriverInfo
*r
)
780 p
->rng_fault_state
= true;
781 return WERR_NOT_SUPPORTED
;
784 /****************************************************************
785 ****************************************************************/
787 WERROR
_PNP_GetServerSideDeviceInstallFlags(pipes_struct
*p
,
788 struct PNP_GetServerSideDeviceInstallFlags
*r
)
790 p
->rng_fault_state
= true;
791 return WERR_NOT_SUPPORTED
;