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
32 #include "setupapi_private.h"
35 #include "rpc_private.h"
39 #include "wine/debug.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(setupapi
);
43 /* Registry key and value names */
44 static const WCHAR Backslash
[] = {'\\', 0};
45 static const WCHAR Class
[] = {'C','l','a','s','s',0};
47 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
48 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
49 'C','o','n','t','r','o','l','\\',
50 'C','l','a','s','s',0};
52 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
53 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
54 'C','o','n','t','r','o','l','\\',
55 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
57 typedef struct _MACHINE_INFO
59 WCHAR szMachineName
[MAX_PATH
];
60 RPC_BINDING_HANDLE BindingHandle
;
61 HSTRING_TABLE StringTable
;
62 } MACHINE_INFO
, *PMACHINE_INFO
;
65 static BOOL
GuidToString(LPGUID Guid
, LPWSTR String
)
69 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
72 lstrcpyW(&String
[1], lpString
);
75 String
[MAX_GUID_STRING_LEN
- 2] = L
'}';
76 String
[MAX_GUID_STRING_LEN
- 1] = 0;
78 RpcStringFree(&lpString
);
84 /***********************************************************************
85 * CM_Connect_MachineA [SETUPAPI.@]
87 CONFIGRET WINAPI
CM_Connect_MachineA(PCSTR UNCServerName
, PHMACHINE phMachine
)
92 TRACE("%s %p\n", UNCServerName
, phMachine
);
94 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
95 return CM_Connect_MachineW(NULL
, phMachine
);
97 if (CaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
98 return CR_INVALID_DATA
;
100 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
102 MyFree(pServerNameW
);
108 /***********************************************************************
109 * CM_Connect_MachineW [SETUPAPI.@]
111 CONFIGRET WINAPI
CM_Connect_MachineW(PCWSTR UNCServerName
, PHMACHINE phMachine
)
113 PMACHINE_INFO pMachine
;
115 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
117 pMachine
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(MACHINE_INFO
));
118 if (pMachine
== NULL
)
119 return CR_OUT_OF_MEMORY
;
121 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
123 pMachine
->StringTable
= StringTableInitialize();
124 if (pMachine
->StringTable
== NULL
)
126 HeapFree(GetProcessHeap(), 0, pMachine
);
130 StringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
132 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
134 StringTableDestroy(pMachine
->StringTable
);
135 HeapFree(GetProcessHeap(), 0, pMachine
);
136 return CR_INVALID_MACHINENAME
;
139 phMachine
= (PHMACHINE
)pMachine
;
145 /***********************************************************************
146 * CM_Delete_Class_Key [SETUPAPI.@]
148 CONFIGRET WINAPI
CM_Delete_Class_Key(LPGUID ClassGuid
, ULONG ulFlags
)
150 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
151 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
155 /***********************************************************************
156 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
158 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
159 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
161 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
162 RPC_BINDING_HANDLE BindingHandle
= NULL
;
164 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
166 if (ClassGuid
== NULL
)
167 return CR_INVALID_POINTER
;
169 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
170 return CR_INVALID_FLAG
;
172 if (!GuidToString(ClassGuid
, szGuidString
))
173 return CR_INVALID_DATA
;
175 if (hMachine
!= NULL
)
177 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
178 if (BindingHandle
== NULL
)
183 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
187 return PNP_DeleteClassKey(BindingHandle
,
193 /***********************************************************************
194 * CM_Disconnect_Machine [SETUPAPI.@]
196 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
198 PMACHINE_INFO pMachine
;
200 TRACE("%lx\n", hMachine
);
202 pMachine
= (PMACHINE_INFO
)hMachine
;
203 if (pMachine
== NULL
)
206 if (pMachine
->StringTable
!= NULL
)
207 StringTableDestroy(pMachine
->StringTable
);
209 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
210 return CR_ACCESS_DENIED
;
212 HeapFree(GetProcessHeap(), 0, pMachine
);
218 /***********************************************************************
219 * CM_Enumerate_Classes [SETUPAPI.@]
221 CONFIGRET WINAPI
CM_Enumerate_Classes(
222 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
224 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
225 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
229 static CONFIGRET
GetCmCodeFromErrorCode(DWORD ErrorCode
)
236 case ERROR_ACCESS_DENIED
:
237 return CR_ACCESS_DENIED
;
239 case ERROR_INSUFFICIENT_BUFFER
:
240 return CR_BUFFER_SMALL
;
242 case ERROR_INVALID_DATA
:
243 return CR_INVALID_DATA
;
245 case ERROR_INVALID_PARAMETER
:
246 return CR_INVALID_DATA
;
248 case ERROR_NO_MORE_ITEMS
:
249 return CR_NO_SUCH_VALUE
;
251 case ERROR_NO_SYSTEM_RESOURCES
:
252 return CR_OUT_OF_MEMORY
;
260 /***********************************************************************
261 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
263 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
264 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
266 HKEY hRelativeKey
, hKey
;
268 WCHAR Buffer
[MAX_GUID_STRING_LEN
];
270 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
272 if (ClassGuid
== NULL
)
273 return CR_INVALID_POINTER
;
276 return CR_INVALID_FLAG
;
278 if (hMachine
!= NULL
)
280 FIXME("hMachine argument ignored\n");
281 hRelativeKey
= HKEY_LOCAL_MACHINE
; /* FIXME: use here a field in hMachine */
284 hRelativeKey
= HKEY_LOCAL_MACHINE
;
290 KEY_ENUMERATE_SUB_KEYS
,
292 if (rc
!= ERROR_SUCCESS
)
293 return GetCmCodeFromErrorCode(rc
);
299 sizeof(Buffer
) / sizeof(WCHAR
));
303 if (rc
== ERROR_SUCCESS
)
306 Buffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
307 /* Convert the buffer to a GUID */
308 if (UuidFromStringW(&Buffer
[1], ClassGuid
) != RPC_S_OK
)
312 return GetCmCodeFromErrorCode(rc
);
316 /***********************************************************************
317 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
319 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
320 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
322 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
323 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
328 /***********************************************************************
329 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
331 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
332 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
334 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
335 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
340 /***********************************************************************
341 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
343 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
344 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
347 FIXME("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
349 return CR_CALL_NOT_IMPLEMENTED
;
353 /***********************************************************************
354 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
356 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
357 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
360 RPC_BINDING_HANDLE BindingHandle
= NULL
;
362 FIXME("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
365 if (Buffer
== NULL
|| pulLength
== NULL
)
366 return CR_INVALID_POINTER
;
369 return CR_INVALID_FLAG
;
371 Buffer
[0] = (WCHAR
)0;
373 if (hMachine
!= NULL
)
375 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
376 if (BindingHandle
== NULL
)
381 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
385 return PNP_EnumerateSubKeys(BindingHandle
,
395 /***********************************************************************
396 * CM_Get_Child [SETUPAPI.@]
398 CONFIGRET WINAPI
CM_Get_Child(
399 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
401 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
402 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
406 /***********************************************************************
407 * CM_Get_Child_Ex [SETUPAPI.@]
409 CONFIGRET WINAPI
CM_Get_Child_Ex(
410 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
412 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
413 RPC_BINDING_HANDLE BindingHandle
= NULL
;
414 HSTRING_TABLE StringTable
= NULL
;
419 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
421 if (pdnDevInst
== NULL
)
422 return CR_INVALID_POINTER
;
425 return CR_INVALID_DEVINST
;
428 return CR_INVALID_FLAG
;
432 if (hMachine
!= NULL
)
434 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
435 if (BindingHandle
== NULL
)
438 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
439 if (StringTable
== 0)
444 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
448 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
449 if (lpDevInst
== NULL
)
450 return CR_INVALID_DEVNODE
;
452 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
458 if (ret
!= CR_SUCCESS
)
461 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
463 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
467 *pdnDevInst
= dwIndex
;
473 /***********************************************************************
474 * CM_Get_Class_Key_NameA [SETUPAPI.@]
476 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
477 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
479 TRACE("%p %p %p %lx\n",
480 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
481 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
486 /***********************************************************************
487 * CM_Get_Class_Key_NameW [SETUPAPI.@]
489 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
490 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
492 TRACE("%p %p %p %lx\n",
493 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
494 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
499 /***********************************************************************
500 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
502 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
503 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
506 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
507 CONFIGRET ret
= CR_SUCCESS
;
511 TRACE("%p %p %p %lx %lx\n",
512 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
514 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
515 return CR_INVALID_POINTER
;
517 ulOrigLength
= *pulLength
;
520 ulLength
= MAX_GUID_STRING_LEN
;
521 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
523 if (ret
== CR_SUCCESS
)
525 if (WideCharToMultiByte(CP_ACP
,
535 *pulLength
= lstrlenA(pszKeyName
) + 1;
542 /***********************************************************************
543 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
545 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
546 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
549 TRACE("%p %p %p %lx %lx\n",
550 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
552 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
553 return CR_INVALID_POINTER
;
556 return CR_INVALID_FLAG
;
558 if (*pulLength
< MAX_GUID_STRING_LEN
)
561 return CR_BUFFER_SMALL
;
564 if (!GuidToString(ClassGuid
, pszKeyName
))
565 return CR_INVALID_DATA
;
567 *pulLength
= MAX_GUID_STRING_LEN
;
573 /***********************************************************************
574 * CM_Get_Class_NameA [SETUPAPI.@]
576 CONFIGRET WINAPI
CM_Get_Class_NameA(
577 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
579 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
580 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
585 /***********************************************************************
586 * CM_Get_Class_NameW [SETUPAPI.@]
588 CONFIGRET WINAPI
CM_Get_Class_NameW(
589 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
591 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
592 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
597 /***********************************************************************
598 * CM_Get_Class_Name_ExA [SETUPAPI.@]
600 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
601 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
604 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
605 CONFIGRET ret
= CR_SUCCESS
;
609 TRACE("%p %p %p %lx %lx\n",
610 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
612 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
613 return CR_INVALID_POINTER
;
615 ulOrigLength
= *pulLength
;
618 ulLength
= MAX_CLASS_NAME_LEN
;
619 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
621 if (ret
== CR_SUCCESS
)
623 if (WideCharToMultiByte(CP_ACP
,
633 *pulLength
= lstrlenA(Buffer
) + 1;
640 /***********************************************************************
641 * CM_Get_Class_Name_ExW [SETUPAPI.@]
644 CM_Get_Class_Name_ExW(
645 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
648 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
649 RPC_BINDING_HANDLE BindingHandle
= NULL
;
651 TRACE("%p %p %p %lx %lx\n",
652 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
654 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
655 return CR_INVALID_POINTER
;
658 return CR_INVALID_FLAG
;
660 if (!GuidToString(ClassGuid
, szGuidString
))
661 return CR_INVALID_DATA
;
663 TRACE("Guid %s\n", debugstr_w(szGuidString
));
665 if (hMachine
!= NULL
)
667 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
668 if (BindingHandle
== NULL
)
673 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
677 return PNP_GetClassName(BindingHandle
,
685 /***********************************************************************
686 * CM_Get_Depth [SETUPAPI.@]
688 CONFIGRET WINAPI
CM_Get_Depth(
689 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
691 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
692 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
696 /***********************************************************************
697 * CM_Get_Depth_Ex [SETUPAPI.@]
699 CONFIGRET WINAPI
CM_Get_Depth_Ex(
700 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
702 RPC_BINDING_HANDLE BindingHandle
= NULL
;
703 HSTRING_TABLE StringTable
= NULL
;
706 TRACE("%p %lx %lx %lx\n",
707 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
709 if (pulDepth
== NULL
)
710 return CR_INVALID_POINTER
;
713 return CR_INVALID_DEVINST
;
716 return CR_INVALID_FLAG
;
718 if (hMachine
!= NULL
)
720 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
721 if (BindingHandle
== NULL
)
724 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
725 if (StringTable
== 0)
730 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
734 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
735 if (lpDevInst
== NULL
)
736 return CR_INVALID_DEVNODE
;
738 return PNP_GetDepth(BindingHandle
,
745 /***********************************************************************
746 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
748 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
749 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
750 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
752 TRACE("%lx %lu %p %p %p %lx\n",
753 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
755 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
756 pulRegDataType
, Buffer
,
757 pulLength
, ulFlags
, NULL
);
761 /***********************************************************************
762 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
764 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
765 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
766 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
768 TRACE("%lx %lu %p %p %p %lx\n",
769 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
771 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
772 pulRegDataType
, Buffer
,
773 pulLength
, ulFlags
, NULL
);
777 /***********************************************************************
778 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
780 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
781 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
782 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
784 FIXME("%lx %lu %p %p %p %lx %lx\n",
785 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
788 return CR_CALL_NOT_IMPLEMENTED
;
792 /***********************************************************************
793 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
795 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
796 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
797 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
799 RPC_BINDING_HANDLE BindingHandle
= NULL
;
800 HSTRING_TABLE StringTable
= NULL
;
801 CONFIGRET ret
= CR_SUCCESS
;
803 ULONG ulDataType
= 0;
804 ULONG ulTransferLength
= 0;
806 FIXME("%lx %lu %p %p %p %lx %lx\n",
807 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
811 return CR_INVALID_DEVNODE
;
813 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
814 return CR_INVALID_PROPERTY
;
816 /* pulRegDataType is optional */
818 /* Buffer is optional */
820 if (pulLength
== NULL
)
821 return CR_INVALID_POINTER
;
824 return CR_INVALID_POINTER
;
827 return CR_INVALID_FLAG
;
829 if (hMachine
!= NULL
)
831 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
832 if (BindingHandle
== NULL
)
835 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
836 if (StringTable
== 0)
841 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
845 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
846 if (lpDevInst
== NULL
)
847 return CR_INVALID_DEVNODE
;
849 ulTransferLength
= *pulLength
;
850 ret
= PNP_GetDeviceRegProp(BindingHandle
,
858 if (ret
== CR_SUCCESS
)
860 if (pulRegDataType
!= NULL
)
861 *pulRegDataType
= ulDataType
;
868 /***********************************************************************
869 * CM_Get_DevNode_Status [SETUPAPI.@]
871 CONFIGRET WINAPI
CM_Get_DevNode_Status(
872 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
875 TRACE("%p %p %lx %lx\n",
876 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
877 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
882 /***********************************************************************
883 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
886 CM_Get_DevNode_Status_Ex(
887 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
888 ULONG ulFlags
, HMACHINE hMachine
)
890 RPC_BINDING_HANDLE BindingHandle
= NULL
;
891 HSTRING_TABLE StringTable
= NULL
;
894 TRACE("%p %p %lx %lx %lx\n",
895 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
897 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
898 return CR_INVALID_POINTER
;
901 return CR_INVALID_DEVINST
;
904 return CR_INVALID_FLAG
;
906 if (hMachine
!= NULL
)
908 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
909 if (BindingHandle
== NULL
)
912 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
913 if (StringTable
== 0)
918 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
922 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
923 if (lpDevInst
== NULL
)
924 return CR_INVALID_DEVNODE
;
926 return PNP_GetDeviceStatus(BindingHandle
,
934 /***********************************************************************
935 * CM_Get_Device_IDA [SETUPAPI.@]
937 CONFIGRET WINAPI
CM_Get_Device_IDA(
938 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
940 TRACE("%lx %p %ld %ld\n",
941 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
942 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
946 /***********************************************************************
947 * CM_Get_Device_IDW [SETUPAPI.@]
949 CONFIGRET WINAPI
CM_Get_Device_IDW(
950 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
952 TRACE("%lx %p %ld %ld\n",
953 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
954 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
958 /***********************************************************************
959 * CM_Get_Device_ID_ExA [SETUPAPI.@]
961 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
962 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
965 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
966 CONFIGRET ret
= CR_SUCCESS
;
968 FIXME("%lx %p %ld %ld %lx\n",
969 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
972 return CR_INVALID_POINTER
;
974 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
979 if (ret
== CR_SUCCESS
)
981 if (WideCharToMultiByte(CP_ACP
,
984 lstrlenW(szBufferW
) + 1,
996 /***********************************************************************
997 * CM_Get_Device_ID_ExW [SETUPAPI.@]
999 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
1000 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1003 HSTRING_TABLE StringTable
= NULL
;
1005 TRACE("%lx %p %ld %ld %lx\n",
1006 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1009 return CR_INVALID_DEVINST
;
1012 return CR_INVALID_POINTER
;
1015 return CR_INVALID_FLAG
;
1017 if (hMachine
!= NULL
)
1019 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1020 if (StringTable
== NULL
)
1025 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1029 if (!StringTableStringFromIdEx(StringTable
,
1039 /***********************************************************************
1040 * CM_Get_Device_ID_ListA [SETUPAPI.@]
1042 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
1043 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1045 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1046 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
1051 /***********************************************************************
1052 * CM_Get_Device_ID_ListW [SETUPAPI.@]
1054 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
1055 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1057 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1058 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
1063 /***********************************************************************
1064 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
1066 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
1067 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1070 LPWSTR BufferW
= NULL
;
1071 LPWSTR pszFilterW
= NULL
;
1072 CONFIGRET ret
= CR_SUCCESS
;
1074 FIXME("%p %p %ld %ld %lx\n",
1075 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1077 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
1078 if (BufferW
== NULL
)
1079 return CR_OUT_OF_MEMORY
;
1081 if (pszFilter
== NULL
)
1083 ret
= CM_Get_Device_ID_List_ExW(NULL
,
1091 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1093 ret
= CR_INVALID_DEVICE_ID
;
1097 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
1106 if (WideCharToMultiByte(CP_ACP
,
1109 lstrlenW(BufferW
) + 1,
1123 /***********************************************************************
1124 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
1126 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
1127 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1130 FIXME("%p %p %ld %ld %lx\n",
1131 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1137 /***********************************************************************
1138 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
1140 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
1141 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
1143 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
1144 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
1148 /***********************************************************************
1149 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
1151 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
1152 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
1154 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
1155 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
1159 /***********************************************************************
1160 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
1162 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
1163 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1165 LPWSTR pszFilterW
= NULL
;
1166 CONFIGRET ret
= CR_SUCCESS
;
1168 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
1170 if (pszFilter
== NULL
)
1172 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1179 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1180 return CR_INVALID_DEVICE_ID
;
1182 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1194 /***********************************************************************
1195 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
1197 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
1198 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1200 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
1206 /***********************************************************************
1207 * CM_Get_Device_ID_Size [SETUPAPI.@]
1209 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
1210 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
1212 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
1213 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
1217 /***********************************************************************
1218 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
1220 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
1221 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1223 HSTRING_TABLE StringTable
= NULL
;
1226 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
1229 return CR_INVALID_POINTER
;
1232 return CR_INVALID_DEVINST
;
1235 return CR_INVALID_FLAG
;
1237 if (hMachine
!= NULL
)
1239 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1240 if (StringTable
== NULL
)
1245 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1249 DeviceId
= StringTableStringFromId(StringTable
, dnDevInst
);
1250 if (DeviceId
== NULL
)
1256 *pulLen
= lstrlenW(DeviceId
);
1262 /***********************************************************************
1263 * CM_Get_Global_State [SETUPAPI.@]
1265 CONFIGRET WINAPI
CM_Get_Global_State(
1266 PULONG pulState
, ULONG ulFlags
)
1268 TRACE("%p %lx\n", pulState
, ulFlags
);
1269 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
1273 /***********************************************************************
1274 * CM_Get_Global_State_Ex [SETUPAPI.@]
1276 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
1277 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
1279 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1281 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
1283 if (pulState
== NULL
)
1284 return CR_INVALID_POINTER
;
1287 return CR_INVALID_FLAG
;
1289 if (hMachine
!= NULL
)
1291 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1292 if (BindingHandle
== NULL
)
1297 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1301 return PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
1305 /***********************************************************************
1306 * CM_Get_Parent [SETUPAPI.@]
1308 CONFIGRET WINAPI
CM_Get_Parent(
1309 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1311 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1312 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1316 /***********************************************************************
1317 * CM_Get_Parent_Ex [SETUPAPI.@]
1319 CONFIGRET WINAPI
CM_Get_Parent_Ex(
1320 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1322 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1323 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1324 HSTRING_TABLE StringTable
= NULL
;
1329 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1331 if (pdnDevInst
== NULL
)
1332 return CR_INVALID_POINTER
;
1335 return CR_INVALID_DEVINST
;
1338 return CR_INVALID_FLAG
;
1342 if (hMachine
!= NULL
)
1344 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1345 if (BindingHandle
== NULL
)
1348 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1349 if (StringTable
== 0)
1354 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1358 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1359 if (lpDevInst
== NULL
)
1360 return CR_INVALID_DEVNODE
;
1362 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1368 if (ret
!= CR_SUCCESS
)
1371 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1373 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1377 *pdnDevInst
= dwIndex
;
1383 /***********************************************************************
1384 * CM_Get_Sibling [SETUPAPI.@]
1386 CONFIGRET WINAPI
CM_Get_Sibling(
1387 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1389 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1390 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1394 /***********************************************************************
1395 * CM_Get_Sibling_Ex [SETUPAPI.@]
1397 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
1398 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1400 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1401 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1402 HSTRING_TABLE StringTable
= NULL
;
1407 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1409 if (pdnDevInst
== NULL
)
1410 return CR_INVALID_POINTER
;
1413 return CR_INVALID_DEVINST
;
1416 return CR_INVALID_FLAG
;
1420 if (hMachine
!= NULL
)
1422 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1423 if (BindingHandle
== NULL
)
1426 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1427 if (StringTable
== 0)
1432 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1436 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1437 if (lpDevInst
== NULL
)
1438 return CR_INVALID_DEVNODE
;
1440 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1446 if (ret
!= CR_SUCCESS
)
1449 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1451 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1455 *pdnDevInst
= dwIndex
;
1461 /***********************************************************************
1462 * CM_Get_Version [SETUPAPI.@]
1464 WORD WINAPI
CM_Get_Version(VOID
)
1467 return CM_Get_Version_Ex(NULL
);
1471 /***********************************************************************
1472 * CM_Get_Version_Ex [SETUPAPI.@]
1474 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
1476 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1479 TRACE("%lx\n", hMachine
);
1481 if (hMachine
!= NULL
)
1483 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1484 if (BindingHandle
== NULL
)
1489 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1493 if (PNP_GetVersion(BindingHandle
, &Version
) != CR_SUCCESS
)
1500 /***********************************************************************
1501 * CM_Locate_DevNodeA [SETUPAPI.@]
1503 CONFIGRET WINAPI
CM_Locate_DevNodeA(
1504 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
1506 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
1507 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
1511 /***********************************************************************
1512 * CM_Locate_DevNodeW [SETUPAPI.@]
1514 CONFIGRET WINAPI
CM_Locate_DevNodeW(
1515 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
1517 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
1518 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
1522 /***********************************************************************
1523 * CM_Locate_DevNode_ExA [SETUPAPI.@]
1525 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
1526 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
1528 DEVINSTID_W pDevIdW
= NULL
;
1529 CONFIGRET ret
= CR_SUCCESS
;
1531 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
1533 if (pDeviceID
!= NULL
)
1535 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
1536 return CR_INVALID_DEVICE_ID
;
1539 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
1541 if (pDevIdW
!= NULL
)
1548 /***********************************************************************
1549 * CM_Locate_DevNode_ExW [SETUPAPI.@]
1551 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
1552 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
1554 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
1555 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1556 HSTRING_TABLE StringTable
= NULL
;
1557 CONFIGRET ret
= CR_SUCCESS
;
1559 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
1561 if (pdnDevInst
== NULL
)
1562 return CR_INVALID_POINTER
;
1564 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
1565 return CR_INVALID_FLAG
;
1567 if (hMachine
!= NULL
)
1569 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1570 if (BindingHandle
== NULL
)
1573 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1574 if (StringTable
== 0)
1579 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1583 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
1585 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
1589 /* Get the root device ID */
1590 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
1593 if (ret
!= CR_SUCCESS
)
1596 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
1598 /* Validate the device ID */
1599 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
1602 if (ret
== CR_SUCCESS
)
1604 *pdnDevInst
= StringTableAddString(StringTable
, DeviceIdBuffer
, 1);
1605 if (*pdnDevInst
== -1)
1613 /***********************************************************************
1614 * CM_Open_Class_KeyA [SETUPAPI.@]
1616 CONFIGRET WINAPI
CM_Open_Class_KeyA(
1617 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
1618 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
1620 TRACE("%p %s %lx %lx %p %lx\n",
1621 debugstr_guid(pClassGuid
), pszClassName
,
1622 samDesired
, Disposition
, phkClass
, ulFlags
);
1624 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
1625 Disposition
, phkClass
, ulFlags
, NULL
);
1629 /***********************************************************************
1630 * CM_Open_Class_KeyW [SETUPAPI.@]
1632 CONFIGRET WINAPI
CM_Open_Class_KeyW(
1633 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
1634 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
1636 TRACE("%p %s %lx %lx %p %lx\n",
1637 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
1638 samDesired
, Disposition
, phkClass
, ulFlags
);
1640 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
1641 Disposition
, phkClass
, ulFlags
, NULL
);
1645 /***********************************************************************
1646 * CM_Open_Class_Key_ExA [SETUPAPI.@]
1648 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
1649 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
1650 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
1653 CONFIGRET rc
= CR_SUCCESS
;
1654 LPWSTR pszClassNameW
= NULL
;
1656 TRACE("%p %s %lx %lx %p %lx %lx\n",
1657 debugstr_guid(pClassGuid
), pszClassName
,
1658 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
1660 if (pszClassName
!= NULL
)
1662 if (CaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
1663 return CR_INVALID_DATA
;
1666 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
1667 Disposition
, phkClass
, ulFlags
, hMachine
);
1669 if (pszClassNameW
!= NULL
)
1670 MyFree(pszClassNameW
);
1676 /***********************************************************************
1677 * CM_Open_Class_Key_ExW [SETUPAPI.@]
1679 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
1680 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
1681 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
1684 WCHAR szKeyName
[MAX_PATH
];
1685 LPWSTR lpGuidString
;
1686 DWORD dwDisposition
;
1690 TRACE("%p %s %lx %lx %p %lx %lx\n",
1691 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
1692 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
1694 /* Check Disposition and ulFlags */
1695 if ((Disposition
& ~RegDisposition_Bits
) ||
1696 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
1697 return CR_INVALID_FLAG
;
1699 /* Check phkClass */
1700 if (phkClass
== NULL
)
1701 return CR_INVALID_POINTER
;
1705 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
1706 pszClassName
!= NULL
)
1707 return CR_INVALID_DATA
;
1709 if (hMachine
== NULL
)
1711 hKey
= HKEY_LOCAL_MACHINE
;
1715 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
1716 HKEY_LOCAL_MACHINE
, &hKey
))
1717 return CR_REGISTRY_ERROR
;
1720 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
1722 lstrcpyW(szKeyName
, DeviceClasses
);
1726 lstrcpyW(szKeyName
, ControlClass
);
1729 if (pClassGuid
!= NULL
)
1731 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
1734 return CR_INVALID_DATA
;
1737 lstrcatW(szKeyName
, Backslash
);
1738 lstrcatW(szKeyName
, lpGuidString
);
1741 if (Disposition
== RegDisposition_OpenAlways
)
1743 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
1744 NULL
, phkClass
, &dwDisposition
);
1748 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
1753 if (pClassGuid
!= NULL
)
1754 RpcStringFreeW(&lpGuidString
);
1756 if (dwError
!= ERROR_SUCCESS
)
1759 return CR_NO_SUCH_REGISTRY_KEY
;
1762 if (pszClassName
!= NULL
)
1764 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
1765 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
1772 /***********************************************************************
1773 * CM_Set_DevNode_Problem [SETUPAPI.@]
1775 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
1776 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
1778 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
1779 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
1783 /***********************************************************************
1784 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
1786 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
1787 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
1789 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1790 HSTRING_TABLE StringTable
= NULL
;
1793 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
1796 return CR_INVALID_DEVNODE
;
1798 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
1799 return CR_INVALID_FLAG
;
1801 if (hMachine
!= NULL
)
1803 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1804 if (BindingHandle
== NULL
)
1807 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1808 if (StringTable
== 0)
1813 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1817 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1818 if (lpDevInst
== NULL
)
1819 return CR_INVALID_DEVNODE
;
1821 return PNP_SetDeviceProblem(BindingHandle
,
1828 /***********************************************************************
1829 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
1831 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
1832 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1835 TRACE("%lx %lu %p %lx %lx\n",
1836 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
1837 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1843 /***********************************************************************
1844 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
1846 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
1847 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1850 TRACE("%lx %lu %p %lx %lx\n",
1851 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
1852 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1858 /***********************************************************************
1859 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
1861 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
1862 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1863 ULONG ulFlags
, HMACHINE hMachine
)
1865 CONFIGRET ret
= CR_SUCCESS
;
1869 FIXME("%lx %lu %p %lx %lx %lx\n",
1870 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
1872 if (Buffer
== NULL
&& ulLength
!= 0)
1873 return CR_INVALID_POINTER
;
1877 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
1886 /* Get property type */
1889 case CM_DRP_DEVICEDESC
:
1893 case CM_DRP_HARDWAREID
:
1894 ulType
= REG_MULTI_SZ
;
1897 case CM_DRP_COMPATIBLEIDS
:
1898 ulType
= REG_MULTI_SZ
;
1901 case CM_DRP_SERVICE
:
1909 case CM_DRP_CLASSGUID
:
1917 case CM_DRP_CONFIGFLAGS
:
1925 case CM_DRP_FRIENDLYNAME
:
1929 case CM_DRP_LOCATION_INFORMATION
:
1933 case CM_DRP_UPPERFILTERS
:
1934 ulType
= REG_MULTI_SZ
;
1937 case CM_DRP_LOWERFILTERS
:
1938 ulType
= REG_MULTI_SZ
;
1942 return CR_INVALID_PROPERTY
;
1945 /* Allocate buffer if needed */
1946 if (ulType
== REG_SZ
||
1947 ulType
== REG_MULTI_SZ
)
1949 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
1950 if (lpBuffer
== NULL
)
1952 ret
= CR_OUT_OF_MEMORY
;
1956 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
1957 ulLength
, lpBuffer
, ulLength
))
1964 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
1967 ulLength
* sizeof(WCHAR
),
1976 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
1984 ret
= CR_CALL_NOT_IMPLEMENTED
;
1991 /***********************************************************************
1992 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
1994 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
1995 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1996 ULONG ulFlags
, HMACHINE hMachine
)
1998 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1999 HSTRING_TABLE StringTable
= NULL
;
2003 TRACE("%lx %lu %p %lx %lx %lx\n",
2004 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
2007 return CR_INVALID_DEVNODE
;
2009 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
2010 return CR_INVALID_PROPERTY
;
2012 if (Buffer
!= NULL
&& ulLength
== 0)
2013 return CR_INVALID_POINTER
;
2016 return CR_INVALID_FLAG
;
2018 if (hMachine
!= NULL
)
2020 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2021 if (BindingHandle
== NULL
)
2024 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2025 if (StringTable
== 0)
2030 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2034 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2035 if (lpDevInst
== NULL
)
2036 return CR_INVALID_DEVNODE
;
2040 case CM_DRP_DEVICEDESC
:
2044 case CM_DRP_HARDWAREID
:
2045 ulType
= REG_MULTI_SZ
;
2048 case CM_DRP_COMPATIBLEIDS
:
2049 ulType
= REG_MULTI_SZ
;
2052 case CM_DRP_SERVICE
:
2060 case CM_DRP_CLASSGUID
:
2068 case CM_DRP_CONFIGFLAGS
:
2076 case CM_DRP_FRIENDLYNAME
:
2080 case CM_DRP_LOCATION_INFORMATION
:
2084 case CM_DRP_UPPERFILTERS
:
2085 ulType
= REG_MULTI_SZ
;
2088 case CM_DRP_LOWERFILTERS
:
2089 ulType
= REG_MULTI_SZ
;
2093 return CR_INVALID_PROPERTY
;
2096 return PNP_SetDeviceRegProp(BindingHandle
,