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_Get_Child [SETUPAPI.@]
319 CONFIGRET WINAPI
CM_Get_Child(
320 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
322 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
323 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
327 /***********************************************************************
328 * CM_Get_Child_Ex [SETUPAPI.@]
330 CONFIGRET WINAPI
CM_Get_Child_Ex(
331 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
333 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
334 RPC_BINDING_HANDLE BindingHandle
= NULL
;
335 HSTRING_TABLE StringTable
= NULL
;
340 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
342 if (pdnDevInst
== NULL
)
343 return CR_INVALID_POINTER
;
346 return CR_INVALID_DEVINST
;
349 return CR_INVALID_FLAG
;
353 if (hMachine
!= NULL
)
355 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
356 if (BindingHandle
== NULL
)
359 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
360 if (StringTable
== 0)
365 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
369 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
370 if (lpDevInst
== NULL
)
371 return CR_INVALID_DEVNODE
;
373 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
379 if (ret
!= CR_SUCCESS
)
382 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
384 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
388 *pdnDevInst
= dwIndex
;
394 /***********************************************************************
395 * CM_Get_Class_Key_NameA [SETUPAPI.@]
397 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
398 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
400 TRACE("%p %p %p %lx\n",
401 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
402 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
407 /***********************************************************************
408 * CM_Get_Class_Key_NameW [SETUPAPI.@]
410 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
411 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
413 TRACE("%p %p %p %lx\n",
414 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
415 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
420 /***********************************************************************
421 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
423 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
424 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
427 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
428 CONFIGRET ret
= CR_SUCCESS
;
432 TRACE("%p %p %p %lx %lx\n",
433 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
435 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
436 return CR_INVALID_POINTER
;
438 ulOrigLength
= *pulLength
;
441 ulLength
= MAX_GUID_STRING_LEN
;
442 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
444 if (ret
== CR_SUCCESS
)
446 if (WideCharToMultiByte(CP_ACP
,
456 *pulLength
= lstrlenA(pszKeyName
) + 1;
463 /***********************************************************************
464 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
466 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
467 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
470 TRACE("%p %p %p %lx %lx\n",
471 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
473 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
474 return CR_INVALID_POINTER
;
477 return CR_INVALID_FLAG
;
479 if (*pulLength
< MAX_GUID_STRING_LEN
)
482 return CR_BUFFER_SMALL
;
485 if (!GuidToString(ClassGuid
, pszKeyName
))
486 return CR_INVALID_DATA
;
488 *pulLength
= MAX_GUID_STRING_LEN
;
494 /***********************************************************************
495 * CM_Get_Class_NameA [SETUPAPI.@]
497 CONFIGRET WINAPI
CM_Get_Class_NameA(
498 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
500 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
501 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
506 /***********************************************************************
507 * CM_Get_Class_NameW [SETUPAPI.@]
509 CONFIGRET WINAPI
CM_Get_Class_NameW(
510 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
512 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
513 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
518 /***********************************************************************
519 * CM_Get_Class_Name_ExA [SETUPAPI.@]
521 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
522 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
525 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
526 CONFIGRET ret
= CR_SUCCESS
;
530 TRACE("%p %p %p %lx %lx\n",
531 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
533 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
534 return CR_INVALID_POINTER
;
536 ulOrigLength
= *pulLength
;
539 ulLength
= MAX_CLASS_NAME_LEN
;
540 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
542 if (ret
== CR_SUCCESS
)
544 if (WideCharToMultiByte(CP_ACP
,
554 *pulLength
= lstrlenA(Buffer
) + 1;
561 /***********************************************************************
562 * CM_Get_Class_Name_ExW [SETUPAPI.@]
565 CM_Get_Class_Name_ExW(
566 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
569 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
570 RPC_BINDING_HANDLE BindingHandle
= NULL
;
572 TRACE("%p %p %p %lx %lx\n",
573 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
575 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
576 return CR_INVALID_POINTER
;
579 return CR_INVALID_FLAG
;
581 if (!GuidToString(ClassGuid
, szGuidString
))
582 return CR_INVALID_DATA
;
584 TRACE("Guid %s\n", debugstr_w(szGuidString
));
586 if (hMachine
!= NULL
)
588 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
589 if (BindingHandle
== NULL
)
594 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
598 return PNP_GetClassName(BindingHandle
,
606 /***********************************************************************
607 * CM_Get_Depth [SETUPAPI.@]
609 CONFIGRET WINAPI
CM_Get_Depth(
610 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
612 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
613 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
617 /***********************************************************************
618 * CM_Get_Depth_Ex [SETUPAPI.@]
620 CONFIGRET WINAPI
CM_Get_Depth_Ex(
621 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
623 RPC_BINDING_HANDLE BindingHandle
= NULL
;
624 HSTRING_TABLE StringTable
= NULL
;
627 TRACE("%p %lx %lx %lx\n",
628 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
630 if (pulDepth
== NULL
)
631 return CR_INVALID_POINTER
;
634 return CR_INVALID_DEVINST
;
637 return CR_INVALID_FLAG
;
639 if (hMachine
!= NULL
)
641 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
642 if (BindingHandle
== NULL
)
645 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
646 if (StringTable
== 0)
651 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
655 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
656 if (lpDevInst
== NULL
)
657 return CR_INVALID_DEVNODE
;
659 return PNP_GetDepth(BindingHandle
,
666 /***********************************************************************
667 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
669 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
670 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
671 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
673 TRACE("%lx %lu %p %p %p %lx\n",
674 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
676 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
677 pulRegDataType
, Buffer
,
678 pulLength
, ulFlags
, NULL
);
682 /***********************************************************************
683 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
685 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
686 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
687 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
689 TRACE("%lx %lu %p %p %p %lx\n",
690 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
692 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
693 pulRegDataType
, Buffer
,
694 pulLength
, ulFlags
, NULL
);
698 /***********************************************************************
699 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
701 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
702 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
703 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
705 FIXME("%lx %lu %p %p %p %lx %lx\n",
706 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
709 return CR_CALL_NOT_IMPLEMENTED
;
713 /***********************************************************************
714 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
716 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
717 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
718 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
720 RPC_BINDING_HANDLE BindingHandle
= NULL
;
721 HSTRING_TABLE StringTable
= NULL
;
722 CONFIGRET ret
= CR_SUCCESS
;
724 ULONG ulDataType
= 0;
725 ULONG ulTransferLength
= 0;
727 FIXME("%lx %lu %p %p %p %lx %lx\n",
728 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
732 return CR_INVALID_DEVNODE
;
734 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
735 return CR_INVALID_PROPERTY
;
737 /* pulRegDataType is optional */
739 /* Buffer is optional */
741 if (pulLength
== NULL
)
742 return CR_INVALID_POINTER
;
745 return CR_INVALID_POINTER
;
748 return CR_INVALID_FLAG
;
750 if (hMachine
!= NULL
)
752 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
753 if (BindingHandle
== NULL
)
756 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
757 if (StringTable
== 0)
762 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
766 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
767 if (lpDevInst
== NULL
)
768 return CR_INVALID_DEVNODE
;
770 ulTransferLength
= *pulLength
;
771 ret
= PNP_GetDeviceRegProp(BindingHandle
,
779 if (ret
== CR_SUCCESS
)
781 if (pulRegDataType
!= NULL
)
782 *pulRegDataType
= ulDataType
;
789 /***********************************************************************
790 * CM_Get_DevNode_Status [SETUPAPI.@]
792 CONFIGRET WINAPI
CM_Get_DevNode_Status(
793 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
796 TRACE("%p %p %lx %lx\n",
797 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
798 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
803 /***********************************************************************
804 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
807 CM_Get_DevNode_Status_Ex(
808 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
809 ULONG ulFlags
, HMACHINE hMachine
)
811 RPC_BINDING_HANDLE BindingHandle
= NULL
;
812 HSTRING_TABLE StringTable
= NULL
;
815 TRACE("%p %p %lx %lx %lx\n",
816 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
818 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
819 return CR_INVALID_POINTER
;
822 return CR_INVALID_DEVINST
;
825 return CR_INVALID_FLAG
;
827 if (hMachine
!= NULL
)
829 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
830 if (BindingHandle
== NULL
)
833 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
834 if (StringTable
== 0)
839 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
843 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
844 if (lpDevInst
== NULL
)
845 return CR_INVALID_DEVNODE
;
847 return PNP_GetDeviceStatus(BindingHandle
,
855 /***********************************************************************
856 * CM_Get_Device_IDA [SETUPAPI.@]
858 CONFIGRET WINAPI
CM_Get_Device_IDA(
859 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
861 TRACE("%lx %p %ld %ld\n",
862 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
863 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
867 /***********************************************************************
868 * CM_Get_Device_IDW [SETUPAPI.@]
870 CONFIGRET WINAPI
CM_Get_Device_IDW(
871 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
873 TRACE("%lx %p %ld %ld\n",
874 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
875 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
879 /***********************************************************************
880 * CM_Get_Device_ID_ExA [SETUPAPI.@]
882 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
883 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
886 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
887 CONFIGRET ret
= CR_SUCCESS
;
889 FIXME("%lx %p %ld %ld %lx\n",
890 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
893 return CR_INVALID_POINTER
;
895 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
900 if (ret
== CR_SUCCESS
)
902 if (WideCharToMultiByte(CP_ACP
,
905 lstrlenW(szBufferW
) + 1,
917 /***********************************************************************
918 * CM_Get_Device_ID_ExW [SETUPAPI.@]
920 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
921 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
924 HSTRING_TABLE StringTable
= NULL
;
926 TRACE("%lx %p %ld %ld %lx\n",
927 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
930 return CR_INVALID_DEVINST
;
933 return CR_INVALID_POINTER
;
936 return CR_INVALID_FLAG
;
938 if (hMachine
!= NULL
)
940 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
941 if (StringTable
== NULL
)
946 if (!PnpGetLocalHandles(NULL
, &StringTable
))
950 if (!StringTableStringFromIdEx(StringTable
,
960 /***********************************************************************
961 * CM_Get_Device_ID_ListA [SETUPAPI.@]
963 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
964 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
966 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
967 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
972 /***********************************************************************
973 * CM_Get_Device_ID_ListW [SETUPAPI.@]
975 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
976 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
978 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
979 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
984 /***********************************************************************
985 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
987 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
988 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
991 LPWSTR BufferW
= NULL
;
992 LPWSTR pszFilterW
= NULL
;
993 CONFIGRET ret
= CR_SUCCESS
;
995 FIXME("%p %p %ld %ld %lx\n",
996 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
998 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
1000 return CR_OUT_OF_MEMORY
;
1002 if (pszFilter
== NULL
)
1004 ret
= CM_Get_Device_ID_List_ExW(NULL
,
1012 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1014 ret
= CR_INVALID_DEVICE_ID
;
1018 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
1027 if (WideCharToMultiByte(CP_ACP
,
1030 lstrlenW(BufferW
) + 1,
1044 /***********************************************************************
1045 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
1047 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
1048 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1051 FIXME("%p %p %ld %ld %lx\n",
1052 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1058 /***********************************************************************
1059 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
1061 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
1062 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
1064 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
1065 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
1069 /***********************************************************************
1070 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
1072 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
1073 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
1075 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
1076 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
1080 /***********************************************************************
1081 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
1083 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
1084 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1086 LPWSTR pszFilterW
= NULL
;
1087 CONFIGRET ret
= CR_SUCCESS
;
1089 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
1091 if (pszFilter
== NULL
)
1093 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1100 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1101 return CR_INVALID_DEVICE_ID
;
1103 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
1115 /***********************************************************************
1116 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
1118 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
1119 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
1121 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
1127 /***********************************************************************
1128 * CM_Get_Device_ID_Size [SETUPAPI.@]
1130 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
1131 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
1133 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
1134 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
1138 /***********************************************************************
1139 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
1141 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
1142 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1144 HSTRING_TABLE StringTable
= NULL
;
1147 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
1150 return CR_INVALID_POINTER
;
1153 return CR_INVALID_DEVINST
;
1156 return CR_INVALID_FLAG
;
1158 if (hMachine
!= NULL
)
1160 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1161 if (StringTable
== NULL
)
1166 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1170 DeviceId
= StringTableStringFromId(StringTable
, dnDevInst
);
1171 if (DeviceId
== NULL
)
1177 *pulLen
= lstrlenW(DeviceId
);
1183 /***********************************************************************
1184 * CM_Get_Global_State [SETUPAPI.@]
1186 CONFIGRET WINAPI
CM_Get_Global_State(
1187 PULONG pulState
, ULONG ulFlags
)
1189 TRACE("%p %lx\n", pulState
, ulFlags
);
1190 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
1194 /***********************************************************************
1195 * CM_Get_Global_State_Ex [SETUPAPI.@]
1197 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
1198 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
1200 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1202 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
1204 if (pulState
== NULL
)
1205 return CR_INVALID_POINTER
;
1208 return CR_INVALID_FLAG
;
1210 if (hMachine
!= NULL
)
1212 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1213 if (BindingHandle
== NULL
)
1218 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1222 return PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
1226 /***********************************************************************
1227 * CM_Get_Parent [SETUPAPI.@]
1229 CONFIGRET WINAPI
CM_Get_Parent(
1230 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1232 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1233 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1237 /***********************************************************************
1238 * CM_Get_Parent_Ex [SETUPAPI.@]
1240 CONFIGRET WINAPI
CM_Get_Parent_Ex(
1241 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1243 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1244 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1245 HSTRING_TABLE StringTable
= NULL
;
1250 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1252 if (pdnDevInst
== NULL
)
1253 return CR_INVALID_POINTER
;
1256 return CR_INVALID_DEVINST
;
1259 return CR_INVALID_FLAG
;
1263 if (hMachine
!= NULL
)
1265 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1266 if (BindingHandle
== NULL
)
1269 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1270 if (StringTable
== 0)
1275 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1279 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1280 if (lpDevInst
== NULL
)
1281 return CR_INVALID_DEVNODE
;
1283 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1289 if (ret
!= CR_SUCCESS
)
1292 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1294 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1298 *pdnDevInst
= dwIndex
;
1304 /***********************************************************************
1305 * CM_Get_Sibling [SETUPAPI.@]
1307 CONFIGRET WINAPI
CM_Get_Sibling(
1308 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1310 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1311 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1315 /***********************************************************************
1316 * CM_Get_Sibling_Ex [SETUPAPI.@]
1318 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
1319 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1321 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1322 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1323 HSTRING_TABLE StringTable
= NULL
;
1328 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1330 if (pdnDevInst
== NULL
)
1331 return CR_INVALID_POINTER
;
1334 return CR_INVALID_DEVINST
;
1337 return CR_INVALID_FLAG
;
1341 if (hMachine
!= NULL
)
1343 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1344 if (BindingHandle
== NULL
)
1347 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1348 if (StringTable
== 0)
1353 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1357 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1358 if (lpDevInst
== NULL
)
1359 return CR_INVALID_DEVNODE
;
1361 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1367 if (ret
!= CR_SUCCESS
)
1370 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1372 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1376 *pdnDevInst
= dwIndex
;
1382 /***********************************************************************
1383 * CM_Get_Version [SETUPAPI.@]
1385 WORD WINAPI
CM_Get_Version(VOID
)
1388 return CM_Get_Version_Ex(NULL
);
1392 /***********************************************************************
1393 * CM_Get_Version_Ex [SETUPAPI.@]
1395 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
1397 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1400 TRACE("%lx\n", hMachine
);
1402 if (hMachine
!= NULL
)
1404 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1405 if (BindingHandle
== NULL
)
1410 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1414 if (PNP_GetVersion(BindingHandle
, &Version
) != CR_SUCCESS
)
1421 /***********************************************************************
1422 * CM_Locate_DevNodeA [SETUPAPI.@]
1424 CONFIGRET WINAPI
CM_Locate_DevNodeA(
1425 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
1427 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
1428 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
1432 /***********************************************************************
1433 * CM_Locate_DevNodeW [SETUPAPI.@]
1435 CONFIGRET WINAPI
CM_Locate_DevNodeW(
1436 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
1438 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
1439 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
1443 /***********************************************************************
1444 * CM_Locate_DevNode_ExA [SETUPAPI.@]
1446 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
1447 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
1449 DEVINSTID_W pDevIdW
= NULL
;
1450 CONFIGRET ret
= CR_SUCCESS
;
1452 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
1454 if (pDeviceID
!= NULL
)
1456 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
1457 return CR_INVALID_DEVICE_ID
;
1460 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
1462 if (pDevIdW
!= NULL
)
1469 /***********************************************************************
1470 * CM_Locate_DevNode_ExW [SETUPAPI.@]
1472 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
1473 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
1475 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
1476 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1477 HSTRING_TABLE StringTable
= NULL
;
1478 CONFIGRET ret
= CR_SUCCESS
;
1480 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
1482 if (pdnDevInst
== NULL
)
1483 return CR_INVALID_POINTER
;
1485 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
1486 return CR_INVALID_FLAG
;
1488 if (hMachine
!= NULL
)
1490 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1491 if (BindingHandle
== NULL
)
1494 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1495 if (StringTable
== 0)
1500 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1504 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
1506 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
1510 /* Get the root device ID */
1511 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
1514 if (ret
!= CR_SUCCESS
)
1517 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
1519 /* Validate the device ID */
1520 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
1523 if (ret
== CR_SUCCESS
)
1525 *pdnDevInst
= StringTableAddString(StringTable
, DeviceIdBuffer
, 1);
1526 if (*pdnDevInst
== -1)
1534 /***********************************************************************
1535 * CM_Open_Class_KeyA [SETUPAPI.@]
1537 CONFIGRET WINAPI
CM_Open_Class_KeyA(
1538 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
1539 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
1541 TRACE("%p %s %lx %lx %p %lx\n",
1542 debugstr_guid(pClassGuid
), pszClassName
,
1543 samDesired
, Disposition
, phkClass
, ulFlags
);
1545 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
1546 Disposition
, phkClass
, ulFlags
, NULL
);
1550 /***********************************************************************
1551 * CM_Open_Class_KeyW [SETUPAPI.@]
1553 CONFIGRET WINAPI
CM_Open_Class_KeyW(
1554 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
1555 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
1557 TRACE("%p %s %lx %lx %p %lx\n",
1558 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
1559 samDesired
, Disposition
, phkClass
, ulFlags
);
1561 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
1562 Disposition
, phkClass
, ulFlags
, NULL
);
1566 /***********************************************************************
1567 * CM_Open_Class_Key_ExA [SETUPAPI.@]
1569 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
1570 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
1571 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
1574 CONFIGRET rc
= CR_SUCCESS
;
1575 LPWSTR pszClassNameW
= NULL
;
1577 TRACE("%p %s %lx %lx %p %lx %lx\n",
1578 debugstr_guid(pClassGuid
), pszClassName
,
1579 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
1581 if (pszClassName
!= NULL
)
1583 if (CaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
1584 return CR_INVALID_DATA
;
1587 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
1588 Disposition
, phkClass
, ulFlags
, hMachine
);
1590 if (pszClassNameW
!= NULL
)
1591 MyFree(pszClassNameW
);
1597 /***********************************************************************
1598 * CM_Open_Class_Key_ExW [SETUPAPI.@]
1600 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
1601 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
1602 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
1605 WCHAR szKeyName
[MAX_PATH
];
1606 LPWSTR lpGuidString
;
1607 DWORD dwDisposition
;
1611 TRACE("%p %s %lx %lx %p %lx %lx\n",
1612 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
1613 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
1615 /* Check Disposition and ulFlags */
1616 if ((Disposition
& ~RegDisposition_Bits
) ||
1617 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
1618 return CR_INVALID_FLAG
;
1620 /* Check phkClass */
1621 if (phkClass
== NULL
)
1622 return CR_INVALID_POINTER
;
1626 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
1627 pszClassName
!= NULL
)
1628 return CR_INVALID_DATA
;
1630 if (hMachine
== NULL
)
1632 hKey
= HKEY_LOCAL_MACHINE
;
1636 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
1637 HKEY_LOCAL_MACHINE
, &hKey
))
1638 return CR_REGISTRY_ERROR
;
1641 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
1643 lstrcpyW(szKeyName
, DeviceClasses
);
1647 lstrcpyW(szKeyName
, ControlClass
);
1650 if (pClassGuid
!= NULL
)
1652 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
1655 return CR_INVALID_DATA
;
1658 lstrcatW(szKeyName
, Backslash
);
1659 lstrcatW(szKeyName
, lpGuidString
);
1662 if (Disposition
== RegDisposition_OpenAlways
)
1664 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
1665 NULL
, phkClass
, &dwDisposition
);
1669 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
1674 if (pClassGuid
!= NULL
)
1675 RpcStringFreeW(&lpGuidString
);
1677 if (dwError
!= ERROR_SUCCESS
)
1680 return CR_NO_SUCH_REGISTRY_KEY
;
1683 if (pszClassName
!= NULL
)
1685 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
1686 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
1693 /***********************************************************************
1694 * CM_Set_DevNode_Problem [SETUPAPI.@]
1696 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
1697 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
1699 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
1700 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
1704 /***********************************************************************
1705 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
1707 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
1708 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
1710 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1711 HSTRING_TABLE StringTable
= NULL
;
1714 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
1717 return CR_INVALID_DEVNODE
;
1719 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
1720 return CR_INVALID_FLAG
;
1722 if (hMachine
!= NULL
)
1724 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1725 if (BindingHandle
== NULL
)
1728 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1729 if (StringTable
== 0)
1734 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1738 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1739 if (lpDevInst
== NULL
)
1740 return CR_INVALID_DEVNODE
;
1742 return PNP_SetDeviceProblem(BindingHandle
,
1749 /***********************************************************************
1750 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
1752 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
1753 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1756 TRACE("%lx %lu %p %lx %lx\n",
1757 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
1758 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1764 /***********************************************************************
1765 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
1767 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
1768 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1771 TRACE("%lx %lu %p %lx %lx\n",
1772 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
1773 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1779 /***********************************************************************
1780 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
1782 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
1783 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1784 ULONG ulFlags
, HMACHINE hMachine
)
1786 CONFIGRET ret
= CR_SUCCESS
;
1790 FIXME("%lx %lu %p %lx %lx %lx\n",
1791 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
1793 if (Buffer
== NULL
&& ulLength
!= 0)
1794 return CR_INVALID_POINTER
;
1798 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
1807 /* Get property type */
1810 case CM_DRP_DEVICEDESC
:
1814 case CM_DRP_HARDWAREID
:
1815 ulType
= REG_MULTI_SZ
;
1818 case CM_DRP_COMPATIBLEIDS
:
1819 ulType
= REG_MULTI_SZ
;
1822 case CM_DRP_SERVICE
:
1830 case CM_DRP_CLASSGUID
:
1838 case CM_DRP_CONFIGFLAGS
:
1846 case CM_DRP_FRIENDLYNAME
:
1850 case CM_DRP_LOCATION_INFORMATION
:
1854 case CM_DRP_UPPERFILTERS
:
1855 ulType
= REG_MULTI_SZ
;
1858 case CM_DRP_LOWERFILTERS
:
1859 ulType
= REG_MULTI_SZ
;
1863 return CR_INVALID_PROPERTY
;
1866 /* Allocate buffer if needed */
1867 if (ulType
== REG_SZ
||
1868 ulType
== REG_MULTI_SZ
)
1870 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
1871 if (lpBuffer
== NULL
)
1873 ret
= CR_OUT_OF_MEMORY
;
1877 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
1878 ulLength
, lpBuffer
, ulLength
))
1885 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
1888 ulLength
* sizeof(WCHAR
),
1897 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
1905 ret
= CR_CALL_NOT_IMPLEMENTED
;
1912 /***********************************************************************
1913 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
1915 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
1916 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
1917 ULONG ulFlags
, HMACHINE hMachine
)
1919 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1920 HSTRING_TABLE StringTable
= NULL
;
1924 TRACE("%lx %lu %p %lx %lx %lx\n",
1925 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
1928 return CR_INVALID_DEVNODE
;
1930 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
1931 return CR_INVALID_PROPERTY
;
1933 if (Buffer
!= NULL
&& ulLength
== 0)
1934 return CR_INVALID_POINTER
;
1937 return CR_INVALID_FLAG
;
1939 if (hMachine
!= NULL
)
1941 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1942 if (BindingHandle
== NULL
)
1945 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1946 if (StringTable
== 0)
1951 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1955 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1956 if (lpDevInst
== NULL
)
1957 return CR_INVALID_DEVNODE
;
1961 case CM_DRP_DEVICEDESC
:
1965 case CM_DRP_HARDWAREID
:
1966 ulType
= REG_MULTI_SZ
;
1969 case CM_DRP_COMPATIBLEIDS
:
1970 ulType
= REG_MULTI_SZ
;
1973 case CM_DRP_SERVICE
:
1981 case CM_DRP_CLASSGUID
:
1989 case CM_DRP_CONFIGFLAGS
:
1997 case CM_DRP_FRIENDLYNAME
:
2001 case CM_DRP_LOCATION_INFORMATION
:
2005 case CM_DRP_UPPERFILTERS
:
2006 ulType
= REG_MULTI_SZ
;
2009 case CM_DRP_LOWERFILTERS
:
2010 ulType
= REG_MULTI_SZ
;
2014 return CR_INVALID_PROPERTY
;
2017 return PNP_SetDeviceRegProp(BindingHandle
,