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
[SP_MAX_MACHINENAME_LENGTH
];
43 RPC_BINDING_HANDLE BindingHandle
;
44 HSTRING_TABLE StringTable
;
46 } MACHINE_INFO
, *PMACHINE_INFO
;
49 typedef struct _LOG_CONF_INFO
55 } LOG_CONF_INFO
, *PLOG_CONF_INFO
;
57 #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */
60 static BOOL
GuidToString(LPGUID Guid
, LPWSTR String
)
64 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
67 lstrcpyW(&String
[1], lpString
);
70 String
[MAX_GUID_STRING_LEN
- 2] = '}';
71 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
73 RpcStringFreeW(&lpString
);
80 RpcStatusToCmStatus(RPC_STATUS Status
)
86 /***********************************************************************
87 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
89 DWORD WINAPI
CMP_WaitNoPendingInstallEvents(
95 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
99 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
105 /***********************************************************************
106 * CMP_Init_Detection [SETUPAPI.@]
108 CONFIGRET WINAPI
CMP_Init_Detection(
111 RPC_BINDING_HANDLE BindingHandle
= NULL
;
114 TRACE("%lu\n", dwMagic
);
116 if (dwMagic
!= CMP_MAGIC
)
117 return CR_INVALID_DATA
;
119 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
124 ret
= PNP_InitDetection(BindingHandle
);
126 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
128 ret
= RpcStatusToCmStatus(RpcExceptionCode());
136 /***********************************************************************
137 * CMP_Report_LogOn [SETUPAPI.@]
139 CONFIGRET WINAPI
CMP_Report_LogOn(
143 RPC_BINDING_HANDLE BindingHandle
= NULL
;
144 CONFIGRET ret
= CR_SUCCESS
;
148 TRACE("%lu\n", dwMagic
);
150 if (dwMagic
!= CMP_MAGIC
)
151 return CR_INVALID_DATA
;
153 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
156 bAdmin
= IsUserAdmin();
158 for (i
= 0; i
< 30; i
++)
162 ret
= PNP_ReportLogOn(BindingHandle
,
166 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
168 ret
= RpcStatusToCmStatus(RpcExceptionCode());
172 if (ret
== CR_SUCCESS
)
182 /***********************************************************************
183 * CMP_WaitServicesAvailable [SETUPAPI.@]
187 CMP_WaitServicesAvailable(HMACHINE hMachine
)
189 RPC_BINDING_HANDLE BindingHandle
= NULL
;
190 CONFIGRET ret
= CR_SUCCESS
;
193 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
198 ret
= PNP_GetVersion(BindingHandle
, &Version
);
200 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
202 ret
= RpcStatusToCmStatus(RpcExceptionCode());
210 /***********************************************************************
211 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
213 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf(
214 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
217 TRACE("%p %p %lu %lx\n", plcLogConf
, dnDevInst
, Priority
, ulFlags
);
218 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
223 /***********************************************************************
224 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
226 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf_Ex(
227 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
228 ULONG ulFlags
, HMACHINE hMachine
)
230 RPC_BINDING_HANDLE BindingHandle
= NULL
;
231 HSTRING_TABLE StringTable
= NULL
;
232 ULONG ulLogConfTag
= 0;
234 PLOG_CONF_INFO pLogConfInfo
;
235 CONFIGRET ret
= CR_SUCCESS
;
237 FIXME("%p %p %lu %lx %p\n",
238 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
241 return CR_ACCESS_DENIED
;
243 if (plcLogConf
== NULL
)
244 return CR_INVALID_POINTER
;
247 return CR_INVALID_DEVINST
;
249 if (Priority
> 0xFFFF)
250 return CR_INVALID_PRIORITY
;
252 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
253 return CR_INVALID_FLAG
;
255 if (hMachine
!= NULL
)
257 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
258 if (BindingHandle
== NULL
)
261 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
262 if (StringTable
== 0)
267 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
271 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
272 if (lpDevInst
== NULL
)
273 return CR_INVALID_DEVNODE
;
277 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
278 &ulLogConfTag
, ulFlags
);
280 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
282 ret
= RpcStatusToCmStatus(RpcExceptionCode());
286 if (ret
== CR_SUCCESS
)
288 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
289 if (pLogConfInfo
== NULL
)
291 ret
= CR_OUT_OF_MEMORY
;
295 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
296 pLogConfInfo
->dnDevInst
= dnDevInst
;
297 pLogConfInfo
->ulFlags
= ulFlags
;
298 pLogConfInfo
->ulTag
= ulLogConfTag
;
300 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
310 /***********************************************************************
311 * CM_Add_IDA [SETUPAPI.@]
313 CONFIGRET WINAPI
CM_Add_IDA(
314 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
)
316 TRACE("%p %s %lx\n", dnDevInst
, pszID
, ulFlags
);
317 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
321 /***********************************************************************
322 * CM_Add_IDW [SETUPAPI.@]
324 CONFIGRET WINAPI
CM_Add_IDW(
325 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
)
327 TRACE("%p %s %lx\n", dnDevInst
, debugstr_w(pszID
), ulFlags
);
328 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
332 /***********************************************************************
333 * CM_Add_ID_ExA [SETUPAPI.@]
335 CONFIGRET WINAPI
CM_Add_ID_ExA(
336 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
341 TRACE("%p %s %lx %p\n", dnDevInst
, pszID
, ulFlags
, hMachine
);
343 if (CaptureAndConvertAnsiArg(pszID
, &pszIDW
))
344 return CR_INVALID_DATA
;
346 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
354 /***********************************************************************
355 * CM_Add_ID_ExW [SETUPAPI.@]
357 CONFIGRET WINAPI
CM_Add_ID_ExW(
358 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
360 RPC_BINDING_HANDLE BindingHandle
= NULL
;
361 HSTRING_TABLE StringTable
= NULL
;
365 TRACE("%p %s %lx %p\n", dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
368 return CR_ACCESS_DENIED
;
371 return CR_INVALID_DEVINST
;
374 return CR_INVALID_POINTER
;
376 if (ulFlags
& ~CM_ADD_ID_BITS
)
377 return CR_INVALID_FLAG
;
379 if (hMachine
!= NULL
)
381 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
382 if (BindingHandle
== NULL
)
385 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
386 if (StringTable
== 0)
391 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
395 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
396 if (lpDevInst
== NULL
)
397 return CR_INVALID_DEVNODE
;
401 ret
= PNP_AddID(BindingHandle
,
406 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
408 ret
= RpcStatusToCmStatus(RpcExceptionCode());
416 /***********************************************************************
417 * CM_Connect_MachineA [SETUPAPI.@]
419 CONFIGRET WINAPI
CM_Connect_MachineA(
420 PCSTR UNCServerName
, PHMACHINE phMachine
)
425 TRACE("%s %p\n", UNCServerName
, phMachine
);
427 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
428 return CM_Connect_MachineW(NULL
, phMachine
);
430 if (CaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
431 return CR_INVALID_DATA
;
433 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
435 MyFree(pServerNameW
);
441 /***********************************************************************
442 * CM_Connect_MachineW [SETUPAPI.@]
444 CONFIGRET WINAPI
CM_Connect_MachineW(
445 PCWSTR UNCServerName
, PHMACHINE phMachine
)
447 PMACHINE_INFO pMachine
;
449 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
451 if (phMachine
== NULL
)
452 return CR_INVALID_POINTER
;
456 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
457 if (pMachine
== NULL
)
458 return CR_OUT_OF_MEMORY
;
460 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
462 pMachine
->bLocal
= TRUE
;
464 /* FIXME: store the computers name in pMachine->szMachineName */
466 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
467 &pMachine
->StringTable
))
469 HeapFree(GetProcessHeap(), 0, pMachine
);
475 pMachine
->bLocal
= FALSE
;
476 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
478 HeapFree(GetProcessHeap(), 0, pMachine
);
479 return CR_INVALID_MACHINENAME
;
481 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
483 pMachine
->StringTable
= StringTableInitialize();
484 if (pMachine
->StringTable
== NULL
)
486 HeapFree(GetProcessHeap(), 0, pMachine
);
490 StringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
492 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
494 StringTableDestroy(pMachine
->StringTable
);
495 HeapFree(GetProcessHeap(), 0, pMachine
);
496 return CR_INVALID_MACHINENAME
;
500 phMachine
= (PHMACHINE
)pMachine
;
506 /***********************************************************************
507 * CM_Create_DevNodeA [SETUPAPI.@]
509 CONFIGRET WINAPI
CM_Create_DevNodeA(
510 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
513 TRACE("%p %s %p %lx\n",
514 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
515 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
520 /***********************************************************************
521 * CM_Create_DevNodeW [SETUPAPI.@]
523 CONFIGRET WINAPI
CM_Create_DevNodeW(
524 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
527 TRACE("%p %s %p %lx\n",
528 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
529 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
534 /***********************************************************************
535 * CM_Create_DevNode_ExA [SETUPAPI.@]
537 CONFIGRET WINAPI
CM_Create_DevNode_ExA(
538 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
539 ULONG ulFlags
, HANDLE hMachine
)
541 DEVINSTID_W pDeviceIDW
;
544 TRACE("%p %s %p %lx %p\n",
545 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
547 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
548 return CR_INVALID_DATA
;
550 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
559 /***********************************************************************
560 * CM_Create_DevNode_ExW [SETUPAPI.@]
562 CONFIGRET WINAPI
CM_Create_DevNode_ExW(
563 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
564 ULONG ulFlags
, HANDLE hMachine
)
566 RPC_BINDING_HANDLE BindingHandle
= NULL
;
567 HSTRING_TABLE StringTable
= NULL
;
568 LPWSTR lpParentDevInst
;
569 CONFIGRET ret
= CR_SUCCESS
;
571 FIXME("%p %s %p %lx %p\n",
572 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
575 return CR_ACCESS_DENIED
;
577 if (pdnDevInst
== NULL
)
578 return CR_INVALID_POINTER
;
580 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0)
581 return CR_INVALID_DEVICE_ID
;
584 return CR_INVALID_DEVNODE
;
586 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
587 return CR_INVALID_FLAG
;
589 if (hMachine
!= NULL
)
591 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
592 if (BindingHandle
== NULL
)
595 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
596 if (StringTable
== 0)
601 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
605 lpParentDevInst
= StringTableStringFromId(StringTable
, dnParent
);
606 if (lpParentDevInst
== NULL
)
607 return CR_INVALID_DEVNODE
;
611 ret
= PNP_CreateDevInst(BindingHandle
,
617 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
619 ret
= RpcStatusToCmStatus(RpcExceptionCode());
623 if (ret
== CR_SUCCESS
)
625 *pdnDevInst
= StringTableAddString(StringTable
, pDeviceID
, 1);
626 if (*pdnDevInst
== 0)
627 ret
= CR_NO_SUCH_DEVNODE
;
634 /***********************************************************************
635 * CM_Delete_Class_Key [SETUPAPI.@]
637 CONFIGRET WINAPI
CM_Delete_Class_Key(
638 LPGUID ClassGuid
, ULONG ulFlags
)
640 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
641 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
645 /***********************************************************************
646 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
648 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
649 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
651 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
652 RPC_BINDING_HANDLE BindingHandle
= NULL
;
655 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
657 if (ClassGuid
== NULL
)
658 return CR_INVALID_POINTER
;
660 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
661 return CR_INVALID_FLAG
;
663 if (!GuidToString(ClassGuid
, szGuidString
))
664 return CR_INVALID_DATA
;
666 if (hMachine
!= NULL
)
668 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
669 if (BindingHandle
== NULL
)
674 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
680 ret
= PNP_DeleteClassKey(BindingHandle
,
684 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
686 ret
= RpcStatusToCmStatus(RpcExceptionCode());
694 /***********************************************************************
695 * CM_Delete_DevNode_Key [SETUPAPI.@]
697 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
698 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
700 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
701 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
706 /***********************************************************************
707 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
709 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
710 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
713 FIXME("%p %lu %lx %p\n",
714 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
716 return CR_CALL_NOT_IMPLEMENTED
;
720 /***********************************************************************
721 * CM_Disable_DevNode [SETUPAPI.@]
723 CONFIGRET WINAPI
CM_Disable_DevNode(
724 DEVINST dnDevInst
, ULONG ulFlags
)
726 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
727 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
731 /***********************************************************************
732 * CM_Disable_DevNode_Ex [SETUPAPI.@]
734 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
735 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
737 RPC_BINDING_HANDLE BindingHandle
= NULL
;
738 HSTRING_TABLE StringTable
= NULL
;
742 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
745 return CR_ACCESS_DENIED
;
748 return CR_INVALID_DEVINST
;
751 return CR_INVALID_FLAG
;
753 if (hMachine
!= NULL
)
755 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
756 if (BindingHandle
== NULL
)
759 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
760 if (StringTable
== 0)
765 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
769 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
770 if (lpDevInst
== NULL
)
771 return CR_INVALID_DEVNODE
;
775 ret
= PNP_DeviceInstanceAction(BindingHandle
,
781 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
783 ret
= RpcStatusToCmStatus(RpcExceptionCode());
791 /***********************************************************************
792 * CM_Disconnect_Machine [SETUPAPI.@]
794 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
796 PMACHINE_INFO pMachine
;
798 TRACE("%lx\n", hMachine
);
800 pMachine
= (PMACHINE_INFO
)hMachine
;
801 if (pMachine
== NULL
)
804 if (pMachine
->bLocal
== FALSE
)
806 if (pMachine
->StringTable
!= NULL
)
807 StringTableDestroy(pMachine
->StringTable
);
809 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
810 return CR_ACCESS_DENIED
;
813 HeapFree(GetProcessHeap(), 0, pMachine
);
819 /***********************************************************************
820 * CM_Enable_DevNode [SETUPAPI.@]
822 CONFIGRET WINAPI
CM_Enable_DevNode(
823 DEVINST dnDevInst
, ULONG ulFlags
)
825 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
826 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
830 /***********************************************************************
831 * CM_Enable_DevNode_Ex [SETUPAPI.@]
833 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
834 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
836 RPC_BINDING_HANDLE BindingHandle
= NULL
;
837 HSTRING_TABLE StringTable
= NULL
;
841 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
844 return CR_ACCESS_DENIED
;
847 return CR_INVALID_DEVINST
;
850 return CR_INVALID_FLAG
;
852 if (hMachine
!= NULL
)
854 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
855 if (BindingHandle
== NULL
)
858 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
859 if (StringTable
== 0)
864 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
868 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
869 if (lpDevInst
== NULL
)
870 return CR_INVALID_DEVNODE
;
874 ret
= PNP_DeviceInstanceAction(BindingHandle
,
880 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
882 ret
= RpcStatusToCmStatus(RpcExceptionCode());
890 /***********************************************************************
891 * CM_Enumerate_Classes [SETUPAPI.@]
893 CONFIGRET WINAPI
CM_Enumerate_Classes(
894 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
896 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
897 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
901 /***********************************************************************
902 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
904 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
905 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
907 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
908 RPC_BINDING_HANDLE BindingHandle
= NULL
;
909 CONFIGRET ret
= CR_SUCCESS
;
910 ULONG ulLength
= MAX_GUID_STRING_LEN
;
912 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
914 if (ClassGuid
== NULL
)
915 return CR_INVALID_POINTER
;
918 return CR_INVALID_FLAG
;
920 if (hMachine
!= NULL
)
922 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
923 if (BindingHandle
== NULL
)
928 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
934 ret
= PNP_EnumerateSubKeys(BindingHandle
,
942 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
944 ret
= RpcStatusToCmStatus(RpcExceptionCode());
948 if (ret
== CR_SUCCESS
)
951 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
953 /* Convert the buffer to a GUID */
954 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
962 /***********************************************************************
963 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
965 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
966 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
968 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
969 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
974 /***********************************************************************
975 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
977 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
978 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
980 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
981 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
986 /***********************************************************************
987 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
989 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
990 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
993 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
996 CONFIGRET ret
= CR_SUCCESS
;
998 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1001 if (Buffer
== NULL
|| pulLength
== NULL
)
1002 return CR_INVALID_POINTER
;
1005 return CR_INVALID_FLAG
;
1007 ulOrigLength
= *pulLength
;
1010 ulLength
= MAX_DEVICE_ID_LEN
;
1011 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1013 if (ret
== CR_SUCCESS
)
1015 if (WideCharToMultiByte(CP_ACP
,
1025 *pulLength
= lstrlenA(Buffer
) + 1;
1032 /***********************************************************************
1033 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1035 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1036 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1039 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1042 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1045 if (Buffer
== NULL
|| pulLength
== NULL
)
1046 return CR_INVALID_POINTER
;
1049 return CR_INVALID_FLAG
;
1051 *Buffer
= UNICODE_NULL
;
1053 if (hMachine
!= NULL
)
1055 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1056 if (BindingHandle
== NULL
)
1061 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1067 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1068 PNP_ENUMERATOR_SUBKEYS
,
1075 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1077 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1085 /***********************************************************************
1086 * CM_Free_Log_Conf [SETUPAPI.@]
1088 CONFIGRET WINAPI
CM_Free_Log_Conf(
1089 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1091 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1092 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1096 /***********************************************************************
1097 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1099 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1100 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1102 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1103 HSTRING_TABLE StringTable
= NULL
;
1105 PLOG_CONF_INFO pLogConfInfo
;
1108 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1111 return CR_ACCESS_DENIED
;
1113 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1114 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1115 return CR_INVALID_LOG_CONF
;
1118 return CR_INVALID_FLAG
;
1120 if (hMachine
!= NULL
)
1122 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1123 if (BindingHandle
== NULL
)
1126 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1127 if (StringTable
== 0)
1132 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1136 lpDevInst
= StringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1137 if (lpDevInst
== NULL
)
1138 return CR_INVALID_DEVNODE
;
1142 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1143 pLogConfInfo
->ulTag
, 0);
1145 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1147 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1155 /***********************************************************************
1156 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1158 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1161 PLOG_CONF_INFO pLogConfInfo
;
1163 TRACE("%lx\n", lcLogConf
);
1165 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1166 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1167 return CR_INVALID_LOG_CONF
;
1169 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1175 /***********************************************************************
1176 * CM_Get_Child [SETUPAPI.@]
1178 CONFIGRET WINAPI
CM_Get_Child(
1179 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1181 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1182 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1186 /***********************************************************************
1187 * CM_Get_Child_Ex [SETUPAPI.@]
1189 CONFIGRET WINAPI
CM_Get_Child_Ex(
1190 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1192 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1193 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1194 HSTRING_TABLE StringTable
= NULL
;
1196 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1199 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1201 if (pdnDevInst
== NULL
)
1202 return CR_INVALID_POINTER
;
1205 return CR_INVALID_DEVINST
;
1208 return CR_INVALID_FLAG
;
1212 if (hMachine
!= NULL
)
1214 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1215 if (BindingHandle
== NULL
)
1218 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1219 if (StringTable
== 0)
1224 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1228 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1229 if (lpDevInst
== NULL
)
1230 return CR_INVALID_DEVNODE
;
1234 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1235 PNP_GET_CHILD_DEVICE_INSTANCE
,
1241 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1243 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1247 if (ret
!= CR_SUCCESS
)
1250 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1252 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
1256 *pdnDevInst
= dwIndex
;
1262 /***********************************************************************
1263 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1265 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1266 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1268 TRACE("%p %p %p %lx\n",
1269 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1270 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1275 /***********************************************************************
1276 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1278 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1279 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1281 TRACE("%p %p %p %lx\n",
1282 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1283 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1288 /***********************************************************************
1289 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1291 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1292 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1295 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1296 CONFIGRET ret
= CR_SUCCESS
;
1300 TRACE("%p %p %p %lx %lx\n",
1301 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1303 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1304 return CR_INVALID_POINTER
;
1306 ulOrigLength
= *pulLength
;
1309 ulLength
= MAX_GUID_STRING_LEN
;
1310 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1312 if (ret
== CR_SUCCESS
)
1314 if (WideCharToMultiByte(CP_ACP
,
1324 *pulLength
= lstrlenA(pszKeyName
) + 1;
1331 /***********************************************************************
1332 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
1334 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
1335 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1338 TRACE("%p %p %p %lx %lx\n",
1339 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1341 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1342 return CR_INVALID_POINTER
;
1345 return CR_INVALID_FLAG
;
1347 if (*pulLength
< MAX_GUID_STRING_LEN
)
1350 return CR_BUFFER_SMALL
;
1353 if (!GuidToString(ClassGuid
, pszKeyName
))
1354 return CR_INVALID_DATA
;
1356 *pulLength
= MAX_GUID_STRING_LEN
;
1362 /***********************************************************************
1363 * CM_Get_Class_NameA [SETUPAPI.@]
1365 CONFIGRET WINAPI
CM_Get_Class_NameA(
1366 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1368 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1369 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1374 /***********************************************************************
1375 * CM_Get_Class_NameW [SETUPAPI.@]
1377 CONFIGRET WINAPI
CM_Get_Class_NameW(
1378 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1380 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
1381 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
1386 /***********************************************************************
1387 * CM_Get_Class_Name_ExA [SETUPAPI.@]
1389 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
1390 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1393 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
1394 CONFIGRET ret
= CR_SUCCESS
;
1398 TRACE("%p %p %p %lx %lx\n",
1399 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1401 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1402 return CR_INVALID_POINTER
;
1404 ulOrigLength
= *pulLength
;
1407 ulLength
= MAX_CLASS_NAME_LEN
;
1408 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1410 if (ret
== CR_SUCCESS
)
1412 if (WideCharToMultiByte(CP_ACP
,
1422 *pulLength
= lstrlenA(Buffer
) + 1;
1429 /***********************************************************************
1430 * CM_Get_Class_Name_ExW [SETUPAPI.@]
1433 CM_Get_Class_Name_ExW(
1434 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1437 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1438 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1441 TRACE("%p %p %p %lx %lx\n",
1442 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
1444 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
1445 return CR_INVALID_POINTER
;
1448 return CR_INVALID_FLAG
;
1450 if (!GuidToString(ClassGuid
, szGuidString
))
1451 return CR_INVALID_DATA
;
1453 TRACE("Guid %s\n", debugstr_w(szGuidString
));
1455 if (hMachine
!= NULL
)
1457 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1458 if (BindingHandle
== NULL
)
1463 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1469 ret
= PNP_GetClassName(BindingHandle
,
1475 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1477 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1485 /***********************************************************************
1486 * CM_Get_Depth [SETUPAPI.@]
1488 CONFIGRET WINAPI
CM_Get_Depth(
1489 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
1491 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
1492 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
1496 /***********************************************************************
1497 * CM_Get_Depth_Ex [SETUPAPI.@]
1499 CONFIGRET WINAPI
CM_Get_Depth_Ex(
1500 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1502 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1503 HSTRING_TABLE StringTable
= NULL
;
1507 TRACE("%p %lx %lx %lx\n",
1508 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
1510 if (pulDepth
== NULL
)
1511 return CR_INVALID_POINTER
;
1514 return CR_INVALID_DEVINST
;
1517 return CR_INVALID_FLAG
;
1519 if (hMachine
!= NULL
)
1521 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1522 if (BindingHandle
== NULL
)
1525 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1526 if (StringTable
== 0)
1531 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1535 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1536 if (lpDevInst
== NULL
)
1537 return CR_INVALID_DEVNODE
;
1541 ret
= PNP_GetDepth(BindingHandle
,
1546 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1548 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1556 /***********************************************************************
1557 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
1559 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
1560 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1561 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1563 TRACE("%lx %lu %p %p %p %lx\n",
1564 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1566 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
1567 pulRegDataType
, Buffer
,
1568 pulLength
, ulFlags
, NULL
);
1572 /***********************************************************************
1573 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
1575 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
1576 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1577 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
1579 TRACE("%lx %lu %p %p %p %lx\n",
1580 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
1582 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
1583 pulRegDataType
, Buffer
,
1584 pulLength
, ulFlags
, NULL
);
1588 /***********************************************************************
1589 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
1591 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
1592 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1593 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1597 ULONG RegDataType
= REG_NONE
;
1600 TRACE("%lx %lu %p %p %p %lx %lx\n",
1601 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1605 return CR_INVALID_POINTER
;
1607 LengthW
= *pulLength
* sizeof(WCHAR
);
1608 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
1611 return CR_OUT_OF_MEMORY
;
1613 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
1621 if (ret
== CR_SUCCESS
)
1623 if (RegDataType
== REG_SZ
|| RegDataType
== REG_EXPAND_SZ
)
1625 /* Do W->A conversion */
1626 *pulLength
= WideCharToMultiByte(CP_ACP
,
1629 lstrlenW(BufferW
) + 1,
1634 if (*pulLength
== 0)
1639 /* Directly copy the value */
1640 if (LengthW
<= *pulLength
)
1641 memcpy(Buffer
, BufferW
, LengthW
);
1644 *pulLength
= LengthW
;
1645 ret
= CR_BUFFER_SMALL
;
1651 *pulRegDataType
= RegDataType
;
1653 HeapFree(GetProcessHeap(), 0, BufferW
);
1659 /***********************************************************************
1660 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
1662 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
1663 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
1664 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
1666 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1667 HSTRING_TABLE StringTable
= NULL
;
1668 CONFIGRET ret
= CR_SUCCESS
;
1670 ULONG ulDataType
= 0;
1671 ULONG ulTransferLength
= 0;
1673 TRACE("%lx %lu %p %p %p %lx %lx\n",
1674 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
1678 return CR_INVALID_DEVNODE
;
1680 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
1681 return CR_INVALID_PROPERTY
;
1683 /* pulRegDataType is optional */
1685 /* Buffer is optional */
1687 if (pulLength
== NULL
)
1688 return CR_INVALID_POINTER
;
1690 if (*pulLength
== 0)
1691 return CR_INVALID_POINTER
;
1694 return CR_INVALID_FLAG
;
1696 if (hMachine
!= NULL
)
1698 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1699 if (BindingHandle
== NULL
)
1702 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1703 if (StringTable
== 0)
1708 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1712 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1713 if (lpDevInst
== NULL
)
1714 return CR_INVALID_DEVNODE
;
1716 ulTransferLength
= *pulLength
;
1720 ret
= PNP_GetDeviceRegProp(BindingHandle
,
1729 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1731 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1735 if (ret
== CR_SUCCESS
)
1737 if (pulRegDataType
!= NULL
)
1738 *pulRegDataType
= ulDataType
;
1745 /***********************************************************************
1746 * CM_Get_DevNode_Status [SETUPAPI.@]
1748 CONFIGRET WINAPI
CM_Get_DevNode_Status(
1749 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1752 TRACE("%p %p %lx %lx\n",
1753 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
1754 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
1759 /***********************************************************************
1760 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
1763 CM_Get_DevNode_Status_Ex(
1764 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
1765 ULONG ulFlags
, HMACHINE hMachine
)
1767 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1768 HSTRING_TABLE StringTable
= NULL
;
1772 TRACE("%p %p %lx %lx %lx\n",
1773 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
1775 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
1776 return CR_INVALID_POINTER
;
1779 return CR_INVALID_DEVINST
;
1782 return CR_INVALID_FLAG
;
1784 if (hMachine
!= NULL
)
1786 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1787 if (BindingHandle
== NULL
)
1790 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1791 if (StringTable
== 0)
1796 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1800 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
1801 if (lpDevInst
== NULL
)
1802 return CR_INVALID_DEVNODE
;
1806 ret
= PNP_GetDeviceStatus(BindingHandle
,
1812 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1814 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1822 /***********************************************************************
1823 * CM_Get_Device_IDA [SETUPAPI.@]
1825 CONFIGRET WINAPI
CM_Get_Device_IDA(
1826 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1828 TRACE("%lx %p %ld %ld\n",
1829 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1830 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1834 /***********************************************************************
1835 * CM_Get_Device_IDW [SETUPAPI.@]
1837 CONFIGRET WINAPI
CM_Get_Device_IDW(
1838 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1840 TRACE("%lx %p %ld %ld\n",
1841 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
1842 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
1846 /***********************************************************************
1847 * CM_Get_Device_ID_ExA [SETUPAPI.@]
1849 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
1850 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1853 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
1854 CONFIGRET ret
= CR_SUCCESS
;
1856 TRACE("%lx %p %ld %ld %lx\n",
1857 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1860 return CR_INVALID_POINTER
;
1862 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
1867 if (ret
== CR_SUCCESS
)
1869 if (WideCharToMultiByte(CP_ACP
,
1872 lstrlenW(szBufferW
) + 1,
1884 /***********************************************************************
1885 * CM_Get_Device_ID_ExW [SETUPAPI.@]
1887 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
1888 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1891 HSTRING_TABLE StringTable
= NULL
;
1893 TRACE("%lx %p %ld %ld %lx\n",
1894 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1897 return CR_INVALID_DEVINST
;
1900 return CR_INVALID_POINTER
;
1903 return CR_INVALID_FLAG
;
1905 if (hMachine
!= NULL
)
1907 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1908 if (StringTable
== NULL
)
1913 if (!PnpGetLocalHandles(NULL
, &StringTable
))
1917 if (!StringTableStringFromIdEx(StringTable
,
1927 /***********************************************************************
1928 * CM_Get_Device_ID_ListA [SETUPAPI.@]
1930 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
1931 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1933 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1934 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
1939 /***********************************************************************
1940 * CM_Get_Device_ID_ListW [SETUPAPI.@]
1942 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
1943 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
1945 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
1946 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
1951 /***********************************************************************
1952 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
1954 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
1955 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
1958 LPWSTR BufferW
= NULL
;
1959 LPWSTR pszFilterW
= NULL
;
1960 CONFIGRET ret
= CR_SUCCESS
;
1962 TRACE("%p %p %ld %ld %lx\n",
1963 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
1965 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
1966 if (BufferW
== NULL
)
1967 return CR_OUT_OF_MEMORY
;
1969 if (pszFilter
== NULL
)
1971 ret
= CM_Get_Device_ID_List_ExW(NULL
,
1979 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
1981 ret
= CR_INVALID_DEVICE_ID
;
1985 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
1994 if (WideCharToMultiByte(CP_ACP
,
1997 lstrlenW(BufferW
) + 1,
2011 /***********************************************************************
2012 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
2014 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
2015 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2018 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2021 TRACE("%p %p %ld %ld %lx\n",
2022 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2024 if (Buffer
== NULL
|| BufferLen
== 0)
2025 return CR_INVALID_POINTER
;
2027 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2028 return CR_INVALID_FLAG
;
2030 if (hMachine
!= NULL
)
2032 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2033 if (BindingHandle
== NULL
)
2038 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2046 ret
= PNP_GetDeviceList(BindingHandle
,
2052 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2054 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2062 /***********************************************************************
2063 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
2065 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
2066 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
2068 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
2069 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
2073 /***********************************************************************
2074 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
2076 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
2077 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
2079 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
2080 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
2084 /***********************************************************************
2085 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
2087 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
2088 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2090 LPWSTR pszFilterW
= NULL
;
2091 CONFIGRET ret
= CR_SUCCESS
;
2093 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
2095 if (pszFilter
== NULL
)
2097 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2104 if (CaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2105 return CR_INVALID_DEVICE_ID
;
2107 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
2119 /***********************************************************************
2120 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
2122 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
2123 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
2125 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2128 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
2131 return CR_INVALID_POINTER
;
2133 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
2134 return CR_INVALID_FLAG
;
2136 if (hMachine
!= NULL
)
2138 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2139 if (BindingHandle
== NULL
)
2144 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2152 ret
= PNP_GetDeviceListSize(BindingHandle
,
2157 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2159 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2167 /***********************************************************************
2168 * CM_Get_Device_ID_Size [SETUPAPI.@]
2170 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
2171 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
2173 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
2174 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
2178 /***********************************************************************
2179 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
2181 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
2182 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2184 HSTRING_TABLE StringTable
= NULL
;
2187 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
2190 return CR_INVALID_POINTER
;
2193 return CR_INVALID_DEVINST
;
2196 return CR_INVALID_FLAG
;
2198 if (hMachine
!= NULL
)
2200 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2201 if (StringTable
== NULL
)
2206 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2210 DeviceId
= StringTableStringFromId(StringTable
, dnDevInst
);
2211 if (DeviceId
== NULL
)
2217 *pulLen
= lstrlenW(DeviceId
);
2223 /***********************************************************************
2224 * CM_Get_First_Log_Conf [SETUPAPI.@]
2226 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
2227 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
2229 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
2230 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
2234 /***********************************************************************
2235 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
2237 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
2238 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2240 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2241 HSTRING_TABLE StringTable
= NULL
;
2242 LPWSTR lpDevInst
= NULL
;
2243 CONFIGRET ret
= CR_SUCCESS
;
2245 PLOG_CONF_INFO pLogConfInfo
;
2247 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
2250 return CR_INVALID_DEVINST
;
2252 if (ulFlags
& ~LOG_CONF_BITS
)
2253 return CR_INVALID_FLAG
;
2258 if (hMachine
!= NULL
)
2260 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2261 if (BindingHandle
== NULL
)
2264 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2265 if (StringTable
== 0)
2270 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2274 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2275 if (lpDevInst
== NULL
)
2276 return CR_INVALID_DEVNODE
;
2280 ret
= PNP_GetFirstLogConf(BindingHandle
,
2286 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2288 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2292 if (ret
!= CR_SUCCESS
)
2297 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
2298 if (pLogConfInfo
== NULL
)
2299 return CR_OUT_OF_MEMORY
;
2301 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
2302 pLogConfInfo
->dnDevInst
= dnDevInst
;
2303 pLogConfInfo
->ulFlags
= ulFlags
;
2304 pLogConfInfo
->ulTag
= ulTag
;
2306 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
2313 /***********************************************************************
2314 * CM_Get_Global_State [SETUPAPI.@]
2316 CONFIGRET WINAPI
CM_Get_Global_State(
2317 PULONG pulState
, ULONG ulFlags
)
2319 TRACE("%p %lx\n", pulState
, ulFlags
);
2320 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
2324 /***********************************************************************
2325 * CM_Get_Global_State_Ex [SETUPAPI.@]
2327 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
2328 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
2330 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2333 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
2335 if (pulState
== NULL
)
2336 return CR_INVALID_POINTER
;
2339 return CR_INVALID_FLAG
;
2341 if (hMachine
!= NULL
)
2343 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2344 if (BindingHandle
== NULL
)
2349 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2355 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
2357 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2359 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2367 /***********************************************************************
2368 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
2370 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
2371 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2374 TRACE("%s %lu %p %lx\n", szDevInstName
,
2375 ulHardwareProfile
, pulValue
, ulFlags
);
2377 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
2378 pulValue
, ulFlags
, NULL
);
2382 /***********************************************************************
2383 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
2385 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
2386 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2389 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
2390 ulHardwareProfile
, pulValue
, ulFlags
);
2392 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
2393 pulValue
, ulFlags
, NULL
);
2397 /***********************************************************************
2398 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
2400 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
2401 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2402 ULONG ulFlags
, HMACHINE hMachine
)
2404 DEVINSTID_W pszDevIdW
= NULL
;
2405 CONFIGRET ret
= CR_SUCCESS
;
2407 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
2408 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2410 if (szDevInstName
!= NULL
)
2412 if (CaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
2413 return CR_INVALID_DEVICE_ID
;
2416 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
2417 pulValue
, ulFlags
, hMachine
);
2419 if (pszDevIdW
!= NULL
)
2426 /***********************************************************************
2427 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
2429 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
2430 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
2431 ULONG ulFlags
, HMACHINE hMachine
)
2433 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2436 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
2437 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
2439 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
2440 return CR_INVALID_POINTER
;
2443 return CR_INVALID_FLAG
;
2445 /* FIXME: Check whether szDevInstName is valid */
2447 if (hMachine
!= NULL
)
2449 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2450 if (BindingHandle
== NULL
)
2455 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2461 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
2462 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
2464 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2466 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2474 /***********************************************************************
2475 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
2477 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
2478 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
2480 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
2481 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
2485 /***********************************************************************
2486 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
2488 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
2489 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
2492 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2493 HSTRING_TABLE StringTable
= NULL
;
2494 PLOG_CONF_INFO pLogConfInfo
;
2498 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
2500 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2501 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
2502 return CR_INVALID_LOG_CONF
;
2504 if (pPriority
== NULL
)
2505 return CR_INVALID_POINTER
;
2508 return CR_INVALID_FLAG
;
2510 if (hMachine
!= NULL
)
2512 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2513 if (BindingHandle
== NULL
)
2516 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2517 if (StringTable
== 0)
2522 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2526 lpDevInst
= StringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2527 if (lpDevInst
== NULL
)
2528 return CR_INVALID_DEVNODE
;
2532 ret
= PNP_GetLogConfPriority(BindingHandle
,
2534 pLogConfInfo
->ulFlags
,
2535 pLogConfInfo
->ulTag
,
2539 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2541 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2549 /***********************************************************************
2550 * CM_Get_Next_Log_Conf [SETUPAPI.@]
2552 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
2553 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
2555 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
2556 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
2560 /***********************************************************************
2561 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
2563 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
2564 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
2567 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2568 HSTRING_TABLE StringTable
= NULL
;
2569 PLOG_CONF_INFO pLogConfInfo
;
2570 PLOG_CONF_INFO pNewLogConfInfo
;
2575 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
2580 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2581 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
2582 return CR_INVALID_LOG_CONF
;
2585 return CR_INVALID_FLAG
;
2587 if (hMachine
!= NULL
)
2589 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2590 if (BindingHandle
== NULL
)
2593 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2594 if (StringTable
== 0)
2599 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2603 lpDevInst
= StringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2604 if (lpDevInst
== NULL
)
2605 return CR_INVALID_DEVNODE
;
2609 ret
= PNP_GetNextLogConf(BindingHandle
,
2611 pLogConfInfo
->ulFlags
,
2612 pLogConfInfo
->ulTag
,
2616 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2618 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2622 if (ret
!= CR_SUCCESS
)
2627 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
2628 if (pNewLogConfInfo
== NULL
)
2629 return CR_OUT_OF_MEMORY
;
2631 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
2632 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
2633 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
2634 pNewLogConfInfo
->ulTag
= ulNewTag
;
2636 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
2643 /***********************************************************************
2644 * CM_Get_Parent [SETUPAPI.@]
2646 CONFIGRET WINAPI
CM_Get_Parent(
2647 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
2649 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
2650 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2654 /***********************************************************************
2655 * CM_Get_Parent_Ex [SETUPAPI.@]
2657 CONFIGRET WINAPI
CM_Get_Parent_Ex(
2658 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2660 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2661 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2662 HSTRING_TABLE StringTable
= NULL
;
2664 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
2667 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2669 if (pdnDevInst
== NULL
)
2670 return CR_INVALID_POINTER
;
2673 return CR_INVALID_DEVINST
;
2676 return CR_INVALID_FLAG
;
2680 if (hMachine
!= NULL
)
2682 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2683 if (BindingHandle
== NULL
)
2686 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2687 if (StringTable
== 0)
2692 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2696 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2697 if (lpDevInst
== NULL
)
2698 return CR_INVALID_DEVNODE
;
2702 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2703 PNP_GET_PARENT_DEVICE_INSTANCE
,
2709 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2711 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2715 if (ret
!= CR_SUCCESS
)
2718 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2720 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
2724 *pdnDevInst
= dwIndex
;
2730 /***********************************************************************
2731 * CM_Get_Sibling [SETUPAPI.@]
2733 CONFIGRET WINAPI
CM_Get_Sibling(
2734 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
2736 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
2737 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2741 /***********************************************************************
2742 * CM_Get_Sibling_Ex [SETUPAPI.@]
2744 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
2745 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2747 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2748 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2749 HSTRING_TABLE StringTable
= NULL
;
2751 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
2754 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2756 if (pdnDevInst
== NULL
)
2757 return CR_INVALID_POINTER
;
2760 return CR_INVALID_DEVINST
;
2763 return CR_INVALID_FLAG
;
2767 if (hMachine
!= NULL
)
2769 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2770 if (BindingHandle
== NULL
)
2773 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2774 if (StringTable
== 0)
2779 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2783 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
2784 if (lpDevInst
== NULL
)
2785 return CR_INVALID_DEVNODE
;
2789 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2790 PNP_GET_SIBLING_DEVICE_INSTANCE
,
2796 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2798 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2802 if (ret
!= CR_SUCCESS
)
2805 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2807 dwIndex
= StringTableAddString(StringTable
, szRelatedDevInst
, 1);
2811 *pdnDevInst
= dwIndex
;
2817 /***********************************************************************
2818 * CM_Get_Version [SETUPAPI.@]
2820 WORD WINAPI
CM_Get_Version(VOID
)
2823 return CM_Get_Version_Ex(NULL
);
2827 /***********************************************************************
2828 * CM_Get_Version_Ex [SETUPAPI.@]
2830 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
2832 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2836 TRACE("%lx\n", hMachine
);
2838 if (hMachine
!= NULL
)
2840 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2841 if (BindingHandle
== NULL
)
2846 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2852 ret
= PNP_GetVersion(BindingHandle
, &Version
);
2854 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2856 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2860 if (ret
!= CR_SUCCESS
)
2867 /***********************************************************************
2868 * CM_Is_Dock_Station_Present [SETUPAPI.@]
2870 CONFIGRET WINAPI
CM_Is_Dock_Station_Present(
2873 TRACE("%p\n", pbPresent
);
2874 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
2878 /***********************************************************************
2879 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
2881 CONFIGRET WINAPI
CM_Is_Dock_Station_Present_Ex(
2882 PBOOL pbPresent
, HMACHINE hMachine
)
2884 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2887 TRACE("%p %lx\n", pbPresent
, hMachine
);
2889 if (pbPresent
== NULL
)
2890 return CR_INVALID_POINTER
;
2894 if (hMachine
!= NULL
)
2896 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2897 if (BindingHandle
== NULL
)
2902 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2908 ret
= PNP_IsDockStationPresent(BindingHandle
,
2911 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2913 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2921 /***********************************************************************
2922 * CM_Is_Version_Available_Ex [SETUPAPI.@]
2924 BOOL WINAPI
CM_Is_Version_Available(
2927 TRACE("%hu\n", wVersion
);
2928 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
2932 /***********************************************************************
2933 * CM_Is_Version_Available_Ex [SETUPAPI.@]
2935 BOOL WINAPI
CM_Is_Version_Available_Ex(
2936 WORD wVersion
, HMACHINE hMachine
)
2938 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2939 WORD wServerVersion
;
2942 TRACE("%hu %lx\n", wVersion
, hMachine
);
2944 if (wVersion
<= 0x400)
2947 if (hMachine
!= NULL
)
2949 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2950 if (BindingHandle
== NULL
)
2955 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2961 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
2963 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2965 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2969 if (ret
!= CR_SUCCESS
)
2972 return (wServerVersion
>= wVersion
);
2976 /***********************************************************************
2977 * CM_Locate_DevNodeA [SETUPAPI.@]
2979 CONFIGRET WINAPI
CM_Locate_DevNodeA(
2980 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
2982 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
2983 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
2987 /***********************************************************************
2988 * CM_Locate_DevNodeW [SETUPAPI.@]
2990 CONFIGRET WINAPI
CM_Locate_DevNodeW(
2991 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
2993 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
2994 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
2998 /***********************************************************************
2999 * CM_Locate_DevNode_ExA [SETUPAPI.@]
3001 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
3002 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3004 DEVINSTID_W pDevIdW
= NULL
;
3005 CONFIGRET ret
= CR_SUCCESS
;
3007 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
3009 if (pDeviceID
!= NULL
)
3011 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
3012 return CR_INVALID_DEVICE_ID
;
3015 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
3017 if (pDevIdW
!= NULL
)
3024 /***********************************************************************
3025 * CM_Locate_DevNode_ExW [SETUPAPI.@]
3027 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
3028 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
3030 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
3031 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3032 HSTRING_TABLE StringTable
= NULL
;
3033 CONFIGRET ret
= CR_SUCCESS
;
3035 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
3037 if (pdnDevInst
== NULL
)
3038 return CR_INVALID_POINTER
;
3040 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
3041 return CR_INVALID_FLAG
;
3043 if (hMachine
!= NULL
)
3045 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3046 if (BindingHandle
== NULL
)
3049 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3050 if (StringTable
== 0)
3055 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3059 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
3061 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
3067 /* Get the root device ID */
3068 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
3072 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3074 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3078 if (ret
!= CR_SUCCESS
)
3081 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
3085 /* Validate the device ID */
3086 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
3090 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3092 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3096 if (ret
== CR_SUCCESS
)
3098 *pdnDevInst
= StringTableAddString(StringTable
, DeviceIdBuffer
, 1);
3099 if (*pdnDevInst
== -1)
3107 /***********************************************************************
3108 * CM_Move_DevNode [SETUPAPI.@]
3110 CONFIGRET WINAPI
CM_Move_DevNode(
3111 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
3113 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
3114 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
3118 /***********************************************************************
3119 * CM_Move_DevNode_Ex [SETUPAPI.@]
3121 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
3122 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
3125 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3126 HSTRING_TABLE StringTable
= NULL
;
3127 LPWSTR lpFromDevInst
;
3131 FIXME("%lx %lx %lx %lx\n",
3132 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
3135 return CR_ACCESS_DENIED
;
3137 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
3138 return CR_INVALID_DEVNODE
;
3141 return CR_INVALID_FLAG
;
3143 if (hMachine
!= NULL
)
3145 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3146 if (BindingHandle
== NULL
)
3149 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3150 if (StringTable
== 0)
3155 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3159 lpFromDevInst
= StringTableStringFromId(StringTable
, dnFromDevInst
);
3160 if (lpFromDevInst
== NULL
)
3161 return CR_INVALID_DEVNODE
;
3163 lpToDevInst
= StringTableStringFromId(StringTable
, dnToDevInst
);
3164 if (lpToDevInst
== NULL
)
3165 return CR_INVALID_DEVNODE
;
3169 ret
= PNP_DeviceInstanceAction(BindingHandle
,
3175 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3177 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3185 /***********************************************************************
3186 * CM_Open_Class_KeyA [SETUPAPI.@]
3188 CONFIGRET WINAPI
CM_Open_Class_KeyA(
3189 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3190 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3192 TRACE("%p %s %lx %lx %p %lx\n",
3193 debugstr_guid(pClassGuid
), pszClassName
,
3194 samDesired
, Disposition
, phkClass
, ulFlags
);
3196 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
3197 Disposition
, phkClass
, ulFlags
, NULL
);
3201 /***********************************************************************
3202 * CM_Open_Class_KeyW [SETUPAPI.@]
3204 CONFIGRET WINAPI
CM_Open_Class_KeyW(
3205 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3206 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3208 TRACE("%p %s %lx %lx %p %lx\n",
3209 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3210 samDesired
, Disposition
, phkClass
, ulFlags
);
3212 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
3213 Disposition
, phkClass
, ulFlags
, NULL
);
3217 /***********************************************************************
3218 * CM_Open_Class_Key_ExA [SETUPAPI.@]
3220 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
3221 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3222 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3225 CONFIGRET rc
= CR_SUCCESS
;
3226 LPWSTR pszClassNameW
= NULL
;
3228 TRACE("%p %s %lx %lx %p %lx %lx\n",
3229 debugstr_guid(pClassGuid
), pszClassName
,
3230 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3232 if (pszClassName
!= NULL
)
3234 if (CaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
3235 return CR_INVALID_DATA
;
3238 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
3239 Disposition
, phkClass
, ulFlags
, hMachine
);
3241 if (pszClassNameW
!= NULL
)
3242 MyFree(pszClassNameW
);
3248 /***********************************************************************
3249 * CM_Open_Class_Key_ExW [SETUPAPI.@]
3251 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
3252 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3253 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3256 WCHAR szKeyName
[MAX_PATH
];
3257 LPWSTR lpGuidString
;
3258 DWORD dwDisposition
;
3262 TRACE("%p %s %lx %lx %p %lx %lx\n",
3263 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3264 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3266 /* Check Disposition and ulFlags */
3267 if ((Disposition
& ~RegDisposition_Bits
) ||
3268 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
3269 return CR_INVALID_FLAG
;
3271 /* Check phkClass */
3272 if (phkClass
== NULL
)
3273 return CR_INVALID_POINTER
;
3277 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
3278 pszClassName
!= NULL
)
3279 return CR_INVALID_DATA
;
3281 if (hMachine
== NULL
)
3283 hKey
= HKEY_LOCAL_MACHINE
;
3287 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
3288 HKEY_LOCAL_MACHINE
, &hKey
))
3289 return CR_REGISTRY_ERROR
;
3292 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
3294 lstrcpyW(szKeyName
, DeviceClasses
);
3298 lstrcpyW(szKeyName
, ControlClass
);
3301 if (pClassGuid
!= NULL
)
3303 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
3306 return CR_INVALID_DATA
;
3309 lstrcatW(szKeyName
, Backslash
);
3310 lstrcatW(szKeyName
, lpGuidString
);
3313 if (Disposition
== RegDisposition_OpenAlways
)
3315 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
3316 NULL
, phkClass
, &dwDisposition
);
3320 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
3325 if (pClassGuid
!= NULL
)
3326 RpcStringFreeW(&lpGuidString
);
3328 if (dwError
!= ERROR_SUCCESS
)
3331 return CR_NO_SUCH_REGISTRY_KEY
;
3334 if (pszClassName
!= NULL
)
3336 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
3337 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
3344 /***********************************************************************
3345 * CM_Open_DevNode_Key [SETUPAPI.@]
3347 CONFIGRET WINAPI
CM_Open_DevNode_Key(
3348 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
3349 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
3351 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
3352 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
3353 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
3354 Disposition
, phkDevice
, ulFlags
, NULL
);
3358 /***********************************************************************
3359 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
3361 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
3362 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
3363 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
3366 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
3367 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
3369 return CR_CALL_NOT_IMPLEMENTED
;
3373 /***********************************************************************
3374 * CM_Reenumerate_DevNode [SETUPAPI.@]
3376 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
3377 DEVINST dnDevInst
, ULONG ulFlags
)
3379 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
3380 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
3384 /***********************************************************************
3385 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]