2 * Configuration manager functions
4 * Copyright 2000 James Hatheway
5 * Copyright 2005 Eric Kohl
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "setupapi_private.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(setupapi
);
26 /* Registry key and value names */
27 static const WCHAR Backslash
[] = {'\\', 0};
28 static const WCHAR Class
[] = {'C','l','a','s','s',0};
30 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
31 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
32 'C','o','n','t','r','o','l','\\',
33 'C','l','a','s','s',0};
35 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
36 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
37 'C','o','n','t','r','o','l','\\',
38 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
40 typedef struct _MACHINE_INFO
42 WCHAR szMachineName
[MAX_PATH
];
43 RPC_BINDING_HANDLE BindingHandle
;
44 HSTRING_TABLE StringTable
;
45 } MACHINE_INFO
, *PMACHINE_INFO
;
48 static BOOL
GuidToString(LPGUID Guid
, LPWSTR String
)
52 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
55 lstrcpyW(&String
[1], lpString
);
58 String
[MAX_GUID_STRING_LEN
- 2] = L
'}';
59 String
[MAX_GUID_STRING_LEN
- 1] = 0;
61 RpcStringFree(&lpString
);
67 /***********************************************************************
68 * CMP_Init_Detection [SETUPAPI.@]
70 CONFIGRET WINAPI
CMP_Init_Detection(
73 RPC_BINDING_HANDLE BindingHandle
= NULL
;
75 TRACE("%lu\n", dwMagic
);
77 if (dwMagic
!= CMP_MAGIC
)
78 return CR_INVALID_DATA
;
80 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
83 return PNP_InitDetection(BindingHandle
);
87 /***********************************************************************
88 * CMP_Report_LogOn [SETUPAPI.@]
90 CONFIGRET WINAPI
CMP_Report_LogOn(
94 RPC_BINDING_HANDLE BindingHandle
= NULL
;
95 CONFIGRET ret
= CR_SUCCESS
;
99 TRACE("%lu\n", dwMagic
);
101 if (dwMagic
!= CMP_MAGIC
)
102 return CR_INVALID_DATA
;
104 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
107 bAdmin
= TRUE
; //IsUserAdmin();
109 for (i
= 0; i
< 30; i
++)
111 ret
= PNP_ReportLogOn(BindingHandle
,
114 if (ret
== CR_SUCCESS
)
124 /***********************************************************************
125 * CM_Connect_MachineA [SETUPAPI.@]
127 CONFIGRET WINAPI
CM_Connect_MachineA(
128 PCSTR UNCServerName
, PHMACHINE phMachine
)
133 TRACE("%s %p\n", UNCServerName
, phMachine
);
135 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
136 return CM_Connect_MachineW(NULL
, phMachine
);
138 if (CaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
139 return CR_INVALID_DATA
;
141 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
143 MyFree(pServerNameW
);
149 /***********************************************************************
150 * CM_Connect_MachineW [SETUPAPI.@]
152 CONFIGRET WINAPI
CM_Connect_MachineW(
153 PCWSTR UNCServerName
, PHMACHINE phMachine
)
155 PMACHINE_INFO pMachine
;
157 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
159 pMachine
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(MACHINE_INFO
));
160 if (pMachine
== NULL
)
161 return CR_OUT_OF_MEMORY
;
163 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
165 pMachine
->StringTable
= StringTableInitialize();
166 if (pMachine
->StringTable
== NULL
)
168 HeapFree(GetProcessHeap(), 0, pMachine
);
172 StringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
174 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
176 StringTableDestroy(pMachine
->StringTable
);
177 HeapFree(GetProcessHeap(), 0, pMachine
);
178 return CR_INVALID_MACHINENAME
;
181 phMachine
= (PHMACHINE
)pMachine
;
187 /***********************************************************************
188 * CM_Delete_Class_Key [SETUPAPI.@]
190 CONFIGRET WINAPI
CM_Delete_Class_Key(
191 LPGUID ClassGuid
, ULONG ulFlags
)
193 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
194 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
198 /***********************************************************************
199 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
201 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
202 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
204 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
205 RPC_BINDING_HANDLE BindingHandle
= NULL
;
207 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
209 if (ClassGuid
== NULL
)
210 return CR_INVALID_POINTER
;
212 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
213 return CR_INVALID_FLAG
;
215 if (!GuidToString(ClassGuid
, szGuidString
))
216 return CR_INVALID_DATA
;
218 if (hMachine
!= NULL
)
220 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
221 if (BindingHandle
== NULL
)
226 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
230 return PNP_DeleteClassKey(BindingHandle
,
236 /***********************************************************************
237 * CM_Disable_DevNode [SETUPAPI.@]
239 CONFIGRET WINAPI
CM_Disable_DevNode(
240 DEVINST dnDevInst
, ULONG ulFlags
)
242 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
243 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
247 /***********************************************************************
248 * CM_Disable_DevNode_Ex [SETUPAPI.@]
250 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
251 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
253 RPC_BINDING_HANDLE BindingHandle
= NULL
;
254 HSTRING_TABLE StringTable
= NULL
;
257 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
259 // if (!IsUserAdmin())
260 // return CR_ACCESS_DENIED;
263 return CR_INVALID_DEVINST
;
266 return CR_INVALID_FLAG
;
268 if (hMachine
!= NULL
)
270 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
271 if (BindingHandle
== NULL
)
274 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
275 if (StringTable
== 0)
280 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
284 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
285 if (lpDevInst
== NULL
)
286 return CR_INVALID_DEVNODE
;
288 return PNP_DeviceInstanceAction(BindingHandle
,
296 /***********************************************************************
297 * CM_Disconnect_Machine [SETUPAPI.@]
299 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
301 PMACHINE_INFO pMachine
;
303 TRACE("%lx\n", hMachine
);
305 pMachine
= (PMACHINE_INFO
)hMachine
;
306 if (pMachine
== NULL
)
309 if (pMachine
->StringTable
!= NULL
)
310 StringTableDestroy(pMachine
->StringTable
);
312 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
313 return CR_ACCESS_DENIED
;
315 HeapFree(GetProcessHeap(), 0, pMachine
);
321 /***********************************************************************
322 * CM_Enable_DevNode [SETUPAPI.@]
324 CONFIGRET WINAPI
CM_Enable_DevNode(
325 DEVINST dnDevInst
, ULONG ulFlags
)
327 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
328 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
332 /***********************************************************************
333 * CM_Enable_DevNode_Ex [SETUPAPI.@]
335 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
336 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
338 RPC_BINDING_HANDLE BindingHandle
= NULL
;
339 HSTRING_TABLE StringTable
= NULL
;
342 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
344 // if (!IsUserAdmin())
345 // return CR_ACCESS_DENIED;
348 return CR_INVALID_DEVINST
;
351 return CR_INVALID_FLAG
;
353 if (hMachine
!= NULL
)
355 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
356 if (BindingHandle
== NULL
)
359 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
360 if (StringTable
== 0)
365 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
369 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
370 if (lpDevInst
== NULL
)
371 return CR_INVALID_DEVNODE
;
373 return PNP_DeviceInstanceAction(BindingHandle
,
381 /***********************************************************************
382 * CM_Enumerate_Classes [SETUPAPI.@]
384 CONFIGRET WINAPI
CM_Enumerate_Classes(
385 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
387 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
388 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
392 /***********************************************************************
393 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
395 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
396 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
398 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
399 RPC_BINDING_HANDLE BindingHandle
= NULL
;
400 CONFIGRET ret
= CR_SUCCESS
;
401 ULONG ulLength
= MAX_GUID_STRING_LEN
;
403 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
405 if (ClassGuid
== NULL
)
406 return CR_INVALID_POINTER
;
409 return CR_INVALID_FLAG
;
411 if (hMachine
!= NULL
)
413 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
414 if (BindingHandle
== NULL
)
419 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
423 ret
= PNP_EnumerateSubKeys(BindingHandle
,
430 if (ret
== CR_SUCCESS
)
433 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
435 /* Convert the buffer to a GUID */
436 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
444 /***********************************************************************
445 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
447 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
448 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
450 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
451 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
456 /***********************************************************************
457 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
459 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
460 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
462 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
463 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
468 /***********************************************************************
469 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
471 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
472 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
475 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
478 CONFIGRET ret
= CR_SUCCESS
;
480 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
483 if (Buffer
== NULL
|| pulLength
== NULL
)
484 return CR_INVALID_POINTER
;
487 return CR_INVALID_FLAG
;
489 ulOrigLength
= *pulLength
;
492 ulLength
= MAX_DEVICE_ID_LEN
;
493 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
495 if (ret
== CR_SUCCESS
)
497 if (WideCharToMultiByte(CP_ACP
,
507 *pulLength
= lstrlenA(Buffer
) + 1;
514 /***********************************************************************
515 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
517 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
518 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
521 RPC_BINDING_HANDLE BindingHandle
= NULL
;
523 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
526 if (Buffer
== NULL
|| pulLength
== NULL
)
527 return CR_INVALID_POINTER
;
530 return CR_INVALID_FLAG
;
532 *Buffer
= UNICODE_NULL
;
534 if (hMachine
!= NULL
)
536 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
537 if (BindingHandle
== NULL
)
542 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
546 return PNP_EnumerateSubKeys(BindingHandle
,
556 /***********************************************************************
557 * CM_Get_Child [SETUPAPI.@]
559 CONFIGRET WINAPI
CM_Get_Child(
560 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
562 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
563 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
567 /***********************************************************************
568 * CM_Get_Child_Ex [SETUPAPI.@]
570 CONFIGRET WINAPI
CM_Get_Child_Ex(
571 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
573 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
574 RPC_BINDING_HANDLE BindingHandle
= NULL
;
575 HSTRING_TABLE StringTable
= NULL
;
580 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
582 if (pdnDevInst
== NULL
)
583 return CR_INVALID_POINTER
;
586 return CR_INVALID_DEVINST
;
589 return CR_INVALID_FLAG
;
593 if (hMachine
!= NULL
)
595 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
596 if (BindingHandle
== NULL
)
599 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
600 if (StringTable
== 0)
605 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
609 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
610 if (lpDevInst
== NULL
)
611 return CR_INVALID_DEVNODE
;
613 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
619 if (ret
!= CR_SUCCESS
)
622 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
624 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
628 *pdnDevInst
= dwIndex
;
634 /***********************************************************************
635 * CM_Get_Class_Key_NameA [SETUPAPI.@]
637 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
638 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
640 TRACE("%p %p %p %lx\n",
641 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
642 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
647 /***********************************************************************
648 * CM_Get_Class_Key_NameW [SETUPAPI.@]
650 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
651 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
653 TRACE("%p %p %p %lx\n",
654 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
655 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
660 /***********************************************************************
661 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
663 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
664 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
667 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
668 CONFIGRET ret
= CR_SUCCESS
;
672 TRACE("%p %p %p %lx %lx\n",
673 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
675 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
676 return CR_INVALID_POINTER
;
678 ulOrigLength
= *pulLength
;
681 ulLength
= MAX_GUID_STRING_LEN
;
682 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
684 if (ret
== CR_SUCCESS
)
686 if (WideCharToMultiByte(CP_ACP
,
696 *pulLength
= lstrlenA(pszKeyName
) + 1;
703 /***********************************************************************
704 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
706 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
707 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
710 TRACE("%p %p %p %lx %lx\n",
711 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
713 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
714 return CR_INVALID_POINTER
;
717 return CR_INVALID_FLAG
;
719 if (*pulLength
< MAX_GUID_STRING_LEN
)
722 return CR_BUFFER_SMALL
;
725 if (!GuidToString(ClassGuid
, pszKeyName
))
726 return CR_INVALID_DATA
;
728 *pulLength
= MAX_GUID_STRING_LEN
;
734 /***********************************************************************
735 * CM_Get_Class_NameA [SETUPAPI.@]
737 CONFIGRET WINAPI
CM_Get_Class_NameA(
738 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
740 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
741 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
746 /***********************************************************************
747 * CM_Get_Class_NameW [SETUPAPI.@]
749 CONFIGRET WINAPI
CM_Get_Class_NameW(
750 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
752 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
753 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
758 /***********************************************************************
759 * CM_Get_Class_Name_ExA [SETUPAPI.@]
761 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
762 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
765 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
766 CONFIGRET ret
= CR_SUCCESS
;
770 TRACE("%p %p %p %lx %lx\n",
771 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
773 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
774 return CR_INVALID_POINTER
;
776 ulOrigLength
= *pulLength
;
779 ulLength
= MAX_CLASS_NAME_LEN
;
780 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
782 if (ret
== CR_SUCCESS
)
784 if (WideCharToMultiByte(CP_ACP
,
794 *pulLength
= lstrlenA(Buffer
) + 1;
801 /***********************************************************************
802 * CM_Get_Class_Name_ExW [SETUPAPI.@]
805 CM_Get_Class_Name_ExW(
806 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
809 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
810 RPC_BINDING_HANDLE BindingHandle
= NULL
;
812 TRACE("%p %p %p %lx %lx\n",
813 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
815 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
816 return CR_INVALID_POINTER
;
819 return CR_INVALID_FLAG
;
821 if (!GuidToString(ClassGuid
, szGuidString
))
822 return CR_INVALID_DATA
;
824 TRACE("Guid %s\n", debugstr_w(szGuidString
));
826 if (hMachine
!= NULL
)
828 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
829 if (BindingHandle
== NULL
)
834 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
838 return PNP_GetClassName(BindingHandle
,
846 /***********************************************************************
847 * CM_Get_Depth [SETUPAPI.@]
849 CONFIGRET WINAPI
CM_Get_Depth(
850 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
852 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
853 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
857 /***********************************************************************
858 * CM_Get_Depth_Ex [SETUPAPI.@]
860 CONFIGRET WINAPI
CM_Get_Depth_Ex(
861 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
863 RPC_BINDING_HANDLE BindingHandle
= NULL
;
864 HSTRING_TABLE StringTable
= NULL
;
867 TRACE("%p %lx %lx %lx\n",
868 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
870 if (pulDepth
== NULL
)
871 return CR_INVALID_POINTER
;
874 return CR_INVALID_DEVINST
;
877 return CR_INVALID_FLAG
;
879 if (hMachine
!= NULL
)
881 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
882 if (BindingHandle
== NULL
)
885 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
886 if (StringTable
== 0)
891 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
895 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
896 if (lpDevInst
== NULL
)
897 return CR_INVALID_DEVNODE
;
899 return PNP_GetDepth(BindingHandle
,
906 /***********************************************************************
907 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
909 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
910 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
911 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
913 TRACE("%lx %lu %p %p %p %lx\n",
914 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
916 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
917 pulRegDataType
, Buffer
,
918 pulLength
, ulFlags
, NULL
);
922 /***********************************************************************
923 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
925 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
926 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
927 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
929 TRACE("%lx %lu %p %p %p %lx\n",
930 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
932 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
933 pulRegDataType
, Buffer
,
934 pulLength
, ulFlags
, NULL
);
938 /***********************************************************************
939 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
941 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
942 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
943 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
950 TRACE("%lx %lu %p %p %p %lx %lx\n",
951 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
955 return CR_INVALID_POINTER
;
957 LengthW
= *pulLength
* sizeof(WCHAR
);
958 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
961 return CR_OUT_OF_MEMORY
;
963 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
971 if (ret
== CR_SUCCESS
)
973 if (RegDataType
== REG_SZ
|| RegDataType
== REG_EXPAND_SZ
)
975 /* Do W->A conversion */
976 *pulLength
= WideCharToMultiByte(CP_ACP
,
979 lstrlenW(BufferW
) + 1,
989 /* Directly copy the value */
990 if (LengthW
<= *pulLength
)
991 memcpy(Buffer
, BufferW
, LengthW
);
994 *pulLength
= LengthW
;
995 ret
= CR_BUFFER_SMALL
;
1001 *pulRegDataType
= RegDataType
;
1003 HeapFree(GetProcessHeap(), 0, BufferW
);
1009 /***********************************************************************
1010 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
1012 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
1013 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1014 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1016 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1017 HSTRING_TABLE StringTable
= NULL
;
1018 CONFIGRET ret
= CR_SUCCESS
;
1020 ULONG ulDataType
= 0;
1021 ULONG ulTransferLength
= 0;
1023 TRACE("%lx %lu %p %p %p %lx %lx\n",
1024 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1028 return CR_INVALID_DEVNODE
;
1030 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
1031 return CR_INVALID_PROPERTY
;
1033 /* pulRegDataType is optional */
1035 /* Buffer is optional */
1037 if (pulLength
== NULL
)
1038 return CR_INVALID_POINTER
;
1040 if (*pulLength
== 0)
1041 return CR_INVALID_POINTER
;
1044 return CR_INVALID_FLAG
;
1046 if (hMachine
!= NULL
)
1048 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1049 if (BindingHandle
== NULL
)
1052 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1053 if (StringTable
== 0)
1058 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1062 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1063 if (lpDevInst
== NULL
)
1064 return CR_INVALID_DEVNODE
;
1066 ulTransferLength
= *pulLength
;
1067 ret
= PNP_GetDeviceRegProp(BindingHandle
,
1075 if (ret
== CR_SUCCESS
)
1077 if (pulRegDataType
!= NULL
)
1078 *pulRegDataType
= ulDataType
;
1085 /***********************************************************************
1086 * CM_Get_DevNode_Status [SETUPAPI.@]
1088 CONFIGRET WINAPI
CM_Get_DevNode_Status(
1089 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1092 TRACE("%p %p %lx %lx\n",
1093 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
1094 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
1099 /***********************************************************************
1100 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
1103 CM_Get_DevNode_Status_Ex(
1104 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1105 ULONG ulFlags
, HMACHINE hMachine
)
1107 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1108 HSTRING_TABLE StringTable
= NULL
;
1111 TRACE("%p %p %lx %lx %lx\n",
1112 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
1114 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
1115 return CR_INVALID_POINTER
;
1118 return CR_INVALID_DEVINST
;
1121 return CR_INVALID_FLAG
;
1123 if (hMachine
!= NULL
)
1125 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1126 if (BindingHandle
== NULL
)
1129 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1130 if (StringTable
== 0)
1135 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1139 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1140 if (lpDevInst
== NULL
)
1141 return CR_INVALID_DEVNODE
;
1143 return PNP_GetDeviceStatus(BindingHandle
,
1151 /***********************************************************************
1152 * CM_Get_Device_IDA [SETUPAPI.@]
1154 CONFIGRET WINAPI
CM_Get_Device_IDA(
1155 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1157 TRACE("%lx %p %ld %ld\n",
1158 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1159 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1163 /***********************************************************************
1164 * CM_Get_Device_IDW [SETUPAPI.@]
1166 CONFIGRET WINAPI
CM_Get_Device_IDW(
1167 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1169 TRACE("%lx %p %ld %ld\n",
1170 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1171 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1175 /***********************************************************************
1176 * CM_Get_Device_ID_ExA [SETUPAPI.@]
1178 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
1179 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1182 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
1183 CONFIGRET ret
= CR_SUCCESS
;
1185 FIXME("%lx %p %ld %ld %lx\n",
1186 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1189 return CR_INVALID_POINTER
;
1191 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
1196 if (ret
== CR_SUCCESS
)
1198 if (WideCharToMultiByte(CP_ACP
,
1201 lstrlenW(szBufferW
) + 1,
1213 /***********************************************************************
1214 * CM_Get_Device_ID_ExW [SETUPAPI.@]
1216 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
1217 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1220 HSTRING_TABLE StringTable
= NULL
;
1222 TRACE("%lx %p %ld %ld %lx\n",
1223 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1226 return CR_INVALID_DEVINST
;
1229 return CR_INVALID_POINTER
;
1232 return CR_INVALID_FLAG
;
1234 if (hMachine
!= NULL
)
1236 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1237 if (StringTable
== NULL
)
1242 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1246 if (!StringTableStringFromIdEx(StringTable
,
1256 /***********************************************************************
1257 * CM_Get_Device_ID_ListA [SETUPAPI.@]
1259 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
1260 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1262 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1263 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
1268 /***********************************************************************
1269 * CM_Get_Device_ID_ListW [SETUPAPI.@]
1271 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
1272 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1274 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1275 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
1280 /***********************************************************************
1281 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
1283 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
1284 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1287 LPWSTR BufferW
= NULL
;
1288 LPWSTR pszFilterW
= NULL
;
1289 CONFIGRET ret
= CR_SUCCESS
;
1291 FIXME("%p %p %ld %ld %lx\n",
1292 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1294 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
1295 if (BufferW
== NULL
)
1296 return CR_OUT_OF_MEMORY
;
1298 if (pszFilter
== NULL
)
1300 ret
= CM_Get_Device_ID_List_ExW(NULL
,
1308 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1310 ret
= CR_INVALID_DEVICE_ID
;
1314 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
1323 if (WideCharToMultiByte(CP_ACP
,
1326 lstrlenW(BufferW
) + 1,
1340 /***********************************************************************
1341 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
1343 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
1344 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1347 FIXME("%p %p %ld %ld %lx\n",
1348 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1354 /***********************************************************************
1355 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
1357 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
1358 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
1360 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
1361 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
1365 /***********************************************************************
1366 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
1368 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
1369 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
1371 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
1372 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
1376 /***********************************************************************
1377 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
1379 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
1380 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1382 LPWSTR pszFilterW
= NULL
;
1383 CONFIGRET ret
= CR_SUCCESS
;
1385 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
1387 if (pszFilter
== NULL
)
1389 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1396 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1397 return CR_INVALID_DEVICE_ID
;
1399 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1411 /***********************************************************************
1412 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
1414 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
1415 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1417 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1419 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
1422 return CR_INVALID_POINTER
;
1424 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
1425 return CR_INVALID_FLAG
;
1427 if (hMachine
!= NULL
)
1429 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1430 if (BindingHandle
== NULL
)
1435 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1441 return PNP_GetDeviceListSize(BindingHandle
,
1448 /***********************************************************************
1449 * CM_Get_Device_ID_Size [SETUPAPI.@]
1451 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
1452 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
1454 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
1455 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
1459 /***********************************************************************
1460 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
1462 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
1463 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1465 HSTRING_TABLE StringTable
= NULL
;
1468 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
1471 return CR_INVALID_POINTER
;
1474 return CR_INVALID_DEVINST
;
1477 return CR_INVALID_FLAG
;
1479 if (hMachine
!= NULL
)
1481 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1482 if (StringTable
== NULL
)
1487 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1491 DeviceId
= StringTableStringFromId(StringTable
, dnDevInst
);
1492 if (DeviceId
== NULL
)
1498 *pulLen
= lstrlenW(DeviceId
);
1504 /***********************************************************************
1505 * CM_Get_Global_State [SETUPAPI.@]
1507 CONFIGRET WINAPI
CM_Get_Global_State(
1508 PULONG pulState
, ULONG ulFlags
)
1510 TRACE("%p %lx\n", pulState
, ulFlags
);
1511 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
1515 /***********************************************************************
1516 * CM_Get_Global_State_Ex [SETUPAPI.@]
1518 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
1519 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
1521 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1523 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
1525 if (pulState
== NULL
)
1526 return CR_INVALID_POINTER
;
1529 return CR_INVALID_FLAG
;
1531 if (hMachine
!= NULL
)
1533 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1534 if (BindingHandle
== NULL
)
1539 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1543 return PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
1547 /***********************************************************************
1548 * CM_Get_Parent [SETUPAPI.@]
1550 CONFIGRET WINAPI
CM_Get_Parent(
1551 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1553 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1554 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1558 /***********************************************************************
1559 * CM_Get_Parent_Ex [SETUPAPI.@]
1561 CONFIGRET WINAPI
CM_Get_Parent_Ex(
1562 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1564 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1565 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1566 HSTRING_TABLE StringTable
= NULL
;
1571 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1573 if (pdnDevInst
== NULL
)
1574 return CR_INVALID_POINTER
;
1577 return CR_INVALID_DEVINST
;
1580 return CR_INVALID_FLAG
;
1584 if (hMachine
!= NULL
)
1586 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1587 if (BindingHandle
== NULL
)
1590 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1591 if (StringTable
== 0)
1596 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1600 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1601 if (lpDevInst
== NULL
)
1602 return CR_INVALID_DEVNODE
;
1604 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1610 if (ret
!= CR_SUCCESS
)
1613 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1615 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1619 *pdnDevInst
= dwIndex
;
1625 /***********************************************************************
1626 * CM_Get_Sibling [SETUPAPI.@]
1628 CONFIGRET WINAPI
CM_Get_Sibling(
1629 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1631 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1632 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1636 /***********************************************************************
1637 * CM_Get_Sibling_Ex [SETUPAPI.@]
1639 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
1640 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1642 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1643 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1644 HSTRING_TABLE StringTable
= NULL
;
1649 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1651 if (pdnDevInst
== NULL
)
1652 return CR_INVALID_POINTER
;
1655 return CR_INVALID_DEVINST
;
1658 return CR_INVALID_FLAG
;
1662 if (hMachine
!= NULL
)
1664 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1665 if (BindingHandle
== NULL
)
1668 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1669 if (StringTable
== 0)
1674 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1678 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1679 if (lpDevInst
== NULL
)
1680 return CR_INVALID_DEVNODE
;
1682 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1688 if (ret
!= CR_SUCCESS
)
1691 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1693 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1697 *pdnDevInst
= dwIndex
;
1703 /***********************************************************************
1704 * CM_Get_Version [SETUPAPI.@]
1706 WORD WINAPI
CM_Get_Version(VOID
)
1709 return CM_Get_Version_Ex(NULL
);
1713 /***********************************************************************
1714 * CM_Get_Version_Ex [SETUPAPI.@]
1716 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
1718 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1721 TRACE("%lx\n", hMachine
);
1723 if (hMachine
!= NULL
)
1725 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1726 if (BindingHandle
== NULL
)
1731 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1735 if (PNP_GetVersion(BindingHandle
, &Version
) != CR_SUCCESS
)
1742 /***********************************************************************
1743 * CM_Is_Dock_Station_Present [SETUPAPI.@]
1745 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
1748 TRACE("%p\n", pbPresent
);
1749 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
1753 /***********************************************************************
1754 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
1756 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
1757 PBOOL pbPresent
, HMACHINE hMachine
)
1759 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1761 TRACE("%p %lx\n", pbPresent
, hMachine
);
1763 if (pbPresent
== NULL
)
1764 return CR_INVALID_POINTER
;
1768 if (hMachine
!= NULL
)
1770 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1771 if (BindingHandle
== NULL
)
1776 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1780 return PNP_IsDockStationPresent(BindingHandle
,
1781 (unsigned long *)pbPresent
);
1785 /***********************************************************************
1786 * CM_Locate_DevNodeA [SETUPAPI.@]
1788 CONFIGRET WINAPI
CM_Locate_DevNodeA(
1789 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
1791 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
1792 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
1796 /***********************************************************************
1797 * CM_Locate_DevNodeW [SETUPAPI.@]
1799 CONFIGRET WINAPI
CM_Locate_DevNodeW(
1800 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
1802 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
1803 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
1807 /***********************************************************************
1808 * CM_Locate_DevNode_ExA [SETUPAPI.@]
1810 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
1811 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
1813 DEVINSTID_W pDevIdW
= NULL
;
1814 CONFIGRET ret
= CR_SUCCESS
;
1816 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
1818 if (pDeviceID
!= NULL
)
1820 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
1821 return CR_INVALID_DEVICE_ID
;
1824 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
1826 if (pDevIdW
!= NULL
)
1833 /***********************************************************************
1834 * CM_Locate_DevNode_ExW [SETUPAPI.@]
1836 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
1837 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
1839 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
1840 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1841 HSTRING_TABLE StringTable
= NULL
;
1842 CONFIGRET ret
= CR_SUCCESS
;
1844 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
1846 if (pdnDevInst
== NULL
)
1847 return CR_INVALID_POINTER
;
1849 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
1850 return CR_INVALID_FLAG
;
1852 if (hMachine
!= NULL
)
1854 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1855 if (BindingHandle
== NULL
)
1858 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1859 if (StringTable
== 0)
1864 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1868 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
1870 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
1874 /* Get the root device ID */
1875 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
1878 if (ret
!= CR_SUCCESS
)
1881 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
1883 /* Validate the device ID */
1884 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
1887 if (ret
== CR_SUCCESS
)
1889 *pdnDevInst
= StringTableAddString(StringTable
, DeviceIdBuffer
, 1);
1890 if (*pdnDevInst
== -1)
1898 /***********************************************************************
1899 * CM_Move_DevNode [SETUPAPI.@]
1901 CONFIGRET WINAPI
CM_Move_DevNode(
1902 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
1904 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
1905 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
1909 /***********************************************************************
1910 * CM_Move_DevNode_Ex [SETUPAPI.@]
1912 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
1913 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
1916 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1917 HSTRING_TABLE StringTable
= NULL
;
1918 LPWSTR lpFromDevInst
;
1921 FIXME("%lx %lx %lx %lx\n",
1922 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
1924 // if (!IsUserAdmin())
1925 // return CR_ACCESS_DENIED;
1927 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
1928 return CR_INVALID_DEVNODE
;
1931 return CR_INVALID_FLAG
;
1933 if (hMachine
!= NULL
)
1935 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1936 if (BindingHandle
== NULL
)
1939 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1940 if (StringTable
== 0)
1945 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1949 lpFromDevInst
= StringTableStringFromId(StringTable
, dnFromDevInst
);
1950 if (lpFromDevInst
== NULL
)
1951 return CR_INVALID_DEVNODE
;
1953 lpToDevInst
= StringTableStringFromId(StringTable
, dnToDevInst
);
1954 if (lpToDevInst
== NULL
)
1955 return CR_INVALID_DEVNODE
;
1957 return PNP_DeviceInstanceAction(BindingHandle
,
1965 /***********************************************************************
1966 * CM_Open_Class_KeyA [SETUPAPI.@]
1968 CONFIGRET WINAPI
CM_Open_Class_KeyA(
1969 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
1970 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
1972 TRACE("%p %s %lx %lx %p %lx\n",
1973 debugstr_guid(pClassGuid
), pszClassName
,
1974 samDesired
, Disposition
, phkClass
, ulFlags
);
1976 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
1977 Disposition
, phkClass
, ulFlags
, NULL
);
1981 /***********************************************************************
1982 * CM_Open_Class_KeyW [SETUPAPI.@]
1984 CONFIGRET WINAPI
CM_Open_Class_KeyW(
1985 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
1986 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
1988 TRACE("%p %s %lx %lx %p %lx\n",
1989 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
1990 samDesired
, Disposition
, phkClass
, ulFlags
);
1992 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
1993 Disposition
, phkClass
, ulFlags
, NULL
);
1997 /***********************************************************************
1998 * CM_Open_Class_Key_ExA [SETUPAPI.@]
2000 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
2001 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
2002 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
2005 CONFIGRET rc
= CR_SUCCESS
;
2006 LPWSTR pszClassNameW
= NULL
;
2008 TRACE("%p %s %lx %lx %p %lx %lx\n",
2009 debugstr_guid(pClassGuid
), pszClassName
,
2010 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
2012 if (pszClassName
!= NULL
)
2014 if (CaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
2015 return CR_INVALID_DATA
;
2018 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
2019 Disposition
, phkClass
, ulFlags
, hMachine
);
2021 if (pszClassNameW
!= NULL
)
2022 MyFree(pszClassNameW
);
2028 /***********************************************************************
2029 * CM_Open_Class_Key_ExW [SETUPAPI.@]
2031 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
2032 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
2033 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
2036 WCHAR szKeyName
[MAX_PATH
];
2037 LPWSTR lpGuidString
;
2038 DWORD dwDisposition
;
2042 TRACE("%p %s %lx %lx %p %lx %lx\n",
2043 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
2044 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
2046 /* Check Disposition and ulFlags */
2047 if ((Disposition
& ~RegDisposition_Bits
) ||
2048 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
2049 return CR_INVALID_FLAG
;
2051 /* Check phkClass */
2052 if (phkClass
== NULL
)
2053 return CR_INVALID_POINTER
;
2057 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
2058 pszClassName
!= NULL
)
2059 return CR_INVALID_DATA
;
2061 if (hMachine
== NULL
)
2063 hKey
= HKEY_LOCAL_MACHINE
;
2067 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
2068 HKEY_LOCAL_MACHINE
, &hKey
))
2069 return CR_REGISTRY_ERROR
;
2072 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
2074 lstrcpyW(szKeyName
, DeviceClasses
);
2078 lstrcpyW(szKeyName
, ControlClass
);
2081 if (pClassGuid
!= NULL
)
2083 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
2086 return CR_INVALID_DATA
;
2089 lstrcatW(szKeyName
, Backslash
);
2090 lstrcatW(szKeyName
, lpGuidString
);
2093 if (Disposition
== RegDisposition_OpenAlways
)
2095 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
2096 NULL
, phkClass
, &dwDisposition
);
2100 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
2105 if (pClassGuid
!= NULL
)
2106 RpcStringFreeW(&lpGuidString
);
2108 if (dwError
!= ERROR_SUCCESS
)
2111 return CR_NO_SUCH_REGISTRY_KEY
;
2114 if (pszClassName
!= NULL
)
2116 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
2117 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
2124 /***********************************************************************
2125 * CM_Reenumerate_DevNode [SETUPAPI.@]
2127 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
2128 DEVINST dnDevInst
, ULONG ulFlags
)
2130 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
2131 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
2135 /***********************************************************************
2136 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
2139 CM_Reenumerate_DevNode_Ex(
2140 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2142 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2143 HSTRING_TABLE StringTable
= NULL
;
2146 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
2149 return CR_INVALID_DEVNODE
;
2151 if (ulFlags
& ~CM_REENUMERATE_BITS
)
2152 return CR_INVALID_FLAG
;
2154 if (hMachine
!= NULL
)
2156 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2157 if (BindingHandle
== NULL
)
2160 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2161 if (StringTable
== 0)
2166 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2170 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2171 if (lpDevInst
== NULL
)
2172 return CR_INVALID_DEVNODE
;
2174 return PNP_DeviceInstanceAction(BindingHandle
,
2182 /***********************************************************************
2183 * CM_Request_Eject_PC [SETUPAPI.@]
2185 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
2188 return CM_Request_Eject_PC_Ex(NULL
);
2192 /***********************************************************************
2193 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
2195 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
2198 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2200 TRACE("%lx\n", hMachine
);
2202 if (hMachine
!= NULL
)
2204 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2205 if (BindingHandle
== NULL
)
2210 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2214 return PNP_RequestEjectPC(BindingHandle
);
2218 /***********************************************************************
2219 * CM_Run_Detection [SETUPAPI.@]
2221 CONFIGRET WINAPI
CM_Run_Detection(
2224 TRACE("%lx\n", ulFlags
);
2225 return CM_Run_Detection_Ex(ulFlags
, NULL
);
2229 /***********************************************************************
2230 * CM_Run_Detection_Ex [SETUPAPI.@]
2232 CONFIGRET WINAPI
CM_Run_Detection_Ex(
2233 ULONG ulFlags
, HMACHINE hMachine
)
2235 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2237 TRACE("%lx %lx\n", ulFlags
, hMachine
);
2239 // if (!IsUserAdmin())
2240 // return CR_ACCESS_DENIED;
2242 if (ulFlags
& ~CM_DETECT_BITS
)
2243 return CR_INVALID_FLAG
;
2245 if (hMachine
!= NULL
)
2247 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2248 if (BindingHandle
== NULL
)
2253 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2257 return PNP_RunDetection(BindingHandle
,
2262 /***********************************************************************
2263 * CM_Set_DevNode_Problem [SETUPAPI.@]
2265 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
2266 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
2268 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
2269 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
2273 /***********************************************************************
2274 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
2276 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
2277 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
2279 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2280 HSTRING_TABLE StringTable
= NULL
;
2283 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
2286 return CR_INVALID_DEVNODE
;
2288 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
2289 return CR_INVALID_FLAG
;
2291 if (hMachine
!= NULL
)
2293 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2294 if (BindingHandle
== NULL
)
2297 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2298 if (StringTable
== 0)
2303 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2307 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2308 if (lpDevInst
== NULL
)
2309 return CR_INVALID_DEVNODE
;
2311 return PNP_SetDeviceProblem(BindingHandle
,
2318 /***********************************************************************
2319 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
2321 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
2322 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
2325 TRACE("%lx %lu %p %lx %lx\n",
2326 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
2327 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
2333 /***********************************************************************
2334 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
2336 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
2337 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
2340 TRACE("%lx %lu %p %lx %lx\n",
2341 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
2342 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
2348 /***********************************************************************
2349 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
2351 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
2352 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
2353 ULONG ulFlags
, HMACHINE hMachine
)
2355 CONFIGRET ret
= CR_SUCCESS
;
2359 FIXME("%lx %lu %p %lx %lx %lx\n",
2360 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
2362 if (Buffer
== NULL
&& ulLength
!= 0)
2363 return CR_INVALID_POINTER
;
2367 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
2376 /* Get property type */
2379 case CM_DRP_DEVICEDESC
:
2383 case CM_DRP_HARDWAREID
:
2384 ulType
= REG_MULTI_SZ
;
2387 case CM_DRP_COMPATIBLEIDS
:
2388 ulType
= REG_MULTI_SZ
;
2391 case CM_DRP_SERVICE
:
2399 case CM_DRP_CLASSGUID
:
2407 case CM_DRP_CONFIGFLAGS
:
2415 case CM_DRP_FRIENDLYNAME
:
2419 case CM_DRP_LOCATION_INFORMATION
:
2423 case CM_DRP_UPPERFILTERS
:
2424 ulType
= REG_MULTI_SZ
;
2427 case CM_DRP_LOWERFILTERS
:
2428 ulType
= REG_MULTI_SZ
;
2432 return CR_INVALID_PROPERTY
;
2435 /* Allocate buffer if needed */
2436 if (ulType
== REG_SZ
||
2437 ulType
== REG_MULTI_SZ
)
2439 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
2440 if (lpBuffer
== NULL
)
2442 ret
= CR_OUT_OF_MEMORY
;
2446 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
2447 ulLength
, lpBuffer
, ulLength
))
2454 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
2457 ulLength
* sizeof(WCHAR
),
2466 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
2474 ret
= CR_CALL_NOT_IMPLEMENTED
;
2481 /***********************************************************************
2482 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
2484 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
2485 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
2486 ULONG ulFlags
, HMACHINE hMachine
)
2488 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2489 HSTRING_TABLE StringTable
= NULL
;
2493 TRACE("%lx %lu %p %lx %lx %lx\n",
2494 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
2497 return CR_INVALID_DEVNODE
;
2499 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
2500 return CR_INVALID_PROPERTY
;
2502 if (Buffer
!= NULL
&& ulLength
== 0)
2503 return CR_INVALID_POINTER
;
2506 return CR_INVALID_FLAG
;
2508 if (hMachine
!= NULL
)
2510 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2511 if (BindingHandle
== NULL
)
2514 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2515 if (StringTable
== 0)
2520 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2524 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2525 if (lpDevInst
== NULL
)
2526 return CR_INVALID_DEVNODE
;
2530 case CM_DRP_DEVICEDESC
:
2534 case CM_DRP_HARDWAREID
:
2535 ulType
= REG_MULTI_SZ
;
2538 case CM_DRP_COMPATIBLEIDS
:
2539 ulType
= REG_MULTI_SZ
;
2542 case CM_DRP_SERVICE
:
2550 case CM_DRP_CLASSGUID
:
2558 case CM_DRP_CONFIGFLAGS
:
2566 case CM_DRP_FRIENDLYNAME
:
2570 case CM_DRP_LOCATION_INFORMATION
:
2574 case CM_DRP_UPPERFILTERS
:
2575 ulType
= REG_MULTI_SZ
;
2578 case CM_DRP_LOWERFILTERS
:
2579 ulType
= REG_MULTI_SZ
;
2583 return CR_INVALID_PROPERTY
;
2586 return PNP_SetDeviceRegProp(BindingHandle
,
2596 /***********************************************************************
2597 * CM_Setup_DevNode [SETUPAPI.@]
2599 CONFIGRET WINAPI
CM_Setup_DevNode(
2600 DEVINST dnDevInst
, ULONG ulFlags
)
2602 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
2603 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
2607 /***********************************************************************
2608 * CM_Setup_DevNode_Ex [SETUPAPI.@]
2610 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
2611 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2613 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2614 HSTRING_TABLE StringTable
= NULL
;
2617 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
2619 // if (!IsUserAdmin())
2620 // return CR_ACCESS_DENIED;
2623 return CR_INVALID_DEVNODE
;
2625 if (ulFlags
& ~CM_SETUP_BITS
)
2626 return CR_INVALID_FLAG
;
2628 if (hMachine
!= NULL
)
2630 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2631 if (BindingHandle
== NULL
)
2634 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2635 if (StringTable
== 0)
2640 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2644 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2645 if (lpDevInst
== NULL
)
2646 return CR_INVALID_DEVNODE
;
2648 return PNP_DeviceInstanceAction(BindingHandle
,
2656 /***********************************************************************
2657 * CM_Uninstall_DevNode [SETUPAPI.@]
2659 CONFIGRET WINAPI
CM_Uninstall_DevNode(
2660 DEVINST dnPhantom
, ULONG ulFlags
)
2662 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
2663 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
2667 /***********************************************************************
2668 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
2670 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
2671 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
2673 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2674 HSTRING_TABLE StringTable
= NULL
;
2677 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
2680 return CR_INVALID_DEVNODE
;
2683 return CR_INVALID_FLAG
;
2685 if (hMachine
!= NULL
)
2687 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2688 if (BindingHandle
== NULL
)
2691 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2692 if (StringTable
== 0)
2697 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2701 lpDevInst
= StringTableStringFromId(StringTable
, dnPhantom
);
2702 if (lpDevInst
== NULL
)
2703 return CR_INVALID_DEVNODE
;
2705 return PNP_UninstallDevInst(BindingHandle
,