2 * Configuration manager functions
4 * Copyright 2000 James Hatheway
5 * Copyright 2005, 2006 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, 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
= 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_Create_DevNodeA [SETUPAPI.@]
190 CONFIGRET WINAPI
CM_Create_DevNodeA(
191 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
194 TRACE("%p %s %p %lx\n",
195 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
196 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
201 /***********************************************************************
202 * CM_Create_DevNodeW [SETUPAPI.@]
204 CONFIGRET WINAPI
CM_Create_DevNodeW(
205 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
208 TRACE("%p %s %p %lx\n",
209 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
210 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
215 /***********************************************************************
216 * CM_Create_DevNode_ExA [SETUPAPI.@]
218 CONFIGRET WINAPI
CM_Create_DevNode_ExA(
219 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
220 ULONG ulFlags
, HANDLE hMachine
)
222 DEVINSTID_W pDeviceIDW
;
225 TRACE("%p %s %p %lx %p\n",
226 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
228 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
229 return CR_INVALID_DATA
;
231 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
240 /***********************************************************************
241 * CM_Create_DevNode_ExW [SETUPAPI.@]
243 CONFIGRET WINAPI
CM_Create_DevNode_ExW(
244 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
245 ULONG ulFlags
, HANDLE hMachine
)
247 RPC_BINDING_HANDLE BindingHandle
= NULL
;
248 HSTRING_TABLE StringTable
= NULL
;
249 LPWSTR lpParentDevInst
;
250 CONFIGRET ret
= CR_SUCCESS
;
252 FIXME("%p %s %p %lx %p\n",
253 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
256 return CR_ACCESS_DENIED
;
258 if (pdnDevInst
== NULL
)
259 return CR_INVALID_POINTER
;
261 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0)
262 return CR_INVALID_DEVICE_ID
;
265 return CR_INVALID_DEVNODE
;
267 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
268 return CR_INVALID_FLAG
;
270 if (hMachine
!= NULL
)
272 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
273 if (BindingHandle
== NULL
)
276 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
277 if (StringTable
== 0)
282 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
286 lpParentDevInst
= StringTableStringFromId(StringTable
, dnParent
);
287 if (lpParentDevInst
== NULL
)
288 return CR_INVALID_DEVNODE
;
290 ret
= PNP_CreateDevInst(BindingHandle
,
295 if (ret
== CR_SUCCESS
)
297 *pdnDevInst
= StringTableAddString(StringTable
, pDeviceID
, 1);
298 if (*pdnDevInst
== 0)
299 ret
= CR_NO_SUCH_DEVNODE
;
306 /***********************************************************************
307 * CM_Delete_Class_Key [SETUPAPI.@]
309 CONFIGRET WINAPI
CM_Delete_Class_Key(
310 LPGUID ClassGuid
, ULONG ulFlags
)
312 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
313 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
317 /***********************************************************************
318 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
320 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
321 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
323 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
324 RPC_BINDING_HANDLE BindingHandle
= NULL
;
326 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
328 if (ClassGuid
== NULL
)
329 return CR_INVALID_POINTER
;
331 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
332 return CR_INVALID_FLAG
;
334 if (!GuidToString(ClassGuid
, szGuidString
))
335 return CR_INVALID_DATA
;
337 if (hMachine
!= NULL
)
339 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
340 if (BindingHandle
== NULL
)
345 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
349 return PNP_DeleteClassKey(BindingHandle
,
355 /***********************************************************************
356 * CM_Disable_DevNode [SETUPAPI.@]
358 CONFIGRET WINAPI
CM_Disable_DevNode(
359 DEVINST dnDevInst
, ULONG ulFlags
)
361 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
362 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
366 /***********************************************************************
367 * CM_Disable_DevNode_Ex [SETUPAPI.@]
369 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
370 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
372 RPC_BINDING_HANDLE BindingHandle
= NULL
;
373 HSTRING_TABLE StringTable
= NULL
;
376 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
379 return CR_ACCESS_DENIED
;
382 return CR_INVALID_DEVINST
;
385 return CR_INVALID_FLAG
;
387 if (hMachine
!= NULL
)
389 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
390 if (BindingHandle
== NULL
)
393 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
394 if (StringTable
== 0)
399 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
403 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
404 if (lpDevInst
== NULL
)
405 return CR_INVALID_DEVNODE
;
407 return PNP_DeviceInstanceAction(BindingHandle
,
415 /***********************************************************************
416 * CM_Disconnect_Machine [SETUPAPI.@]
418 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
420 PMACHINE_INFO pMachine
;
422 TRACE("%lx\n", hMachine
);
424 pMachine
= (PMACHINE_INFO
)hMachine
;
425 if (pMachine
== NULL
)
428 if (pMachine
->StringTable
!= NULL
)
429 StringTableDestroy(pMachine
->StringTable
);
431 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
432 return CR_ACCESS_DENIED
;
434 HeapFree(GetProcessHeap(), 0, pMachine
);
440 /***********************************************************************
441 * CM_Enable_DevNode [SETUPAPI.@]
443 CONFIGRET WINAPI
CM_Enable_DevNode(
444 DEVINST dnDevInst
, ULONG ulFlags
)
446 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
447 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
451 /***********************************************************************
452 * CM_Enable_DevNode_Ex [SETUPAPI.@]
454 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
455 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
457 RPC_BINDING_HANDLE BindingHandle
= NULL
;
458 HSTRING_TABLE StringTable
= NULL
;
461 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
464 return CR_ACCESS_DENIED
;
467 return CR_INVALID_DEVINST
;
470 return CR_INVALID_FLAG
;
472 if (hMachine
!= NULL
)
474 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
475 if (BindingHandle
== NULL
)
478 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
479 if (StringTable
== 0)
484 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
488 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
489 if (lpDevInst
== NULL
)
490 return CR_INVALID_DEVNODE
;
492 return PNP_DeviceInstanceAction(BindingHandle
,
500 /***********************************************************************
501 * CM_Enumerate_Classes [SETUPAPI.@]
503 CONFIGRET WINAPI
CM_Enumerate_Classes(
504 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
506 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
507 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
511 /***********************************************************************
512 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
514 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
515 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
517 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
518 RPC_BINDING_HANDLE BindingHandle
= NULL
;
519 CONFIGRET ret
= CR_SUCCESS
;
520 ULONG ulLength
= MAX_GUID_STRING_LEN
;
522 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
524 if (ClassGuid
== NULL
)
525 return CR_INVALID_POINTER
;
528 return CR_INVALID_FLAG
;
530 if (hMachine
!= NULL
)
532 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
533 if (BindingHandle
== NULL
)
538 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
542 ret
= PNP_EnumerateSubKeys(BindingHandle
,
549 if (ret
== CR_SUCCESS
)
552 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
554 /* Convert the buffer to a GUID */
555 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
563 /***********************************************************************
564 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
566 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
567 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
569 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
570 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
575 /***********************************************************************
576 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
578 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
579 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
581 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
582 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
587 /***********************************************************************
588 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
590 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
591 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
594 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
597 CONFIGRET ret
= CR_SUCCESS
;
599 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
602 if (Buffer
== NULL
|| pulLength
== NULL
)
603 return CR_INVALID_POINTER
;
606 return CR_INVALID_FLAG
;
608 ulOrigLength
= *pulLength
;
611 ulLength
= MAX_DEVICE_ID_LEN
;
612 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
614 if (ret
== CR_SUCCESS
)
616 if (WideCharToMultiByte(CP_ACP
,
626 *pulLength
= lstrlenA(Buffer
) + 1;
633 /***********************************************************************
634 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
636 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
637 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
640 RPC_BINDING_HANDLE BindingHandle
= NULL
;
642 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
645 if (Buffer
== NULL
|| pulLength
== NULL
)
646 return CR_INVALID_POINTER
;
649 return CR_INVALID_FLAG
;
651 *Buffer
= UNICODE_NULL
;
653 if (hMachine
!= NULL
)
655 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
656 if (BindingHandle
== NULL
)
661 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
665 return PNP_EnumerateSubKeys(BindingHandle
,
675 /***********************************************************************
676 * CM_Get_Child [SETUPAPI.@]
678 CONFIGRET WINAPI
CM_Get_Child(
679 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
681 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
682 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
686 /***********************************************************************
687 * CM_Get_Child_Ex [SETUPAPI.@]
689 CONFIGRET WINAPI
CM_Get_Child_Ex(
690 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
692 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
693 RPC_BINDING_HANDLE BindingHandle
= NULL
;
694 HSTRING_TABLE StringTable
= NULL
;
699 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
701 if (pdnDevInst
== NULL
)
702 return CR_INVALID_POINTER
;
705 return CR_INVALID_DEVINST
;
708 return CR_INVALID_FLAG
;
712 if (hMachine
!= NULL
)
714 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
715 if (BindingHandle
== NULL
)
718 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
719 if (StringTable
== 0)
724 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
728 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
729 if (lpDevInst
== NULL
)
730 return CR_INVALID_DEVNODE
;
732 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
738 if (ret
!= CR_SUCCESS
)
741 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
743 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
747 *pdnDevInst
= dwIndex
;
753 /***********************************************************************
754 * CM_Get_Class_Key_NameA [SETUPAPI.@]
756 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
757 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
759 TRACE("%p %p %p %lx\n",
760 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
761 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
766 /***********************************************************************
767 * CM_Get_Class_Key_NameW [SETUPAPI.@]
769 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
770 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
772 TRACE("%p %p %p %lx\n",
773 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
774 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
779 /***********************************************************************
780 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
782 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
783 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
786 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
787 CONFIGRET ret
= CR_SUCCESS
;
791 TRACE("%p %p %p %lx %lx\n",
792 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
794 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
795 return CR_INVALID_POINTER
;
797 ulOrigLength
= *pulLength
;
800 ulLength
= MAX_GUID_STRING_LEN
;
801 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
803 if (ret
== CR_SUCCESS
)
805 if (WideCharToMultiByte(CP_ACP
,
815 *pulLength
= lstrlenA(pszKeyName
) + 1;
822 /***********************************************************************
823 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
825 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
826 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
829 TRACE("%p %p %p %lx %lx\n",
830 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
832 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
833 return CR_INVALID_POINTER
;
836 return CR_INVALID_FLAG
;
838 if (*pulLength
< MAX_GUID_STRING_LEN
)
841 return CR_BUFFER_SMALL
;
844 if (!GuidToString(ClassGuid
, pszKeyName
))
845 return CR_INVALID_DATA
;
847 *pulLength
= MAX_GUID_STRING_LEN
;
853 /***********************************************************************
854 * CM_Get_Class_NameA [SETUPAPI.@]
856 CONFIGRET WINAPI
CM_Get_Class_NameA(
857 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
859 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
860 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
865 /***********************************************************************
866 * CM_Get_Class_NameW [SETUPAPI.@]
868 CONFIGRET WINAPI
CM_Get_Class_NameW(
869 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
871 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
872 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
877 /***********************************************************************
878 * CM_Get_Class_Name_ExA [SETUPAPI.@]
880 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
881 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
884 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
885 CONFIGRET ret
= CR_SUCCESS
;
889 TRACE("%p %p %p %lx %lx\n",
890 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
892 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
893 return CR_INVALID_POINTER
;
895 ulOrigLength
= *pulLength
;
898 ulLength
= MAX_CLASS_NAME_LEN
;
899 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
901 if (ret
== CR_SUCCESS
)
903 if (WideCharToMultiByte(CP_ACP
,
913 *pulLength
= lstrlenA(Buffer
) + 1;
920 /***********************************************************************
921 * CM_Get_Class_Name_ExW [SETUPAPI.@]
924 CM_Get_Class_Name_ExW(
925 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
928 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
929 RPC_BINDING_HANDLE BindingHandle
= NULL
;
931 TRACE("%p %p %p %lx %lx\n",
932 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
934 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
935 return CR_INVALID_POINTER
;
938 return CR_INVALID_FLAG
;
940 if (!GuidToString(ClassGuid
, szGuidString
))
941 return CR_INVALID_DATA
;
943 TRACE("Guid %s\n", debugstr_w(szGuidString
));
945 if (hMachine
!= NULL
)
947 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
948 if (BindingHandle
== NULL
)
953 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
957 return PNP_GetClassName(BindingHandle
,
965 /***********************************************************************
966 * CM_Get_Depth [SETUPAPI.@]
968 CONFIGRET WINAPI
CM_Get_Depth(
969 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
971 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
972 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
976 /***********************************************************************
977 * CM_Get_Depth_Ex [SETUPAPI.@]
979 CONFIGRET WINAPI
CM_Get_Depth_Ex(
980 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
982 RPC_BINDING_HANDLE BindingHandle
= NULL
;
983 HSTRING_TABLE StringTable
= NULL
;
986 TRACE("%p %lx %lx %lx\n",
987 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
989 if (pulDepth
== NULL
)
990 return CR_INVALID_POINTER
;
993 return CR_INVALID_DEVINST
;
996 return CR_INVALID_FLAG
;
998 if (hMachine
!= NULL
)
1000 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1001 if (BindingHandle
== NULL
)
1004 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1005 if (StringTable
== 0)
1010 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1014 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1015 if (lpDevInst
== NULL
)
1016 return CR_INVALID_DEVNODE
;
1018 return PNP_GetDepth(BindingHandle
,
1025 /***********************************************************************
1026 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
1028 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
1029 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1030 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1032 TRACE("%lx %lu %p %p %p %lx\n",
1033 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1035 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1036 pulRegDataType
, Buffer
,
1037 pulLength
, ulFlags
, NULL
);
1041 /***********************************************************************
1042 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
1044 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
1045 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1046 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1048 TRACE("%lx %lu %p %p %p %lx\n",
1049 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1051 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1052 pulRegDataType
, Buffer
,
1053 pulLength
, ulFlags
, NULL
);
1057 /***********************************************************************
1058 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
1060 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
1061 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1062 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1066 ULONG RegDataType
= REG_NONE
;
1069 TRACE("%lx %lu %p %p %p %lx %lx\n",
1070 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1074 return CR_INVALID_POINTER
;
1076 LengthW
= *pulLength
* sizeof(WCHAR
);
1077 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
1080 return CR_OUT_OF_MEMORY
;
1082 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
1090 if (ret
== CR_SUCCESS
)
1092 if (RegDataType
== REG_SZ
|| RegDataType
== REG_EXPAND_SZ
)
1094 /* Do W->A conversion */
1095 *pulLength
= WideCharToMultiByte(CP_ACP
,
1098 lstrlenW(BufferW
) + 1,
1103 if (*pulLength
== 0)
1108 /* Directly copy the value */
1109 if (LengthW
<= *pulLength
)
1110 memcpy(Buffer
, BufferW
, LengthW
);
1113 *pulLength
= LengthW
;
1114 ret
= CR_BUFFER_SMALL
;
1120 *pulRegDataType
= RegDataType
;
1122 HeapFree(GetProcessHeap(), 0, BufferW
);
1128 /***********************************************************************
1129 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
1131 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
1132 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1133 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1135 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1136 HSTRING_TABLE StringTable
= NULL
;
1137 CONFIGRET ret
= CR_SUCCESS
;
1139 ULONG ulDataType
= 0;
1140 ULONG ulTransferLength
= 0;
1142 TRACE("%lx %lu %p %p %p %lx %lx\n",
1143 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1147 return CR_INVALID_DEVNODE
;
1149 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
1150 return CR_INVALID_PROPERTY
;
1152 /* pulRegDataType is optional */
1154 /* Buffer is optional */
1156 if (pulLength
== NULL
)
1157 return CR_INVALID_POINTER
;
1159 if (*pulLength
== 0)
1160 return CR_INVALID_POINTER
;
1163 return CR_INVALID_FLAG
;
1165 if (hMachine
!= NULL
)
1167 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1168 if (BindingHandle
== NULL
)
1171 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1172 if (StringTable
== 0)
1177 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1181 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1182 if (lpDevInst
== NULL
)
1183 return CR_INVALID_DEVNODE
;
1185 ulTransferLength
= *pulLength
;
1186 ret
= PNP_GetDeviceRegProp(BindingHandle
,
1194 if (ret
== CR_SUCCESS
)
1196 if (pulRegDataType
!= NULL
)
1197 *pulRegDataType
= ulDataType
;
1204 /***********************************************************************
1205 * CM_Get_DevNode_Status [SETUPAPI.@]
1207 CONFIGRET WINAPI
CM_Get_DevNode_Status(
1208 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1211 TRACE("%p %p %lx %lx\n",
1212 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
1213 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
1218 /***********************************************************************
1219 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
1222 CM_Get_DevNode_Status_Ex(
1223 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1224 ULONG ulFlags
, HMACHINE hMachine
)
1226 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1227 HSTRING_TABLE StringTable
= NULL
;
1230 TRACE("%p %p %lx %lx %lx\n",
1231 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
1233 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
1234 return CR_INVALID_POINTER
;
1237 return CR_INVALID_DEVINST
;
1240 return CR_INVALID_FLAG
;
1242 if (hMachine
!= NULL
)
1244 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1245 if (BindingHandle
== NULL
)
1248 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1249 if (StringTable
== 0)
1254 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1258 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1259 if (lpDevInst
== NULL
)
1260 return CR_INVALID_DEVNODE
;
1262 return PNP_GetDeviceStatus(BindingHandle
,
1270 /***********************************************************************
1271 * CM_Get_Device_IDA [SETUPAPI.@]
1273 CONFIGRET WINAPI
CM_Get_Device_IDA(
1274 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1276 TRACE("%lx %p %ld %ld\n",
1277 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1278 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1282 /***********************************************************************
1283 * CM_Get_Device_IDW [SETUPAPI.@]
1285 CONFIGRET WINAPI
CM_Get_Device_IDW(
1286 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1288 TRACE("%lx %p %ld %ld\n",
1289 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1290 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1294 /***********************************************************************
1295 * CM_Get_Device_ID_ExA [SETUPAPI.@]
1297 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
1298 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1301 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
1302 CONFIGRET ret
= CR_SUCCESS
;
1304 FIXME("%lx %p %ld %ld %lx\n",
1305 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1308 return CR_INVALID_POINTER
;
1310 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
1315 if (ret
== CR_SUCCESS
)
1317 if (WideCharToMultiByte(CP_ACP
,
1320 lstrlenW(szBufferW
) + 1,
1332 /***********************************************************************
1333 * CM_Get_Device_ID_ExW [SETUPAPI.@]
1335 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
1336 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1339 HSTRING_TABLE StringTable
= NULL
;
1341 TRACE("%lx %p %ld %ld %lx\n",
1342 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1345 return CR_INVALID_DEVINST
;
1348 return CR_INVALID_POINTER
;
1351 return CR_INVALID_FLAG
;
1353 if (hMachine
!= NULL
)
1355 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1356 if (StringTable
== NULL
)
1361 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1365 if (!StringTableStringFromIdEx(StringTable
,
1375 /***********************************************************************
1376 * CM_Get_Device_ID_ListA [SETUPAPI.@]
1378 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
1379 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1381 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1382 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
1387 /***********************************************************************
1388 * CM_Get_Device_ID_ListW [SETUPAPI.@]
1390 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
1391 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1393 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1394 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
1399 /***********************************************************************
1400 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
1402 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
1403 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1406 LPWSTR BufferW
= NULL
;
1407 LPWSTR pszFilterW
= NULL
;
1408 CONFIGRET ret
= CR_SUCCESS
;
1410 FIXME("%p %p %ld %ld %lx\n",
1411 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1413 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
1414 if (BufferW
== NULL
)
1415 return CR_OUT_OF_MEMORY
;
1417 if (pszFilter
== NULL
)
1419 ret
= CM_Get_Device_ID_List_ExW(NULL
,
1427 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1429 ret
= CR_INVALID_DEVICE_ID
;
1433 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
1442 if (WideCharToMultiByte(CP_ACP
,
1445 lstrlenW(BufferW
) + 1,
1459 /***********************************************************************
1460 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
1462 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
1463 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1466 FIXME("%p %p %ld %ld %lx\n",
1467 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1473 /***********************************************************************
1474 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
1476 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
1477 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
1479 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
1480 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
1484 /***********************************************************************
1485 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
1487 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
1488 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
1490 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
1491 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
1495 /***********************************************************************
1496 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
1498 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
1499 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1501 LPWSTR pszFilterW
= NULL
;
1502 CONFIGRET ret
= CR_SUCCESS
;
1504 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
1506 if (pszFilter
== NULL
)
1508 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1515 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1516 return CR_INVALID_DEVICE_ID
;
1518 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1530 /***********************************************************************
1531 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
1533 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
1534 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1536 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1538 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
1541 return CR_INVALID_POINTER
;
1543 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
1544 return CR_INVALID_FLAG
;
1546 if (hMachine
!= NULL
)
1548 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1549 if (BindingHandle
== NULL
)
1554 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1560 return PNP_GetDeviceListSize(BindingHandle
,
1567 /***********************************************************************
1568 * CM_Get_Device_ID_Size [SETUPAPI.@]
1570 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
1571 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
1573 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
1574 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
1578 /***********************************************************************
1579 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
1581 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
1582 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1584 HSTRING_TABLE StringTable
= NULL
;
1587 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
1590 return CR_INVALID_POINTER
;
1593 return CR_INVALID_DEVINST
;
1596 return CR_INVALID_FLAG
;
1598 if (hMachine
!= NULL
)
1600 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1601 if (StringTable
== NULL
)
1606 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1610 DeviceId
= StringTableStringFromId(StringTable
, dnDevInst
);
1611 if (DeviceId
== NULL
)
1617 *pulLen
= lstrlenW(DeviceId
);
1623 /***********************************************************************
1624 * CM_Get_Global_State [SETUPAPI.@]
1626 CONFIGRET WINAPI
CM_Get_Global_State(
1627 PULONG pulState
, ULONG ulFlags
)
1629 TRACE("%p %lx\n", pulState
, ulFlags
);
1630 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
1634 /***********************************************************************
1635 * CM_Get_Global_State_Ex [SETUPAPI.@]
1637 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
1638 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
1640 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1642 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
1644 if (pulState
== NULL
)
1645 return CR_INVALID_POINTER
;
1648 return CR_INVALID_FLAG
;
1650 if (hMachine
!= NULL
)
1652 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1653 if (BindingHandle
== NULL
)
1658 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1662 return PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
1666 /***********************************************************************
1667 * CM_Get_Parent [SETUPAPI.@]
1669 CONFIGRET WINAPI
CM_Get_Parent(
1670 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1672 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1673 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1677 /***********************************************************************
1678 * CM_Get_Parent_Ex [SETUPAPI.@]
1680 CONFIGRET WINAPI
CM_Get_Parent_Ex(
1681 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1683 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1684 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1685 HSTRING_TABLE StringTable
= NULL
;
1690 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1692 if (pdnDevInst
== NULL
)
1693 return CR_INVALID_POINTER
;
1696 return CR_INVALID_DEVINST
;
1699 return CR_INVALID_FLAG
;
1703 if (hMachine
!= NULL
)
1705 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1706 if (BindingHandle
== NULL
)
1709 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1710 if (StringTable
== 0)
1715 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1719 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1720 if (lpDevInst
== NULL
)
1721 return CR_INVALID_DEVNODE
;
1723 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1729 if (ret
!= CR_SUCCESS
)
1732 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1734 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1738 *pdnDevInst
= dwIndex
;
1744 /***********************************************************************
1745 * CM_Get_Sibling [SETUPAPI.@]
1747 CONFIGRET WINAPI
CM_Get_Sibling(
1748 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1750 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1751 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1755 /***********************************************************************
1756 * CM_Get_Sibling_Ex [SETUPAPI.@]
1758 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
1759 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1761 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1762 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1763 HSTRING_TABLE StringTable
= NULL
;
1768 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1770 if (pdnDevInst
== NULL
)
1771 return CR_INVALID_POINTER
;
1774 return CR_INVALID_DEVINST
;
1777 return CR_INVALID_FLAG
;
1781 if (hMachine
!= NULL
)
1783 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1784 if (BindingHandle
== NULL
)
1787 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1788 if (StringTable
== 0)
1793 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1797 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1798 if (lpDevInst
== NULL
)
1799 return CR_INVALID_DEVNODE
;
1801 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1807 if (ret
!= CR_SUCCESS
)
1810 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1812 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1816 *pdnDevInst
= dwIndex
;
1822 /***********************************************************************
1823 * CM_Get_Version [SETUPAPI.@]
1825 WORD WINAPI
CM_Get_Version(VOID
)
1828 return CM_Get_Version_Ex(NULL
);
1832 /***********************************************************************
1833 * CM_Get_Version_Ex [SETUPAPI.@]
1835 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
1837 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1840 TRACE("%lx\n", hMachine
);
1842 if (hMachine
!= NULL
)
1844 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1845 if (BindingHandle
== NULL
)
1850 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1854 if (PNP_GetVersion(BindingHandle
, &Version
) != CR_SUCCESS
)
1861 /***********************************************************************
1862 * CM_Is_Dock_Station_Present [SETUPAPI.@]
1864 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
1867 TRACE("%p\n", pbPresent
);
1868 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
1872 /***********************************************************************
1873 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
1875 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
1876 PBOOL pbPresent
, HMACHINE hMachine
)
1878 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1880 TRACE("%p %lx\n", pbPresent
, hMachine
);
1882 if (pbPresent
== NULL
)
1883 return CR_INVALID_POINTER
;
1887 if (hMachine
!= NULL
)
1889 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1890 if (BindingHandle
== NULL
)
1895 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1899 return PNP_IsDockStationPresent(BindingHandle
,
1900 (unsigned long *)pbPresent
);
1904 /***********************************************************************
1905 * CM_Locate_DevNodeA [SETUPAPI.@]
1907 CONFIGRET WINAPI
CM_Locate_DevNodeA(
1908 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
1910 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
1911 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
1915 /***********************************************************************
1916 * CM_Locate_DevNodeW [SETUPAPI.@]
1918 CONFIGRET WINAPI
CM_Locate_DevNodeW(
1919 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
1921 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
1922 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
1926 /***********************************************************************
1927 * CM_Locate_DevNode_ExA [SETUPAPI.@]
1929 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
1930 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
1932 DEVINSTID_W pDevIdW
= NULL
;
1933 CONFIGRET ret
= CR_SUCCESS
;
1935 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
1937 if (pDeviceID
!= NULL
)
1939 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
1940 return CR_INVALID_DEVICE_ID
;
1943 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
1945 if (pDevIdW
!= NULL
)
1952 /***********************************************************************
1953 * CM_Locate_DevNode_ExW [SETUPAPI.@]
1955 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
1956 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
1958 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
1959 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1960 HSTRING_TABLE StringTable
= NULL
;
1961 CONFIGRET ret
= CR_SUCCESS
;
1963 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
1965 if (pdnDevInst
== NULL
)
1966 return CR_INVALID_POINTER
;
1968 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
1969 return CR_INVALID_FLAG
;
1971 if (hMachine
!= NULL
)
1973 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1974 if (BindingHandle
== NULL
)
1977 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1978 if (StringTable
== 0)
1983 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1987 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
1989 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
1993 /* Get the root device ID */
1994 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
1997 if (ret
!= CR_SUCCESS
)
2000 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
2002 /* Validate the device ID */
2003 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
2006 if (ret
== CR_SUCCESS
)
2008 *pdnDevInst
= StringTableAddString(StringTable
, DeviceIdBuffer
, 1);
2009 if (*pdnDevInst
== -1)
2017 /***********************************************************************
2018 * CM_Move_DevNode [SETUPAPI.@]
2020 CONFIGRET WINAPI
CM_Move_DevNode(
2021 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
2023 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
2024 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
2028 /***********************************************************************
2029 * CM_Move_DevNode_Ex [SETUPAPI.@]
2031 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
2032 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
2035 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2036 HSTRING_TABLE StringTable
= NULL
;
2037 LPWSTR lpFromDevInst
;
2040 FIXME("%lx %lx %lx %lx\n",
2041 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
2044 return CR_ACCESS_DENIED
;
2046 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
2047 return CR_INVALID_DEVNODE
;
2050 return CR_INVALID_FLAG
;
2052 if (hMachine
!= NULL
)
2054 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2055 if (BindingHandle
== NULL
)
2058 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2059 if (StringTable
== 0)
2064 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2068 lpFromDevInst
= StringTableStringFromId(StringTable
, dnFromDevInst
);
2069 if (lpFromDevInst
== NULL
)
2070 return CR_INVALID_DEVNODE
;
2072 lpToDevInst
= StringTableStringFromId(StringTable
, dnToDevInst
);
2073 if (lpToDevInst
== NULL
)
2074 return CR_INVALID_DEVNODE
;
2076 return PNP_DeviceInstanceAction(BindingHandle
,
2084 /***********************************************************************
2085 * CM_Open_Class_KeyA [SETUPAPI.@]
2087 CONFIGRET WINAPI
CM_Open_Class_KeyA(
2088 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
2089 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
2091 TRACE("%p %s %lx %lx %p %lx\n",
2092 debugstr_guid(pClassGuid
), pszClassName
,
2093 samDesired
, Disposition
, phkClass
, ulFlags
);
2095 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
2096 Disposition
, phkClass
, ulFlags
, NULL
);
2100 /***********************************************************************
2101 * CM_Open_Class_KeyW [SETUPAPI.@]
2103 CONFIGRET WINAPI
CM_Open_Class_KeyW(
2104 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
2105 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
2107 TRACE("%p %s %lx %lx %p %lx\n",
2108 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
2109 samDesired
, Disposition
, phkClass
, ulFlags
);
2111 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
2112 Disposition
, phkClass
, ulFlags
, NULL
);
2116 /***********************************************************************
2117 * CM_Open_Class_Key_ExA [SETUPAPI.@]
2119 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
2120 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
2121 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
2124 CONFIGRET rc
= CR_SUCCESS
;
2125 LPWSTR pszClassNameW
= NULL
;
2127 TRACE("%p %s %lx %lx %p %lx %lx\n",
2128 debugstr_guid(pClassGuid
), pszClassName
,
2129 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
2131 if (pszClassName
!= NULL
)
2133 if (CaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
2134 return CR_INVALID_DATA
;
2137 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
2138 Disposition
, phkClass
, ulFlags
, hMachine
);
2140 if (pszClassNameW
!= NULL
)
2141 MyFree(pszClassNameW
);
2147 /***********************************************************************
2148 * CM_Open_Class_Key_ExW [SETUPAPI.@]
2150 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
2151 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
2152 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
2155 WCHAR szKeyName
[MAX_PATH
];
2156 LPWSTR lpGuidString
;
2157 DWORD dwDisposition
;
2161 TRACE("%p %s %lx %lx %p %lx %lx\n",
2162 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
2163 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
2165 /* Check Disposition and ulFlags */
2166 if ((Disposition
& ~RegDisposition_Bits
) ||
2167 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
2168 return CR_INVALID_FLAG
;
2170 /* Check phkClass */
2171 if (phkClass
== NULL
)
2172 return CR_INVALID_POINTER
;
2176 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
2177 pszClassName
!= NULL
)
2178 return CR_INVALID_DATA
;
2180 if (hMachine
== NULL
)
2182 hKey
= HKEY_LOCAL_MACHINE
;
2186 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
2187 HKEY_LOCAL_MACHINE
, &hKey
))
2188 return CR_REGISTRY_ERROR
;
2191 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
2193 lstrcpyW(szKeyName
, DeviceClasses
);
2197 lstrcpyW(szKeyName
, ControlClass
);
2200 if (pClassGuid
!= NULL
)
2202 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
2205 return CR_INVALID_DATA
;
2208 lstrcatW(szKeyName
, Backslash
);
2209 lstrcatW(szKeyName
, lpGuidString
);
2212 if (Disposition
== RegDisposition_OpenAlways
)
2214 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
2215 NULL
, phkClass
, &dwDisposition
);
2219 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
2224 if (pClassGuid
!= NULL
)
2225 RpcStringFreeW(&lpGuidString
);
2227 if (dwError
!= ERROR_SUCCESS
)
2230 return CR_NO_SUCH_REGISTRY_KEY
;
2233 if (pszClassName
!= NULL
)
2235 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
2236 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
2243 /***********************************************************************
2244 * CM_Reenumerate_DevNode [SETUPAPI.@]
2246 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
2247 DEVINST dnDevInst
, ULONG ulFlags
)
2249 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
2250 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
2254 /***********************************************************************
2255 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
2258 CM_Reenumerate_DevNode_Ex(
2259 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2261 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2262 HSTRING_TABLE StringTable
= NULL
;
2265 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
2268 return CR_INVALID_DEVNODE
;
2270 if (ulFlags
& ~CM_REENUMERATE_BITS
)
2271 return CR_INVALID_FLAG
;
2273 if (hMachine
!= NULL
)
2275 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2276 if (BindingHandle
== NULL
)
2279 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2280 if (StringTable
== 0)
2285 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2289 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2290 if (lpDevInst
== NULL
)
2291 return CR_INVALID_DEVNODE
;
2293 return PNP_DeviceInstanceAction(BindingHandle
,
2301 /***********************************************************************
2302 * CM_Request_Eject_PC [SETUPAPI.@]
2304 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
2307 return CM_Request_Eject_PC_Ex(NULL
);
2311 /***********************************************************************
2312 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
2314 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
2317 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2319 TRACE("%lx\n", hMachine
);
2321 if (hMachine
!= NULL
)
2323 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2324 if (BindingHandle
== NULL
)
2329 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2333 return PNP_RequestEjectPC(BindingHandle
);
2337 /***********************************************************************
2338 * CM_Run_Detection [SETUPAPI.@]
2340 CONFIGRET WINAPI
CM_Run_Detection(
2343 TRACE("%lx\n", ulFlags
);
2344 return CM_Run_Detection_Ex(ulFlags
, NULL
);
2348 /***********************************************************************
2349 * CM_Run_Detection_Ex [SETUPAPI.@]
2351 CONFIGRET WINAPI
CM_Run_Detection_Ex(
2352 ULONG ulFlags
, HMACHINE hMachine
)
2354 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2356 TRACE("%lx %lx\n", ulFlags
, hMachine
);
2359 return CR_ACCESS_DENIED
;
2361 if (ulFlags
& ~CM_DETECT_BITS
)
2362 return CR_INVALID_FLAG
;
2364 if (hMachine
!= NULL
)
2366 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2367 if (BindingHandle
== NULL
)
2372 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2376 return PNP_RunDetection(BindingHandle
,
2381 /***********************************************************************
2382 * CM_Set_DevNode_Problem [SETUPAPI.@]
2384 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
2385 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
2387 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
2388 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
2392 /***********************************************************************
2393 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
2395 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
2396 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
2398 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2399 HSTRING_TABLE StringTable
= NULL
;
2402 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
2405 return CR_INVALID_DEVNODE
;
2407 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
2408 return CR_INVALID_FLAG
;
2410 if (hMachine
!= NULL
)
2412 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2413 if (BindingHandle
== NULL
)
2416 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2417 if (StringTable
== 0)
2422 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2426 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2427 if (lpDevInst
== NULL
)
2428 return CR_INVALID_DEVNODE
;
2430 return PNP_SetDeviceProblem(BindingHandle
,
2437 /***********************************************************************
2438 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
2440 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
2441 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
2444 TRACE("%lx %lu %p %lx %lx\n",
2445 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
2446 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
2452 /***********************************************************************
2453 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
2455 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
2456 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
2459 TRACE("%lx %lu %p %lx %lx\n",
2460 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
2461 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
2467 /***********************************************************************
2468 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
2470 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
2471 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
2472 ULONG ulFlags
, HMACHINE hMachine
)
2474 CONFIGRET ret
= CR_SUCCESS
;
2478 FIXME("%lx %lu %p %lx %lx %lx\n",
2479 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
2481 if (Buffer
== NULL
&& ulLength
!= 0)
2482 return CR_INVALID_POINTER
;
2486 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
2495 /* Get property type */
2498 case CM_DRP_DEVICEDESC
:
2502 case CM_DRP_HARDWAREID
:
2503 ulType
= REG_MULTI_SZ
;
2506 case CM_DRP_COMPATIBLEIDS
:
2507 ulType
= REG_MULTI_SZ
;
2510 case CM_DRP_SERVICE
:
2518 case CM_DRP_CLASSGUID
:
2526 case CM_DRP_CONFIGFLAGS
:
2534 case CM_DRP_FRIENDLYNAME
:
2538 case CM_DRP_LOCATION_INFORMATION
:
2542 case CM_DRP_UPPERFILTERS
:
2543 ulType
= REG_MULTI_SZ
;
2546 case CM_DRP_LOWERFILTERS
:
2547 ulType
= REG_MULTI_SZ
;
2551 return CR_INVALID_PROPERTY
;
2554 /* Allocate buffer if needed */
2555 if (ulType
== REG_SZ
||
2556 ulType
== REG_MULTI_SZ
)
2558 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
2559 if (lpBuffer
== NULL
)
2561 ret
= CR_OUT_OF_MEMORY
;
2565 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
2566 ulLength
, lpBuffer
, ulLength
))
2573 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
2576 ulLength
* sizeof(WCHAR
),
2585 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
2593 ret
= CR_CALL_NOT_IMPLEMENTED
;
2600 /***********************************************************************
2601 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
2603 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
2604 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
2605 ULONG ulFlags
, HMACHINE hMachine
)
2607 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2608 HSTRING_TABLE StringTable
= NULL
;
2612 TRACE("%lx %lu %p %lx %lx %lx\n",
2613 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
2616 return CR_INVALID_DEVNODE
;
2618 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
2619 return CR_INVALID_PROPERTY
;
2621 if (Buffer
!= NULL
&& ulLength
== 0)
2622 return CR_INVALID_POINTER
;
2625 return CR_INVALID_FLAG
;
2627 if (hMachine
!= NULL
)
2629 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2630 if (BindingHandle
== NULL
)
2633 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2634 if (StringTable
== 0)
2639 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2643 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2644 if (lpDevInst
== NULL
)
2645 return CR_INVALID_DEVNODE
;
2649 case CM_DRP_DEVICEDESC
:
2653 case CM_DRP_HARDWAREID
:
2654 ulType
= REG_MULTI_SZ
;
2657 case CM_DRP_COMPATIBLEIDS
:
2658 ulType
= REG_MULTI_SZ
;
2661 case CM_DRP_SERVICE
:
2669 case CM_DRP_CLASSGUID
:
2677 case CM_DRP_CONFIGFLAGS
:
2685 case CM_DRP_FRIENDLYNAME
:
2689 case CM_DRP_LOCATION_INFORMATION
:
2693 case CM_DRP_UPPERFILTERS
:
2694 ulType
= REG_MULTI_SZ
;
2697 case CM_DRP_LOWERFILTERS
:
2698 ulType
= REG_MULTI_SZ
;
2702 return CR_INVALID_PROPERTY
;
2705 return PNP_SetDeviceRegProp(BindingHandle
,
2715 /***********************************************************************
2716 * CM_Setup_DevNode [SETUPAPI.@]
2718 CONFIGRET WINAPI
CM_Setup_DevNode(
2719 DEVINST dnDevInst
, ULONG ulFlags
)
2721 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
2722 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
2726 /***********************************************************************
2727 * CM_Setup_DevNode_Ex [SETUPAPI.@]
2729 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
2730 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2732 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2733 HSTRING_TABLE StringTable
= NULL
;
2736 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
2739 return CR_ACCESS_DENIED
;
2742 return CR_INVALID_DEVNODE
;
2744 if (ulFlags
& ~CM_SETUP_BITS
)
2745 return CR_INVALID_FLAG
;
2747 if (hMachine
!= NULL
)
2749 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2750 if (BindingHandle
== NULL
)
2753 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2754 if (StringTable
== 0)
2759 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2763 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2764 if (lpDevInst
== NULL
)
2765 return CR_INVALID_DEVNODE
;
2767 return PNP_DeviceInstanceAction(BindingHandle
,
2775 /***********************************************************************
2776 * CM_Uninstall_DevNode [SETUPAPI.@]
2778 CONFIGRET WINAPI
CM_Uninstall_DevNode(
2779 DEVINST dnPhantom
, ULONG ulFlags
)
2781 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
2782 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
2786 /***********************************************************************
2787 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
2789 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
2790 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
2792 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2793 HSTRING_TABLE StringTable
= NULL
;
2796 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
2799 return CR_INVALID_DEVNODE
;
2802 return CR_INVALID_FLAG
;
2804 if (hMachine
!= NULL
)
2806 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2807 if (BindingHandle
== NULL
)
2810 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2811 if (StringTable
== 0)
2816 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2820 lpDevInst
= StringTableStringFromId(StringTable
, dnPhantom
);
2821 if (lpDevInst
== NULL
)
2822 return CR_INVALID_DEVNODE
;
2824 return PNP_UninstallDevInst(BindingHandle
,