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/>.
25 #define DBGC_CLASS DBGC_RPC_SRV
27 /********************************************************************
28 ********************************************************************/
30 static char* get_device_path(TALLOC_CTX
*mem_ctx
, const char *device
)
32 return talloc_asprintf(mem_ctx
, "ROOT\\Legacy_%s\\0000", device
);
35 /********************************************************************
36 ********************************************************************/
38 WERROR
_PNP_GetVersion(pipes_struct
*p
,
39 struct PNP_GetVersion
*r
)
41 *r
->out
.version
= 0x0400; /* no idea what this means */
46 /********************************************************************
47 ********************************************************************/
49 WERROR
_PNP_GetDeviceListSize(pipes_struct
*p
,
50 struct PNP_GetDeviceListSize
*r
)
54 if ((r
->in
.flags
& CM_GETIDLIST_FILTER_SERVICE
) &&
55 (!r
->in
.devicename
)) {
56 return WERR_CM_INVALID_POINTER
;
59 if (!(devicepath
= get_device_path(p
->mem_ctx
, r
->in
.devicename
))) {
63 *r
->out
.size
= strlen(devicepath
) + 2;
65 TALLOC_FREE(devicepath
);
70 /****************************************************************
72 ****************************************************************/
74 WERROR
_PNP_GetDeviceList(pipes_struct
*p
,
75 struct PNP_GetDeviceList
*r
)
79 const char **multi_sz
= NULL
;
82 if ((r
->in
.flags
& CM_GETIDLIST_FILTER_SERVICE
) &&
84 return WERR_CM_INVALID_POINTER
;
87 if (!(devicepath
= get_device_path(p
->mem_ctx
, r
->in
.filter
))) {
91 size
= strlen(devicepath
) + 2;
93 if (*r
->in
.length
< size
) {
94 return WERR_CM_BUFFER_SMALL
;
97 multi_sz
= talloc_zero_array(p
->mem_ctx
, const char *, 2);
102 multi_sz
[0] = devicepath
;
104 if (!push_reg_multi_sz(multi_sz
, &blob
, multi_sz
)) {
108 if (*r
->in
.length
< blob
.length
/2) {
109 return WERR_CM_BUFFER_SMALL
;
112 memcpy(r
->out
.buffer
, blob
.data
, blob
.length
);
117 /********************************************************************
118 _PNP_GetDeviceRegProp
119 ********************************************************************/
121 WERROR
_PNP_GetDeviceRegProp(pipes_struct
*p
,
122 struct PNP_GetDeviceRegProp
*r
)
125 struct regval_ctr
*values
;
126 struct regval_blob
*val
;
128 switch( r
->in
.property
) {
129 case DEV_REGPROP_DESC
:
131 /* just parse the service name from the device path and then
132 lookup the display name */
133 if ( !(ptr
= strrchr_m( r
->in
.devicepath
, '\\' )) )
134 return WERR_GENERAL_FAILURE
;
137 if ( !(ptr
= strrchr_m( r
->in
.devicepath
, '_' )) )
138 return WERR_GENERAL_FAILURE
;
141 if ( !(values
= svcctl_fetch_regvalues(
142 ptr
, p
->server_info
->ptok
)))
143 return WERR_GENERAL_FAILURE
;
145 if ( !(val
= regval_ctr_getvalue( values
, "DisplayName" )) ) {
146 TALLOC_FREE( values
);
147 return WERR_GENERAL_FAILURE
;
150 if (*r
->in
.buffer_size
< val
->size
) {
151 *r
->out
.needed
= val
->size
;
152 *r
->out
.buffer_size
= 0;
153 TALLOC_FREE( values
);
154 return WERR_CM_BUFFER_SMALL
;
157 r
->out
.buffer
= (uint8_t *)talloc_memdup(p
->mem_ctx
, val
->data_p
, val
->size
);
159 if (!r
->out
.buffer
) {
163 *r
->out
.reg_data_type
= REG_SZ
; /* always 1...tested using a remove device manager connection */
164 *r
->out
.buffer_size
= val
->size
;
165 *r
->out
.needed
= val
->size
;
170 *r
->out
.reg_data_type
= 0x00437c98; /* ??? */
171 return WERR_CM_NO_SUCH_VALUE
;
177 /********************************************************************
178 ********************************************************************/
180 WERROR
_PNP_ValidateDeviceInstance(pipes_struct
*p
,
181 struct PNP_ValidateDeviceInstance
*r
)
187 /********************************************************************
188 ********************************************************************/
190 WERROR
_PNP_GetHwProfInfo(pipes_struct
*p
,
191 struct PNP_GetHwProfInfo
*r
)
193 /* steal the incoming buffer */
195 r
->out
.info
= r
->in
.info
;
197 /* Take the 5th Ammentment */
199 return WERR_CM_NO_MORE_HW_PROFILES
;
202 /********************************************************************
203 ********************************************************************/
205 WERROR
_PNP_HwProfFlags(pipes_struct
*p
,
206 struct PNP_HwProfFlags
*r
)
208 /* just nod your head */
213 /****************************************************************
214 ****************************************************************/
216 WERROR
_PNP_Disconnect(pipes_struct
*p
,
217 struct PNP_Disconnect
*r
)
219 p
->rng_fault_state
= true;
220 return WERR_NOT_SUPPORTED
;
223 /****************************************************************
224 ****************************************************************/
226 WERROR
_PNP_Connect(pipes_struct
*p
,
227 struct PNP_Connect
*r
)
229 p
->rng_fault_state
= true;
230 return WERR_NOT_SUPPORTED
;
233 /****************************************************************
234 ****************************************************************/
236 WERROR
_PNP_GetGlobalState(pipes_struct
*p
,
237 struct PNP_GetGlobalState
*r
)
239 p
->rng_fault_state
= true;
240 return WERR_NOT_SUPPORTED
;
243 /****************************************************************
244 ****************************************************************/
246 WERROR
_PNP_InitDetection(pipes_struct
*p
,
247 struct PNP_InitDetection
*r
)
249 p
->rng_fault_state
= true;
250 return WERR_NOT_SUPPORTED
;
253 /****************************************************************
254 ****************************************************************/
256 WERROR
_PNP_ReportLogOn(pipes_struct
*p
,
257 struct PNP_ReportLogOn
*r
)
259 p
->rng_fault_state
= true;
260 return WERR_NOT_SUPPORTED
;
263 /****************************************************************
264 ****************************************************************/
266 WERROR
_PNP_GetRootDeviceInstance(pipes_struct
*p
,
267 struct PNP_GetRootDeviceInstance
*r
)
269 p
->rng_fault_state
= true;
270 return WERR_NOT_SUPPORTED
;
273 /****************************************************************
274 ****************************************************************/
276 WERROR
_PNP_GetRelatedDeviceInstance(pipes_struct
*p
,
277 struct PNP_GetRelatedDeviceInstance
*r
)
279 p
->rng_fault_state
= true;
280 return WERR_NOT_SUPPORTED
;
283 /****************************************************************
284 ****************************************************************/
286 WERROR
_PNP_EnumerateSubKeys(pipes_struct
*p
,
287 struct PNP_EnumerateSubKeys
*r
)
289 p
->rng_fault_state
= true;
290 return WERR_NOT_SUPPORTED
;
293 /****************************************************************
294 ****************************************************************/
296 WERROR
_PNP_GetDepth(pipes_struct
*p
,
297 struct PNP_GetDepth
*r
)
299 p
->rng_fault_state
= true;
300 return WERR_NOT_SUPPORTED
;
303 /****************************************************************
304 ****************************************************************/
306 WERROR
_PNP_SetDeviceRegProp(pipes_struct
*p
,
307 struct PNP_SetDeviceRegProp
*r
)
309 p
->rng_fault_state
= true;
310 return WERR_NOT_SUPPORTED
;
313 /****************************************************************
314 ****************************************************************/
316 WERROR
_PNP_GetClassInstance(pipes_struct
*p
,
317 struct PNP_GetClassInstance
*r
)
319 p
->rng_fault_state
= true;
320 return WERR_NOT_SUPPORTED
;
323 /****************************************************************
324 ****************************************************************/
326 WERROR
_PNP_CreateKey(pipes_struct
*p
,
327 struct PNP_CreateKey
*r
)
329 p
->rng_fault_state
= true;
330 return WERR_NOT_SUPPORTED
;
333 /****************************************************************
334 ****************************************************************/
336 WERROR
_PNP_DeleteRegistryKey(pipes_struct
*p
,
337 struct PNP_DeleteRegistryKey
*r
)
339 p
->rng_fault_state
= true;
340 return WERR_NOT_SUPPORTED
;
343 /****************************************************************
344 ****************************************************************/
346 WERROR
_PNP_GetClassCount(pipes_struct
*p
,
347 struct PNP_GetClassCount
*r
)
349 p
->rng_fault_state
= true;
350 return WERR_NOT_SUPPORTED
;
353 /****************************************************************
354 ****************************************************************/
356 WERROR
_PNP_GetClassName(pipes_struct
*p
,
357 struct PNP_GetClassName
*r
)
359 p
->rng_fault_state
= true;
360 return WERR_NOT_SUPPORTED
;
363 /****************************************************************
364 ****************************************************************/
366 WERROR
_PNP_DeleteClassKey(pipes_struct
*p
,
367 struct PNP_DeleteClassKey
*r
)
369 p
->rng_fault_state
= true;
370 return WERR_NOT_SUPPORTED
;
373 /****************************************************************
374 ****************************************************************/
376 WERROR
_PNP_GetInterfaceDeviceAlias(pipes_struct
*p
,
377 struct PNP_GetInterfaceDeviceAlias
*r
)
379 p
->rng_fault_state
= true;
380 return WERR_NOT_SUPPORTED
;
383 /****************************************************************
384 ****************************************************************/
386 WERROR
_PNP_GetInterfaceDeviceList(pipes_struct
*p
,
387 struct PNP_GetInterfaceDeviceList
*r
)
389 p
->rng_fault_state
= true;
390 return WERR_NOT_SUPPORTED
;
393 /****************************************************************
394 ****************************************************************/
396 WERROR
_PNP_GetInterfaceDeviceListSize(pipes_struct
*p
,
397 struct PNP_GetInterfaceDeviceListSize
*r
)
399 p
->rng_fault_state
= true;
400 return WERR_NOT_SUPPORTED
;
403 /****************************************************************
404 ****************************************************************/
406 WERROR
_PNP_RegisterDeviceClassAssociation(pipes_struct
*p
,
407 struct PNP_RegisterDeviceClassAssociation
*r
)
409 p
->rng_fault_state
= true;
410 return WERR_NOT_SUPPORTED
;
413 /****************************************************************
414 ****************************************************************/
416 WERROR
_PNP_UnregisterDeviceClassAssociation(pipes_struct
*p
,
417 struct PNP_UnregisterDeviceClassAssociation
*r
)
419 p
->rng_fault_state
= true;
420 return WERR_NOT_SUPPORTED
;
423 /****************************************************************
424 ****************************************************************/
426 WERROR
_PNP_GetClassRegProp(pipes_struct
*p
,
427 struct PNP_GetClassRegProp
*r
)
429 p
->rng_fault_state
= true;
430 return WERR_NOT_SUPPORTED
;
433 /****************************************************************
434 ****************************************************************/
436 WERROR
_PNP_SetClassRegProp(pipes_struct
*p
,
437 struct PNP_SetClassRegProp
*r
)
439 p
->rng_fault_state
= true;
440 return WERR_NOT_SUPPORTED
;
443 /****************************************************************
444 ****************************************************************/
446 WERROR
_PNP_CreateDevInst(pipes_struct
*p
,
447 struct PNP_CreateDevInst
*r
)
449 p
->rng_fault_state
= true;
450 return WERR_NOT_SUPPORTED
;
453 /****************************************************************
454 ****************************************************************/
456 WERROR
_PNP_DeviceInstanceAction(pipes_struct
*p
,
457 struct PNP_DeviceInstanceAction
*r
)
459 p
->rng_fault_state
= true;
460 return WERR_NOT_SUPPORTED
;
463 /****************************************************************
464 ****************************************************************/
466 WERROR
_PNP_GetDeviceStatus(pipes_struct
*p
,
467 struct PNP_GetDeviceStatus
*r
)
469 p
->rng_fault_state
= true;
470 return WERR_NOT_SUPPORTED
;
473 /****************************************************************
474 ****************************************************************/
476 WERROR
_PNP_SetDeviceProblem(pipes_struct
*p
,
477 struct PNP_SetDeviceProblem
*r
)
479 p
->rng_fault_state
= true;
480 return WERR_NOT_SUPPORTED
;
483 /****************************************************************
484 ****************************************************************/
486 WERROR
_PNP_DisableDevInst(pipes_struct
*p
,
487 struct PNP_DisableDevInst
*r
)
489 p
->rng_fault_state
= true;
490 return WERR_NOT_SUPPORTED
;
493 /****************************************************************
494 ****************************************************************/
496 WERROR
_PNP_UninstallDevInst(pipes_struct
*p
,
497 struct PNP_UninstallDevInst
*r
)
499 p
->rng_fault_state
= true;
500 return WERR_NOT_SUPPORTED
;
503 /****************************************************************
504 ****************************************************************/
506 WERROR
_PNP_AddID(pipes_struct
*p
,
509 p
->rng_fault_state
= true;
510 return WERR_NOT_SUPPORTED
;
513 /****************************************************************
514 ****************************************************************/
516 WERROR
_PNP_RegisterDriver(pipes_struct
*p
,
517 struct PNP_RegisterDriver
*r
)
519 p
->rng_fault_state
= true;
520 return WERR_NOT_SUPPORTED
;
523 /****************************************************************
524 ****************************************************************/
526 WERROR
_PNP_QueryRemove(pipes_struct
*p
,
527 struct PNP_QueryRemove
*r
)
529 p
->rng_fault_state
= true;
530 return WERR_NOT_SUPPORTED
;
533 /****************************************************************
534 ****************************************************************/
536 WERROR
_PNP_RequestDeviceEject(pipes_struct
*p
,
537 struct PNP_RequestDeviceEject
*r
)
539 p
->rng_fault_state
= true;
540 return WERR_NOT_SUPPORTED
;
543 /****************************************************************
544 ****************************************************************/
546 WERROR
_PNP_IsDockStationPresent(pipes_struct
*p
,
547 struct PNP_IsDockStationPresent
*r
)
549 p
->rng_fault_state
= true;
550 return WERR_NOT_SUPPORTED
;
553 /****************************************************************
554 ****************************************************************/
556 WERROR
_PNP_RequestEjectPC(pipes_struct
*p
,
557 struct PNP_RequestEjectPC
*r
)
559 p
->rng_fault_state
= true;
560 return WERR_NOT_SUPPORTED
;
563 /****************************************************************
564 ****************************************************************/
566 WERROR
_PNP_AddEmptyLogConf(pipes_struct
*p
,
567 struct PNP_AddEmptyLogConf
*r
)
569 p
->rng_fault_state
= true;
570 return WERR_NOT_SUPPORTED
;
573 /****************************************************************
574 ****************************************************************/
576 WERROR
_PNP_FreeLogConf(pipes_struct
*p
,
577 struct PNP_FreeLogConf
*r
)
579 p
->rng_fault_state
= true;
580 return WERR_NOT_SUPPORTED
;
583 /****************************************************************
584 ****************************************************************/
586 WERROR
_PNP_GetFirstLogConf(pipes_struct
*p
,
587 struct PNP_GetFirstLogConf
*r
)
589 p
->rng_fault_state
= true;
590 return WERR_NOT_SUPPORTED
;
593 /****************************************************************
594 ****************************************************************/
596 WERROR
_PNP_GetNextLogConf(pipes_struct
*p
,
597 struct PNP_GetNextLogConf
*r
)
599 p
->rng_fault_state
= true;
600 return WERR_NOT_SUPPORTED
;
603 /****************************************************************
604 ****************************************************************/
606 WERROR
_PNP_GetLogConfPriority(pipes_struct
*p
,
607 struct PNP_GetLogConfPriority
*r
)
609 p
->rng_fault_state
= true;
610 return WERR_NOT_SUPPORTED
;
613 /****************************************************************
614 ****************************************************************/
616 WERROR
_PNP_AddResDes(pipes_struct
*p
,
617 struct PNP_AddResDes
*r
)
619 p
->rng_fault_state
= true;
620 return WERR_NOT_SUPPORTED
;
623 /****************************************************************
624 ****************************************************************/
626 WERROR
_PNP_FreeResDes(pipes_struct
*p
,
627 struct PNP_FreeResDes
*r
)
629 p
->rng_fault_state
= true;
630 return WERR_NOT_SUPPORTED
;
633 /****************************************************************
634 ****************************************************************/
636 WERROR
_PNP_GetNextResDes(pipes_struct
*p
,
637 struct PNP_GetNextResDes
*r
)
639 p
->rng_fault_state
= true;
640 return WERR_NOT_SUPPORTED
;
643 /****************************************************************
644 ****************************************************************/
646 WERROR
_PNP_GetResDesData(pipes_struct
*p
,
647 struct PNP_GetResDesData
*r
)
649 p
->rng_fault_state
= true;
650 return WERR_NOT_SUPPORTED
;
653 /****************************************************************
654 ****************************************************************/
656 WERROR
_PNP_GetResDesDataSize(pipes_struct
*p
,
657 struct PNP_GetResDesDataSize
*r
)
659 p
->rng_fault_state
= true;
660 return WERR_NOT_SUPPORTED
;
663 /****************************************************************
664 ****************************************************************/
666 WERROR
_PNP_ModifyResDes(pipes_struct
*p
,
667 struct PNP_ModifyResDes
*r
)
669 p
->rng_fault_state
= true;
670 return WERR_NOT_SUPPORTED
;
673 /****************************************************************
674 ****************************************************************/
676 WERROR
_PNP_DetectResourceLimit(pipes_struct
*p
,
677 struct PNP_DetectResourceLimit
*r
)
679 p
->rng_fault_state
= true;
680 return WERR_NOT_SUPPORTED
;
683 /****************************************************************
684 ****************************************************************/
686 WERROR
_PNP_QueryResConfList(pipes_struct
*p
,
687 struct PNP_QueryResConfList
*r
)
689 p
->rng_fault_state
= true;
690 return WERR_NOT_SUPPORTED
;
693 /****************************************************************
694 ****************************************************************/
696 WERROR
_PNP_SetHwProf(pipes_struct
*p
,
697 struct PNP_SetHwProf
*r
)
699 p
->rng_fault_state
= true;
700 return WERR_NOT_SUPPORTED
;
703 /****************************************************************
704 ****************************************************************/
706 WERROR
_PNP_QueryArbitratorFreeData(pipes_struct
*p
,
707 struct PNP_QueryArbitratorFreeData
*r
)
709 p
->rng_fault_state
= true;
710 return WERR_NOT_SUPPORTED
;
713 /****************************************************************
714 ****************************************************************/
716 WERROR
_PNP_QueryArbitratorFreeSize(pipes_struct
*p
,
717 struct PNP_QueryArbitratorFreeSize
*r
)
719 p
->rng_fault_state
= true;
720 return WERR_NOT_SUPPORTED
;
723 /****************************************************************
724 ****************************************************************/
726 WERROR
_PNP_RunDetection(pipes_struct
*p
,
727 struct PNP_RunDetection
*r
)
729 p
->rng_fault_state
= true;
730 return WERR_NOT_SUPPORTED
;
733 /****************************************************************
734 ****************************************************************/
736 WERROR
_PNP_RegisterNotification(pipes_struct
*p
,
737 struct PNP_RegisterNotification
*r
)
739 p
->rng_fault_state
= true;
740 return WERR_NOT_SUPPORTED
;
743 /****************************************************************
744 ****************************************************************/
746 WERROR
_PNP_UnregisterNotification(pipes_struct
*p
,
747 struct PNP_UnregisterNotification
*r
)
749 p
->rng_fault_state
= true;
750 return WERR_NOT_SUPPORTED
;
753 /****************************************************************
754 ****************************************************************/
756 WERROR
_PNP_GetCustomDevProp(pipes_struct
*p
,
757 struct PNP_GetCustomDevProp
*r
)
759 p
->rng_fault_state
= true;
760 return WERR_NOT_SUPPORTED
;
763 /****************************************************************
764 ****************************************************************/
766 WERROR
_PNP_GetVersionInternal(pipes_struct
*p
,
767 struct PNP_GetVersionInternal
*r
)
769 p
->rng_fault_state
= true;
770 return WERR_NOT_SUPPORTED
;
773 /****************************************************************
774 ****************************************************************/
776 WERROR
_PNP_GetBlockedDriverInfo(pipes_struct
*p
,
777 struct PNP_GetBlockedDriverInfo
*r
)
779 p
->rng_fault_state
= true;
780 return WERR_NOT_SUPPORTED
;
783 /****************************************************************
784 ****************************************************************/
786 WERROR
_PNP_GetServerSideDeviceInstallFlags(pipes_struct
*p
,
787 struct PNP_GetServerSideDeviceInstallFlags
*r
)
789 p
->rng_fault_state
= true;
790 return WERR_NOT_SUPPORTED
;