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"
24 #include "services/svc_winreg_glue.h"
27 #define DBGC_CLASS DBGC_RPC_SRV
29 /********************************************************************
30 ********************************************************************/
32 static char* get_device_path(TALLOC_CTX *mem_ctx, const char *device )
34 return talloc_asprintf(mem_ctx, "ROOT\\Legacy_%s\\0000", device);
37 /********************************************************************
38 ********************************************************************/
40 WERROR _PNP_GetVersion(struct pipes_struct *p,
41 struct PNP_GetVersion *r)
43 *r->out.version = 0x0400; /* no idea what this means */
48 /********************************************************************
49 ********************************************************************/
51 WERROR _PNP_GetDeviceListSize(struct pipes_struct *p,
52 struct PNP_GetDeviceListSize *r)
56 if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) &&
57 (!r->in.devicename)) {
58 return WERR_CM_INVALID_POINTER;
61 if (!(devicepath = get_device_path(p->mem_ctx, r->in.devicename))) {
65 *r->out.size = strlen(devicepath) + 2;
67 TALLOC_FREE(devicepath);
72 /****************************************************************
74 ****************************************************************/
76 WERROR _PNP_GetDeviceList(struct pipes_struct *p,
77 struct PNP_GetDeviceList *r)
81 const char **multi_sz = NULL;
84 if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) &&
86 return WERR_CM_INVALID_POINTER;
89 if (!(devicepath = get_device_path(p->mem_ctx, r->in.filter))) {
93 size = strlen(devicepath) + 2;
95 if (*r->in.length < size) {
96 return WERR_CM_BUFFER_SMALL;
99 multi_sz = talloc_zero_array(p->mem_ctx, const char *, 2);
104 multi_sz[0] = devicepath;
106 if (!push_reg_multi_sz(multi_sz, &blob, multi_sz)) {
110 if (*r->in.length < blob.length/2) {
111 return WERR_CM_BUFFER_SMALL;
114 memcpy(r->out.buffer, blob.data, blob.length);
119 /********************************************************************
120 _PNP_GetDeviceRegProp
121 ********************************************************************/
123 WERROR _PNP_GetDeviceRegProp(struct pipes_struct *p,
124 struct PNP_GetDeviceRegProp *r)
129 TALLOC_CTX *mem_ctx = NULL;
131 switch( r->in.property ) {
132 case DEV_REGPROP_DESC:
134 /* just parse the service name from the device path and then
135 lookup the display name */
136 if ( !(ptr = strrchr_m( r->in.devicepath, '\\' )) )
137 return WERR_GENERAL_FAILURE;
140 if ( !(ptr = strrchr_m( r->in.devicepath, '_' )) )
141 return WERR_GENERAL_FAILURE;
144 mem_ctx = talloc_stackframe();
146 result = svcctl_lookup_dispname(mem_ctx,
150 if (result == NULL) {
151 return WERR_GENERAL_FAILURE;
154 if (!push_reg_sz(mem_ctx, &blob, result)) {
155 talloc_free(mem_ctx);
156 return WERR_GENERAL_FAILURE;
159 if (*r->in.buffer_size < blob.length) {
160 *r->out.needed = blob.length;
161 *r->out.buffer_size = 0;
162 talloc_free(mem_ctx);
163 return WERR_CM_BUFFER_SMALL;
166 r->out.buffer = (uint8_t *)talloc_memdup(p->mem_ctx, blob.data, blob.length);
167 talloc_free(mem_ctx);
168 if (!r->out.buffer) {
172 *r->out.reg_data_type = REG_SZ; /* always 1...tested using a remove device manager connection */
173 *r->out.buffer_size = blob.length;
174 *r->out.needed = blob.length;
179 *r->out.reg_data_type = 0x00437c98; /* ??? */
180 return WERR_CM_NO_SUCH_VALUE;
186 /********************************************************************
187 ********************************************************************/
189 WERROR _PNP_ValidateDeviceInstance(struct pipes_struct *p,
190 struct PNP_ValidateDeviceInstance *r)
196 /********************************************************************
197 ********************************************************************/
199 WERROR _PNP_GetHwProfInfo(struct pipes_struct *p,
200 struct PNP_GetHwProfInfo *r)
202 /* steal the incoming buffer */
204 r->out.info = r->in.info;
206 /* Take the 5th Ammentment */
208 return WERR_CM_NO_MORE_HW_PROFILES;
211 /********************************************************************
212 ********************************************************************/
214 WERROR _PNP_HwProfFlags(struct pipes_struct *p,
215 struct PNP_HwProfFlags *r)
217 /* just nod your head */
222 /****************************************************************
223 ****************************************************************/
225 WERROR _PNP_Disconnect(struct pipes_struct *p,
226 struct PNP_Disconnect *r)
228 p->rng_fault_state = true;
229 return WERR_NOT_SUPPORTED;
232 /****************************************************************
233 ****************************************************************/
235 WERROR _PNP_Connect(struct pipes_struct *p,
236 struct PNP_Connect *r)
238 p->rng_fault_state = true;
239 return WERR_NOT_SUPPORTED;
242 /****************************************************************
243 ****************************************************************/
245 WERROR _PNP_GetGlobalState(struct pipes_struct *p,
246 struct PNP_GetGlobalState *r)
248 p->rng_fault_state = true;
249 return WERR_NOT_SUPPORTED;
252 /****************************************************************
253 ****************************************************************/
255 WERROR _PNP_InitDetection(struct pipes_struct *p,
256 struct PNP_InitDetection *r)
258 p->rng_fault_state = true;
259 return WERR_NOT_SUPPORTED;
262 /****************************************************************
263 ****************************************************************/
265 WERROR _PNP_ReportLogOn(struct pipes_struct *p,
266 struct PNP_ReportLogOn *r)
268 p->rng_fault_state = true;
269 return WERR_NOT_SUPPORTED;
272 /****************************************************************
273 ****************************************************************/
275 WERROR _PNP_GetRootDeviceInstance(struct pipes_struct *p,
276 struct PNP_GetRootDeviceInstance *r)
278 p->rng_fault_state = true;
279 return WERR_NOT_SUPPORTED;
282 /****************************************************************
283 ****************************************************************/
285 WERROR _PNP_GetRelatedDeviceInstance(struct pipes_struct *p,
286 struct PNP_GetRelatedDeviceInstance *r)
288 p->rng_fault_state = true;
289 return WERR_NOT_SUPPORTED;
292 /****************************************************************
293 ****************************************************************/
295 WERROR _PNP_EnumerateSubKeys(struct pipes_struct *p,
296 struct PNP_EnumerateSubKeys *r)
298 p->rng_fault_state = true;
299 return WERR_NOT_SUPPORTED;
302 /****************************************************************
303 ****************************************************************/
305 WERROR _PNP_GetDepth(struct pipes_struct *p,
306 struct PNP_GetDepth *r)
308 p->rng_fault_state = true;
309 return WERR_NOT_SUPPORTED;
312 /****************************************************************
313 ****************************************************************/
315 WERROR _PNP_SetDeviceRegProp(struct pipes_struct *p,
316 struct PNP_SetDeviceRegProp *r)
318 p->rng_fault_state = true;
319 return WERR_NOT_SUPPORTED;
322 /****************************************************************
323 ****************************************************************/
325 WERROR _PNP_GetClassInstance(struct pipes_struct *p,
326 struct PNP_GetClassInstance *r)
328 p->rng_fault_state = true;
329 return WERR_NOT_SUPPORTED;
332 /****************************************************************
333 ****************************************************************/
335 WERROR _PNP_CreateKey(struct pipes_struct *p,
336 struct PNP_CreateKey *r)
338 p->rng_fault_state = true;
339 return WERR_NOT_SUPPORTED;
342 /****************************************************************
343 ****************************************************************/
345 WERROR _PNP_DeleteRegistryKey(struct pipes_struct *p,
346 struct PNP_DeleteRegistryKey *r)
348 p->rng_fault_state = true;
349 return WERR_NOT_SUPPORTED;
352 /****************************************************************
353 ****************************************************************/
355 WERROR _PNP_GetClassCount(struct pipes_struct *p,
356 struct PNP_GetClassCount *r)
358 p->rng_fault_state = true;
359 return WERR_NOT_SUPPORTED;
362 /****************************************************************
363 ****************************************************************/
365 WERROR _PNP_GetClassName(struct pipes_struct *p,
366 struct PNP_GetClassName *r)
368 p->rng_fault_state = true;
369 return WERR_NOT_SUPPORTED;
372 /****************************************************************
373 ****************************************************************/
375 WERROR _PNP_DeleteClassKey(struct pipes_struct *p,
376 struct PNP_DeleteClassKey *r)
378 p->rng_fault_state = true;
379 return WERR_NOT_SUPPORTED;
382 /****************************************************************
383 ****************************************************************/
385 WERROR _PNP_GetInterfaceDeviceAlias(struct pipes_struct *p,
386 struct PNP_GetInterfaceDeviceAlias *r)
388 p->rng_fault_state = true;
389 return WERR_NOT_SUPPORTED;
392 /****************************************************************
393 ****************************************************************/
395 WERROR _PNP_GetInterfaceDeviceList(struct pipes_struct *p,
396 struct PNP_GetInterfaceDeviceList *r)
398 p->rng_fault_state = true;
399 return WERR_NOT_SUPPORTED;
402 /****************************************************************
403 ****************************************************************/
405 WERROR _PNP_GetInterfaceDeviceListSize(struct pipes_struct *p,
406 struct PNP_GetInterfaceDeviceListSize *r)
408 p->rng_fault_state = true;
409 return WERR_NOT_SUPPORTED;
412 /****************************************************************
413 ****************************************************************/
415 WERROR _PNP_RegisterDeviceClassAssociation(struct pipes_struct *p,
416 struct PNP_RegisterDeviceClassAssociation *r)
418 p->rng_fault_state = true;
419 return WERR_NOT_SUPPORTED;
422 /****************************************************************
423 ****************************************************************/
425 WERROR _PNP_UnregisterDeviceClassAssociation(struct pipes_struct *p,
426 struct PNP_UnregisterDeviceClassAssociation *r)
428 p->rng_fault_state = true;
429 return WERR_NOT_SUPPORTED;
432 /****************************************************************
433 ****************************************************************/
435 WERROR _PNP_GetClassRegProp(struct pipes_struct *p,
436 struct PNP_GetClassRegProp *r)
438 p->rng_fault_state = true;
439 return WERR_NOT_SUPPORTED;
442 /****************************************************************
443 ****************************************************************/
445 WERROR _PNP_SetClassRegProp(struct pipes_struct *p,
446 struct PNP_SetClassRegProp *r)
448 p->rng_fault_state = true;
449 return WERR_NOT_SUPPORTED;
452 /****************************************************************
453 ****************************************************************/
455 WERROR _PNP_CreateDevInst(struct pipes_struct *p,
456 struct PNP_CreateDevInst *r)
458 p->rng_fault_state = true;
459 return WERR_NOT_SUPPORTED;
462 /****************************************************************
463 ****************************************************************/
465 WERROR _PNP_DeviceInstanceAction(struct pipes_struct *p,
466 struct PNP_DeviceInstanceAction *r)
468 p->rng_fault_state = true;
469 return WERR_NOT_SUPPORTED;
472 /****************************************************************
473 ****************************************************************/
475 WERROR _PNP_GetDeviceStatus(struct pipes_struct *p,
476 struct PNP_GetDeviceStatus *r)
478 p->rng_fault_state = true;
479 return WERR_NOT_SUPPORTED;
482 /****************************************************************
483 ****************************************************************/
485 WERROR _PNP_SetDeviceProblem(struct pipes_struct *p,
486 struct PNP_SetDeviceProblem *r)
488 p->rng_fault_state = true;
489 return WERR_NOT_SUPPORTED;
492 /****************************************************************
493 ****************************************************************/
495 WERROR _PNP_DisableDevInst(struct pipes_struct *p,
496 struct PNP_DisableDevInst *r)
498 p->rng_fault_state = true;
499 return WERR_NOT_SUPPORTED;
502 /****************************************************************
503 ****************************************************************/
505 WERROR _PNP_UninstallDevInst(struct pipes_struct *p,
506 struct PNP_UninstallDevInst *r)
508 p->rng_fault_state = true;
509 return WERR_NOT_SUPPORTED;
512 /****************************************************************
513 ****************************************************************/
515 WERROR _PNP_AddID(struct pipes_struct *p,
518 p->rng_fault_state = true;
519 return WERR_NOT_SUPPORTED;
522 /****************************************************************
523 ****************************************************************/
525 WERROR _PNP_RegisterDriver(struct pipes_struct *p,
526 struct PNP_RegisterDriver *r)
528 p->rng_fault_state = true;
529 return WERR_NOT_SUPPORTED;
532 /****************************************************************
533 ****************************************************************/
535 WERROR _PNP_QueryRemove(struct pipes_struct *p,
536 struct PNP_QueryRemove *r)
538 p->rng_fault_state = true;
539 return WERR_NOT_SUPPORTED;
542 /****************************************************************
543 ****************************************************************/
545 WERROR _PNP_RequestDeviceEject(struct pipes_struct *p,
546 struct PNP_RequestDeviceEject *r)
548 p->rng_fault_state = true;
549 return WERR_NOT_SUPPORTED;
552 /****************************************************************
553 ****************************************************************/
555 WERROR _PNP_IsDockStationPresent(struct pipes_struct *p,
556 struct PNP_IsDockStationPresent *r)
558 p->rng_fault_state = true;
559 return WERR_NOT_SUPPORTED;
562 /****************************************************************
563 ****************************************************************/
565 WERROR _PNP_RequestEjectPC(struct pipes_struct *p,
566 struct PNP_RequestEjectPC *r)
568 p->rng_fault_state = true;
569 return WERR_NOT_SUPPORTED;
572 /****************************************************************
573 ****************************************************************/
575 WERROR _PNP_AddEmptyLogConf(struct pipes_struct *p,
576 struct PNP_AddEmptyLogConf *r)
578 p->rng_fault_state = true;
579 return WERR_NOT_SUPPORTED;
582 /****************************************************************
583 ****************************************************************/
585 WERROR _PNP_FreeLogConf(struct pipes_struct *p,
586 struct PNP_FreeLogConf *r)
588 p->rng_fault_state = true;
589 return WERR_NOT_SUPPORTED;
592 /****************************************************************
593 ****************************************************************/
595 WERROR _PNP_GetFirstLogConf(struct pipes_struct *p,
596 struct PNP_GetFirstLogConf *r)
598 p->rng_fault_state = true;
599 return WERR_NOT_SUPPORTED;
602 /****************************************************************
603 ****************************************************************/
605 WERROR _PNP_GetNextLogConf(struct pipes_struct *p,
606 struct PNP_GetNextLogConf *r)
608 p->rng_fault_state = true;
609 return WERR_NOT_SUPPORTED;
612 /****************************************************************
613 ****************************************************************/
615 WERROR _PNP_GetLogConfPriority(struct pipes_struct *p,
616 struct PNP_GetLogConfPriority *r)
618 p->rng_fault_state = true;
619 return WERR_NOT_SUPPORTED;
622 /****************************************************************
623 ****************************************************************/
625 WERROR _PNP_AddResDes(struct pipes_struct *p,
626 struct PNP_AddResDes *r)
628 p->rng_fault_state = true;
629 return WERR_NOT_SUPPORTED;
632 /****************************************************************
633 ****************************************************************/
635 WERROR _PNP_FreeResDes(struct pipes_struct *p,
636 struct PNP_FreeResDes *r)
638 p->rng_fault_state = true;
639 return WERR_NOT_SUPPORTED;
642 /****************************************************************
643 ****************************************************************/
645 WERROR _PNP_GetNextResDes(struct pipes_struct *p,
646 struct PNP_GetNextResDes *r)
648 p->rng_fault_state = true;
649 return WERR_NOT_SUPPORTED;
652 /****************************************************************
653 ****************************************************************/
655 WERROR _PNP_GetResDesData(struct pipes_struct *p,
656 struct PNP_GetResDesData *r)
658 p->rng_fault_state = true;
659 return WERR_NOT_SUPPORTED;
662 /****************************************************************
663 ****************************************************************/
665 WERROR _PNP_GetResDesDataSize(struct pipes_struct *p,
666 struct PNP_GetResDesDataSize *r)
668 p->rng_fault_state = true;
669 return WERR_NOT_SUPPORTED;
672 /****************************************************************
673 ****************************************************************/
675 WERROR _PNP_ModifyResDes(struct pipes_struct *p,
676 struct PNP_ModifyResDes *r)
678 p->rng_fault_state = true;
679 return WERR_NOT_SUPPORTED;
682 /****************************************************************
683 ****************************************************************/
685 WERROR _PNP_DetectResourceLimit(struct pipes_struct *p,
686 struct PNP_DetectResourceLimit *r)
688 p->rng_fault_state = true;
689 return WERR_NOT_SUPPORTED;
692 /****************************************************************
693 ****************************************************************/
695 WERROR _PNP_QueryResConfList(struct pipes_struct *p,
696 struct PNP_QueryResConfList *r)
698 p->rng_fault_state = true;
699 return WERR_NOT_SUPPORTED;
702 /****************************************************************
703 ****************************************************************/
705 WERROR _PNP_SetHwProf(struct pipes_struct *p,
706 struct PNP_SetHwProf *r)
708 p->rng_fault_state = true;
709 return WERR_NOT_SUPPORTED;
712 /****************************************************************
713 ****************************************************************/
715 WERROR _PNP_QueryArbitratorFreeData(struct pipes_struct *p,
716 struct PNP_QueryArbitratorFreeData *r)
718 p->rng_fault_state = true;
719 return WERR_NOT_SUPPORTED;
722 /****************************************************************
723 ****************************************************************/
725 WERROR _PNP_QueryArbitratorFreeSize(struct pipes_struct *p,
726 struct PNP_QueryArbitratorFreeSize *r)
728 p->rng_fault_state = true;
729 return WERR_NOT_SUPPORTED;
732 /****************************************************************
733 ****************************************************************/
735 WERROR _PNP_RunDetection(struct pipes_struct *p,
736 struct PNP_RunDetection *r)
738 p->rng_fault_state = true;
739 return WERR_NOT_SUPPORTED;
742 /****************************************************************
743 ****************************************************************/
745 WERROR _PNP_RegisterNotification(struct pipes_struct *p,
746 struct PNP_RegisterNotification *r)
748 p->rng_fault_state = true;
749 return WERR_NOT_SUPPORTED;
752 /****************************************************************
753 ****************************************************************/
755 WERROR _PNP_UnregisterNotification(struct pipes_struct *p,
756 struct PNP_UnregisterNotification *r)
758 p->rng_fault_state = true;
759 return WERR_NOT_SUPPORTED;
762 /****************************************************************
763 ****************************************************************/
765 WERROR _PNP_GetCustomDevProp(struct pipes_struct *p,
766 struct PNP_GetCustomDevProp *r)
768 p->rng_fault_state = true;
769 return WERR_NOT_SUPPORTED;
772 /****************************************************************
773 ****************************************************************/
775 WERROR _PNP_GetVersionInternal(struct pipes_struct *p,
776 struct PNP_GetVersionInternal *r)
778 p->rng_fault_state = true;
779 return WERR_NOT_SUPPORTED;
782 /****************************************************************
783 ****************************************************************/
785 WERROR _PNP_GetBlockedDriverInfo(struct pipes_struct *p,
786 struct PNP_GetBlockedDriverInfo *r)
788 p->rng_fault_state = true;
789 return WERR_NOT_SUPPORTED;
792 /****************************************************************
793 ****************************************************************/
795 WERROR _PNP_GetServerSideDeviceInstallFlags(struct pipes_struct *p,
796 struct PNP_GetServerSideDeviceInstallFlags *r)
798 p->rng_fault_state = true;
799 return WERR_NOT_SUPPORTED;