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_Locate_DevNodeA [SETUPAPI.@]
2924 CONFIGRET WINAPI
CM_Locate_DevNodeA(
2925 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
)
2927 TRACE("%p %s %lu\n", pdnDevInst
, pDeviceID
, ulFlags
);
2928 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
2932 /***********************************************************************
2933 * CM_Locate_DevNodeW [SETUPAPI.@]
2935 CONFIGRET WINAPI
CM_Locate_DevNodeW(
2936 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
)
2938 TRACE("%p %s %lu\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
2939 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
2943 /***********************************************************************
2944 * CM_Locate_DevNode_ExA [SETUPAPI.@]
2946 CONFIGRET WINAPI
CM_Locate_DevNode_ExA(
2947 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
2949 DEVINSTID_W pDevIdW
= NULL
;
2950 CONFIGRET ret
= CR_SUCCESS
;
2952 TRACE("%p %s %lu %lx\n", pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
2954 if (pDeviceID
!= NULL
)
2956 if (CaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
2957 return CR_INVALID_DEVICE_ID
;
2960 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
2962 if (pDevIdW
!= NULL
)
2969 /***********************************************************************
2970 * CM_Locate_DevNode_ExW [SETUPAPI.@]
2972 CONFIGRET WINAPI
CM_Locate_DevNode_ExW(
2973 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, ULONG ulFlags
, HMACHINE hMachine
)
2975 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
2976 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2977 HSTRING_TABLE StringTable
= NULL
;
2978 CONFIGRET ret
= CR_SUCCESS
;
2980 TRACE("%p %s %lu %lx\n", pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
2982 if (pdnDevInst
== NULL
)
2983 return CR_INVALID_POINTER
;
2985 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
2986 return CR_INVALID_FLAG
;
2988 if (hMachine
!= NULL
)
2990 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2991 if (BindingHandle
== NULL
)
2994 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2995 if (StringTable
== 0)
3000 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3004 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
3006 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
3012 /* Get the root device ID */
3013 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
3017 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3019 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3023 if (ret
!= CR_SUCCESS
)
3026 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
3030 /* Validate the device ID */
3031 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
3035 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3037 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3041 if (ret
== CR_SUCCESS
)
3043 *pdnDevInst
= StringTableAddString(StringTable
, DeviceIdBuffer
, 1);
3044 if (*pdnDevInst
== -1)
3052 /***********************************************************************
3053 * CM_Move_DevNode [SETUPAPI.@]
3055 CONFIGRET WINAPI
CM_Move_DevNode(
3056 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
)
3058 TRACE("%lx %lx %lx\n", dnFromDevInst
, dnToDevInst
, ulFlags
);
3059 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
3063 /***********************************************************************
3064 * CM_Move_DevNode_Ex [SETUPAPI.@]
3066 CONFIGRET WINAPI
CM_Move_DevNode_Ex(
3067 DEVINST dnFromDevInst
, DEVINST dnToDevInst
, ULONG ulFlags
,
3070 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3071 HSTRING_TABLE StringTable
= NULL
;
3072 LPWSTR lpFromDevInst
;
3076 FIXME("%lx %lx %lx %lx\n",
3077 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
3080 return CR_ACCESS_DENIED
;
3082 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
3083 return CR_INVALID_DEVNODE
;
3086 return CR_INVALID_FLAG
;
3088 if (hMachine
!= NULL
)
3090 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3091 if (BindingHandle
== NULL
)
3094 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3095 if (StringTable
== 0)
3100 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3104 lpFromDevInst
= StringTableStringFromId(StringTable
, dnFromDevInst
);
3105 if (lpFromDevInst
== NULL
)
3106 return CR_INVALID_DEVNODE
;
3108 lpToDevInst
= StringTableStringFromId(StringTable
, dnToDevInst
);
3109 if (lpToDevInst
== NULL
)
3110 return CR_INVALID_DEVNODE
;
3114 ret
= PNP_DeviceInstanceAction(BindingHandle
,
3120 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3122 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3130 /***********************************************************************
3131 * CM_Open_Class_KeyA [SETUPAPI.@]
3133 CONFIGRET WINAPI
CM_Open_Class_KeyA(
3134 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3135 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3137 TRACE("%p %s %lx %lx %p %lx\n",
3138 debugstr_guid(pClassGuid
), pszClassName
,
3139 samDesired
, Disposition
, phkClass
, ulFlags
);
3141 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
3142 Disposition
, phkClass
, ulFlags
, NULL
);
3146 /***********************************************************************
3147 * CM_Open_Class_KeyW [SETUPAPI.@]
3149 CONFIGRET WINAPI
CM_Open_Class_KeyW(
3150 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3151 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
)
3153 TRACE("%p %s %lx %lx %p %lx\n",
3154 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3155 samDesired
, Disposition
, phkClass
, ulFlags
);
3157 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
3158 Disposition
, phkClass
, ulFlags
, NULL
);
3162 /***********************************************************************
3163 * CM_Open_Class_Key_ExA [SETUPAPI.@]
3165 CONFIGRET WINAPI
CM_Open_Class_Key_ExA(
3166 LPGUID pClassGuid
, LPCSTR pszClassName
, REGSAM samDesired
,
3167 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3170 CONFIGRET rc
= CR_SUCCESS
;
3171 LPWSTR pszClassNameW
= NULL
;
3173 TRACE("%p %s %lx %lx %p %lx %lx\n",
3174 debugstr_guid(pClassGuid
), pszClassName
,
3175 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3177 if (pszClassName
!= NULL
)
3179 if (CaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
3180 return CR_INVALID_DATA
;
3183 rc
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
3184 Disposition
, phkClass
, ulFlags
, hMachine
);
3186 if (pszClassNameW
!= NULL
)
3187 MyFree(pszClassNameW
);
3193 /***********************************************************************
3194 * CM_Open_Class_Key_ExW [SETUPAPI.@]
3196 CONFIGRET WINAPI
CM_Open_Class_Key_ExW(
3197 LPGUID pClassGuid
, LPCWSTR pszClassName
, REGSAM samDesired
,
3198 REGDISPOSITION Disposition
, PHKEY phkClass
, ULONG ulFlags
,
3201 WCHAR szKeyName
[MAX_PATH
];
3202 LPWSTR lpGuidString
;
3203 DWORD dwDisposition
;
3207 TRACE("%p %s %lx %lx %p %lx %lx\n",
3208 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
3209 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
3211 /* Check Disposition and ulFlags */
3212 if ((Disposition
& ~RegDisposition_Bits
) ||
3213 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
3214 return CR_INVALID_FLAG
;
3216 /* Check phkClass */
3217 if (phkClass
== NULL
)
3218 return CR_INVALID_POINTER
;
3222 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
3223 pszClassName
!= NULL
)
3224 return CR_INVALID_DATA
;
3226 if (hMachine
== NULL
)
3228 hKey
= HKEY_LOCAL_MACHINE
;
3232 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
3233 HKEY_LOCAL_MACHINE
, &hKey
))
3234 return CR_REGISTRY_ERROR
;
3237 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
3239 lstrcpyW(szKeyName
, DeviceClasses
);
3243 lstrcpyW(szKeyName
, ControlClass
);
3246 if (pClassGuid
!= NULL
)
3248 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
3251 return CR_INVALID_DATA
;
3254 lstrcatW(szKeyName
, Backslash
);
3255 lstrcatW(szKeyName
, lpGuidString
);
3258 if (Disposition
== RegDisposition_OpenAlways
)
3260 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
3261 NULL
, phkClass
, &dwDisposition
);
3265 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
3270 if (pClassGuid
!= NULL
)
3271 RpcStringFreeW(&lpGuidString
);
3273 if (dwError
!= ERROR_SUCCESS
)
3276 return CR_NO_SUCH_REGISTRY_KEY
;
3279 if (pszClassName
!= NULL
)
3281 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
3282 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
3289 /***********************************************************************
3290 * CM_Open_DevNode_Key [SETUPAPI.@]
3292 CONFIGRET WINAPI
CM_Open_DevNode_Key(
3293 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
3294 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
)
3296 TRACE("%lx %lx %lu %lx %p %lx\n", dnDevNode
, samDesired
,
3297 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
3298 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
3299 Disposition
, phkDevice
, ulFlags
, NULL
);
3303 /***********************************************************************
3304 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
3306 CONFIGRET WINAPI
CM_Open_DevNode_Key_Ex(
3307 DEVINST dnDevNode
, REGSAM samDesired
, ULONG ulHardwareProfile
,
3308 REGDISPOSITION Disposition
, PHKEY phkDevice
, ULONG ulFlags
,
3311 FIXME("%lx %lx %lu %lx %p %lx %lx\n", dnDevNode
, samDesired
,
3312 ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
3314 return CR_CALL_NOT_IMPLEMENTED
;
3318 /***********************************************************************
3319 * CM_Reenumerate_DevNode [SETUPAPI.@]
3321 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
3322 DEVINST dnDevInst
, ULONG ulFlags
)
3324 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
3325 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
3329 /***********************************************************************
3330 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
3333 CM_Reenumerate_DevNode_Ex(
3334 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3336 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3337 HSTRING_TABLE StringTable
= NULL
;
3341 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
3344 return CR_INVALID_DEVNODE
;
3346 if (ulFlags
& ~CM_REENUMERATE_BITS
)
3347 return CR_INVALID_FLAG
;
3349 if (hMachine
!= NULL
)
3351 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3352 if (BindingHandle
== NULL
)
3355 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3356 if (StringTable
== 0)
3361 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3365 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
3366 if (lpDevInst
== NULL
)
3367 return CR_INVALID_DEVNODE
;
3371 ret
= PNP_DeviceInstanceAction(BindingHandle
,
3372 PNP_DEVINST_REENUMERATE
,
3377 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3379 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3387 /***********************************************************************
3388 * CM_Request_Eject_PC [SETUPAPI.@]
3390 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
3393 return CM_Request_Eject_PC_Ex(NULL
);
3397 /***********************************************************************
3398 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
3400 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
3403 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3406 TRACE("%lx\n", hMachine
);
3408 if (hMachine
!= NULL
)
3410 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3411 if (BindingHandle
== NULL
)
3416 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3422 ret
= PNP_RequestEjectPC(BindingHandle
);
3424 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3426 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3434 /***********************************************************************
3435 * CM_Run_Detection [SETUPAPI.@]
3437 CONFIGRET WINAPI
CM_Run_Detection(
3440 TRACE("%lx\n", ulFlags
);
3441 return CM_Run_Detection_Ex(ulFlags
, NULL
);
3445 /***********************************************************************
3446 * CM_Run_Detection_Ex [SETUPAPI.@]
3448 CONFIGRET WINAPI
CM_Run_Detection_Ex(
3449 ULONG ulFlags
, HMACHINE hMachine
)
3451 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3454 TRACE("%lx %lx\n", ulFlags
, hMachine
);
3457 return CR_ACCESS_DENIED
;
3459 if (ulFlags
& ~CM_DETECT_BITS
)
3460 return CR_INVALID_FLAG
;
3462 if (hMachine
!= NULL
)
3464 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3465 if (BindingHandle
== NULL
)
3470 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3476 ret
= PNP_RunDetection(BindingHandle
,
3479 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3481 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3489 /***********************************************************************
3490 * CM_Set_DevNode_Problem [SETUPAPI.@]
3492 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
3493 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
3495 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
3496 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
3500 /***********************************************************************
3501 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
3503 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
3504 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
3506 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3507 HSTRING_TABLE StringTable
= NULL
;
3511 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
3514 return CR_INVALID_DEVNODE
;
3516 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
3517 return CR_INVALID_FLAG
;
3519 if (hMachine
!= NULL
)
3521 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3522 if (BindingHandle
== NULL
)
3525 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3526 if (StringTable
== 0)
3531 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3535 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
3536 if (lpDevInst
== NULL
)
3537 return CR_INVALID_DEVNODE
;
3541 ret
= PNP_SetDeviceProblem(BindingHandle
,
3546 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3548 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3556 /***********************************************************************
3557 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
3559 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
3560 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3563 TRACE("%lx %lu %p %lx %lx\n",
3564 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
3565 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
3571 /***********************************************************************
3572 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
3574 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
3575 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3578 TRACE("%lx %lu %p %lx %lx\n",
3579 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
3580 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
3586 /***********************************************************************
3587 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
3589 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
3590 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3591 ULONG ulFlags
, HMACHINE hMachine
)
3593 CONFIGRET ret
= CR_SUCCESS
;
3597 FIXME("%lx %lu %p %lx %lx %lx\n",
3598 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
3600 if (Buffer
== NULL
&& ulLength
!= 0)
3601 return CR_INVALID_POINTER
;
3605 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
3614 /* Get property type */
3617 case CM_DRP_DEVICEDESC
:
3621 case CM_DRP_HARDWAREID
:
3622 ulType
= REG_MULTI_SZ
;
3625 case CM_DRP_COMPATIBLEIDS
:
3626 ulType
= REG_MULTI_SZ
;
3629 case CM_DRP_SERVICE
:
3637 case CM_DRP_CLASSGUID
:
3645 case CM_DRP_CONFIGFLAGS
:
3653 case CM_DRP_FRIENDLYNAME
:
3657 case CM_DRP_LOCATION_INFORMATION
:
3661 case CM_DRP_UPPERFILTERS
:
3662 ulType
= REG_MULTI_SZ
;
3665 case CM_DRP_LOWERFILTERS
:
3666 ulType
= REG_MULTI_SZ
;
3670 return CR_INVALID_PROPERTY
;
3673 /* Allocate buffer if needed */
3674 if (ulType
== REG_SZ
||
3675 ulType
== REG_MULTI_SZ
)
3677 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
3678 if (lpBuffer
== NULL
)
3680 ret
= CR_OUT_OF_MEMORY
;
3684 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
3685 ulLength
, lpBuffer
, ulLength
))
3692 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
3695 ulLength
* sizeof(WCHAR
),
3704 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
3712 ret
= CR_CALL_NOT_IMPLEMENTED
;
3719 /***********************************************************************
3720 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
3722 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
3723 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
3724 ULONG ulFlags
, HMACHINE hMachine
)
3726 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3727 HSTRING_TABLE StringTable
= NULL
;
3732 TRACE("%lx %lu %p %lx %lx %lx\n",
3733 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
3736 return CR_INVALID_DEVNODE
;
3738 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
3739 return CR_INVALID_PROPERTY
;
3741 if (Buffer
!= NULL
&& ulLength
== 0)
3742 return CR_INVALID_POINTER
;
3745 return CR_INVALID_FLAG
;
3747 if (hMachine
!= NULL
)
3749 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3750 if (BindingHandle
== NULL
)
3753 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3754 if (StringTable
== 0)
3759 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3763 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
3764 if (lpDevInst
== NULL
)
3765 return CR_INVALID_DEVNODE
;
3769 case CM_DRP_DEVICEDESC
:
3773 case CM_DRP_HARDWAREID
:
3774 ulType
= REG_MULTI_SZ
;
3777 case CM_DRP_COMPATIBLEIDS
:
3778 ulType
= REG_MULTI_SZ
;
3781 case CM_DRP_SERVICE
:
3789 case CM_DRP_CLASSGUID
:
3797 case CM_DRP_CONFIGFLAGS
:
3805 case CM_DRP_FRIENDLYNAME
:
3809 case CM_DRP_LOCATION_INFORMATION
:
3813 case CM_DRP_UPPERFILTERS
:
3814 ulType
= REG_MULTI_SZ
;
3817 case CM_DRP_LOWERFILTERS
:
3818 ulType
= REG_MULTI_SZ
;
3822 return CR_INVALID_PROPERTY
;
3827 ret
= PNP_SetDeviceRegProp(BindingHandle
,
3835 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3837 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3845 /***********************************************************************
3846 * CM_Set_HW_Prof [SETUPAPI.@]
3848 CONFIGRET WINAPI
CM_Set_HW_Prof(
3849 ULONG ulHardwareProfile
, ULONG ulFlags
)
3851 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
3852 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
3856 /***********************************************************************
3857 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
3859 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
3860 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
3862 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3865 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
3868 return CR_ACCESS_DENIED
;
3871 return CR_INVALID_FLAG
;
3873 if (hMachine
!= NULL
)
3875 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3876 if (BindingHandle
== NULL
)
3881 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3887 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
3889 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3891 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3899 /***********************************************************************
3900 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
3902 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
3903 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3906 TRACE("%s %lu %lu %lx\n", szDevInstName
,
3907 ulConfig
, ulValue
, ulFlags
);
3908 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
3913 /***********************************************************************
3914 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
3916 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
3917 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3920 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
3921 ulConfig
, ulValue
, ulFlags
);
3922 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
3927 /***********************************************************************
3928 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
3930 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
3931 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3932 ULONG ulFlags
, HMACHINE hMachine
)
3934 DEVINSTID_W pszDevIdW
= NULL
;
3935 CONFIGRET ret
= CR_SUCCESS
;
3937 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
3938 ulConfig
, ulValue
, ulFlags
, hMachine
);
3940 if (szDevInstName
!= NULL
)
3942 if (CaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
3943 return CR_INVALID_DEVICE_ID
;
3946 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
3949 if (pszDevIdW
!= NULL
)
3956 /***********************************************************************
3957 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
3959 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
3960 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
3961 ULONG ulFlags
, HMACHINE hMachine
)
3963 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3966 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
3967 ulConfig
, ulValue
, ulFlags
, hMachine
);
3969 if (szDevInstName
== NULL
)
3970 return CR_INVALID_POINTER
;
3972 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
3973 return CR_INVALID_FLAG
;
3975 /* FIXME: Check whether szDevInstName is valid */
3977 if (hMachine
!= NULL
)
3979 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3980 if (BindingHandle
== NULL
)
3985 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3991 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
3992 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
3994 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3996 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4004 /***********************************************************************
4005 * CM_Setup_DevNode [SETUPAPI.@]
4007 CONFIGRET WINAPI
CM_Setup_DevNode(
4008 DEVINST dnDevInst
, ULONG ulFlags
)
4010 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
4011 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
4015 /***********************************************************************
4016 * CM_Setup_DevNode_Ex [SETUPAPI.@]
4018 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
4019 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4021 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4022 HSTRING_TABLE StringTable
= NULL
;
4026 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
4029 return CR_ACCESS_DENIED
;
4032 return CR_INVALID_DEVNODE
;
4034 if (ulFlags
& ~CM_SETUP_BITS
)
4035 return CR_INVALID_FLAG
;
4037 if (hMachine
!= NULL
)
4039 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4040 if (BindingHandle
== NULL
)
4043 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4044 if (StringTable
== 0)
4049 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4053 lpDevInst
= StringTableStringFromId(StringTable
, dnDevInst
);
4054 if (lpDevInst
== NULL
)
4055 return CR_INVALID_DEVNODE
;
4059 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4065 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4067 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4075 /***********************************************************************
4076 * CM_Uninstall_DevNode [SETUPAPI.@]
4078 CONFIGRET WINAPI
CM_Uninstall_DevNode(
4079 DEVINST dnPhantom
, ULONG ulFlags
)
4081 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
4082 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
4086 /***********************************************************************
4087 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
4089 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
4090 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
4092 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4093 HSTRING_TABLE StringTable
= NULL
;
4097 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
4100 return CR_INVALID_DEVNODE
;
4103 return CR_INVALID_FLAG
;
4105 if (hMachine
!= NULL
)
4107 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4108 if (BindingHandle
== NULL
)
4111 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4112 if (StringTable
== 0)
4117 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4121 lpDevInst
= StringTableStringFromId(StringTable
, dnPhantom
);
4122 if (lpDevInst
== NULL
)
4123 return CR_INVALID_DEVNODE
;
4127 ret
= PNP_UninstallDevInst(BindingHandle
,
4131 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4133 ret
= RpcStatusToCmStatus(RpcExceptionCode());