• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/samba-3.5.8/source3/rpc_server/
1/*
2 *  Unix SMB/CIFS implementation.
3 *  RPC Pipe client / server routines
4 *
5 *  Copyright (C) Gerald (Jerry) Carter             2005.
6 *  Copyright (C) Guenther Deschner                 2008,2009.
7 *
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.
12 *
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.
17 *
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/>.
20 */
21
22#include "includes.h"
23#include "../librpc/gen_ndr/srv_ntsvcs.h"
24
25#undef DBGC_CLASS
26#define DBGC_CLASS DBGC_RPC_SRV
27
28/********************************************************************
29********************************************************************/
30
31static char* get_device_path(TALLOC_CTX *mem_ctx, const char *device )
32{
33	return talloc_asprintf(mem_ctx, "ROOT\\Legacy_%s\\0000", device);
34}
35
36/********************************************************************
37********************************************************************/
38
39WERROR _PNP_GetVersion(pipes_struct *p,
40		       struct PNP_GetVersion *r)
41{
42	*r->out.version = 0x0400;      /* no idea what this means */
43
44	return WERR_OK;
45}
46
47/********************************************************************
48********************************************************************/
49
50WERROR _PNP_GetDeviceListSize(pipes_struct *p,
51			      struct PNP_GetDeviceListSize *r)
52{
53	char *devicepath;
54
55	if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) &&
56	    (!r->in.devicename)) {
57		return WERR_CM_INVALID_POINTER;
58	}
59
60	if (!(devicepath = get_device_path(p->mem_ctx, r->in.devicename))) {
61		return WERR_NOMEM;
62	}
63
64	*r->out.size = strlen(devicepath) + 2;
65
66	TALLOC_FREE(devicepath);
67
68	return WERR_OK;
69}
70
71/****************************************************************
72 _PNP_GetDeviceList
73****************************************************************/
74
75WERROR _PNP_GetDeviceList(pipes_struct *p,
76			  struct PNP_GetDeviceList *r)
77{
78	char *devicepath;
79	uint32_t size = 0;
80	const char **multi_sz = NULL;
81	DATA_BLOB blob;
82
83	if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) &&
84	    (!r->in.filter)) {
85		return WERR_CM_INVALID_POINTER;
86	}
87
88	if (!(devicepath = get_device_path(p->mem_ctx, r->in.filter))) {
89		return WERR_NOMEM;
90	}
91
92	size = strlen(devicepath) + 2;
93
94	if (*r->in.length < size) {
95		return WERR_CM_BUFFER_SMALL;
96	}
97
98	multi_sz = talloc_zero_array(p->mem_ctx, const char *, 2);
99	if (!multi_sz) {
100		return WERR_NOMEM;
101	}
102
103	multi_sz[0] = devicepath;
104
105	if (!push_reg_multi_sz(multi_sz, &blob, multi_sz)) {
106		return WERR_NOMEM;
107	}
108
109	if (*r->in.length < blob.length/2) {
110		return WERR_CM_BUFFER_SMALL;
111	}
112
113	memcpy(r->out.buffer, blob.data, blob.length);
114
115	return WERR_OK;
116}
117
118/********************************************************************
119_PNP_GetDeviceRegProp
120********************************************************************/
121
122WERROR _PNP_GetDeviceRegProp(pipes_struct *p,
123			     struct PNP_GetDeviceRegProp *r)
124{
125	char *ptr;
126	struct regval_ctr *values;
127	struct regval_blob *val;
128
129	switch( r->in.property ) {
130	case DEV_REGPROP_DESC:
131
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;
136		*ptr = '\0';
137
138		if ( !(ptr = strrchr_m( r->in.devicepath, '_' )) )
139			return WERR_GENERAL_FAILURE;
140		ptr++;
141
142		if ( !(values = svcctl_fetch_regvalues(
143			       ptr, p->server_info->ptok)))
144			return WERR_GENERAL_FAILURE;
145
146		if ( !(val = regval_ctr_getvalue( values, "DisplayName" )) ) {
147			TALLOC_FREE( values );
148			return WERR_GENERAL_FAILURE;
149		}
150
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;
156		}
157
158		r->out.buffer = (uint8_t *)talloc_memdup(p->mem_ctx, val->data_p, val->size);
159		TALLOC_FREE(values);
160		if (!r->out.buffer) {
161			return WERR_NOMEM;
162		}
163
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;
167
168		break;
169
170	default:
171		*r->out.reg_data_type = 0x00437c98; /* ??? */
172		return WERR_CM_NO_SUCH_VALUE;
173	}
174
175	return WERR_OK;
176}
177
178/********************************************************************
179********************************************************************/
180
181WERROR _PNP_ValidateDeviceInstance(pipes_struct *p,
182				   struct PNP_ValidateDeviceInstance *r)
183{
184	/* whatever dude */
185	return WERR_OK;
186}
187
188/********************************************************************
189********************************************************************/
190
191WERROR _PNP_GetHwProfInfo(pipes_struct *p,
192			  struct PNP_GetHwProfInfo *r)
193{
194	/* steal the incoming buffer */
195
196	r->out.info = r->in.info;
197
198	/* Take the 5th Ammentment */
199
200	return WERR_CM_NO_MORE_HW_PROFILES;
201}
202
203/********************************************************************
204********************************************************************/
205
206WERROR _PNP_HwProfFlags(pipes_struct *p,
207			struct PNP_HwProfFlags *r)
208{
209	/* just nod your head */
210
211	return WERR_OK;
212}
213
214/****************************************************************
215****************************************************************/
216
217WERROR _PNP_Disconnect(pipes_struct *p,
218		       struct PNP_Disconnect *r)
219{
220	p->rng_fault_state = true;
221	return WERR_NOT_SUPPORTED;
222}
223
224/****************************************************************
225****************************************************************/
226
227WERROR _PNP_Connect(pipes_struct *p,
228		    struct PNP_Connect *r)
229{
230	p->rng_fault_state = true;
231	return WERR_NOT_SUPPORTED;
232}
233
234/****************************************************************
235****************************************************************/
236
237WERROR _PNP_GetGlobalState(pipes_struct *p,
238			   struct PNP_GetGlobalState *r)
239{
240	p->rng_fault_state = true;
241	return WERR_NOT_SUPPORTED;
242}
243
244/****************************************************************
245****************************************************************/
246
247WERROR _PNP_InitDetection(pipes_struct *p,
248			  struct PNP_InitDetection *r)
249{
250	p->rng_fault_state = true;
251	return WERR_NOT_SUPPORTED;
252}
253
254/****************************************************************
255****************************************************************/
256
257WERROR _PNP_ReportLogOn(pipes_struct *p,
258			struct PNP_ReportLogOn *r)
259{
260	p->rng_fault_state = true;
261	return WERR_NOT_SUPPORTED;
262}
263
264/****************************************************************
265****************************************************************/
266
267WERROR _PNP_GetRootDeviceInstance(pipes_struct *p,
268				  struct PNP_GetRootDeviceInstance *r)
269{
270	p->rng_fault_state = true;
271	return WERR_NOT_SUPPORTED;
272}
273
274/****************************************************************
275****************************************************************/
276
277WERROR _PNP_GetRelatedDeviceInstance(pipes_struct *p,
278				     struct PNP_GetRelatedDeviceInstance *r)
279{
280	p->rng_fault_state = true;
281	return WERR_NOT_SUPPORTED;
282}
283
284/****************************************************************
285****************************************************************/
286
287WERROR _PNP_EnumerateSubKeys(pipes_struct *p,
288			     struct PNP_EnumerateSubKeys *r)
289{
290	p->rng_fault_state = true;
291	return WERR_NOT_SUPPORTED;
292}
293
294/****************************************************************
295****************************************************************/
296
297WERROR _PNP_GetDepth(pipes_struct *p,
298		     struct PNP_GetDepth *r)
299{
300	p->rng_fault_state = true;
301	return WERR_NOT_SUPPORTED;
302}
303
304/****************************************************************
305****************************************************************/
306
307WERROR _PNP_SetDeviceRegProp(pipes_struct *p,
308			     struct PNP_SetDeviceRegProp *r)
309{
310	p->rng_fault_state = true;
311	return WERR_NOT_SUPPORTED;
312}
313
314/****************************************************************
315****************************************************************/
316
317WERROR _PNP_GetClassInstance(pipes_struct *p,
318			     struct PNP_GetClassInstance *r)
319{
320	p->rng_fault_state = true;
321	return WERR_NOT_SUPPORTED;
322}
323
324/****************************************************************
325****************************************************************/
326
327WERROR _PNP_CreateKey(pipes_struct *p,
328		      struct PNP_CreateKey *r)
329{
330	p->rng_fault_state = true;
331	return WERR_NOT_SUPPORTED;
332}
333
334/****************************************************************
335****************************************************************/
336
337WERROR _PNP_DeleteRegistryKey(pipes_struct *p,
338			      struct PNP_DeleteRegistryKey *r)
339{
340	p->rng_fault_state = true;
341	return WERR_NOT_SUPPORTED;
342}
343
344/****************************************************************
345****************************************************************/
346
347WERROR _PNP_GetClassCount(pipes_struct *p,
348			  struct PNP_GetClassCount *r)
349{
350	p->rng_fault_state = true;
351	return WERR_NOT_SUPPORTED;
352}
353
354/****************************************************************
355****************************************************************/
356
357WERROR _PNP_GetClassName(pipes_struct *p,
358			 struct PNP_GetClassName *r)
359{
360	p->rng_fault_state = true;
361	return WERR_NOT_SUPPORTED;
362}
363
364/****************************************************************
365****************************************************************/
366
367WERROR _PNP_DeleteClassKey(pipes_struct *p,
368			   struct PNP_DeleteClassKey *r)
369{
370	p->rng_fault_state = true;
371	return WERR_NOT_SUPPORTED;
372}
373
374/****************************************************************
375****************************************************************/
376
377WERROR _PNP_GetInterfaceDeviceAlias(pipes_struct *p,
378				    struct PNP_GetInterfaceDeviceAlias *r)
379{
380	p->rng_fault_state = true;
381	return WERR_NOT_SUPPORTED;
382}
383
384/****************************************************************
385****************************************************************/
386
387WERROR _PNP_GetInterfaceDeviceList(pipes_struct *p,
388				   struct PNP_GetInterfaceDeviceList *r)
389{
390	p->rng_fault_state = true;
391	return WERR_NOT_SUPPORTED;
392}
393
394/****************************************************************
395****************************************************************/
396
397WERROR _PNP_GetInterfaceDeviceListSize(pipes_struct *p,
398				       struct PNP_GetInterfaceDeviceListSize *r)
399{
400	p->rng_fault_state = true;
401	return WERR_NOT_SUPPORTED;
402}
403
404/****************************************************************
405****************************************************************/
406
407WERROR _PNP_RegisterDeviceClassAssociation(pipes_struct *p,
408					   struct PNP_RegisterDeviceClassAssociation *r)
409{
410	p->rng_fault_state = true;
411	return WERR_NOT_SUPPORTED;
412}
413
414/****************************************************************
415****************************************************************/
416
417WERROR _PNP_UnregisterDeviceClassAssociation(pipes_struct *p,
418					     struct PNP_UnregisterDeviceClassAssociation *r)
419{
420	p->rng_fault_state = true;
421	return WERR_NOT_SUPPORTED;
422}
423
424/****************************************************************
425****************************************************************/
426
427WERROR _PNP_GetClassRegProp(pipes_struct *p,
428			    struct PNP_GetClassRegProp *r)
429{
430	p->rng_fault_state = true;
431	return WERR_NOT_SUPPORTED;
432}
433
434/****************************************************************
435****************************************************************/
436
437WERROR _PNP_SetClassRegProp(pipes_struct *p,
438			    struct PNP_SetClassRegProp *r)
439{
440	p->rng_fault_state = true;
441	return WERR_NOT_SUPPORTED;
442}
443
444/****************************************************************
445****************************************************************/
446
447WERROR _PNP_CreateDevInst(pipes_struct *p,
448			  struct PNP_CreateDevInst *r)
449{
450	p->rng_fault_state = true;
451	return WERR_NOT_SUPPORTED;
452}
453
454/****************************************************************
455****************************************************************/
456
457WERROR _PNP_DeviceInstanceAction(pipes_struct *p,
458				 struct PNP_DeviceInstanceAction *r)
459{
460	p->rng_fault_state = true;
461	return WERR_NOT_SUPPORTED;
462}
463
464/****************************************************************
465****************************************************************/
466
467WERROR _PNP_GetDeviceStatus(pipes_struct *p,
468			    struct PNP_GetDeviceStatus *r)
469{
470	p->rng_fault_state = true;
471	return WERR_NOT_SUPPORTED;
472}
473
474/****************************************************************
475****************************************************************/
476
477WERROR _PNP_SetDeviceProblem(pipes_struct *p,
478			     struct PNP_SetDeviceProblem *r)
479{
480	p->rng_fault_state = true;
481	return WERR_NOT_SUPPORTED;
482}
483
484/****************************************************************
485****************************************************************/
486
487WERROR _PNP_DisableDevInst(pipes_struct *p,
488			   struct PNP_DisableDevInst *r)
489{
490	p->rng_fault_state = true;
491	return WERR_NOT_SUPPORTED;
492}
493
494/****************************************************************
495****************************************************************/
496
497WERROR _PNP_UninstallDevInst(pipes_struct *p,
498			     struct PNP_UninstallDevInst *r)
499{
500	p->rng_fault_state = true;
501	return WERR_NOT_SUPPORTED;
502}
503
504/****************************************************************
505****************************************************************/
506
507WERROR _PNP_AddID(pipes_struct *p,
508		  struct PNP_AddID *r)
509{
510	p->rng_fault_state = true;
511	return WERR_NOT_SUPPORTED;
512}
513
514/****************************************************************
515****************************************************************/
516
517WERROR _PNP_RegisterDriver(pipes_struct *p,
518			   struct PNP_RegisterDriver *r)
519{
520	p->rng_fault_state = true;
521	return WERR_NOT_SUPPORTED;
522}
523
524/****************************************************************
525****************************************************************/
526
527WERROR _PNP_QueryRemove(pipes_struct *p,
528			struct PNP_QueryRemove *r)
529{
530	p->rng_fault_state = true;
531	return WERR_NOT_SUPPORTED;
532}
533
534/****************************************************************
535****************************************************************/
536
537WERROR _PNP_RequestDeviceEject(pipes_struct *p,
538			       struct PNP_RequestDeviceEject *r)
539{
540	p->rng_fault_state = true;
541	return WERR_NOT_SUPPORTED;
542}
543
544/****************************************************************
545****************************************************************/
546
547WERROR _PNP_IsDockStationPresent(pipes_struct *p,
548				 struct PNP_IsDockStationPresent *r)
549{
550	p->rng_fault_state = true;
551	return WERR_NOT_SUPPORTED;
552}
553
554/****************************************************************
555****************************************************************/
556
557WERROR _PNP_RequestEjectPC(pipes_struct *p,
558			   struct PNP_RequestEjectPC *r)
559{
560	p->rng_fault_state = true;
561	return WERR_NOT_SUPPORTED;
562}
563
564/****************************************************************
565****************************************************************/
566
567WERROR _PNP_AddEmptyLogConf(pipes_struct *p,
568			    struct PNP_AddEmptyLogConf *r)
569{
570	p->rng_fault_state = true;
571	return WERR_NOT_SUPPORTED;
572}
573
574/****************************************************************
575****************************************************************/
576
577WERROR _PNP_FreeLogConf(pipes_struct *p,
578			struct PNP_FreeLogConf *r)
579{
580	p->rng_fault_state = true;
581	return WERR_NOT_SUPPORTED;
582}
583
584/****************************************************************
585****************************************************************/
586
587WERROR _PNP_GetFirstLogConf(pipes_struct *p,
588			    struct PNP_GetFirstLogConf *r)
589{
590	p->rng_fault_state = true;
591	return WERR_NOT_SUPPORTED;
592}
593
594/****************************************************************
595****************************************************************/
596
597WERROR _PNP_GetNextLogConf(pipes_struct *p,
598			   struct PNP_GetNextLogConf *r)
599{
600	p->rng_fault_state = true;
601	return WERR_NOT_SUPPORTED;
602}
603
604/****************************************************************
605****************************************************************/
606
607WERROR _PNP_GetLogConfPriority(pipes_struct *p,
608			       struct PNP_GetLogConfPriority *r)
609{
610	p->rng_fault_state = true;
611	return WERR_NOT_SUPPORTED;
612}
613
614/****************************************************************
615****************************************************************/
616
617WERROR _PNP_AddResDes(pipes_struct *p,
618		      struct PNP_AddResDes *r)
619{
620	p->rng_fault_state = true;
621	return WERR_NOT_SUPPORTED;
622}
623
624/****************************************************************
625****************************************************************/
626
627WERROR _PNP_FreeResDes(pipes_struct *p,
628		       struct PNP_FreeResDes *r)
629{
630	p->rng_fault_state = true;
631	return WERR_NOT_SUPPORTED;
632}
633
634/****************************************************************
635****************************************************************/
636
637WERROR _PNP_GetNextResDes(pipes_struct *p,
638			  struct PNP_GetNextResDes *r)
639{
640	p->rng_fault_state = true;
641	return WERR_NOT_SUPPORTED;
642}
643
644/****************************************************************
645****************************************************************/
646
647WERROR _PNP_GetResDesData(pipes_struct *p,
648			  struct PNP_GetResDesData *r)
649{
650	p->rng_fault_state = true;
651	return WERR_NOT_SUPPORTED;
652}
653
654/****************************************************************
655****************************************************************/
656
657WERROR _PNP_GetResDesDataSize(pipes_struct *p,
658			      struct PNP_GetResDesDataSize *r)
659{
660	p->rng_fault_state = true;
661	return WERR_NOT_SUPPORTED;
662}
663
664/****************************************************************
665****************************************************************/
666
667WERROR _PNP_ModifyResDes(pipes_struct *p,
668			 struct PNP_ModifyResDes *r)
669{
670	p->rng_fault_state = true;
671	return WERR_NOT_SUPPORTED;
672}
673
674/****************************************************************
675****************************************************************/
676
677WERROR _PNP_DetectResourceLimit(pipes_struct *p,
678				struct PNP_DetectResourceLimit *r)
679{
680	p->rng_fault_state = true;
681	return WERR_NOT_SUPPORTED;
682}
683
684/****************************************************************
685****************************************************************/
686
687WERROR _PNP_QueryResConfList(pipes_struct *p,
688			     struct PNP_QueryResConfList *r)
689{
690	p->rng_fault_state = true;
691	return WERR_NOT_SUPPORTED;
692}
693
694/****************************************************************
695****************************************************************/
696
697WERROR _PNP_SetHwProf(pipes_struct *p,
698		      struct PNP_SetHwProf *r)
699{
700	p->rng_fault_state = true;
701	return WERR_NOT_SUPPORTED;
702}
703
704/****************************************************************
705****************************************************************/
706
707WERROR _PNP_QueryArbitratorFreeData(pipes_struct *p,
708				    struct PNP_QueryArbitratorFreeData *r)
709{
710	p->rng_fault_state = true;
711	return WERR_NOT_SUPPORTED;
712}
713
714/****************************************************************
715****************************************************************/
716
717WERROR _PNP_QueryArbitratorFreeSize(pipes_struct *p,
718				    struct PNP_QueryArbitratorFreeSize *r)
719{
720	p->rng_fault_state = true;
721	return WERR_NOT_SUPPORTED;
722}
723
724/****************************************************************
725****************************************************************/
726
727WERROR _PNP_RunDetection(pipes_struct *p,
728			 struct PNP_RunDetection *r)
729{
730	p->rng_fault_state = true;
731	return WERR_NOT_SUPPORTED;
732}
733
734/****************************************************************
735****************************************************************/
736
737WERROR _PNP_RegisterNotification(pipes_struct *p,
738				 struct PNP_RegisterNotification *r)
739{
740	p->rng_fault_state = true;
741	return WERR_NOT_SUPPORTED;
742}
743
744/****************************************************************
745****************************************************************/
746
747WERROR _PNP_UnregisterNotification(pipes_struct *p,
748				   struct PNP_UnregisterNotification *r)
749{
750	p->rng_fault_state = true;
751	return WERR_NOT_SUPPORTED;
752}
753
754/****************************************************************
755****************************************************************/
756
757WERROR _PNP_GetCustomDevProp(pipes_struct *p,
758			     struct PNP_GetCustomDevProp *r)
759{
760	p->rng_fault_state = true;
761	return WERR_NOT_SUPPORTED;
762}
763
764/****************************************************************
765****************************************************************/
766
767WERROR _PNP_GetVersionInternal(pipes_struct *p,
768			       struct PNP_GetVersionInternal *r)
769{
770	p->rng_fault_state = true;
771	return WERR_NOT_SUPPORTED;
772}
773
774/****************************************************************
775****************************************************************/
776
777WERROR _PNP_GetBlockedDriverInfo(pipes_struct *p,
778				 struct PNP_GetBlockedDriverInfo *r)
779{
780	p->rng_fault_state = true;
781	return WERR_NOT_SUPPORTED;
782}
783
784/****************************************************************
785****************************************************************/
786
787WERROR _PNP_GetServerSideDeviceInstallFlags(pipes_struct *p,
788					    struct PNP_GetServerSideDeviceInstallFlags *r)
789{
790	p->rng_fault_state = true;
791	return WERR_NOT_SUPPORTED;
792}
793
794