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"
27 #include "rpc_private.h"
29 /* Registry key and value names */
30 static const WCHAR Backslash
[] = {'\\', 0};
31 static const WCHAR Class
[] = {'C','l','a','s','s',0};
33 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
34 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
35 'C','o','n','t','r','o','l','\\',
36 'C','l','a','s','s',0};
38 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
39 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
40 'C','o','n','t','r','o','l','\\',
41 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
43 typedef struct _MACHINE_INFO
45 WCHAR szMachineName
[SP_MAX_MACHINENAME_LENGTH
];
46 RPC_BINDING_HANDLE BindingHandle
;
47 HSTRING_TABLE StringTable
;
49 } MACHINE_INFO
, *PMACHINE_INFO
;
52 typedef struct _LOG_CONF_INFO
58 } LOG_CONF_INFO
, *PLOG_CONF_INFO
;
60 #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */
63 typedef struct _NOTIFY_DATA
67 } NOTIFY_DATA
, *PNOTIFY_DATA
;
69 #define NOTIFY_MAGIC 0x44556677
72 typedef struct _INTERNAL_RANGE
77 } INTERNAL_RANGE
, *PINTERNAL_RANGE
;
79 typedef struct _INTERNAL_RANGE_LIST
84 } INTERNAL_RANGE_LIST
, *PINTERNAL_RANGE_LIST
;
86 #define RANGE_LIST_MAGIC 0x33445566
97 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
100 lstrcpyW(&String
[1], lpString
);
103 String
[MAX_GUID_STRING_LEN
- 2] = '}';
104 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
106 RpcStringFreeW(&lpString
);
115 _In_ RPC_STATUS Status
)
123 GetRegistryPropertyType(
124 _In_ ULONG ulProperty
)
128 case CM_DRP_DEVICEDESC
:
131 case CM_DRP_CLASSGUID
:
134 case CM_DRP_FRIENDLYNAME
:
135 case CM_DRP_LOCATION_INFORMATION
:
136 case CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME
:
137 case CM_DRP_ENUMERATOR_NAME
:
138 case CM_DRP_SECURITY_SDS
:
139 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
142 case CM_DRP_HARDWAREID
:
143 case CM_DRP_COMPATIBLEIDS
:
144 case CM_DRP_UPPERFILTERS
:
145 case CM_DRP_LOWERFILTERS
:
148 case CM_DRP_CONFIGFLAGS
:
149 case CM_DRP_CAPABILITIES
:
150 case CM_DRP_UI_NUMBER
:
151 case CM_DRP_LEGACYBUSTYPE
:
152 case CM_DRP_BUSNUMBER
:
154 case CM_DRP_EXCLUSIVE
:
155 case CM_DRP_CHARACTERISTICS
:
157 case CM_DRP_REMOVAL_POLICY
:
158 case CM_DRP_REMOVAL_POLICY_HW_DEFAULT
:
159 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
160 case CM_DRP_INSTALL_STATE
:
163 case CM_DRP_BUSTYPEGUID
:
164 case CM_DRP_SECURITY
:
165 case CM_DRP_DEVICE_POWER_DATA
:
176 SplitDeviceInstanceId(
177 _In_ PWSTR pszDeviceInstanceId
,
178 _Out_ PWSTR pszDeviceId
,
179 _Out_ PWSTR pszInstanceId
)
183 wcscpy(pszDeviceId
, pszDeviceInstanceId
);
185 ptr
= wcschr(pszDeviceId
, L
'\\');
191 wcscpy(pszInstanceId
, ptr
);
195 *pszInstanceId
= UNICODE_NULL
;
202 GetDeviceInstanceKeyPath(
203 _In_ RPC_BINDING_HANDLE BindingHandle
,
204 _In_ PWSTR pszDeviceInst
,
205 _Out_ PWSTR pszKeyPath
,
206 _Out_ PWSTR pszInstancePath
,
207 _In_ ULONG ulHardwareProfile
,
210 PWSTR pszBuffer
= NULL
;
212 ULONG ulTransferLength
, ulLength
;
213 CONFIGRET ret
= CR_SUCCESS
;
215 TRACE("GetDeviceInstanceKeyPath()\n");
217 /* Allocate a buffer for the device id */
218 pszBuffer
= MyMalloc(300 * sizeof(WCHAR
));
219 if (pszBuffer
== NULL
)
221 ERR("MyMalloc() failed\n");
222 return CR_OUT_OF_MEMORY
;
225 if (ulFlags
& CM_REGISTRY_SOFTWARE
)
227 /* Software Key Path */
229 if (ulFlags
& CM_REGISTRY_CONFIG
)
231 SplitDeviceInstanceId(pszDeviceInst
,
235 if (ulHardwareProfile
== 0)
237 wsprintfW(pszKeyPath
,
239 L
"System\\CurrentControlSet\\Hardware Profiles",
241 L
"System\\CurrentControlSet\\Enum",
246 wsprintfW(pszKeyPath
,
247 L
"%s\\%04lu\\%s\\%s",
248 L
"System\\CurrentControlSet\\Hardware Profiles",
250 L
"System\\CurrentControlSet\\Enum",
254 else if (ulFlags
& CM_REGISTRY_USER
)
256 wsprintfW(pszKeyPath
,
258 L
"System\\CurrentControlSet\\Enum",
261 wcscpy(pszInstancePath
,
262 L
"Device Parameters");
266 SplitDeviceInstanceId(pszDeviceInst
,
270 wsprintfW(pszKeyPath
,
272 L
"System\\CurrentControlSet\\Enum",
278 /* Hardware Key Path */
280 ulTransferLength
= 300 * sizeof(WCHAR
);
281 ulLength
= 300 * sizeof(WCHAR
);
282 ret
= PNP_GetDeviceRegProp(BindingHandle
,
290 if (ret
!= CR_SUCCESS
)
292 ERR("PNP_GetDeviceRegProp() failed (Error %lu)\n", ret
);
296 TRACE("szBuffer: %S\n", pszBuffer
);
298 SplitDeviceInstanceId(pszBuffer
,
302 TRACE("szBuffer: %S\n", pszBuffer
);
304 if (ulFlags
& CM_REGISTRY_CONFIG
)
306 if (ulHardwareProfile
== 0)
308 wsprintfW(pszKeyPath
,
310 L
"System\\CurrentControlSet\\Hardware Profiles",
312 L
"System\\CurrentControlSet\\Control\\Class",
317 wsprintfW(pszKeyPath
,
318 L
"%s\\%04lu\\%s\\%s",
319 L
"System\\CurrentControlSet\\Hardware Profiles",
321 L
"System\\CurrentControlSet\\Control\\Class",
327 wsprintfW(pszKeyPath
,
329 L
"System\\CurrentControlSet\\Control\\Class",
335 if (pszBuffer
!= NULL
)
344 _In_opt_ PINTERNAL_RANGE_LIST pRangeList
)
348 if (pRangeList
== NULL
)
353 if (pRangeList
->ulMagic
!= RANGE_LIST_MAGIC
)
356 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
368 _In_opt_ PLOG_CONF_INFO pLogConfInfo
)
372 if (pLogConfInfo
== NULL
)
377 if (pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
380 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
390 /***********************************************************************
391 * CMP_GetBlockedDriverInfo [SETUPAPI.@]
395 CMP_GetBlockedDriverInfo(
396 _Out_opt_ LPWSTR pszNames
,
397 _Inout_ PULONG pulLength
,
399 _In_opt_ HMACHINE hMachine
)
401 RPC_BINDING_HANDLE BindingHandle
= NULL
;
402 ULONG ulTransferLength
;
405 TRACE("CMP_GetBlockedDriverInfo(%p %p %lx %p)\n",
406 pszNames
, pulLength
, ulFlags
, hMachine
);
408 if (hMachine
!= NULL
)
410 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
411 if (BindingHandle
== NULL
)
416 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
420 ulTransferLength
= *pulLength
;
424 ret
= PNP_GetBlockedDriverInfo(BindingHandle
,
430 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
432 ret
= RpcStatusToCmStatus(RpcExceptionCode());
440 /***********************************************************************
441 * CMP_GetServerSideDeviceInstallFlags [SETUPAPI.@]
445 CMP_GetServerSideDeviceInstallFlags(
446 _Out_ PULONG pulSSDIFlags
,
448 _In_opt_ HMACHINE hMachine
)
450 RPC_BINDING_HANDLE BindingHandle
= NULL
;
453 TRACE("CMP_GetServerSideDeviceInstallFlags(%p %lx %p)\n",
454 pulSSDIFlags
, ulFlags
, hMachine
);
456 if (pulSSDIFlags
== NULL
)
457 return CR_INVALID_POINTER
;
460 return CR_INVALID_FLAG
;
462 if (hMachine
!= NULL
)
464 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
465 if (BindingHandle
== NULL
)
470 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
476 ret
= PNP_GetServerSideDeviceInstallFlags(BindingHandle
,
480 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
482 ret
= RpcStatusToCmStatus(RpcExceptionCode());
490 /***********************************************************************
491 * CMP_Init_Detection [SETUPAPI.@]
498 RPC_BINDING_HANDLE BindingHandle
= NULL
;
501 TRACE("CMP_Init_Detection(%lu)\n", ulMagic
);
503 if (ulMagic
!= CMP_MAGIC
)
504 return CR_INVALID_DATA
;
506 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
511 ret
= PNP_InitDetection(BindingHandle
);
513 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
515 ret
= RpcStatusToCmStatus(RpcExceptionCode());
523 /***********************************************************************
524 * CMP_RegisterNotification [SETUPAPI.@]
528 CMP_RegisterNotification(
529 _In_ HANDLE hRecipient
,
530 _In_ LPVOID lpvNotificationFilter
,
532 _Out_ PHDEVNOTIFY phDevNotify
)
534 RPC_BINDING_HANDLE BindingHandle
= NULL
;
535 PNOTIFY_DATA pNotifyData
= NULL
;
536 CONFIGRET ret
= CR_SUCCESS
;
538 TRACE("CMP_RegisterNotification(%p %p %lu %p)\n",
539 hRecipient
, lpvNotificationFilter
, ulFlags
, phDevNotify
);
541 if ((hRecipient
== NULL
) ||
542 (lpvNotificationFilter
== NULL
) ||
543 (phDevNotify
== NULL
))
544 return CR_INVALID_POINTER
;
547 return CR_INVALID_FLAG
;
549 if (((PDEV_BROADCAST_HDR
)lpvNotificationFilter
)->dbch_size
< sizeof(DEV_BROADCAST_HDR
))
550 return CR_INVALID_DATA
;
552 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
555 pNotifyData
= HeapAlloc(GetProcessHeap(),
557 sizeof(NOTIFY_DATA
));
558 if (pNotifyData
== NULL
)
559 return CR_OUT_OF_MEMORY
;
561 pNotifyData
->ulMagic
= NOTIFY_MAGIC
;
564 if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_WINDOW_HANDLE)
568 else if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_SERVICE_HANDLE)
576 ret
= PNP_RegisterNotification(BindingHandle
,
578 &pNotifyData
->ulNotifyData
);
580 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
582 ret
= RpcStatusToCmStatus(RpcExceptionCode());
586 if (ret
== CR_SUCCESS
)
588 *phDevNotify
= (HDEVNOTIFY
)pNotifyData
;
592 if (pNotifyData
!= NULL
)
593 HeapFree(GetProcessHeap(), 0, pNotifyData
);
595 *phDevNotify
= (HDEVNOTIFY
)NULL
;
602 /***********************************************************************
603 * CMP_Report_LogOn [SETUPAPI.@]
609 _In_ DWORD dwProcessId
)
611 RPC_BINDING_HANDLE BindingHandle
= NULL
;
612 CONFIGRET ret
= CR_SUCCESS
;
616 TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic
, dwProcessId
);
618 if (dwMagic
!= CMP_MAGIC
)
619 return CR_INVALID_DATA
;
621 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
624 bAdmin
= pSetupIsUserAdmin();
626 for (i
= 0; i
< 30; i
++)
630 ret
= PNP_ReportLogOn(BindingHandle
,
634 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
636 ret
= RpcStatusToCmStatus(RpcExceptionCode());
640 if (ret
== CR_SUCCESS
)
650 /***********************************************************************
651 * CMP_UnregisterNotification [SETUPAPI.@]
655 CMP_UnregisterNotification(
656 _In_ HDEVNOTIFY hDevNotify
)
658 RPC_BINDING_HANDLE BindingHandle
= NULL
;
659 PNOTIFY_DATA pNotifyData
;
660 CONFIGRET ret
= CR_SUCCESS
;
662 TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify
);
664 pNotifyData
= (PNOTIFY_DATA
)hDevNotify
;
666 if ((pNotifyData
== NULL
) ||
667 (pNotifyData
->ulMagic
!= NOTIFY_MAGIC
))
668 return CR_INVALID_POINTER
;
670 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
675 ret
= PNP_UnregisterNotification(BindingHandle
,
676 pNotifyData
->ulNotifyData
);
678 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
680 ret
= RpcStatusToCmStatus(RpcExceptionCode());
684 if (ret
== CR_SUCCESS
)
685 HeapFree(GetProcessHeap(), 0, pNotifyData
);
691 /***********************************************************************
692 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
696 CMP_WaitNoPendingInstallEvents(
697 _In_ DWORD dwTimeout
)
702 TRACE("CMP_WaitNoPendingInstallEvents(%lu)\n", dwTimeout
);
704 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
708 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
714 /***********************************************************************
715 * CMP_WaitServicesAvailable [SETUPAPI.@]
719 CMP_WaitServicesAvailable(
720 _In_opt_ HMACHINE hMachine
)
722 RPC_BINDING_HANDLE BindingHandle
= NULL
;
723 CONFIGRET ret
= CR_SUCCESS
;
726 TRACE("CMP_WaitServicesAvailable(%p)\n", hMachine
);
728 if (hMachine
!= NULL
)
730 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
731 if (BindingHandle
== NULL
)
736 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
742 ret
= PNP_GetVersion(BindingHandle
, &Version
);
744 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
746 ret
= RpcStatusToCmStatus(RpcExceptionCode());
754 /***********************************************************************
755 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
759 CM_Add_Empty_Log_Conf(
760 _Out_ PLOG_CONF plcLogConf
,
761 _In_ DEVINST dnDevInst
,
762 _In_ PRIORITY Priority
,
765 TRACE("CM_Add_Empty_Log_Conf(%p %p %lu %lx)\n",
766 plcLogConf
, dnDevInst
, Priority
, ulFlags
);
768 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
773 /***********************************************************************
774 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
777 WINAPI
CM_Add_Empty_Log_Conf_Ex(
778 _Out_ PLOG_CONF plcLogConf
,
779 _In_ DEVINST dnDevInst
,
780 _In_ PRIORITY Priority
,
782 _In_opt_ HMACHINE hMachine
)
784 RPC_BINDING_HANDLE BindingHandle
= NULL
;
785 HSTRING_TABLE StringTable
= NULL
;
786 ULONG ulLogConfTag
= 0;
788 PLOG_CONF_INFO pLogConfInfo
;
789 CONFIGRET ret
= CR_SUCCESS
;
791 FIXME("CM_Add_Empty_Log_Conf_Ex(%p %p %lu %lx %p)\n",
792 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
794 if (!pSetupIsUserAdmin())
795 return CR_ACCESS_DENIED
;
797 if (plcLogConf
== NULL
)
798 return CR_INVALID_POINTER
;
801 return CR_INVALID_DEVINST
;
803 if (Priority
> 0xFFFF)
804 return CR_INVALID_PRIORITY
;
806 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
807 return CR_INVALID_FLAG
;
809 if (hMachine
!= NULL
)
811 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
812 if (BindingHandle
== NULL
)
815 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
816 if (StringTable
== 0)
821 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
825 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
826 if (lpDevInst
== NULL
)
827 return CR_INVALID_DEVNODE
;
831 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
832 &ulLogConfTag
, ulFlags
);
834 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
836 ret
= RpcStatusToCmStatus(RpcExceptionCode());
840 if (ret
== CR_SUCCESS
)
842 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
843 if (pLogConfInfo
== NULL
)
845 ret
= CR_OUT_OF_MEMORY
;
849 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
850 pLogConfInfo
->dnDevInst
= dnDevInst
;
851 pLogConfInfo
->ulFlags
= ulFlags
;
852 pLogConfInfo
->ulTag
= ulLogConfTag
;
854 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
864 /***********************************************************************
865 * CM_Add_IDA [SETUPAPI.@]
870 _In_ DEVINST dnDevInst
,
874 TRACE("CM_Add_IDA(%p %s %lx)\n",
875 dnDevInst
, debugstr_a(pszID
), ulFlags
);
877 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
881 /***********************************************************************
882 * CM_Add_IDW [SETUPAPI.@]
887 _In_ DEVINST dnDevInst
,
891 TRACE("CM_Add_IDW(%p %s %lx)\n",
892 dnDevInst
, debugstr_w(pszID
), ulFlags
);
894 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
898 /***********************************************************************
899 * CM_Add_ID_ExA [SETUPAPI.@]
904 _In_ DEVINST dnDevInst
,
907 _In_opt_ HMACHINE hMachine
)
912 TRACE("CM_Add_ID_ExA(%p %s %lx %p)\n",
913 dnDevInst
, debugstr_a(pszID
), ulFlags
, hMachine
);
915 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
916 return CR_INVALID_DATA
;
918 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
926 /***********************************************************************
927 * CM_Add_ID_ExW [SETUPAPI.@]
932 _In_ DEVINST dnDevInst
,
935 _In_opt_ HMACHINE hMachine
)
937 RPC_BINDING_HANDLE BindingHandle
= NULL
;
938 HSTRING_TABLE StringTable
= NULL
;
942 TRACE("CM_Add_ID_ExW(%p %s %lx %p)\n",
943 dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
945 if (!pSetupIsUserAdmin())
946 return CR_ACCESS_DENIED
;
949 return CR_INVALID_DEVINST
;
952 return CR_INVALID_POINTER
;
954 if (ulFlags
& ~CM_ADD_ID_BITS
)
955 return CR_INVALID_FLAG
;
957 if (hMachine
!= NULL
)
959 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
960 if (BindingHandle
== NULL
)
963 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
964 if (StringTable
== 0)
969 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
973 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
974 if (lpDevInst
== NULL
)
975 return CR_INVALID_DEVNODE
;
979 ret
= PNP_AddID(BindingHandle
,
984 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
986 ret
= RpcStatusToCmStatus(RpcExceptionCode());
994 /***********************************************************************
995 * CM_Add_Range [SETUPAPI.@]
1000 _In_ DWORDLONG ullStartValue
,
1001 _In_ DWORDLONG ullEndValue
,
1002 _In_ RANGE_LIST rlh
,
1005 PINTERNAL_RANGE_LIST pRangeList
;
1006 PINTERNAL_RANGE pRange
;
1007 CONFIGRET ret
= CR_SUCCESS
;
1009 FIXME("CM_Add_Range(%I64u %I64u %p %lx)\n",
1010 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1012 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
1014 if (!IsValidRangeList(pRangeList
))
1015 return CR_INVALID_RANGE_LIST
;
1017 if (ulFlags
& ~CM_ADD_RANGE_BITS
)
1018 return CR_INVALID_FLAG
;
1020 if (ullEndValue
< ullStartValue
)
1021 return CR_INVALID_RANGE
;
1023 /* Lock the range list */
1024 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
1026 /* Allocate the new range */
1027 pRange
= HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNAL_RANGE
));
1030 ret
= CR_OUT_OF_MEMORY
;
1034 pRange
->ullStart
= ullStartValue
;
1035 pRange
->ullEnd
= ullEndValue
;
1037 /* Insert the range */
1038 if (IsListEmpty(&pRangeList
->ListHead
))
1040 InsertTailList(&pRangeList
->ListHead
, &pRange
->ListEntry
);
1048 /* Unlock the range list */
1049 ReleaseMutex(pRangeList
->hMutex
);
1055 /***********************************************************************
1056 * CM_Add_Res_Des [SETUPAPI.@]
1061 _Out_opt_ PRES_DES prdResDes
,
1062 _In_ LOG_CONF lcLogConf
,
1063 _In_ RESOURCEID ResourceID
,
1064 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1065 _In_ ULONG ResourceLen
,
1068 TRACE("CM_Add_Res_Des(%p %p %lu %p %lu %lx)\n",
1069 prdResDes
, lcLogConf
, ResourceID
, ResourceData
, ResourceLen
, ulFlags
);
1071 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
1072 ResourceLen
, ulFlags
, NULL
);
1076 /***********************************************************************
1077 * CM_Add_Res_Des_Ex [SETUPAPI.@]
1082 _Out_opt_ PRES_DES prdResDes
,
1083 _In_ LOG_CONF lcLogConf
,
1084 _In_ RESOURCEID ResourceID
,
1085 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1086 _In_ ULONG ResourceLen
,
1088 _In_opt_ HMACHINE hMachine
)
1090 FIXME("CM_Add_Res_Des_Ex(%p %p %lu %p %lu %lx %p)\n",
1091 prdResDes
, lcLogConf
, ResourceID
,
1092 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
1094 return CR_CALL_NOT_IMPLEMENTED
;
1098 /***********************************************************************
1099 * CM_Connect_MachineA [SETUPAPI.@]
1103 CM_Connect_MachineA(
1104 _In_opt_ PCSTR UNCServerName
,
1105 _Out_ PHMACHINE phMachine
)
1110 TRACE("CM_Connect_MachineA(%s %p)\n",
1111 debugstr_a(UNCServerName
), phMachine
);
1113 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1114 return CM_Connect_MachineW(NULL
, phMachine
);
1116 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
1117 return CR_INVALID_DATA
;
1119 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
1121 MyFree(pServerNameW
);
1127 /***********************************************************************
1128 * CM_Connect_MachineW [SETUPAPI.@]
1132 CM_Connect_MachineW(
1133 _In_opt_ PCWSTR UNCServerName
,
1134 _Out_ PHMACHINE phMachine
)
1136 PMACHINE_INFO pMachine
;
1138 TRACE("CM_Connect_MachineW(%s %p)\n",
1139 debugstr_w(UNCServerName
), phMachine
);
1141 if (phMachine
== NULL
)
1142 return CR_INVALID_POINTER
;
1146 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
1147 if (pMachine
== NULL
)
1148 return CR_OUT_OF_MEMORY
;
1150 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1152 pMachine
->bLocal
= TRUE
;
1154 /* FIXME: store the computers name in pMachine->szMachineName */
1156 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
1157 &pMachine
->StringTable
))
1159 HeapFree(GetProcessHeap(), 0, pMachine
);
1165 pMachine
->bLocal
= FALSE
;
1166 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
1168 HeapFree(GetProcessHeap(), 0, pMachine
);
1169 return CR_INVALID_MACHINENAME
;
1171 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
1173 pMachine
->StringTable
= pSetupStringTableInitialize();
1174 if (pMachine
->StringTable
== NULL
)
1176 HeapFree(GetProcessHeap(), 0, pMachine
);
1180 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
1182 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
1184 pSetupStringTableDestroy(pMachine
->StringTable
);
1185 HeapFree(GetProcessHeap(), 0, pMachine
);
1186 return CR_INVALID_MACHINENAME
;
1190 *phMachine
= (PHMACHINE
)pMachine
;
1196 /***********************************************************************
1197 * CM_Create_DevNodeA [SETUPAPI.@]
1202 _Out_ PDEVINST pdnDevInst
,
1203 _In_ DEVINSTID_A pDeviceID
,
1204 _In_ DEVINST dnParent
,
1207 TRACE("CM_Create_DevNodeA(%p %s %p %lx)\n",
1208 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
1210 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
1215 /***********************************************************************
1216 * CM_Create_DevNodeW [SETUPAPI.@]
1221 _Out_ PDEVINST pdnDevInst
,
1222 _In_ DEVINSTID_W pDeviceID
,
1223 _In_ DEVINST dnParent
,
1226 TRACE("CM_Create_DevNodeW(%p %s %p %lx)\n",
1227 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
1229 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
1234 /***********************************************************************
1235 * CM_Create_DevNode_ExA [SETUPAPI.@]
1239 CM_Create_DevNode_ExA(
1240 _Out_ PDEVINST pdnDevInst
,
1241 _In_ DEVINSTID_A pDeviceID
,
1242 _In_ DEVINST dnParent
,
1244 _In_opt_ HANDLE hMachine
)
1246 DEVINSTID_W pDeviceIDW
;
1249 TRACE("CM_Create_DevNode_ExA(%p %s %p %lx %p)\n",
1250 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1252 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
1253 return CR_INVALID_DATA
;
1255 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
1264 /***********************************************************************
1265 * CM_Create_DevNode_ExW [SETUPAPI.@]
1269 CM_Create_DevNode_ExW(
1270 _Out_ PDEVINST pdnDevInst
,
1271 _In_ DEVINSTID_W pDeviceID
,
1272 _In_ DEVINST dnParent
,
1274 _In_opt_ HANDLE hMachine
)
1276 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1277 HSTRING_TABLE StringTable
= NULL
;
1278 LPWSTR lpParentDevInst
;
1279 CONFIGRET ret
= CR_SUCCESS
;
1280 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
1282 TRACE("CM_Create_DevNode_ExW(%p %s %p %lx %p)\n",
1283 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1285 if (!pSetupIsUserAdmin())
1286 return CR_ACCESS_DENIED
;
1288 if (pdnDevInst
== NULL
)
1289 return CR_INVALID_POINTER
;
1291 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
1292 return CR_INVALID_DEVICE_ID
;
1295 return CR_INVALID_DEVNODE
;
1297 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
1298 return CR_INVALID_FLAG
;
1300 if (hMachine
!= NULL
)
1302 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1303 if (BindingHandle
== NULL
)
1306 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1307 if (StringTable
== 0)
1312 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1316 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
1317 if (lpParentDevInst
== NULL
)
1318 return CR_INVALID_DEVNODE
;
1320 wcscpy(szLocalDeviceID
, pDeviceID
);
1324 ret
= PNP_CreateDevInst(BindingHandle
,
1330 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1332 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1336 if (ret
== CR_SUCCESS
)
1338 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
1339 * will return the generated device ID in szLocalDeviceID */
1340 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
1341 if (*pdnDevInst
== 0)
1342 ret
= CR_NO_SUCH_DEVNODE
;
1349 /***********************************************************************
1350 * CM_Create_Range_List [SETUPAPI.@]
1354 CM_Create_Range_List(
1355 _Out_ PRANGE_LIST prlh
,
1358 PINTERNAL_RANGE_LIST pRangeList
= NULL
;
1360 FIXME("CM_Create_Range_List(%p %lx)\n",
1364 return CR_INVALID_FLAG
;
1367 return CR_INVALID_POINTER
;
1369 /* Allocate the range list */
1370 pRangeList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(INTERNAL_RANGE_LIST
));
1371 if (pRangeList
== NULL
)
1372 return CR_OUT_OF_MEMORY
;
1374 /* Set the magic value */
1375 pRangeList
->ulMagic
= RANGE_LIST_MAGIC
;
1377 /* Initialize the mutex for synchonized access */
1378 pRangeList
->hMutex
= CreateMutex(NULL
, FALSE
, NULL
);
1379 if (pRangeList
->hMutex
== NULL
)
1381 HeapFree(GetProcessHeap(), 0, pRangeList
);
1385 InitializeListHead(&pRangeList
->ListHead
);
1387 *prlh
= (RANGE_LIST
)pRangeList
;
1393 /***********************************************************************
1394 * CM_Delete_Class_Key [SETUPAPI.@]
1398 CM_Delete_Class_Key(
1399 _In_ LPGUID ClassGuid
,
1402 TRACE("CM_Delete_Class_Key(%p %lx)\n",
1403 ClassGuid
, ulFlags
);
1405 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
1409 /***********************************************************************
1410 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
1414 CM_Delete_Class_Key_Ex(
1415 _In_ LPGUID ClassGuid
,
1417 _In_opt_ HANDLE hMachine
)
1419 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1420 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1423 TRACE("CM_Delete_Class_Key_Ex(%p %lx %p)\n",
1424 ClassGuid
, ulFlags
, hMachine
);
1426 if (ClassGuid
== NULL
)
1427 return CR_INVALID_POINTER
;
1429 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
1430 return CR_INVALID_FLAG
;
1432 if (!GuidToString(ClassGuid
, szGuidString
))
1433 return CR_INVALID_DATA
;
1435 if (hMachine
!= NULL
)
1437 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1438 if (BindingHandle
== NULL
)
1443 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1449 ret
= PNP_DeleteClassKey(BindingHandle
,
1453 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1455 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1463 /***********************************************************************
1464 * CM_Delete_DevNode_Key [SETUPAPI.@]
1468 CM_Delete_DevNode_Key(
1469 _In_ DEVNODE dnDevNode
,
1470 _In_ ULONG ulHardwareProfile
,
1473 TRACE("CM_Delete_DevNode_Key(%p %lu %lx)\n",
1474 dnDevNode
, ulHardwareProfile
, ulFlags
);
1476 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
1481 /***********************************************************************
1482 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
1486 CM_Delete_DevNode_Key_Ex(
1487 _In_ DEVNODE dnDevNode
,
1488 _In_ ULONG ulHardwareProfile
,
1490 _In_opt_ HANDLE hMachine
)
1492 FIXME("CM_Delete_DevNode_Key_Ex(%p %lu %lx %p)\n",
1493 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
1495 return CR_CALL_NOT_IMPLEMENTED
;
1499 /***********************************************************************
1500 * CM_Delete_Range [SETUPAPI.@]
1505 _In_ DWORDLONG ullStartValue
,
1506 _In_ DWORDLONG ullEndValue
,
1507 _In_ RANGE_LIST rlh
,
1510 FIXME("CM_Delete_Range(%I64u %I64u %p %lx)\n",
1511 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1513 return CR_CALL_NOT_IMPLEMENTED
;
1517 /***********************************************************************
1518 * CM_Disable_DevNode [SETUPAPI.@]
1523 _In_ DEVINST dnDevInst
,
1526 TRACE("CM_Disable_DevNode(%p %lx)\n",
1527 dnDevInst
, ulFlags
);
1529 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1533 /***********************************************************************
1534 * CM_Disable_DevNode_Ex [SETUPAPI.@]
1538 CM_Disable_DevNode_Ex(
1539 _In_ DEVINST dnDevInst
,
1541 _In_opt_ HMACHINE hMachine
)
1543 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1544 HSTRING_TABLE StringTable
= NULL
;
1548 FIXME("CM_Disable_DevNode_Ex(%p %lx %p)\n",
1549 dnDevInst
, ulFlags
, hMachine
);
1551 if (!pSetupIsUserAdmin())
1552 return CR_ACCESS_DENIED
;
1555 return CR_INVALID_DEVINST
;
1558 return CR_INVALID_FLAG
;
1560 if (hMachine
!= NULL
)
1562 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1563 if (BindingHandle
== NULL
)
1566 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1567 if (StringTable
== 0)
1572 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1576 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1577 if (lpDevInst
== NULL
)
1578 return CR_INVALID_DEVNODE
;
1582 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1583 PNP_DEVINST_DISABLE
,
1588 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1590 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1598 /***********************************************************************
1599 * CM_Disconnect_Machine [SETUPAPI.@]
1603 CM_Disconnect_Machine(
1604 _In_opt_ HMACHINE hMachine
)
1606 PMACHINE_INFO pMachine
;
1608 TRACE("CM_Disconnect_Machine(%p)\n", hMachine
);
1610 pMachine
= (PMACHINE_INFO
)hMachine
;
1611 if (pMachine
== NULL
)
1614 if (pMachine
->bLocal
== FALSE
)
1616 if (pMachine
->StringTable
!= NULL
)
1617 pSetupStringTableDestroy(pMachine
->StringTable
);
1619 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
1620 return CR_ACCESS_DENIED
;
1623 HeapFree(GetProcessHeap(), 0, pMachine
);
1629 /***********************************************************************
1630 * CM_Dup_Range_List [SETUPAPI.@]
1635 _In_ RANGE_LIST rlhOld
,
1636 _In_ RANGE_LIST rlhNew
,
1639 FIXME("CM_Dup_Range_List(%p %p %lx)\n",
1640 rlhOld
, rlhNew
, ulFlags
);
1642 return CR_CALL_NOT_IMPLEMENTED
;
1646 /***********************************************************************
1647 * CM_Enable_DevNode [SETUPAPI.@]
1652 _In_ DEVINST dnDevInst
,
1655 TRACE("CM_Enable_DevNode(%p %lx)\n",
1656 dnDevInst
, ulFlags
);
1658 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1662 /***********************************************************************
1663 * CM_Enable_DevNode_Ex [SETUPAPI.@]
1667 CM_Enable_DevNode_Ex(
1668 _In_ DEVINST dnDevInst
,
1670 _In_opt_ HMACHINE hMachine
)
1672 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1673 HSTRING_TABLE StringTable
= NULL
;
1677 TRACE("CM_Enable_DevNode_Ex(%p %lx %p)\n",
1678 dnDevInst
, ulFlags
, hMachine
);
1680 if (!pSetupIsUserAdmin())
1681 return CR_ACCESS_DENIED
;
1684 return CR_INVALID_DEVINST
;
1687 return CR_INVALID_FLAG
;
1689 if (hMachine
!= NULL
)
1691 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1692 if (BindingHandle
== NULL
)
1695 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1696 if (StringTable
== 0)
1701 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1705 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1706 if (lpDevInst
== NULL
)
1707 return CR_INVALID_DEVNODE
;
1711 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1717 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1719 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1727 /***********************************************************************
1728 * CM_Enumerate_Classes [SETUPAPI.@]
1732 CM_Enumerate_Classes(
1733 _In_ ULONG ulClassIndex
,
1734 _Out_ LPGUID ClassGuid
,
1737 TRACE("CM_Enumerate_Classes(%lx %p %lx)\n",
1738 ulClassIndex
, ClassGuid
, ulFlags
);
1740 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
1744 /***********************************************************************
1745 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
1749 CM_Enumerate_Classes_Ex(
1750 _In_ ULONG ulClassIndex
,
1751 _Out_ LPGUID ClassGuid
,
1753 _In_opt_ HMACHINE hMachine
)
1755 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1756 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1757 CONFIGRET ret
= CR_SUCCESS
;
1758 ULONG ulLength
= MAX_GUID_STRING_LEN
;
1760 TRACE("CM_Enumerate_Classes_Ex(%lx %p %lx %p)\n",
1761 ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
1763 if (ClassGuid
== NULL
)
1764 return CR_INVALID_POINTER
;
1767 return CR_INVALID_FLAG
;
1769 if (hMachine
!= NULL
)
1771 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1772 if (BindingHandle
== NULL
)
1777 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1783 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1787 MAX_GUID_STRING_LEN
,
1791 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1793 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1797 if (ret
== CR_SUCCESS
)
1800 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1802 /* Convert the buffer to a GUID */
1803 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1811 /***********************************************************************
1812 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1816 CM_Enumerate_EnumeratorsA(
1817 _In_ ULONG ulEnumIndex
,
1818 _Out_writes_(*pulLength
) PCHAR Buffer
,
1819 _Inout_ PULONG pulLength
,
1822 TRACE("CM_Enumerate_EnumeratorsA(%lu %p %p %lx)\n",
1823 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1825 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1830 /***********************************************************************
1831 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1835 CM_Enumerate_EnumeratorsW(
1836 _In_ ULONG ulEnumIndex
,
1837 _Out_writes_(*pulLength
) PWCHAR Buffer
,
1838 _Inout_ PULONG pulLength
,
1841 TRACE("CM_Enumerate_EnumeratorsW(%lu %p %p %lx)\n",
1842 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1844 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1849 /***********************************************************************
1850 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1854 CM_Enumerate_Enumerators_ExA(
1855 _In_ ULONG ulEnumIndex
,
1856 _Out_writes_(*pulLength
) PCHAR Buffer
,
1857 _Inout_ PULONG pulLength
,
1859 _In_opt_ HMACHINE hMachine
)
1861 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1864 CONFIGRET ret
= CR_SUCCESS
;
1866 TRACE("CM_Enumerate_Enumerators_ExA(%lu %p %p %lx %p)\n",
1867 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
1869 if (Buffer
== NULL
|| pulLength
== NULL
)
1870 return CR_INVALID_POINTER
;
1873 return CR_INVALID_FLAG
;
1875 ulOrigLength
= *pulLength
;
1878 ulLength
= MAX_DEVICE_ID_LEN
;
1879 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1881 if (ret
== CR_SUCCESS
)
1883 if (WideCharToMultiByte(CP_ACP
,
1893 *pulLength
= lstrlenA(Buffer
) + 1;
1900 /***********************************************************************
1901 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1905 CM_Enumerate_Enumerators_ExW(
1906 _In_ ULONG ulEnumIndex
,
1907 _Out_writes_(*pulLength
) PWCHAR Buffer
,
1908 _Inout_ PULONG pulLength
,
1910 _In_opt_ HMACHINE hMachine
)
1912 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1915 TRACE("CM_Enumerate_Enumerators_ExW(%lu %p %p %lx %p)\n",
1916 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
1918 if (Buffer
== NULL
|| pulLength
== NULL
)
1919 return CR_INVALID_POINTER
;
1922 return CR_INVALID_FLAG
;
1924 *Buffer
= UNICODE_NULL
;
1926 if (hMachine
!= NULL
)
1928 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1929 if (BindingHandle
== NULL
)
1934 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1940 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1941 PNP_ENUMERATOR_SUBKEYS
,
1948 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1950 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1958 /***********************************************************************
1959 * CM_Find_Range [SETUPAPI.@]
1964 _Out_ PDWORDLONG pullStart
,
1965 _In_ DWORDLONG ullStart
,
1966 _In_ ULONG ulLength
,
1967 _In_ DWORDLONG ullAlignment
,
1968 _In_ DWORDLONG ullEnd
,
1969 _In_ RANGE_LIST rlh
,
1972 FIXME("CM_Find_Range(%p %I64u %lu %I64u %I64u %p %lx)\n",
1973 pullStart
, ullStart
, ulLength
, ullAlignment
, ullEnd
, rlh
, ulFlags
);
1975 return CR_CALL_NOT_IMPLEMENTED
;
1979 /***********************************************************************
1980 * CM_First_Range [SETUPAPI.@]
1985 _In_ RANGE_LIST rlh
,
1986 _Out_ PDWORDLONG pullStart
,
1987 _Out_ PDWORDLONG pullEnd
,
1988 _Out_ PRANGE_ELEMENT preElement
,
1991 PINTERNAL_RANGE_LIST pRangeList
;
1992 PINTERNAL_RANGE pRange
;
1993 PLIST_ENTRY ListEntry
;
1994 CONFIGRET ret
= CR_SUCCESS
;
1996 FIXME("CM_First_Range(%p %p %p %p %lx)\n",
1997 rlh
, pullStart
, pullEnd
, preElement
, ulFlags
);
1999 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
2001 if (!IsValidRangeList(pRangeList
))
2002 return CR_INVALID_RANGE_LIST
;
2004 if (pullStart
== NULL
|| pullEnd
== NULL
|| preElement
== NULL
)
2005 return CR_INVALID_POINTER
;
2008 return CR_INVALID_FLAG
;
2010 /* Lock the range list */
2011 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2013 /* Fail, if the list is empty */
2014 if (IsListEmpty(&pRangeList
->ListHead
))
2020 /* Get the first range */
2021 ListEntry
= pRangeList
->ListHead
.Flink
;
2022 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2024 /* Return the range data */
2025 *pullStart
= pRange
->ullStart
;
2026 *pullEnd
= pRange
->ullEnd
;
2027 *preElement
= (RANGE_ELEMENT
)pRange
;
2030 /* Unlock the range list */
2031 ReleaseMutex(pRangeList
->hMutex
);
2037 /***********************************************************************
2038 * CM_Free_Log_Conf [SETUPAPI.@]
2043 _In_ LOG_CONF lcLogConfToBeFreed
,
2046 TRACE("CM_Free_Log_Conf(%lx %lx)\n",
2047 lcLogConfToBeFreed
, ulFlags
);
2049 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
2053 /***********************************************************************
2054 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
2058 CM_Free_Log_Conf_Ex(
2059 _In_ LOG_CONF lcLogConfToBeFreed
,
2061 _In_opt_ HMACHINE hMachine
)
2063 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2064 HSTRING_TABLE StringTable
= NULL
;
2066 PLOG_CONF_INFO pLogConfInfo
;
2069 TRACE("CM_Free_Log_Conf_Ex(%lx %lx %p)\n",
2070 lcLogConfToBeFreed
, ulFlags
, hMachine
);
2072 if (!pSetupIsUserAdmin())
2073 return CR_ACCESS_DENIED
;
2075 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
2076 if (!IsValidLogConf(pLogConfInfo
))
2077 return CR_INVALID_LOG_CONF
;
2080 return CR_INVALID_FLAG
;
2082 if (hMachine
!= NULL
)
2084 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2085 if (BindingHandle
== NULL
)
2088 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2089 if (StringTable
== 0)
2094 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2098 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2099 if (lpDevInst
== NULL
)
2100 return CR_INVALID_DEVNODE
;
2104 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
2105 pLogConfInfo
->ulTag
, 0);
2107 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2109 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2117 /***********************************************************************
2118 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
2122 CM_Free_Log_Conf_Handle(
2123 _In_ LOG_CONF lcLogConf
)
2125 PLOG_CONF_INFO pLogConfInfo
;
2127 TRACE("CM_Free_Log_Conf_Handle(%lx)\n", lcLogConf
);
2129 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2130 if (!IsValidLogConf(pLogConfInfo
))
2131 return CR_INVALID_LOG_CONF
;
2133 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
2139 /***********************************************************************
2140 * CM_Free_Range_List [SETUPAPI.@]
2145 _In_ RANGE_LIST RangeList
,
2148 PINTERNAL_RANGE_LIST pRangeList
;
2149 PINTERNAL_RANGE pRange
;
2150 PLIST_ENTRY ListEntry
;
2152 FIXME("CM_Free_Range_List(%p %lx)\n",
2153 RangeList
, ulFlags
);
2155 pRangeList
= (PINTERNAL_RANGE_LIST
)RangeList
;
2157 if (!IsValidRangeList(pRangeList
))
2158 return CR_INVALID_RANGE_LIST
;
2161 return CR_INVALID_FLAG
;
2163 /* Lock the range list */
2164 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2166 /* Free the list of ranges */
2167 while (!IsListEmpty(&pRangeList
->ListHead
))
2169 ListEntry
= RemoveHeadList(&pRangeList
->ListHead
);
2170 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2171 HeapFree(GetProcessHeap(), 0, pRange
);
2174 /* Unlock the range list */
2175 ReleaseMutex(pRangeList
->hMutex
);
2177 /* Close the mutex */
2178 CloseHandle(pRangeList
->hMutex
);
2180 /* Free the range list */
2181 HeapFree(GetProcessHeap(), 0, pRangeList
);
2187 /***********************************************************************
2188 * CM_Free_Res_Des [SETUPAPI.@]
2193 _Out_ PRES_DES prdResDes
,
2194 _In_ RES_DES rdResDes
,
2197 TRACE("CM_Free_Res_Des(%p %p %lx)\n",
2198 prdResDes
, rdResDes
, ulFlags
);
2200 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
2204 /***********************************************************************
2205 * CM_Free_Res_Des_Ex [SETUPAPI.@]
2210 _Out_ PRES_DES prdResDes
,
2211 _In_ RES_DES rdResDes
,
2213 _In_opt_ HMACHINE hMachine
)
2215 FIXME("CM_Free_Res_Des_Ex(%p %p %lx %p)\n",
2216 prdResDes
, rdResDes
, ulFlags
, hMachine
);
2218 return CR_CALL_NOT_IMPLEMENTED
;
2222 /***********************************************************************
2223 * CM_Free_Res_Des_Handle [SETUPAPI.@]
2227 CM_Free_Res_Des_Handle(
2228 _In_ RES_DES rdResDes
)
2230 FIXME("CM_Free_Res_Des_Handle(%p)\n", rdResDes
);
2232 return CR_CALL_NOT_IMPLEMENTED
;
2236 /***********************************************************************
2237 * CM_Free_Resource_Conflict_Handle [SETUPAPI.@]
2241 CM_Free_Resource_Conflict_Handle(
2242 _In_ CONFLICT_LIST clConflictList
)
2244 FIXME("CM_Free_Resource_Conflict_Handle(%p)\n", clConflictList
);
2246 return CR_CALL_NOT_IMPLEMENTED
;
2250 /***********************************************************************
2251 * CM_Get_Child [SETUPAPI.@]
2256 _Out_ PDEVINST pdnDevInst
,
2257 _In_ DEVINST dnDevInst
,
2260 TRACE("CM_Get_Child(%p %p %lx)\n",
2261 pdnDevInst
, dnDevInst
, ulFlags
);
2263 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2267 /***********************************************************************
2268 * CM_Get_Child_Ex [SETUPAPI.@]
2273 _Out_ PDEVINST pdnDevInst
,
2274 _In_ DEVINST dnDevInst
,
2276 _In_opt_ HMACHINE hMachine
)
2278 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2279 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2280 HSTRING_TABLE StringTable
= NULL
;
2282 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
2285 TRACE("CM_Get_Child_Ex(%p %lx %lx %p)\n",
2286 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2288 if (pdnDevInst
== NULL
)
2289 return CR_INVALID_POINTER
;
2292 return CR_INVALID_DEVINST
;
2295 return CR_INVALID_FLAG
;
2299 if (hMachine
!= NULL
)
2301 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2302 if (BindingHandle
== NULL
)
2305 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2306 if (StringTable
== 0)
2311 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2315 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2316 if (lpDevInst
== NULL
)
2317 return CR_INVALID_DEVNODE
;
2321 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2322 PNP_GET_CHILD_DEVICE_INSTANCE
,
2328 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2330 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2334 if (ret
!= CR_SUCCESS
)
2337 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2339 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
2343 *pdnDevInst
= dwIndex
;
2349 /***********************************************************************
2350 * CM_Get_Class_Key_NameA [SETUPAPI.@]
2354 CM_Get_Class_Key_NameA(
2355 _In_ LPGUID ClassGuid
,
2356 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2357 _Inout_ PULONG pulLength
,
2360 TRACE("CM_Get_Class_Key_NameA(%p %p %p %lx)\n",
2361 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2363 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
2368 /***********************************************************************
2369 * CM_Get_Class_Key_NameW [SETUPAPI.@]
2373 CM_Get_Class_Key_NameW(
2374 _In_ LPGUID ClassGuid
,
2375 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2376 _Inout_ PULONG pulLength
,
2379 TRACE("CM_Get_Class_Key_NameW(%p %p %p %lx)\n",
2380 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2382 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
2387 /***********************************************************************
2388 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
2392 CM_Get_Class_Key_Name_ExA(
2393 _In_ LPGUID ClassGuid
,
2394 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2395 _Inout_ PULONG pulLength
,
2397 _In_opt_ HMACHINE hMachine
)
2399 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
2400 CONFIGRET ret
= CR_SUCCESS
;
2404 TRACE("CM_Get_Class_Key_Name_ExA(%p %p %p %lx %p)\n",
2405 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2407 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2408 return CR_INVALID_POINTER
;
2410 ulOrigLength
= *pulLength
;
2413 ulLength
= MAX_GUID_STRING_LEN
;
2414 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2416 if (ret
== CR_SUCCESS
)
2418 if (WideCharToMultiByte(CP_ACP
,
2428 *pulLength
= lstrlenA(pszKeyName
) + 1;
2435 /***********************************************************************
2436 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
2440 CM_Get_Class_Key_Name_ExW(
2441 _In_ LPGUID ClassGuid
,
2442 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2443 _Inout_ PULONG pulLength
,
2445 _In_opt_ HMACHINE hMachine
)
2447 TRACE("CM_Get_Class_Key_Name_ExW(%p %p %p %lx %p)\n",
2448 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2450 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2451 return CR_INVALID_POINTER
;
2454 return CR_INVALID_FLAG
;
2456 if (*pulLength
< MAX_GUID_STRING_LEN
)
2459 return CR_BUFFER_SMALL
;
2462 if (!GuidToString(ClassGuid
, pszKeyName
))
2463 return CR_INVALID_DATA
;
2465 *pulLength
= MAX_GUID_STRING_LEN
;
2471 /***********************************************************************
2472 * CM_Get_Class_NameA [SETUPAPI.@]
2477 _In_ LPGUID ClassGuid
,
2478 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2479 _Inout_ PULONG pulLength
,
2482 TRACE("CM_Get_Class_NameA(%p %p %p %lx)\n",
2483 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2485 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2490 /***********************************************************************
2491 * CM_Get_Class_NameW [SETUPAPI.@]
2496 _In_ LPGUID ClassGuid
,
2497 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2498 _Inout_ PULONG pulLength
,
2501 TRACE("CM_Get_Class_NameW(%p %p %p %lx)\n",
2502 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2504 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2509 /***********************************************************************
2510 * CM_Get_Class_Name_ExA [SETUPAPI.@]
2514 CM_Get_Class_Name_ExA(
2515 _In_ LPGUID ClassGuid
,
2516 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2517 _Inout_ PULONG pulLength
,
2519 _In_opt_ HMACHINE hMachine
)
2521 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
2522 CONFIGRET ret
= CR_SUCCESS
;
2526 TRACE("CM_Get_Class_Name_ExA(%p %p %p %lx %p)\n",
2527 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2529 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2530 return CR_INVALID_POINTER
;
2532 ulOrigLength
= *pulLength
;
2535 ulLength
= MAX_CLASS_NAME_LEN
;
2536 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2538 if (ret
== CR_SUCCESS
)
2540 if (WideCharToMultiByte(CP_ACP
,
2550 *pulLength
= lstrlenA(Buffer
) + 1;
2557 /***********************************************************************
2558 * CM_Get_Class_Name_ExW [SETUPAPI.@]
2562 CM_Get_Class_Name_ExW(
2563 _In_ LPGUID ClassGuid
,
2564 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2565 _Inout_ PULONG pulLength
,
2567 _In_opt_ HMACHINE hMachine
)
2569 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
2570 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2573 TRACE("CM_Get_Class_Name_ExW(%p %p %p %lx %p\n",
2574 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2576 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2577 return CR_INVALID_POINTER
;
2580 return CR_INVALID_FLAG
;
2582 if (!GuidToString(ClassGuid
, szGuidString
))
2583 return CR_INVALID_DATA
;
2585 TRACE("Guid %s\n", debugstr_w(szGuidString
));
2587 if (hMachine
!= NULL
)
2589 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2590 if (BindingHandle
== NULL
)
2595 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2601 ret
= PNP_GetClassName(BindingHandle
,
2607 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2609 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2617 /***********************************************************************
2618 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
2622 CM_Get_Class_Registry_PropertyA(
2625 PULONG pulRegDataType
,
2631 PWSTR BufferW
= NULL
;
2636 TRACE("CM_Get_Class_Registry_PropertyA(%p %lu %p %p %p %lx %p)\n",
2637 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2640 if (pulLength
== NULL
)
2641 return CR_INVALID_POINTER
;
2643 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2644 return CR_INVALID_PROPERTY
;
2646 ulType
= GetRegistryPropertyType(ulProperty
);
2647 if (ulType
== REG_SZ
|| ulType
== REG_MULTI_SZ
)
2649 /* Get the required buffer size */
2650 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2651 NULL
, &ulLength
, ulFlags
, hMachine
);
2652 if (ret
!= CR_BUFFER_SMALL
)
2655 /* Allocate the unicode buffer */
2656 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLength
);
2657 if (BufferW
== NULL
)
2658 return CR_OUT_OF_MEMORY
;
2660 /* Get the property */
2661 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2662 BufferW
, &ulLength
, ulFlags
, hMachine
);
2663 if (ret
!= CR_SUCCESS
)
2665 HeapFree(GetProcessHeap(), 0, BufferW
);
2669 /* Do W->A conversion */
2670 *pulLength
= WideCharToMultiByte(CP_ACP
,
2673 lstrlenW(BufferW
) + 1,
2679 /* Release the unicode buffer */
2680 HeapFree(GetProcessHeap(), 0, BufferW
);
2682 if (*pulLength
== 0)
2687 /* Get the property */
2688 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2689 Buffer
, pulLength
, ulFlags
, hMachine
);
2696 /***********************************************************************
2697 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
2701 CM_Get_Class_Registry_PropertyW(
2704 PULONG pulRegDataType
,
2710 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2711 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
2713 ULONG ulTransferLength
= 0;
2716 TRACE("CM_Get_Class_Registry_PropertyW(%p %lu %p %p %p %lx %p)\n",
2717 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2720 if (ClassGuid
== NULL
|| pulLength
== NULL
)
2721 return CR_INVALID_POINTER
;
2724 return CR_INVALID_FLAG
;
2726 if (pSetupStringFromGuid(ClassGuid
,
2728 PNP_MAX_GUID_STRING_LEN
) != 0)
2729 return CR_INVALID_DATA
;
2731 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2732 return CR_INVALID_PROPERTY
;
2734 if (hMachine
!= NULL
)
2736 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2737 if (BindingHandle
== NULL
)
2742 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2746 ulTransferLength
= *pulLength
;
2750 ret
= PNP_GetClassRegProp(BindingHandle
,
2759 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2761 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2765 if (ret
== CR_SUCCESS
)
2767 if (pulRegDataType
!= NULL
)
2768 *pulRegDataType
= ulType
;
2775 /***********************************************************************
2776 * CM_Get_Depth [SETUPAPI.@]
2781 _Out_ PULONG pulDepth
,
2782 _In_ DEVINST dnDevInst
,
2785 TRACE("CM_Get_Depth(%p %lx %lx)\n",
2786 pulDepth
, dnDevInst
, ulFlags
);
2788 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
2792 /***********************************************************************
2793 * CM_Get_Depth_Ex [SETUPAPI.@]
2798 _Out_ PULONG pulDepth
,
2799 _In_ DEVINST dnDevInst
,
2801 _In_opt_ HMACHINE hMachine
)
2803 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2804 HSTRING_TABLE StringTable
= NULL
;
2808 TRACE("CM_Get_Depth_Ex(%p %lx %lx %p)\n",
2809 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
2811 if (pulDepth
== NULL
)
2812 return CR_INVALID_POINTER
;
2815 return CR_INVALID_DEVINST
;
2818 return CR_INVALID_FLAG
;
2820 if (hMachine
!= NULL
)
2822 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2823 if (BindingHandle
== NULL
)
2826 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2827 if (StringTable
== 0)
2832 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2836 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2837 if (lpDevInst
== NULL
)
2838 return CR_INVALID_DEVNODE
;
2842 ret
= PNP_GetDepth(BindingHandle
,
2847 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2849 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2857 /***********************************************************************
2858 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
2862 CM_Get_DevNode_Custom_PropertyA(
2863 _In_ DEVINST dnDevInst
,
2864 _In_ PCSTR pszCustomPropertyName
,
2865 _Out_opt_ PULONG pulRegDataType
,
2866 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
2867 _Inout_ PULONG pulLength
,
2870 TRACE("CM_Get_DevNode_Custom_PropertyA(%lx %s %p %p %p %lx)\n",
2871 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
2872 Buffer
, pulLength
, ulFlags
);
2874 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
2875 pulRegDataType
, Buffer
,
2876 pulLength
, ulFlags
, NULL
);
2880 /***********************************************************************
2881 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
2885 CM_Get_DevNode_Custom_PropertyW(
2886 _In_ DEVINST dnDevInst
,
2887 _In_ PCWSTR pszCustomPropertyName
,
2888 _Out_opt_ PULONG pulRegDataType
,
2889 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
2890 _Inout_ PULONG pulLength
,
2893 TRACE("CM_Get_DevNode_Custom_PropertyW(%lx %s %p %p %p %lx)\n",
2894 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
2895 Buffer
, pulLength
, ulFlags
);
2897 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
2898 pulRegDataType
, Buffer
,
2899 pulLength
, ulFlags
, NULL
);
2903 /***********************************************************************
2904 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
2908 CM_Get_DevNode_Custom_Property_ExA(
2909 _In_ DEVINST dnDevInst
,
2910 _In_ PCSTR pszCustomPropertyName
,
2911 _Out_opt_ PULONG pulRegDataType
,
2912 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
2913 _Inout_ PULONG pulLength
,
2915 _In_opt_ HMACHINE hMachine
)
2917 LPWSTR pszPropertyNameW
= NULL
;
2920 ULONG ulDataType
= REG_NONE
;
2923 TRACE("CM_Get_DevNode_Custom_Property_ExA(%lx %s %p %p %p %lx %p)\n",
2924 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
2925 Buffer
, pulLength
, ulFlags
, hMachine
);
2928 return CR_INVALID_POINTER
;
2930 ulLengthW
= *pulLength
* sizeof(WCHAR
);
2931 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
2933 return CR_OUT_OF_MEMORY
;
2935 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
2937 if (pszPropertyNameW
== NULL
)
2939 HeapFree(GetProcessHeap(), 0, BufferW
);
2940 return CR_OUT_OF_MEMORY
;
2943 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
2950 if (ret
== CR_SUCCESS
)
2952 if (ulDataType
== REG_SZ
||
2953 ulDataType
== REG_EXPAND_SZ
||
2954 ulDataType
== REG_MULTI_SZ
)
2956 /* Do W->A conversion */
2957 *pulLength
= WideCharToMultiByte(CP_ACP
,
2960 lstrlenW(BufferW
) + 1,
2965 if (*pulLength
== 0)
2970 /* Directly copy the value */
2971 if (ulLengthW
<= *pulLength
)
2972 memcpy(Buffer
, BufferW
, ulLengthW
);
2975 *pulLength
= ulLengthW
;
2976 ret
= CR_BUFFER_SMALL
;
2982 *pulRegDataType
= ulDataType
;
2984 HeapFree(GetProcessHeap(), 0, BufferW
);
2985 MyFree(pszPropertyNameW
);
2991 /***********************************************************************
2992 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
2996 CM_Get_DevNode_Custom_Property_ExW(
2997 _In_ DEVINST dnDevInst
,
2998 _In_ PCWSTR pszCustomPropertyName
,
2999 _Out_opt_ PULONG pulRegDataType
,
3000 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3001 _Inout_ PULONG pulLength
,
3003 _In_opt_ HMACHINE hMachine
)
3005 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3006 HSTRING_TABLE StringTable
= NULL
;
3008 ULONG ulDataType
= REG_NONE
;
3009 ULONG ulTransferLength
;
3010 CONFIGRET ret
= CR_SUCCESS
;
3012 TRACE("CM_Get_DevNode_Custom_Property_ExW(%lx %s %p %p %p %lx %p)\n",
3013 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
3014 Buffer
, pulLength
, ulFlags
, hMachine
);
3017 return CR_INVALID_DEVNODE
;
3019 if (pszCustomPropertyName
== NULL
||
3020 pulLength
== NULL
||
3022 return CR_INVALID_POINTER
;
3024 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
3025 return CR_INVALID_FLAG
;
3027 if (hMachine
!= NULL
)
3029 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3030 if (BindingHandle
== NULL
)
3033 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3034 if (StringTable
== 0)
3039 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3043 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3044 if (lpDevInst
== NULL
)
3045 return CR_INVALID_DEVNODE
;
3047 ulTransferLength
= *pulLength
;
3051 ret
= PNP_GetCustomDevProp(BindingHandle
,
3053 (LPWSTR
)pszCustomPropertyName
,
3060 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3062 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3066 if (ret
== CR_SUCCESS
)
3068 if (pulRegDataType
!= NULL
)
3069 *pulRegDataType
= ulDataType
;
3076 /***********************************************************************
3077 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
3081 CM_Get_DevNode_Registry_PropertyA(
3082 _In_ DEVINST dnDevInst
,
3083 _In_ ULONG ulProperty
,
3084 _Out_opt_ PULONG pulRegDataType
,
3085 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3086 _Inout_ PULONG pulLength
,
3089 TRACE("CM_Get_DevNode_Registry_PropertyA(%lx %lu %p %p %p %lx)\n",
3090 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3092 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
3093 pulRegDataType
, Buffer
,
3094 pulLength
, ulFlags
, NULL
);
3098 /***********************************************************************
3099 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
3103 CM_Get_DevNode_Registry_PropertyW(
3104 _In_ DEVINST dnDevInst
,
3105 _In_ ULONG ulProperty
,
3106 _Out_opt_ PULONG pulRegDataType
,
3107 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3108 _Inout_ PULONG pulLength
,
3111 TRACE("CM_Get_DevNode_Registry_PropertyW(%lx %lu %p %p %p %lx)\n",
3112 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3114 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
3115 pulRegDataType
, Buffer
,
3116 pulLength
, ulFlags
, NULL
);
3120 /***********************************************************************
3121 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
3125 CM_Get_DevNode_Registry_Property_ExA(
3126 _In_ DEVINST dnDevInst
,
3127 _In_ ULONG ulProperty
,
3128 _Out_opt_ PULONG pulRegDataType
,
3129 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3130 _Inout_ PULONG pulLength
,
3132 _In_opt_ HMACHINE hMachine
)
3136 ULONG ulDataType
= REG_NONE
;
3139 TRACE("CM_Get_DevNode_Registry_Property_ExA(%lx %lu %p %p %p %lx %p)\n",
3140 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3144 return CR_INVALID_POINTER
;
3146 LengthW
= *pulLength
* sizeof(WCHAR
);
3147 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
3150 return CR_OUT_OF_MEMORY
;
3152 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
3160 if (ret
== CR_SUCCESS
)
3162 if (ulDataType
== REG_SZ
||
3163 ulDataType
== REG_EXPAND_SZ
||
3164 ulDataType
== REG_MULTI_SZ
)
3166 /* Do W->A conversion */
3167 *pulLength
= WideCharToMultiByte(CP_ACP
,
3170 lstrlenW(BufferW
) + 1,
3175 if (*pulLength
== 0)
3180 /* Directly copy the value */
3181 if (LengthW
<= *pulLength
)
3182 memcpy(Buffer
, BufferW
, LengthW
);
3185 *pulLength
= LengthW
;
3186 ret
= CR_BUFFER_SMALL
;
3192 *pulRegDataType
= ulDataType
;
3194 HeapFree(GetProcessHeap(), 0, BufferW
);
3200 /***********************************************************************
3201 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
3205 CM_Get_DevNode_Registry_Property_ExW(
3206 _In_ DEVINST dnDevInst
,
3207 _In_ ULONG ulProperty
,
3208 _Out_opt_ PULONG pulRegDataType
,
3209 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3210 _Inout_ PULONG pulLength
,
3212 _In_opt_ HMACHINE hMachine
)
3214 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3215 HSTRING_TABLE StringTable
= NULL
;
3216 CONFIGRET ret
= CR_SUCCESS
;
3218 ULONG ulDataType
= REG_NONE
;
3219 ULONG ulTransferLength
= 0;
3221 TRACE("CM_Get_DevNode_Registry_Property_ExW(%lx %lu %p %p %p %lx %p)\n",
3222 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3226 return CR_INVALID_DEVNODE
;
3228 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
3229 return CR_INVALID_PROPERTY
;
3231 /* pulRegDataType is optional */
3233 /* Buffer is optional */
3235 if (pulLength
== NULL
)
3236 return CR_INVALID_POINTER
;
3238 if (*pulLength
== 0)
3239 return CR_INVALID_POINTER
;
3242 return CR_INVALID_FLAG
;
3244 if (hMachine
!= NULL
)
3246 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3247 if (BindingHandle
== NULL
)
3250 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3251 if (StringTable
== 0)
3256 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3260 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3261 if (lpDevInst
== NULL
)
3262 return CR_INVALID_DEVNODE
;
3264 ulTransferLength
= *pulLength
;
3268 ret
= PNP_GetDeviceRegProp(BindingHandle
,
3277 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3279 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3283 if (ret
== CR_SUCCESS
)
3285 if (pulRegDataType
!= NULL
)
3286 *pulRegDataType
= ulDataType
;
3293 /***********************************************************************
3294 * CM_Get_DevNode_Status [SETUPAPI.@]
3298 CM_Get_DevNode_Status(
3299 _Out_ PULONG pulStatus
,
3300 _Out_ PULONG pulProblemNumber
,
3301 _In_ DEVINST dnDevInst
,
3304 TRACE("CM_Get_DevNode_Status(%p %p %lx %lx)\n",
3305 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
3307 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
3312 /***********************************************************************
3313 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
3317 CM_Get_DevNode_Status_Ex(
3318 _Out_ PULONG pulStatus
,
3319 _Out_ PULONG pulProblemNumber
,
3320 _In_ DEVINST dnDevInst
,
3322 _In_opt_ HMACHINE hMachine
)
3324 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3325 HSTRING_TABLE StringTable
= NULL
;
3329 TRACE("CM_Get_DevNode_Status_Ex(%p %p %lx %lx %p)\n",
3330 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
3332 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
3333 return CR_INVALID_POINTER
;
3336 return CR_INVALID_DEVINST
;
3339 return CR_INVALID_FLAG
;
3341 if (hMachine
!= NULL
)
3343 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3344 if (BindingHandle
== NULL
)
3347 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3348 if (StringTable
== 0)
3353 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3357 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3358 if (lpDevInst
== NULL
)
3359 return CR_INVALID_DEVNODE
;
3363 ret
= PNP_GetDeviceStatus(BindingHandle
,
3369 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3371 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3379 /***********************************************************************
3380 * CM_Get_Device_IDA [SETUPAPI.@]
3385 _In_ DEVINST dnDevInst
,
3386 _Out_writes_(BufferLen
) PCHAR Buffer
,
3387 _In_ ULONG BufferLen
,
3390 TRACE("CM_Get_Device_IDA(%lx %p %lu %lx)\n",
3391 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3393 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3397 /***********************************************************************
3398 * CM_Get_Device_IDW [SETUPAPI.@]
3403 _In_ DEVINST dnDevInst
,
3404 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3405 _In_ ULONG BufferLen
,
3408 TRACE("CM_Get_Device_IDW(%lx %p %lu %lx)\n",
3409 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3411 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3415 /***********************************************************************
3416 * CM_Get_Device_ID_ExA [SETUPAPI.@]
3420 CM_Get_Device_ID_ExA(
3421 _In_ DEVINST dnDevInst
,
3422 _Out_writes_(BufferLen
) PCHAR Buffer
,
3423 _In_ ULONG BufferLen
,
3425 _In_opt_ HMACHINE hMachine
)
3427 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
3428 CONFIGRET ret
= CR_SUCCESS
;
3430 TRACE("CM_Get_Device_ID_ExA(%lx %p %lu %lx %p)\n",
3431 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3434 return CR_INVALID_POINTER
;
3436 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
3441 if (ret
== CR_SUCCESS
)
3443 if (WideCharToMultiByte(CP_ACP
,
3446 lstrlenW(szBufferW
) + 1,
3458 /***********************************************************************
3459 * CM_Get_Device_ID_ExW [SETUPAPI.@]
3463 CM_Get_Device_ID_ExW(
3464 _In_ DEVINST dnDevInst
,
3465 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3466 _In_ ULONG BufferLen
,
3468 _In_opt_ HMACHINE hMachine
)
3470 HSTRING_TABLE StringTable
= NULL
;
3472 TRACE("CM_Get_Device_ID_ExW(%lx %p %lu %lx %p)\n",
3473 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3476 return CR_INVALID_DEVINST
;
3479 return CR_INVALID_POINTER
;
3482 return CR_INVALID_FLAG
;
3484 if (hMachine
!= NULL
)
3486 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3487 if (StringTable
== NULL
)
3492 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3496 if (!pSetupStringTableStringFromIdEx(StringTable
,
3506 /***********************************************************************
3507 * CM_Get_Device_ID_ListA [SETUPAPI.@]
3511 CM_Get_Device_ID_ListA(
3512 _In_ PCSTR pszFilter
,
3513 _Out_writes_(BufferLen
) PCHAR Buffer
,
3514 _In_ ULONG BufferLen
,
3517 TRACE("CM_Get_Device_ID_ListA(%p %p %lu %lx)\n",
3518 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3520 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
3525 /***********************************************************************
3526 * CM_Get_Device_ID_ListW [SETUPAPI.@]
3530 CM_Get_Device_ID_ListW(
3531 _In_ PCWSTR pszFilter
,
3532 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3533 _In_ ULONG BufferLen
,
3536 TRACE("CM_Get_Device_ID_ListW(%p %p %lu %lx)\n",
3537 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3539 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
3544 /***********************************************************************
3545 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
3549 CM_Get_Device_ID_List_ExA(
3550 _In_ PCSTR pszFilter
,
3551 _Out_writes_(BufferLen
) PCHAR Buffer
,
3552 _In_ ULONG BufferLen
,
3554 _In_opt_ HMACHINE hMachine
)
3556 LPWSTR BufferW
= NULL
;
3557 LPWSTR pszFilterW
= NULL
;
3558 CONFIGRET ret
= CR_SUCCESS
;
3560 TRACE("CM_Get_Device_ID_List_ExA(%p %p %lu %lx %p)\n",
3561 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3563 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
3564 if (BufferW
== NULL
)
3565 return CR_OUT_OF_MEMORY
;
3567 if (pszFilter
== NULL
)
3569 ret
= CM_Get_Device_ID_List_ExW(NULL
,
3577 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3579 ret
= CR_INVALID_DEVICE_ID
;
3583 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
3592 if (WideCharToMultiByte(CP_ACP
,
3595 lstrlenW(BufferW
) + 1,
3609 /***********************************************************************
3610 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
3614 CM_Get_Device_ID_List_ExW(
3615 _In_ PCWSTR pszFilter
,
3616 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3617 _In_ ULONG BufferLen
,
3619 _In_opt_ HMACHINE hMachine
)
3621 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3624 TRACE("CM_Get_Device_ID_List_ExW(%p %p %lu %lx %p)\n",
3625 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3627 if (Buffer
== NULL
|| BufferLen
== 0)
3628 return CR_INVALID_POINTER
;
3630 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3631 return CR_INVALID_FLAG
;
3633 if (hMachine
!= NULL
)
3635 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3636 if (BindingHandle
== NULL
)
3641 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3649 ret
= PNP_GetDeviceList(BindingHandle
,
3655 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3657 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3665 /***********************************************************************
3666 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
3670 CM_Get_Device_ID_List_SizeA(
3671 _Out_ PULONG pulLen
,
3672 _In_opt_ PCSTR pszFilter
,
3675 TRACE("CM_Get_Device_ID_List_SizeA(%p %s %lx)\n",
3676 pulLen
, debugstr_a(pszFilter
), ulFlags
);
3678 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
3682 /***********************************************************************
3683 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
3687 CM_Get_Device_ID_List_SizeW(
3688 _Out_ PULONG pulLen
,
3689 _In_opt_ PCWSTR pszFilter
,
3692 TRACE("CM_Get_Device_ID_List_SizeW(%p %s %lx)\n",
3693 pulLen
, debugstr_w(pszFilter
), ulFlags
);
3695 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
3699 /***********************************************************************
3700 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
3704 CM_Get_Device_ID_List_Size_ExA(
3705 _Out_ PULONG pulLen
,
3706 _In_opt_ PCSTR pszFilter
,
3708 _In_opt_ HMACHINE hMachine
)
3710 LPWSTR pszFilterW
= NULL
;
3711 CONFIGRET ret
= CR_SUCCESS
;
3713 FIXME("CM_Get_Device_ID_List_Size_ExA(%p %s %lx %p)\n",
3714 pulLen
, debugstr_a(pszFilter
), ulFlags
, hMachine
);
3716 if (pszFilter
== NULL
)
3718 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3725 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3726 return CR_INVALID_DEVICE_ID
;
3728 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3740 /***********************************************************************
3741 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
3745 CM_Get_Device_ID_List_Size_ExW(
3746 _Out_ PULONG pulLen
,
3747 _In_opt_ PCWSTR pszFilter
,
3749 _In_opt_ HMACHINE hMachine
)
3751 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3754 FIXME("CM_Get_Device_ID_List_Size_ExW(%p %s %lx %p)\n",
3755 pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
3758 return CR_INVALID_POINTER
;
3760 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3761 return CR_INVALID_FLAG
;
3763 if (hMachine
!= NULL
)
3765 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3766 if (BindingHandle
== NULL
)
3771 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3779 ret
= PNP_GetDeviceListSize(BindingHandle
,
3784 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3786 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3794 /***********************************************************************
3795 * CM_Get_Device_ID_Size [SETUPAPI.@]
3799 CM_Get_Device_ID_Size(
3800 _Out_ PULONG pulLen
,
3801 _In_ DEVINST dnDevInst
,
3804 TRACE("CM_Get_Device_ID_Size(%p %lx %lx)\n",
3805 pulLen
, dnDevInst
, ulFlags
);
3807 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
3811 /***********************************************************************
3812 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
3816 CM_Get_Device_ID_Size_Ex(
3817 _Out_ PULONG pulLen
,
3818 _In_ DEVINST dnDevInst
,
3820 _In_opt_ HMACHINE hMachine
)
3822 HSTRING_TABLE StringTable
= NULL
;
3825 TRACE("CM_Get_Device_ID_Size_Ex(%p %lx %lx %p)\n",
3826 pulLen
, dnDevInst
, ulFlags
, hMachine
);
3829 return CR_INVALID_POINTER
;
3832 return CR_INVALID_DEVINST
;
3835 return CR_INVALID_FLAG
;
3837 if (hMachine
!= NULL
)
3839 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3840 if (StringTable
== NULL
)
3845 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3849 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3850 if (DeviceId
== NULL
)
3856 *pulLen
= lstrlenW(DeviceId
);
3862 /***********************************************************************
3863 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
3867 CM_Get_Device_Interface_AliasA(
3868 _In_ LPCSTR pszDeviceInterface
,
3869 _In_ LPGUID AliasInterfaceGuid
,
3870 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
3871 _Inout_ PULONG pulLength
,
3874 TRACE("CM_Get_Device_Interface_AliasA(%p %p %p %p %lx)\n",
3875 pszDeviceInterface
, AliasInterfaceGuid
,
3876 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3878 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
3879 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3884 /***********************************************************************
3885 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
3889 CM_Get_Device_Interface_AliasW(
3890 _In_ LPCWSTR pszDeviceInterface
,
3891 _In_ LPGUID AliasInterfaceGuid
,
3892 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
3893 _Inout_ PULONG pulLength
,
3896 TRACE("CM_Get_Device_Interface_AliasW(%p %p %p %p %lx)\n",
3897 pszDeviceInterface
, AliasInterfaceGuid
,
3898 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3900 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
3901 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3906 /***********************************************************************
3907 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
3911 CM_Get_Device_Interface_Alias_ExA(
3912 _In_ LPCSTR pszDeviceInterface
,
3913 _In_ LPGUID AliasInterfaceGuid
,
3914 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
3915 _Inout_ PULONG pulLength
,
3917 _In_opt_ HMACHINE hMachine
)
3919 FIXME("CM_Get_Device_Interface_Alias_ExA(%p %p %p %p %lx %p)\n",
3920 pszDeviceInterface
, AliasInterfaceGuid
,
3921 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
3923 return CR_CALL_NOT_IMPLEMENTED
;
3927 /***********************************************************************
3928 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
3932 CM_Get_Device_Interface_Alias_ExW(
3933 _In_ LPCWSTR pszDeviceInterface
,
3934 _In_ LPGUID AliasInterfaceGuid
,
3935 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
3936 _Inout_ PULONG pulLength
,
3938 _In_opt_ HMACHINE hMachine
)
3940 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3941 ULONG ulTransferLength
;
3942 CONFIGRET ret
= CR_SUCCESS
;
3944 TRACE("CM_Get_Device_Interface_Alias_ExW(%p %p %p %p %lx %p)\n",
3945 pszDeviceInterface
, AliasInterfaceGuid
,
3946 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
3948 if (pszDeviceInterface
== NULL
||
3949 AliasInterfaceGuid
== NULL
||
3950 pszAliasDeviceInterface
== NULL
||
3952 return CR_INVALID_POINTER
;
3955 return CR_INVALID_FLAG
;
3957 if (hMachine
!= NULL
)
3959 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3960 if (BindingHandle
== NULL
)
3965 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3969 ulTransferLength
= *pulLength
;
3973 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
3974 (LPWSTR
)pszDeviceInterface
,
3976 pszAliasDeviceInterface
,
3981 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3983 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3991 /***********************************************************************
3992 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
3996 CM_Get_Device_Interface_ListA(
3997 _In_ LPGUID InterfaceClassGuid
,
3998 _In_opt_ DEVINSTID_A pDeviceID
,
3999 _Out_writes_(BufferLen
) PCHAR Buffer
,
4000 _In_ ULONG BufferLen
,
4003 TRACE("CM_Get_Device_Interface_ListA(%s %s %p %lu 0x%08lx)\n",
4004 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4005 Buffer
, BufferLen
, ulFlags
);
4007 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
4008 Buffer
, BufferLen
, ulFlags
, NULL
);
4012 /***********************************************************************
4013 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
4017 CM_Get_Device_Interface_ListW(
4018 _In_ LPGUID InterfaceClassGuid
,
4019 _In_opt_ DEVINSTID_W pDeviceID
,
4020 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4021 _In_ ULONG BufferLen
,
4024 TRACE("CM_Get_Device_Interface_ListW(%s %s %p %lu 0x%08lx)\n",
4025 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4026 Buffer
, BufferLen
, ulFlags
);
4028 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
4029 Buffer
, BufferLen
, ulFlags
, NULL
);
4033 /***********************************************************************
4034 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
4038 CM_Get_Device_Interface_List_ExA(
4039 _In_ LPGUID InterfaceClassGuid
,
4040 _In_opt_ DEVINSTID_A pDeviceID
,
4041 _Out_writes_(BufferLen
) PCHAR Buffer
,
4042 _In_ ULONG BufferLen
,
4044 _In_opt_ HMACHINE hMachine
)
4046 DEVINSTID_W pDeviceIdW
= NULL
;
4047 PWCHAR BufferW
= NULL
;
4048 CONFIGRET ret
= CR_SUCCESS
;
4050 TRACE("CM_Get_Device_Interface_List_ExA(%s %s %p %lu 0x%08lx %p)\n",
4051 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4052 Buffer
, BufferLen
, ulFlags
, hMachine
);
4054 if (Buffer
== NULL
||
4056 return CR_INVALID_POINTER
;
4058 if (pDeviceID
!= NULL
)
4060 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4061 return CR_INVALID_DEVICE_ID
;
4064 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
4065 if (BufferW
== NULL
)
4067 ret
= CR_OUT_OF_MEMORY
;
4071 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
4072 BufferW
, BufferLen
, ulFlags
,
4074 if (ret
!= CR_SUCCESS
)
4077 if (WideCharToMultiByte(CP_ACP
,
4080 lstrlenW(BufferW
) + 1,
4088 if (BufferW
!= NULL
)
4091 if (pDeviceIdW
!= NULL
)
4098 /***********************************************************************
4099 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
4103 CM_Get_Device_Interface_List_ExW(
4104 _In_ LPGUID InterfaceClassGuid
,
4105 _In_opt_ DEVINSTID_W pDeviceID
,
4106 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4107 _In_ ULONG BufferLen
,
4109 _In_opt_ HMACHINE hMachine
)
4111 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4112 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
4113 CONFIGRET ret
= CR_SUCCESS
;
4115 TRACE("CM_Get_Device_Interface_List_ExW(%s %s %p %lu 0x%08lx %p)\n",
4116 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4117 Buffer
, BufferLen
, ulFlags
, hMachine
);
4119 if (Buffer
== NULL
||
4121 return CR_INVALID_POINTER
;
4123 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4124 return CR_INVALID_FLAG
;
4126 if (hMachine
!= NULL
)
4128 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4129 if (BindingHandle
== NULL
)
4134 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4139 BufferSize
= BufferLen
;
4143 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
4150 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4152 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4160 /***********************************************************************
4161 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
4165 CM_Get_Device_Interface_List_SizeA(
4166 _Out_ PULONG pulLen
,
4167 _In_ LPGUID InterfaceClassGuid
,
4168 _In_opt_ DEVINSTID_A pDeviceID
,
4171 TRACE("CM_Get_Device_Interface_List_SizeA(%p %p %s 0x%08lx)\n",
4172 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
);
4174 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
4175 pDeviceID
, ulFlags
, NULL
);
4179 /***********************************************************************
4180 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
4184 CM_Get_Device_Interface_List_SizeW(
4185 _Out_ PULONG pulLen
,
4186 _In_ LPGUID InterfaceClassGuid
,
4187 _In_opt_ DEVINSTID_W pDeviceID
,
4190 TRACE("CM_Get_Device_Interface_List_SizeW(%p %p %s 0x%08lx)\n",
4191 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
);
4193 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4194 pDeviceID
, ulFlags
, NULL
);
4198 /***********************************************************************
4199 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
4203 CM_Get_Device_Interface_List_Size_ExA(
4204 _Out_ PULONG pulLen
,
4205 _In_ LPGUID InterfaceClassGuid
,
4206 _In_opt_ DEVINSTID_A pDeviceID
,
4208 _In_opt_ HMACHINE hMachine
)
4210 DEVINSTID_W pDeviceIdW
= NULL
;
4211 CONFIGRET ret
= CR_SUCCESS
;
4213 TRACE("CM_Get_Device_Interface_List_Size_ExA(%p %p %s 0x%08lx %p)\n",
4214 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
4217 return CR_INVALID_POINTER
;
4219 if (pDeviceID
!= NULL
)
4221 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4222 return CR_INVALID_DEVICE_ID
;
4227 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4228 pDeviceIdW
, ulFlags
, hMachine
);
4230 if (pDeviceIdW
!= NULL
)
4237 /***********************************************************************
4238 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
4242 CM_Get_Device_Interface_List_Size_ExW(
4243 _Out_ PULONG pulLen
,
4244 _In_ LPGUID InterfaceClassGuid
,
4245 _In_opt_ DEVINSTID_W pDeviceID
,
4247 _In_opt_ HMACHINE hMachine
)
4249 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4250 CONFIGRET ret
= CR_SUCCESS
;
4252 TRACE("CM_Get_Device_Interface_List_Size_ExW(%p %p %s 0x%08lx %p)\n",
4253 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
4256 return CR_INVALID_POINTER
;
4258 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4259 return CR_INVALID_FLAG
;
4261 if (hMachine
!= NULL
)
4263 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4264 if (BindingHandle
== NULL
)
4269 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4277 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
4283 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4285 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4293 /***********************************************************************
4294 * CM_Get_First_Log_Conf [SETUPAPI.@]
4298 CM_Get_First_Log_Conf(
4299 _Out_opt_ PLOG_CONF plcLogConf
,
4300 _In_ DEVINST dnDevInst
,
4303 TRACE("CM_Get_First_Log_Conf(%p %lx %lx)\n",
4304 plcLogConf
, dnDevInst
, ulFlags
);
4306 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
4310 /***********************************************************************
4311 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
4315 CM_Get_First_Log_Conf_Ex(
4316 _Out_opt_ PLOG_CONF plcLogConf
,
4317 _In_ DEVINST dnDevInst
,
4319 _In_opt_ HMACHINE hMachine
)
4321 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4322 HSTRING_TABLE StringTable
= NULL
;
4323 LPWSTR lpDevInst
= NULL
;
4324 CONFIGRET ret
= CR_SUCCESS
;
4326 PLOG_CONF_INFO pLogConfInfo
;
4328 FIXME("CM_Get_First_Log_Conf_Ex(%p %lx %lx %p)\n",
4329 plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
4332 return CR_INVALID_DEVINST
;
4334 if (ulFlags
& ~LOG_CONF_BITS
)
4335 return CR_INVALID_FLAG
;
4340 if (hMachine
!= NULL
)
4342 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4343 if (BindingHandle
== NULL
)
4346 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4347 if (StringTable
== 0)
4352 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4356 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4357 if (lpDevInst
== NULL
)
4358 return CR_INVALID_DEVNODE
;
4362 ret
= PNP_GetFirstLogConf(BindingHandle
,
4368 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4370 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4374 if (ret
!= CR_SUCCESS
)
4379 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4380 if (pLogConfInfo
== NULL
)
4381 return CR_OUT_OF_MEMORY
;
4383 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4384 pLogConfInfo
->dnDevInst
= dnDevInst
;
4385 pLogConfInfo
->ulFlags
= ulFlags
;
4386 pLogConfInfo
->ulTag
= ulTag
;
4388 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
4395 /***********************************************************************
4396 * CM_Get_Global_State [SETUPAPI.@]
4400 CM_Get_Global_State(
4401 _Out_ PULONG pulState
,
4404 TRACE("CM_Get_Global_State(%p %lx)\n",
4407 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
4411 /***********************************************************************
4412 * CM_Get_Global_State_Ex [SETUPAPI.@]
4416 CM_Get_Global_State_Ex(
4417 _Out_ PULONG pulState
,
4419 _In_opt_ HMACHINE hMachine
)
4421 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4424 TRACE("CM_Get_Global_State_Ex(%p %lx %p)\n",
4425 pulState
, ulFlags
, hMachine
);
4427 if (pulState
== NULL
)
4428 return CR_INVALID_POINTER
;
4431 return CR_INVALID_FLAG
;
4433 if (hMachine
!= NULL
)
4435 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4436 if (BindingHandle
== NULL
)
4441 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4447 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
4449 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4451 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4459 /***********************************************************************
4460 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
4464 CM_Get_HW_Prof_FlagsA(
4465 _In_ DEVINSTID_A szDevInstName
,
4466 _In_ ULONG ulHardwareProfile
,
4467 _Out_ PULONG pulValue
,
4470 TRACE("CM_Get_HW_Prof_FlagsA(%s %lu %p %lx)\n",
4471 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4473 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
4474 pulValue
, ulFlags
, NULL
);
4478 /***********************************************************************
4479 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
4483 CM_Get_HW_Prof_FlagsW(
4484 _In_ DEVINSTID_W szDevInstName
,
4485 _In_ ULONG ulHardwareProfile
,
4486 _Out_ PULONG pulValue
,
4489 TRACE("CM_Get_HW_Prof_FlagsW(%s %lu %p %lx)\n",
4490 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4492 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
4493 pulValue
, ulFlags
, NULL
);
4497 /***********************************************************************
4498 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
4502 CM_Get_HW_Prof_Flags_ExA(
4503 _In_ DEVINSTID_A szDevInstName
,
4504 _In_ ULONG ulHardwareProfile
,
4505 _Out_ PULONG pulValue
,
4507 _In_opt_ HMACHINE hMachine
)
4509 DEVINSTID_W pszDevIdW
= NULL
;
4510 CONFIGRET ret
= CR_SUCCESS
;
4512 TRACE("CM_Get_HW_Prof_Flags_ExA(%s %lu %p %lx %p)\n",
4513 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4515 if (szDevInstName
!= NULL
)
4517 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
4518 return CR_INVALID_DEVICE_ID
;
4521 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
4522 pulValue
, ulFlags
, hMachine
);
4524 if (pszDevIdW
!= NULL
)
4531 /***********************************************************************
4532 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
4536 CM_Get_HW_Prof_Flags_ExW(
4537 _In_ DEVINSTID_W szDevInstName
,
4538 _In_ ULONG ulHardwareProfile
,
4539 _Out_ PULONG pulValue
,
4541 _In_opt_ HMACHINE hMachine
)
4543 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4546 FIXME("CM_Get_HW_Prof_Flags_ExW(%s %lu %p %lx %p)\n",
4547 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4549 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
4550 return CR_INVALID_POINTER
;
4553 return CR_INVALID_FLAG
;
4555 /* FIXME: Check whether szDevInstName is valid */
4557 if (hMachine
!= NULL
)
4559 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4560 if (BindingHandle
== NULL
)
4565 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4571 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
4572 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
4574 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4576 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4584 /***********************************************************************
4585 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
4589 CM_Get_Hardware_Profile_InfoA(
4591 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4594 TRACE("CM_Get_Hardware_Profile_InfoA(%lu %p %lx)\n",
4595 ulIndex
, pHWProfileInfo
, ulFlags
);
4597 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
4602 /***********************************************************************
4603 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
4607 CM_Get_Hardware_Profile_InfoW(
4609 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4612 TRACE("CM_Get_Hardware_Profile_InfoW(%lu %p %lx)\n",
4613 ulIndex
, pHWProfileInfo
, ulFlags
);
4615 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
4620 /***********************************************************************
4621 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
4625 CM_Get_Hardware_Profile_Info_ExA(
4627 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4629 _In_opt_ HMACHINE hMachine
)
4631 HWPROFILEINFO_W LocalProfileInfo
;
4634 TRACE("CM_Get_Hardware_Profile_Info_ExA(%lu %p %lx %p)\n",
4635 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4637 if (pHWProfileInfo
== NULL
)
4638 return CR_INVALID_POINTER
;
4640 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
4642 if (ret
== CR_SUCCESS
)
4644 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
4645 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
4647 if (WideCharToMultiByte(CP_ACP
,
4649 LocalProfileInfo
.HWPI_szFriendlyName
,
4650 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
4651 pHWProfileInfo
->HWPI_szFriendlyName
,
4662 /***********************************************************************
4663 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
4667 CM_Get_Hardware_Profile_Info_ExW(
4669 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4671 _In_opt_ HMACHINE hMachine
)
4673 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4676 TRACE("CM_Get_Hardware_Profile_Info_ExW(%lu %p %lx %p)\n",
4677 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4679 if (pHWProfileInfo
== NULL
)
4680 return CR_INVALID_POINTER
;
4683 return CR_INVALID_FLAG
;
4685 if (hMachine
!= NULL
)
4687 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4688 if (BindingHandle
== NULL
)
4693 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4699 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
4700 sizeof(HWPROFILEINFO_W
), 0);
4702 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4704 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4712 /***********************************************************************
4713 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
4717 CM_Get_Log_Conf_Priority(
4718 _In_ LOG_CONF lcLogConf
,
4719 _Out_ PPRIORITY pPriority
,
4722 TRACE("CM_Get_Log_Conf_Priority(%p %p %lx)\n",
4723 lcLogConf
, pPriority
, ulFlags
);
4725 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
4729 /***********************************************************************
4730 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
4734 CM_Get_Log_Conf_Priority_Ex(
4735 _In_ LOG_CONF lcLogConf
,
4736 _Out_ PPRIORITY pPriority
,
4738 _In_opt_ HMACHINE hMachine
)
4740 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4741 HSTRING_TABLE StringTable
= NULL
;
4742 PLOG_CONF_INFO pLogConfInfo
;
4746 FIXME("CM_Get_Log_Conf_Priority_Ex(%p %p %lx %p)\n",
4747 lcLogConf
, pPriority
, ulFlags
, hMachine
);
4749 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4750 if (!IsValidLogConf(pLogConfInfo
))
4751 return CR_INVALID_LOG_CONF
;
4753 if (pPriority
== NULL
)
4754 return CR_INVALID_POINTER
;
4757 return CR_INVALID_FLAG
;
4759 if (hMachine
!= NULL
)
4761 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4762 if (BindingHandle
== NULL
)
4765 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4766 if (StringTable
== 0)
4771 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4775 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4776 if (lpDevInst
== NULL
)
4777 return CR_INVALID_DEVNODE
;
4781 ret
= PNP_GetLogConfPriority(BindingHandle
,
4783 pLogConfInfo
->ulFlags
,
4784 pLogConfInfo
->ulTag
,
4788 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4790 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4798 /***********************************************************************
4799 * CM_Get_Next_Log_Conf [SETUPAPI.@]
4803 CM_Get_Next_Log_Conf(
4804 _Out_opt_ PLOG_CONF plcLogConf
,
4805 _In_ LOG_CONF lcLogConf
,
4808 TRACE("CM_Get_Next_Log_Conf(%p %p %lx)\n",
4809 plcLogConf
, lcLogConf
, ulFlags
);
4811 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
4815 /***********************************************************************
4816 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
4820 CM_Get_Next_Log_Conf_Ex(
4821 _Out_opt_ PLOG_CONF plcLogConf
,
4822 _In_ LOG_CONF lcLogConf
,
4824 _In_opt_ HMACHINE hMachine
)
4826 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4827 HSTRING_TABLE StringTable
= NULL
;
4828 PLOG_CONF_INFO pLogConfInfo
;
4829 PLOG_CONF_INFO pNewLogConfInfo
;
4834 FIXME("CM_Get_Next_Log_Conf_Ex(%p %p %lx %p)\n",
4835 plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
4840 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4841 if (!IsValidLogConf(pLogConfInfo
))
4842 return CR_INVALID_LOG_CONF
;
4845 return CR_INVALID_FLAG
;
4847 if (hMachine
!= NULL
)
4849 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4850 if (BindingHandle
== NULL
)
4853 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4854 if (StringTable
== 0)
4859 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4863 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4864 if (lpDevInst
== NULL
)
4865 return CR_INVALID_DEVNODE
;
4869 ret
= PNP_GetNextLogConf(BindingHandle
,
4871 pLogConfInfo
->ulFlags
,
4872 pLogConfInfo
->ulTag
,
4876 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4878 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4882 if (ret
!= CR_SUCCESS
)
4887 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4888 if (pNewLogConfInfo
== NULL
)
4889 return CR_OUT_OF_MEMORY
;
4891 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4892 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
4893 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
4894 pNewLogConfInfo
->ulTag
= ulNewTag
;
4896 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
4903 /***********************************************************************
4904 * CM_Get_Next_Re_Des [SETUPAPI.@]
4908 CM_Get_Next_Res_Des(
4909 _Out_ PRES_DES prdResDes
,
4910 _In_ RES_DES rdResDes
,
4911 _In_ RESOURCEID ForResource
,
4912 _Out_opt_ PRESOURCEID pResourceID
,
4915 TRACE("CM_Get_Next_Res_Des(%p %p %lu %p %lx)\n",
4916 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
);
4918 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
4919 pResourceID
, ulFlags
, NULL
);
4923 /***********************************************************************
4924 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
4928 CM_Get_Next_Res_Des_Ex(
4929 _Out_ PRES_DES prdResDes
,
4930 _In_ RES_DES rdResDes
,
4931 _In_ RESOURCEID ForResource
,
4932 _Out_opt_ PRESOURCEID pResourceID
,
4934 _In_opt_ HMACHINE hMachine
)
4936 FIXME("CM_Get_Next_Res_Des_Ex(%p %p %lu %p %lx %p)\n",
4937 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
, hMachine
);
4939 return CR_CALL_NOT_IMPLEMENTED
;
4943 /***********************************************************************
4944 * CM_Get_Parent [SETUPAPI.@]
4949 _Out_ PDEVINST pdnDevInst
,
4950 _In_ DEVINST dnDevInst
,
4953 TRACE("CM_Get_Parent(%p %p %lx)\n",
4954 pdnDevInst
, dnDevInst
, ulFlags
);
4956 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
4960 /***********************************************************************
4961 * CM_Get_Parent_Ex [SETUPAPI.@]
4966 _Out_ PDEVINST pdnDevInst
,
4967 _In_ DEVINST dnDevInst
,
4969 _In_opt_ HMACHINE hMachine
)
4971 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
4972 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4973 HSTRING_TABLE StringTable
= NULL
;
4975 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
4978 TRACE("CM_Get_Parent_Ex(%p %lx %lx %p)\n",
4979 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
4981 if (pdnDevInst
== NULL
)
4982 return CR_INVALID_POINTER
;
4985 return CR_INVALID_DEVINST
;
4988 return CR_INVALID_FLAG
;
4992 if (hMachine
!= NULL
)
4994 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4995 if (BindingHandle
== NULL
)
4998 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4999 if (StringTable
== 0)
5004 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5008 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5009 if (lpDevInst
== NULL
)
5010 return CR_INVALID_DEVNODE
;
5014 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5015 PNP_GET_PARENT_DEVICE_INSTANCE
,
5021 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5023 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5027 if (ret
!= CR_SUCCESS
)
5030 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5032 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5036 *pdnDevInst
= dwIndex
;
5042 /***********************************************************************
5043 * CM_Get_Res_Des_Data [SETUPAPI.@]
5047 CM_Get_Res_Des_Data(
5048 _In_ RES_DES rdResDes
,
5049 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5050 _In_ ULONG BufferLen
,
5053 TRACE("CM_Get_Res_Des_Data(%p %p %lu %lx)\n",
5054 rdResDes
, Buffer
, BufferLen
, ulFlags
);
5056 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
5060 /***********************************************************************
5061 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
5065 CM_Get_Res_Des_Data_Ex(
5066 _In_ RES_DES rdResDes
,
5067 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5068 _In_ ULONG BufferLen
,
5070 _In_opt_ HMACHINE hMachine
)
5072 FIXME("CM_Get_Res_Des_Data_Ex(%p %p %lu %lx %p)\n",
5073 rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
5075 return CR_CALL_NOT_IMPLEMENTED
;
5079 /***********************************************************************
5080 * CM_Get_Res_Des_Size [SETUPAPI.@]
5084 CM_Get_Res_Des_Data_Size(
5085 _Out_ PULONG pulSize
,
5086 _In_ RES_DES rdResDes
,
5089 TRACE("CM_Get_Res_Des_Data_Size(%p %p %lx)\n",
5090 pulSize
, rdResDes
, ulFlags
);
5092 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
5096 /***********************************************************************
5097 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
5101 CM_Get_Res_Des_Data_Size_Ex(
5102 _Out_ PULONG pulSize
,
5103 _In_ RES_DES rdResDes
,
5105 _In_opt_ HMACHINE hMachine
)
5107 TRACE("CM_Get_Res_Des_Data_Size_Ex(%p %p %lx %p)\n",
5108 pulSize
, rdResDes
, ulFlags
, hMachine
);
5110 return CR_CALL_NOT_IMPLEMENTED
;
5114 /***********************************************************************
5115 * CM_Get_Sibling [SETUPAPI.@]
5120 _Out_ PDEVINST pdnDevInst
,
5121 _In_ DEVINST dnDevInst
,
5124 TRACE("CM_Get_Sibling(%p %p %lx)\n",
5125 pdnDevInst
, dnDevInst
, ulFlags
);
5127 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5131 /***********************************************************************
5132 * CM_Get_Sibling_Ex [SETUPAPI.@]
5137 _Out_ PDEVINST pdnDevInst
,
5138 _In_ DEVINST dnDevInst
,
5140 _In_opt_ HMACHINE hMachine
)
5142 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5143 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5144 HSTRING_TABLE StringTable
= NULL
;
5146 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5149 TRACE("CM_Get_Sibling_Ex(%p %lx %lx %p)\n",
5150 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5152 if (pdnDevInst
== NULL
)
5153 return CR_INVALID_POINTER
;
5156 return CR_INVALID_DEVINST
;
5159 return CR_INVALID_FLAG
;
5163 if (hMachine
!= NULL
)
5165 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5166 if (BindingHandle
== NULL
)
5169 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5170 if (StringTable
== 0)
5175 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5179 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5180 if (lpDevInst
== NULL
)
5181 return CR_INVALID_DEVNODE
;
5185 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5186 PNP_GET_SIBLING_DEVICE_INSTANCE
,
5192 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5194 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5198 if (ret
!= CR_SUCCESS
)
5201 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5203 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5207 *pdnDevInst
= dwIndex
;
5213 /***********************************************************************
5214 * CM_Get_Version [SETUPAPI.@]
5218 CM_Get_Version(VOID
)
5220 TRACE("CM_Get_Version()\n");
5222 return CM_Get_Version_Ex(NULL
);
5226 /***********************************************************************
5227 * CM_Get_Version_Ex [SETUPAPI.@]
5232 _In_opt_ HMACHINE hMachine
)
5234 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5238 TRACE("CM_Get_Version_Ex(%p)\n", hMachine
);
5240 if (hMachine
!= NULL
)
5242 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5243 if (BindingHandle
== NULL
)
5248 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5254 ret
= PNP_GetVersion(BindingHandle
, &Version
);
5256 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5258 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5262 if (ret
!= CR_SUCCESS
)
5269 /***********************************************************************
5270 * CM_Intersect_Range_List [SETUPAPI.@]
5274 CM_Intersect_Range_List(
5275 _In_ RANGE_LIST rlhOld1
,
5276 _In_ RANGE_LIST rlhOld2
,
5277 _In_ RANGE_LIST rlhNew
,
5280 FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
5281 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5283 return CR_CALL_NOT_IMPLEMENTED
;
5287 /***********************************************************************
5288 * CM_Invert_Range_List [SETUPAPI.@]
5292 CM_Invert_Range_List(
5293 _In_ RANGE_LIST rlhOld
,
5294 _In_ RANGE_LIST rlhNew
,
5295 _In_ DWORDLONG ullMaxValue
,
5298 FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
5299 rlhOld
, rlhNew
, ullMaxValue
, ulFlags
);
5301 return CR_CALL_NOT_IMPLEMENTED
;
5305 /***********************************************************************
5306 * CM_Is_Dock_Station_Present [SETUPAPI.@]
5310 CM_Is_Dock_Station_Present(
5311 _Out_ PBOOL pbPresent
)
5313 TRACE("CM_Is_Dock_Station_Present(%p)\n",
5316 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
5320 /***********************************************************************
5321 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
5325 CM_Is_Dock_Station_Present_Ex(
5326 _Out_ PBOOL pbPresent
,
5327 _In_opt_ HMACHINE hMachine
)
5329 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5332 TRACE("CM_Is_Dock_Station_Present_Ex(%p %p)\n",
5333 pbPresent
, hMachine
);
5335 if (pbPresent
== NULL
)
5336 return CR_INVALID_POINTER
;
5340 if (hMachine
!= NULL
)
5342 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5343 if (BindingHandle
== NULL
)
5348 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5354 ret
= PNP_IsDockStationPresent(BindingHandle
,
5357 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5359 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5367 /***********************************************************************
5368 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5372 CM_Is_Version_Available(
5375 TRACE("CM_Is_Version_Available(%hu)\n",
5378 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
5382 /***********************************************************************
5383 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5387 CM_Is_Version_Available_Ex(
5389 _In_opt_ HMACHINE hMachine
)
5391 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5392 WORD wServerVersion
;
5395 TRACE("CM_Is_Version_Available_Ex(%hu %p)\n",
5396 wVersion
, hMachine
);
5398 if (wVersion
<= 0x400)
5401 if (hMachine
!= NULL
)
5403 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5404 if (BindingHandle
== NULL
)
5409 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5415 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
5417 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5419 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5423 if (ret
!= CR_SUCCESS
)
5426 return (wServerVersion
>= wVersion
);
5430 /***********************************************************************
5431 * CM_Locate_DevNodeA [SETUPAPI.@]
5436 _Out_ PDEVINST pdnDevInst
,
5437 _In_opt_ DEVINSTID_A pDeviceID
,
5440 TRACE("CM_Locate_DevNodeA(%p %s %lx)\n",
5441 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
);
5443 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5447 /***********************************************************************
5448 * CM_Locate_DevNodeW [SETUPAPI.@]
5453 _Out_ PDEVINST pdnDevInst
,
5454 _In_opt_ DEVINSTID_W pDeviceID
,
5457 TRACE("CM_Locate_DevNodeW(%p %s %lx)\n",
5458 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
5460 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5464 /***********************************************************************
5465 * CM_Locate_DevNode_ExA [SETUPAPI.@]
5469 CM_Locate_DevNode_ExA(
5470 _Out_ PDEVINST pdnDevInst
,
5471 _In_opt_ DEVINSTID_A pDeviceID
,
5473 _In_opt_ HMACHINE hMachine
)
5475 DEVINSTID_W pDevIdW
= NULL
;
5476 CONFIGRET ret
= CR_SUCCESS
;
5478 TRACE("CM_Locate_DevNode_ExA(%p %s %lx %p)\n",
5479 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
5481 if (pDeviceID
!= NULL
)
5483 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
5484 return CR_INVALID_DEVICE_ID
;
5487 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
5489 if (pDevIdW
!= NULL
)
5496 /***********************************************************************
5497 * CM_Locate_DevNode_ExW [SETUPAPI.@]
5501 CM_Locate_DevNode_ExW(
5502 _Out_ PDEVINST pdnDevInst
,
5503 _In_opt_ DEVINSTID_W pDeviceID
,
5505 _In_opt_ HMACHINE hMachine
)
5507 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
5508 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5509 HSTRING_TABLE StringTable
= NULL
;
5510 CONFIGRET ret
= CR_SUCCESS
;
5512 TRACE("CM_Locate_DevNode_ExW(%p %s %lx %p)\n",
5513 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
5515 if (pdnDevInst
== NULL
)
5516 return CR_INVALID_POINTER
;
5518 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
5519 return CR_INVALID_FLAG
;
5521 if (hMachine
!= NULL
)
5523 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5524 if (BindingHandle
== NULL
)
5527 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5528 if (StringTable
== 0)
5533 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5537 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
5539 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
5545 /* Get the root device ID */
5546 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
5550 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5552 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5556 if (ret
!= CR_SUCCESS
)
5559 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
5563 /* Validate the device ID */
5564 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
5568 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5570 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5574 if (ret
== CR_SUCCESS
)
5576 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
5577 if (*pdnDevInst
== -1)
5585 /***********************************************************************
5586 * CM_Merge_Range_List [SETUPAPI.@]
5590 CM_Merge_Range_List(
5591 _In_ RANGE_LIST rlhOld1
,
5592 _In_ RANGE_LIST rlhOld2
,
5593 _In_ RANGE_LIST rlhNew
,
5596 FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
5597 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5599 return CR_CALL_NOT_IMPLEMENTED
;
5603 /***********************************************************************
5604 * CM_Modify_Res_Des [SETUPAPI.@]
5609 _Out_ PRES_DES prdResDes
,
5610 _In_ RES_DES rdResDes
,
5611 _In_ RESOURCEID ResourceID
,
5612 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5613 _In_ ULONG ResourceLen
,
5616 TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
5617 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5618 ResourceLen
, ulFlags
);
5620 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5621 ResourceLen
, ulFlags
, NULL
);
5625 /***********************************************************************
5626 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
5630 CM_Modify_Res_Des_Ex(
5631 _Out_ PRES_DES prdResDes
,
5632 _In_ RES_DES rdResDes
,
5633 _In_ RESOURCEID ResourceID
,
5634 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5635 _In_ ULONG ResourceLen
,
5637 _In_opt_ HMACHINE hMachine
)
5639 FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %p)\n",
5640 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5641 ResourceLen
, ulFlags
, hMachine
);
5643 return CR_CALL_NOT_IMPLEMENTED
;
5647 /***********************************************************************
5648 * CM_Move_DevNode [SETUPAPI.@]
5653 _In_ DEVINST dnFromDevInst
,
5654 _In_ DEVINST dnToDevInst
,
5657 TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
5658 dnFromDevInst
, dnToDevInst
, ulFlags
);
5660 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
5664 /***********************************************************************
5665 * CM_Move_DevNode_Ex [SETUPAPI.@]
5670 _In_ DEVINST dnFromDevInst
,
5671 _In_ DEVINST dnToDevInst
,
5673 _In_opt_ HMACHINE hMachine
)
5675 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5676 HSTRING_TABLE StringTable
= NULL
;
5677 LPWSTR lpFromDevInst
;
5681 FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %p)\n",
5682 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
5684 if (!pSetupIsUserAdmin())
5685 return CR_ACCESS_DENIED
;
5687 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
5688 return CR_INVALID_DEVNODE
;
5691 return CR_INVALID_FLAG
;
5693 if (hMachine
!= NULL
)
5695 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5696 if (BindingHandle
== NULL
)
5699 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5700 if (StringTable
== 0)
5705 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5709 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
5710 if (lpFromDevInst
== NULL
)
5711 return CR_INVALID_DEVNODE
;
5713 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
5714 if (lpToDevInst
== NULL
)
5715 return CR_INVALID_DEVNODE
;
5719 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5725 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5727 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5735 /***********************************************************************
5736 * CM_Next_Range [SETUPAPI.@]
5741 _Inout_ PRANGE_ELEMENT preElement
,
5742 _Out_ PDWORDLONG pullStart
,
5743 _Out_ PDWORDLONG pullEnd
,
5746 FIXME("CM_Next_Range(%p %p %p %lx)\n",
5747 preElement
, pullStart
, pullEnd
, ulFlags
);
5749 return CR_CALL_NOT_IMPLEMENTED
;
5753 /***********************************************************************
5754 * CM_Open_Class_KeyA [SETUPAPI.@]
5759 _In_opt_ LPGUID pClassGuid
,
5760 _In_opt_ LPCSTR pszClassName
,
5761 _In_ REGSAM samDesired
,
5762 _In_ REGDISPOSITION Disposition
,
5763 _Out_ PHKEY phkClass
,
5766 TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
5767 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
5768 samDesired
, Disposition
, phkClass
, ulFlags
);
5770 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
5771 Disposition
, phkClass
, ulFlags
, NULL
);
5775 /***********************************************************************
5776 * CM_Open_Class_KeyW [SETUPAPI.@]
5781 _In_opt_ LPGUID pClassGuid
,
5782 _In_opt_ LPCWSTR pszClassName
,
5783 _In_ REGSAM samDesired
,
5784 _In_ REGDISPOSITION Disposition
,
5785 _Out_ PHKEY phkClass
,
5788 TRACE("CM_Open_Class_KeyW%p %s %lx %lx %p %lx)\n",
5789 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
5790 samDesired
, Disposition
, phkClass
, ulFlags
);
5792 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
5793 Disposition
, phkClass
, ulFlags
, NULL
);
5797 /***********************************************************************
5798 * CM_Open_Class_Key_ExA [SETUPAPI.@]
5802 CM_Open_Class_Key_ExA(
5803 _In_opt_ LPGUID pClassGuid
,
5804 _In_opt_ LPCSTR pszClassName
,
5805 _In_ REGSAM samDesired
,
5806 _In_ REGDISPOSITION Disposition
,
5807 _Out_ PHKEY phkClass
,
5809 _In_opt_ HMACHINE hMachine
)
5811 LPWSTR pszClassNameW
= NULL
;
5814 TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %p)\n",
5815 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
5816 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
5818 if (pszClassName
!= NULL
)
5820 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
5821 return CR_INVALID_DATA
;
5824 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
5825 Disposition
, phkClass
, ulFlags
, hMachine
);
5827 if (pszClassNameW
!= NULL
)
5828 MyFree(pszClassNameW
);
5834 /***********************************************************************
5835 * CM_Open_Class_Key_ExW [SETUPAPI.@]
5839 CM_Open_Class_Key_ExW(
5840 _In_opt_ LPGUID pClassGuid
,
5841 _In_opt_ LPCWSTR pszClassName
,
5842 _In_ REGSAM samDesired
,
5843 _In_ REGDISPOSITION Disposition
,
5844 _Out_ PHKEY phkClass
,
5846 _In_opt_ HMACHINE hMachine
)
5848 WCHAR szKeyName
[MAX_PATH
];
5849 LPWSTR lpGuidString
;
5850 DWORD dwDisposition
;
5854 TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %p)\n",
5855 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
5856 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
5858 /* Check Disposition and ulFlags */
5859 if ((Disposition
& ~RegDisposition_Bits
) ||
5860 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
5861 return CR_INVALID_FLAG
;
5863 /* Check phkClass */
5864 if (phkClass
== NULL
)
5865 return CR_INVALID_POINTER
;
5869 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
5870 pszClassName
!= NULL
)
5871 return CR_INVALID_DATA
;
5873 if (hMachine
== NULL
)
5875 hKey
= HKEY_LOCAL_MACHINE
;
5879 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
5882 return CR_REGISTRY_ERROR
;
5885 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
5887 lstrcpyW(szKeyName
, DeviceClasses
);
5891 lstrcpyW(szKeyName
, ControlClass
);
5894 if (pClassGuid
!= NULL
)
5896 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
5899 return CR_INVALID_DATA
;
5902 lstrcatW(szKeyName
, Backslash
);
5903 lstrcatW(szKeyName
, lpGuidString
);
5906 if (Disposition
== RegDisposition_OpenAlways
)
5908 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
5909 NULL
, phkClass
, &dwDisposition
);
5913 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
5918 if (pClassGuid
!= NULL
)
5919 RpcStringFreeW(&lpGuidString
);
5921 if (dwError
!= ERROR_SUCCESS
)
5924 return CR_NO_SUCH_REGISTRY_KEY
;
5927 if (pszClassName
!= NULL
)
5929 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
5930 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
5937 /***********************************************************************
5938 * CM_Open_DevNode_Key [SETUPAPI.@]
5942 CM_Open_DevNode_Key(
5943 _In_ DEVINST dnDevNode
,
5944 _In_ REGSAM samDesired
,
5945 _In_ ULONG ulHardwareProfile
,
5946 _In_ REGDISPOSITION Disposition
,
5947 _Out_ PHKEY phkDevice
,
5950 TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
5951 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
5953 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
5954 Disposition
, phkDevice
, ulFlags
, NULL
);
5958 /***********************************************************************
5959 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
5963 CM_Open_DevNode_Key_Ex(
5964 _In_ DEVINST dnDevNode
,
5965 _In_ REGSAM samDesired
,
5966 _In_ ULONG ulHardwareProfile
,
5967 _In_ REGDISPOSITION Disposition
,
5968 _Out_ PHKEY phkDevice
,
5970 _In_opt_ HMACHINE hMachine
)
5972 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5973 HSTRING_TABLE StringTable
= NULL
;
5974 LPWSTR pszDevInst
, pszKeyPath
= NULL
, pszInstancePath
= NULL
;
5976 DWORD dwDisposition
;
5977 HKEY hRootKey
= NULL
;
5978 CONFIGRET ret
= CR_CALL_NOT_IMPLEMENTED
;
5980 TRACE("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %p)\n",
5981 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
5983 if (phkDevice
== NULL
)
5984 return CR_INVALID_POINTER
;
5989 return CR_INVALID_DEVNODE
;
5991 if (ulFlags
& ~CM_REGISTRY_BITS
)
5992 return CR_INVALID_FLAG
;
5994 if (Disposition
& ~RegDisposition_Bits
)
5995 return CR_INVALID_DATA
;
5997 if (hMachine
!= NULL
)
5999 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6000 if (BindingHandle
== NULL
)
6003 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6004 if (StringTable
== 0)
6009 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6013 pszDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevNode
);
6014 if (pszDevInst
== NULL
)
6015 return CR_INVALID_DEVNODE
;
6017 TRACE("pszDevInst: %S\n", pszDevInst
);
6019 pszKeyPath
= MyMalloc(512 * sizeof(WCHAR
));
6020 if (pszKeyPath
== NULL
)
6022 ret
= CR_OUT_OF_MEMORY
;
6026 pszInstancePath
= MyMalloc(512 * sizeof(WCHAR
));
6027 if (pszInstancePath
== NULL
)
6029 ret
= CR_OUT_OF_MEMORY
;
6033 ret
= GetDeviceInstanceKeyPath(BindingHandle
,
6039 if (ret
!= CR_SUCCESS
)
6042 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6043 TRACE("pszInstancePath: %S\n", pszInstancePath
);
6045 wcscat(pszKeyPath
, L
"\\");
6046 wcscat(pszKeyPath
, pszInstancePath
);
6048 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6050 if (hMachine
== NULL
)
6052 hRootKey
= HKEY_LOCAL_MACHINE
;
6056 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6060 ret
= CR_REGISTRY_ERROR
;
6065 if (Disposition
== RegDisposition_OpenAlways
)
6067 lError
= RegCreateKeyExW(hRootKey
,
6079 lError
= RegOpenKeyExW(hRootKey
,
6086 if (lError
!= ERROR_SUCCESS
)
6089 ret
= CR_NO_SUCH_REGISTRY_KEY
;
6093 if ((hRootKey
!= NULL
) && (hRootKey
!= HKEY_LOCAL_MACHINE
))
6094 RegCloseKey(hRootKey
);
6096 if (pszInstancePath
!= NULL
)
6097 MyFree(pszInstancePath
);
6099 if (pszKeyPath
!= NULL
)
6106 /***********************************************************************
6107 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
6111 CM_Query_And_Remove_SubTreeA(
6112 _In_ DEVINST dnAncestor
,
6113 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6114 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6115 _In_ ULONG ulNameLength
,
6118 TRACE("CM_Query_And_Remove_SubTreeA(%lx %p %s %lu %lx)\n",
6119 dnAncestor
, pVetoType
, pszVetoName
, ulNameLength
, ulFlags
);
6121 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
6122 ulNameLength
, ulFlags
, NULL
);
6126 /***********************************************************************
6127 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
6131 CM_Query_And_Remove_SubTreeW(
6132 _In_ DEVINST dnAncestor
,
6133 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6134 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6135 _In_ ULONG ulNameLength
,
6138 TRACE("CM_Query_And_Remove_SubTreeW(%lx %p %s %lu %lx)\n",
6139 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
6141 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
6142 ulNameLength
, ulFlags
, NULL
);
6146 /***********************************************************************
6147 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
6151 CM_Query_And_Remove_SubTree_ExA(
6152 _In_ DEVINST dnAncestor
,
6153 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6154 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6155 _In_ ULONG ulNameLength
,
6157 _In_opt_ HMACHINE hMachine
)
6159 LPWSTR lpLocalVetoName
;
6162 TRACE("CM_Query_And_Remove_SubTree_ExA(%lx %p %s %lu %lx %p)\n",
6163 dnAncestor
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
,
6166 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6167 return CR_INVALID_POINTER
;
6169 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
6170 if (lpLocalVetoName
== NULL
)
6171 return CR_OUT_OF_MEMORY
;
6173 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
6174 ulNameLength
, ulFlags
, hMachine
);
6175 if (ret
== CR_REMOVE_VETOED
)
6177 if (WideCharToMultiByte(CP_ACP
,
6188 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
6194 /***********************************************************************
6195 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
6199 CM_Query_And_Remove_SubTree_ExW(
6200 _In_ DEVINST dnAncestor
,
6201 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6202 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6203 _In_ ULONG ulNameLength
,
6205 _In_opt_ HMACHINE hMachine
)
6207 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6208 HSTRING_TABLE StringTable
= NULL
;
6212 TRACE("CM_Query_And_Remove_SubTree_ExW(%lx %p %s %lu %lx %p)\n",
6213 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
,
6216 if (dnAncestor
== 0)
6217 return CR_INVALID_DEVNODE
;
6219 if (ulFlags
& ~CM_REMOVE_BITS
)
6220 return CR_INVALID_FLAG
;
6222 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6223 return CR_INVALID_POINTER
;
6225 if (hMachine
!= NULL
)
6227 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6228 if (BindingHandle
== NULL
)
6231 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6232 if (StringTable
== 0)
6237 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6241 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
6242 if (lpDevInst
== NULL
)
6243 return CR_INVALID_DEVNODE
;
6247 ret
= PNP_QueryRemove(BindingHandle
,
6254 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6256 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6264 /***********************************************************************
6265 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
6269 CM_Query_Arbitrator_Free_Data(
6270 _Out_writes_bytes_(DataLen
) PVOID pData
,
6272 _In_ DEVINST dnDevInst
,
6273 _In_ RESOURCEID ResourceID
,
6276 TRACE("CM_Query_Arbitrator_Free_Data(%p %lu %lx %lu 0x%08lx)\n",
6277 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
);
6279 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
6280 ResourceID
, ulFlags
, NULL
);
6284 /***********************************************************************
6285 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
6289 CM_Query_Arbitrator_Free_Data_Ex(
6290 _Out_writes_bytes_(DataLen
) PVOID pData
,
6292 _In_ DEVINST dnDevInst
,
6293 _In_ RESOURCEID ResourceID
,
6295 _In_opt_ HMACHINE hMachine
)
6297 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6298 HSTRING_TABLE StringTable
= NULL
;
6302 TRACE("CM_Query_Arbitrator_Free_Data_Ex(%p %lu %lx %lu 0x%08lx %p)\n",
6303 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
, hMachine
);
6305 if (pData
== NULL
|| DataLen
== 0)
6306 return CR_INVALID_POINTER
;
6309 return CR_INVALID_DEVINST
;
6311 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6312 return CR_INVALID_FLAG
;
6314 if (hMachine
!= NULL
)
6316 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6317 if (BindingHandle
== NULL
)
6320 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6321 if (StringTable
== 0)
6326 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6330 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6331 if (lpDevInst
== NULL
)
6332 return CR_INVALID_DEVNODE
;
6336 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
6343 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6345 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6353 /***********************************************************************
6354 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
6358 CM_Query_Arbitrator_Free_Size(
6359 _Out_ PULONG pulSize
,
6360 _In_ DEVINST dnDevInst
,
6361 _In_ RESOURCEID ResourceID
,
6364 TRACE("CM_Query_Arbitrator_Free_Size(%p %lu %lx 0x%08lx)\n",
6365 pulSize
, dnDevInst
,ResourceID
, ulFlags
);
6367 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
6372 /***********************************************************************
6373 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
6377 CM_Query_Arbitrator_Free_Size_Ex(
6378 _Out_ PULONG pulSize
,
6379 _In_ DEVINST dnDevInst
,
6380 _In_ RESOURCEID ResourceID
,
6382 _In_opt_ HMACHINE hMachine
)
6384 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6385 HSTRING_TABLE StringTable
= NULL
;
6389 TRACE("CM_Query_Arbitrator_Free_Size_Ex(%p %lu %lx 0x%08lx %p)\n",
6390 pulSize
, dnDevInst
,ResourceID
, ulFlags
, hMachine
);
6392 if (pulSize
== NULL
)
6393 return CR_INVALID_POINTER
;
6396 return CR_INVALID_DEVINST
;
6398 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6399 return CR_INVALID_FLAG
;
6401 if (hMachine
!= NULL
)
6403 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6404 if (BindingHandle
== NULL
)
6407 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6408 if (StringTable
== 0)
6413 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6417 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6418 if (lpDevInst
== NULL
)
6419 return CR_INVALID_DEVNODE
;
6423 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
6429 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6431 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6439 /***********************************************************************
6440 * CM_Query_Remove_SubTree [SETUPAPI.@]
6442 * This function is obsolete in Windows XP and above.
6446 CM_Query_Remove_SubTree(
6447 _In_ DEVINST dnAncestor
,
6450 TRACE("CM_Query_Remove_SubTree(%lx %lx)\n",
6451 dnAncestor
, ulFlags
);
6453 return CR_CALL_NOT_IMPLEMENTED
;
6457 /***********************************************************************
6458 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
6460 * This function is obsolete in Windows XP and above.
6464 CM_Query_Remove_SubTree_Ex(
6465 _In_ DEVINST dnAncestor
,
6467 _In_opt_ HMACHINE hMachine
)
6469 TRACE("CM_Query_Remove_SubTree_Ex(%lx %lx %p)\n",
6470 dnAncestor
, ulFlags
, hMachine
);
6472 return CR_CALL_NOT_IMPLEMENTED
;
6476 /***********************************************************************
6477 * CM_Query_Resource_Conflict_List [SETUPAPI.@]
6481 CM_Query_Resource_Conflict_List(
6482 _Out_ PCONFLICT_LIST pclConflictList
,
6483 _In_ DEVINST dnDevInst
,
6484 _In_ RESOURCEID ResourceID
,
6485 _In_ PCVOID ResourceData
,
6486 _In_ ULONG ResourceLen
,
6488 _In_opt_ HMACHINE hMachine
)
6490 FIXME("CM_Query_Resource_Conflict_List(%p %lx %lu %p %lu %lx %p)\n",
6491 pclConflictList
, dnDevInst
, ResourceID
, ResourceData
,
6492 ResourceLen
, ulFlags
, hMachine
);
6494 return CR_CALL_NOT_IMPLEMENTED
;
6498 /***********************************************************************
6499 * CM_Reenumerate_DevNode [SETUPAPI.@]
6503 CM_Reenumerate_DevNode(
6504 _In_ DEVINST dnDevInst
,
6507 TRACE("CM_Reenumerate_DevNode(%lx %lx)\n",
6508 dnDevInst
, ulFlags
);
6510 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
6514 /***********************************************************************
6515 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
6518 CM_Reenumerate_DevNode_Ex(
6519 _In_ DEVINST dnDevInst
,
6521 _In_opt_ HMACHINE hMachine
)
6523 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6524 HSTRING_TABLE StringTable
= NULL
;
6528 FIXME("CM_Reenumerate_DevNode_Ex(%lx %lx %p)\n",
6529 dnDevInst
, ulFlags
, hMachine
);
6532 return CR_INVALID_DEVNODE
;
6534 if (ulFlags
& ~CM_REENUMERATE_BITS
)
6535 return CR_INVALID_FLAG
;
6537 if (hMachine
!= NULL
)
6539 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6540 if (BindingHandle
== NULL
)
6543 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6544 if (StringTable
== 0)
6549 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6553 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6554 if (lpDevInst
== NULL
)
6555 return CR_INVALID_DEVNODE
;
6559 ret
= PNP_DeviceInstanceAction(BindingHandle
,
6560 PNP_DEVINST_REENUMERATE
,
6565 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6567 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6575 /***********************************************************************
6576 * CM_Register_Device_Driver [SETUPAPI.@]
6580 CM_Register_Device_Driver(
6581 _In_ DEVINST dnDevInst
,
6584 TRACE("CM_Register_Device_Driver(%lx 0x%08lx)\n",
6585 dnDevInst
, ulFlags
);
6587 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
6591 /***********************************************************************
6592 * CM_Register_Device_Driver_Ex [SETUPAPI.@]
6596 CM_Register_Device_Driver_Ex(
6597 _In_ DEVINST dnDevInst
,
6599 _In_opt_ HMACHINE hMachine
)
6601 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6602 HSTRING_TABLE StringTable
= NULL
;
6606 TRACE("CM_Register_Device_Driver_Ex(%lx 0x%08lx %p)\n",
6607 dnDevInst
, ulFlags
, hMachine
);
6610 return CR_INVALID_DEVNODE
;
6612 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
6613 return CR_INVALID_FLAG
;
6615 if (hMachine
!= NULL
)
6617 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6618 if (BindingHandle
== NULL
)
6621 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6622 if (StringTable
== 0)
6627 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6631 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6632 if (lpDevInst
== NULL
)
6633 return CR_INVALID_DEVNODE
;
6637 ret
= PNP_RegisterDriver(BindingHandle
,
6641 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6643 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6651 /***********************************************************************
6652 * CM_Register_Device_InterfaceA [SETUPAPI.@]
6656 CM_Register_Device_InterfaceA(
6657 _In_ DEVINST dnDevInst
,
6658 _In_ LPGUID InterfaceClassGuid
,
6659 _In_opt_ LPCSTR pszReference
,
6660 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
6661 _Inout_ PULONG pulLength
,
6664 TRACE("CM_Register_Device_InterfaceA(%lx %s %s %p %p %lx)\n",
6665 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
6666 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
6668 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
6669 pszReference
, pszDeviceInterface
,
6670 pulLength
, ulFlags
, NULL
);
6674 /***********************************************************************
6675 * CM_Register_Device_InterfaceW [SETUPAPI.@]
6679 CM_Register_Device_InterfaceW(
6680 _In_ DEVINST dnDevInst
,
6681 _In_ LPGUID InterfaceClassGuid
,
6682 _In_opt_ LPCWSTR pszReference
,
6683 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
6684 _Inout_ PULONG pulLength
,
6687 TRACE("CM_Register_Device_InterfaceW(%lx %s %s %p %p %lx)\n",
6688 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
6689 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
6691 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
6692 pszReference
, pszDeviceInterface
,
6693 pulLength
, ulFlags
, NULL
);
6697 /***********************************************************************
6698 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
6702 CM_Register_Device_Interface_ExA(
6703 _In_ DEVINST dnDevInst
,
6704 _In_ LPGUID InterfaceClassGuid
,
6705 _In_opt_ LPCSTR pszReference
,
6706 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
6707 _Inout_ PULONG pulLength
,
6709 _In_opt_ HMACHINE hMachine
)
6711 LPWSTR pszReferenceW
= NULL
;
6712 LPWSTR pszDeviceInterfaceW
= NULL
;
6716 TRACE("CM_Register_Device_Interface_ExA(%lx %s %s %p %p %lx %p)\n",
6717 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_a(pszReference
),
6718 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
6720 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
6721 return CR_INVALID_POINTER
;
6723 if (pszReference
!= NULL
)
6725 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
6726 return CR_INVALID_DATA
;
6729 ulLength
= *pulLength
;
6731 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
6732 if (pszDeviceInterfaceW
== NULL
)
6734 ret
= CR_OUT_OF_MEMORY
;
6738 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
6741 pszDeviceInterfaceW
,
6745 if (ret
== CR_SUCCESS
)
6747 if (WideCharToMultiByte(CP_ACP
,
6749 pszDeviceInterfaceW
,
6758 *pulLength
= ulLength
;
6761 if (pszDeviceInterfaceW
!= NULL
)
6762 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
6764 if (pszReferenceW
!= NULL
)
6765 MyFree(pszReferenceW
);
6771 /***********************************************************************
6772 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
6776 CM_Register_Device_Interface_ExW(
6777 _In_ DEVINST dnDevInst
,
6778 _In_ LPGUID InterfaceClassGuid
,
6779 _In_opt_ LPCWSTR pszReference
,
6780 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
6781 _Inout_ PULONG pulLength
,
6783 _In_opt_ HMACHINE hMachine
)
6785 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6786 HSTRING_TABLE StringTable
= NULL
;
6788 ULONG ulTransferLength
;
6791 TRACE("CM_Register_Device_Interface_ExW(%lx %s %s %p %p %lx %p)\n",
6792 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_w(pszReference
),
6793 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
6796 return CR_INVALID_DEVNODE
;
6798 if (InterfaceClassGuid
== NULL
||
6799 pszDeviceInterface
== NULL
||
6801 return CR_INVALID_POINTER
;
6804 return CR_INVALID_FLAG
;
6806 if (hMachine
!= NULL
)
6808 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6809 if (BindingHandle
== NULL
)
6812 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6813 if (StringTable
== 0)
6818 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6822 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6823 if (lpDevInst
== NULL
)
6824 return CR_INVALID_DEVNODE
;
6826 ulTransferLength
= *pulLength
;
6830 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
6833 (LPWSTR
)pszReference
,
6839 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6841 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6849 /***********************************************************************
6850 * CM_Remove_SubTree [SETUPAPI.@]
6852 * This function is obsolete in Windows XP and above.
6857 _In_ DEVINST dnAncestor
,
6860 TRACE("CM_Remove_SubTree(%lx %lx)\n",
6861 dnAncestor
, ulFlags
);
6863 return CR_CALL_NOT_IMPLEMENTED
;
6867 /***********************************************************************
6868 * CM_Remove_SubTree_Ex [SETUPAPI.@]
6870 * This function is obsolete in Windows XP and above.
6874 CM_Remove_SubTree_Ex(
6875 _In_ DEVINST dnAncestor
,
6877 _In_opt_ HMACHINE hMachine
)
6879 TRACE("CM_Remove_SubTree_Ex(%lx %lx %p)\n",
6880 dnAncestor
, ulFlags
, hMachine
);
6882 return CR_CALL_NOT_IMPLEMENTED
;
6886 /***********************************************************************
6887 * CM_Request_Device_EjectA [SETUPAPI.@]
6891 CM_Request_Device_EjectA(
6892 _In_ DEVINST dnDevInst
,
6893 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6894 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6895 _In_ ULONG ulNameLength
,
6898 TRACE("CM_Request_Device_EjectA(%lx %p %s %lu %lx)\n",
6899 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
);
6901 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
6902 ulNameLength
, ulFlags
, NULL
);
6906 /***********************************************************************
6907 * CM_Request_Device_EjectW [SETUPAPI.@]
6911 CM_Request_Device_EjectW(
6912 _In_ DEVINST dnDevInst
,
6913 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6914 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6915 _In_ ULONG ulNameLength
,
6918 TRACE("CM_Request_Device_EjectW(%lx %p %s %lu %lx)\n",
6919 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
6921 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
6922 ulNameLength
, ulFlags
, NULL
);
6926 /***********************************************************************
6927 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
6931 CM_Request_Device_Eject_ExA(
6932 _In_ DEVINST dnDevInst
,
6933 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6934 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6935 _In_ ULONG ulNameLength
,
6937 _In_opt_ HMACHINE hMachine
)
6939 LPWSTR lpLocalVetoName
;
6942 TRACE("CM_Request_Device_Eject_ExA(%lx %p %s %lu %lx %p)\n",
6943 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
6945 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6946 return CR_INVALID_POINTER
;
6948 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
6949 if (lpLocalVetoName
== NULL
)
6950 return CR_OUT_OF_MEMORY
;
6952 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
6953 ulNameLength
, ulFlags
, hMachine
);
6954 if (ret
== CR_REMOVE_VETOED
)
6956 if (WideCharToMultiByte(CP_ACP
,
6967 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
6973 /***********************************************************************
6974 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
6978 CM_Request_Device_Eject_ExW(
6979 _In_ DEVINST dnDevInst
,
6980 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6981 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6982 _In_ ULONG ulNameLength
,
6984 _In_opt_ HMACHINE hMachine
)
6986 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6987 HSTRING_TABLE StringTable
= NULL
;
6991 TRACE("CM_Request_Device_Eject_ExW(%lx %p %s %lu %lx %p)\n",
6992 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
6995 return CR_INVALID_DEVNODE
;
6998 return CR_INVALID_FLAG
;
7000 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7001 return CR_INVALID_POINTER
;
7003 if (hMachine
!= NULL
)
7005 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7006 if (BindingHandle
== NULL
)
7009 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7010 if (StringTable
== 0)
7015 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7019 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7020 if (lpDevInst
== NULL
)
7021 return CR_INVALID_DEVNODE
;
7025 ret
= PNP_RequestDeviceEject(BindingHandle
,
7032 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7034 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7042 /***********************************************************************
7043 * CM_Request_Eject_PC [SETUPAPI.@]
7047 CM_Request_Eject_PC(VOID
)
7049 TRACE("CM_Request_Eject_PC()\n");
7051 return CM_Request_Eject_PC_Ex(NULL
);
7055 /***********************************************************************
7056 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
7060 CM_Request_Eject_PC_Ex(
7061 _In_opt_ HMACHINE hMachine
)
7063 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7066 TRACE("CM_Request_Eject_PC_Ex(%p)\n", hMachine
);
7068 if (hMachine
!= NULL
)
7070 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7071 if (BindingHandle
== NULL
)
7076 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7082 ret
= PNP_RequestEjectPC(BindingHandle
);
7084 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7086 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7094 /***********************************************************************
7095 * CM_Run_Detection [SETUPAPI.@]
7102 TRACE("CM_Run_Detection(%lx)\n", ulFlags
);
7104 return CM_Run_Detection_Ex(ulFlags
, NULL
);
7108 /***********************************************************************
7109 * CM_Run_Detection_Ex [SETUPAPI.@]
7113 CM_Run_Detection_Ex(
7115 _In_opt_ HMACHINE hMachine
)
7117 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7120 TRACE("CM_Run_Detection_Ex(%lx %p)\n",
7123 if (!pSetupIsUserAdmin())
7124 return CR_ACCESS_DENIED
;
7126 if (ulFlags
& ~CM_DETECT_BITS
)
7127 return CR_INVALID_FLAG
;
7129 if (hMachine
!= NULL
)
7131 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7132 if (BindingHandle
== NULL
)
7137 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7143 ret
= PNP_RunDetection(BindingHandle
,
7146 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7148 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7156 /***********************************************************************
7157 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
7161 CM_Set_Class_Registry_PropertyA(
7162 _In_ LPGUID ClassGuid
,
7163 _In_ ULONG ulProperty
,
7164 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7165 _In_ ULONG ulLength
,
7167 _In_opt_ HMACHINE hMachine
)
7169 FIXME("CM_Set_Class_Registry_PropertyA(%p %lx %p %lu %lx %p)\n",
7170 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7172 return CR_CALL_NOT_IMPLEMENTED
;
7176 /***********************************************************************
7177 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
7181 CM_Set_Class_Registry_PropertyW(
7182 _In_ LPGUID ClassGuid
,
7183 _In_ ULONG ulProperty
,
7184 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7185 _In_ ULONG ulLength
,
7187 _In_opt_ HMACHINE hMachine
)
7189 FIXME("CM_Set_Class_Registry_PropertyW(%p %lx %p %lu %lx %p)\n",
7190 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7192 return CR_CALL_NOT_IMPLEMENTED
;
7196 /***********************************************************************
7197 * CM_Set_DevNode_Problem [SETUPAPI.@]
7201 CM_Set_DevNode_Problem(
7202 _In_ DEVINST dnDevInst
,
7203 _In_ ULONG ulProblem
,
7206 TRACE("CM_Set_DevNode_Problem(%lx %lx %lx)\n",
7207 dnDevInst
, ulProblem
, ulFlags
);
7209 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
7213 /***********************************************************************
7214 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
7218 CM_Set_DevNode_Problem_Ex(
7219 _In_ DEVINST dnDevInst
,
7220 _In_ ULONG ulProblem
,
7222 _In_opt_ HMACHINE hMachine
)
7224 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7225 HSTRING_TABLE StringTable
= NULL
;
7229 TRACE("CM_Set_DevNode_Problem_Ex(%lx %lx %lx %p)\n",
7230 dnDevInst
, ulProblem
, ulFlags
, hMachine
);
7233 return CR_INVALID_DEVNODE
;
7235 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
7236 return CR_INVALID_FLAG
;
7238 if (hMachine
!= NULL
)
7240 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7241 if (BindingHandle
== NULL
)
7244 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7245 if (StringTable
== 0)
7250 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7254 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7255 if (lpDevInst
== NULL
)
7256 return CR_INVALID_DEVNODE
;
7260 ret
= PNP_SetDeviceProblem(BindingHandle
,
7265 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7267 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7275 /***********************************************************************
7276 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
7280 CM_Set_DevNode_Registry_PropertyA(
7281 _In_ DEVINST dnDevInst
,
7282 _In_ ULONG ulProperty
,
7283 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7284 _In_ ULONG ulLength
,
7287 TRACE("CM_Set_DevNode_Registry_PropertyA(%lx %lu %p %lx %lx)\n",
7288 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7290 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
7296 /***********************************************************************
7297 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
7301 CM_Set_DevNode_Registry_PropertyW(
7302 _In_ DEVINST dnDevInst
,
7303 _In_ ULONG ulProperty
,
7304 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7305 _In_ ULONG ulLength
,
7308 TRACE("CM_Set_DevNode_Registry_PropertyW(%lx %lu %p %lx %lx)\n",
7309 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7311 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
7317 /***********************************************************************
7318 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
7322 CM_Set_DevNode_Registry_Property_ExA(
7323 _In_ DEVINST dnDevInst
,
7324 _In_ ULONG ulProperty
,
7325 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7326 _In_ ULONG ulLength
,
7328 _In_opt_ HMACHINE hMachine
)
7330 CONFIGRET ret
= CR_SUCCESS
;
7334 FIXME("CM_Set_DevNode_Registry_Property_ExA(%lx %lu %p %lx %lx %p)\n",
7335 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7337 if (Buffer
== NULL
&& ulLength
!= 0)
7338 return CR_INVALID_POINTER
;
7340 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7341 return CR_INVALID_PROPERTY
;
7345 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7354 /* Get property type */
7355 ulType
= GetRegistryPropertyType(ulProperty
);
7357 /* Allocate buffer if needed */
7358 if (ulType
== REG_SZ
||
7359 ulType
== REG_MULTI_SZ
)
7361 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
7362 if (lpBuffer
== NULL
)
7364 ret
= CR_OUT_OF_MEMORY
;
7368 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
7369 ulLength
, lpBuffer
, ulLength
))
7376 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7379 ulLength
* sizeof(WCHAR
),
7388 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7396 ret
= CR_CALL_NOT_IMPLEMENTED
;
7403 /***********************************************************************
7404 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
7408 CM_Set_DevNode_Registry_Property_ExW(
7409 _In_ DEVINST dnDevInst
,
7410 _In_ ULONG ulProperty
,
7411 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7412 _In_ ULONG ulLength
,
7414 _In_opt_ HMACHINE hMachine
)
7416 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7417 HSTRING_TABLE StringTable
= NULL
;
7422 TRACE("CM_Set_DevNode_Registry_Property_ExW(%lx %lu %p %lx %lx %p)\n",
7423 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7426 return CR_INVALID_DEVNODE
;
7428 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7429 return CR_INVALID_PROPERTY
;
7431 if (Buffer
!= NULL
&& ulLength
== 0)
7432 return CR_INVALID_POINTER
;
7435 return CR_INVALID_FLAG
;
7437 if (hMachine
!= NULL
)
7439 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7440 if (BindingHandle
== NULL
)
7443 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7444 if (StringTable
== 0)
7449 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7453 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7454 if (lpDevInst
== NULL
)
7455 return CR_INVALID_DEVNODE
;
7457 /* Get property type */
7458 ulType
= GetRegistryPropertyType(ulProperty
);
7462 ret
= PNP_SetDeviceRegProp(BindingHandle
,
7470 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7472 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7480 /***********************************************************************
7481 * CM_Set_HW_Prof [SETUPAPI.@]
7486 _In_ ULONG ulHardwareProfile
,
7489 TRACE("CM_Set_HW_Prof(%lu %lx)\n",
7490 ulHardwareProfile
, ulFlags
);
7492 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
7496 /***********************************************************************
7497 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
7502 _In_ ULONG ulHardwareProfile
,
7504 _In_opt_ HMACHINE hMachine
)
7506 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7509 TRACE("CM_Set_HW_Prof_Ex(%lu %lx %p)\n",
7510 ulHardwareProfile
, ulFlags
, hMachine
);
7512 if (!pSetupIsUserAdmin())
7513 return CR_ACCESS_DENIED
;
7516 return CR_INVALID_FLAG
;
7518 if (hMachine
!= NULL
)
7520 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7521 if (BindingHandle
== NULL
)
7526 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7532 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
7534 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7536 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7544 /***********************************************************************
7545 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
7549 CM_Set_HW_Prof_FlagsA(
7550 _In_ DEVINSTID_A szDevInstName
,
7551 _In_ ULONG ulConfig
,
7555 TRACE("CM_Set_HW_Prof_FlagsA(%s %lu %lu %lx)\n",
7556 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7558 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
7563 /***********************************************************************
7564 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
7568 CM_Set_HW_Prof_FlagsW(
7569 _In_ DEVINSTID_W szDevInstName
,
7570 _In_ ULONG ulConfig
,
7574 TRACE("CM_Set_HW_Prof_FlagsW(%s %lu %lu %lx)\n",
7575 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7577 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
7582 /***********************************************************************
7583 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
7587 CM_Set_HW_Prof_Flags_ExA(
7588 _In_ DEVINSTID_A szDevInstName
,
7589 _In_ ULONG ulConfig
,
7592 _In_opt_ HMACHINE hMachine
)
7594 DEVINSTID_W pszDevIdW
= NULL
;
7595 CONFIGRET ret
= CR_SUCCESS
;
7597 TRACE("CM_Set_HW_Prof_Flags_ExA(%s %lu %lu %lx %p)\n",
7598 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7600 if (szDevInstName
!= NULL
)
7602 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
7603 return CR_INVALID_DEVICE_ID
;
7606 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
7609 if (pszDevIdW
!= NULL
)
7616 /***********************************************************************
7617 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
7621 CM_Set_HW_Prof_Flags_ExW(
7622 _In_ DEVINSTID_W szDevInstName
,
7623 _In_ ULONG ulConfig
,
7626 _In_opt_ HMACHINE hMachine
)
7628 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7631 FIXME("CM_Set_HW_Prof_Flags_ExW(%s %lu %lu %lx %p)\n",
7632 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7634 if (szDevInstName
== NULL
)
7635 return CR_INVALID_POINTER
;
7637 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
7638 return CR_INVALID_FLAG
;
7640 /* FIXME: Check whether szDevInstName is valid */
7642 if (hMachine
!= NULL
)
7644 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7645 if (BindingHandle
== NULL
)
7650 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7656 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
7657 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
7659 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7661 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7669 /***********************************************************************
7670 * CM_Setup_DevNode [SETUPAPI.@]
7675 _In_ DEVINST dnDevInst
,
7678 TRACE("CM_Setup_DevNode(%lx %lx)\n",
7679 dnDevInst
, ulFlags
);
7681 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
7685 /***********************************************************************
7686 * CM_Setup_DevNode_Ex [SETUPAPI.@]
7690 CM_Setup_DevNode_Ex(
7691 _In_ DEVINST dnDevInst
,
7693 _In_opt_ HMACHINE hMachine
)
7695 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7696 HSTRING_TABLE StringTable
= NULL
;
7700 FIXME("CM_Setup_DevNode_Ex(%lx %lx %p)\n",
7701 dnDevInst
, ulFlags
, hMachine
);
7703 if (!pSetupIsUserAdmin())
7704 return CR_ACCESS_DENIED
;
7707 return CR_INVALID_DEVNODE
;
7709 if (ulFlags
& ~CM_SETUP_BITS
)
7710 return CR_INVALID_FLAG
;
7712 if (hMachine
!= NULL
)
7714 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7715 if (BindingHandle
== NULL
)
7718 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7719 if (StringTable
== 0)
7724 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7728 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7729 if (lpDevInst
== NULL
)
7730 return CR_INVALID_DEVNODE
;
7734 ret
= PNP_DeviceInstanceAction(BindingHandle
,
7740 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7742 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7750 /***********************************************************************
7751 * CM_Test_Range_Available [SETUPAPI.@]
7755 CM_Test_Range_Available(
7756 _In_ DWORDLONG ullStartValue
,
7757 _In_ DWORDLONG ullEndValue
,
7758 _In_ RANGE_LIST rlh
,
7761 FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
7762 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
7763 return CR_CALL_NOT_IMPLEMENTED
;
7767 /***********************************************************************
7768 * CM_Uninstall_DevNode [SETUPAPI.@]
7772 CM_Uninstall_DevNode(
7773 _In_ DEVINST dnPhantom
,
7776 TRACE("CM_Uninstall_DevNode(%lx %lx)\n",
7777 dnPhantom
, ulFlags
);
7779 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
7783 /***********************************************************************
7784 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
7788 CM_Uninstall_DevNode_Ex(
7789 _In_ DEVINST dnPhantom
,
7791 _In_opt_ HMACHINE hMachine
)
7793 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7794 HSTRING_TABLE StringTable
= NULL
;
7798 TRACE("CM_Uninstall_DevNode_Ex(%lx %lx %p)\n",
7799 dnPhantom
, ulFlags
, hMachine
);
7802 return CR_INVALID_DEVNODE
;
7805 return CR_INVALID_FLAG
;
7807 if (hMachine
!= NULL
)
7809 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7810 if (BindingHandle
== NULL
)
7813 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7814 if (StringTable
== 0)
7819 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7823 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
7824 if (lpDevInst
== NULL
)
7825 return CR_INVALID_DEVNODE
;
7829 ret
= PNP_UninstallDevInst(BindingHandle
,
7833 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7835 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7843 /***********************************************************************
7844 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
7848 CM_Unregister_Device_InterfaceA(
7849 _In_ LPCSTR pszDeviceInterface
,
7852 TRACE("CM_Unregister_Device_InterfaceA(%s %lx)\n",
7853 debugstr_a(pszDeviceInterface
), ulFlags
);
7855 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
7860 /***********************************************************************
7861 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
7865 CM_Unregister_Device_InterfaceW(
7866 _In_ LPCWSTR pszDeviceInterface
,
7869 TRACE("CM_Unregister_Device_InterfaceW(%s %lx)\n",
7870 debugstr_w(pszDeviceInterface
), ulFlags
);
7872 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
7877 /***********************************************************************
7878 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
7882 CM_Unregister_Device_Interface_ExA(
7883 _In_ LPCSTR pszDeviceInterface
,
7885 _In_opt_ HMACHINE hMachine
)
7887 LPWSTR pszDeviceInterfaceW
= NULL
;
7890 TRACE("CM_Unregister_Device_Interface_ExA(%s %lx %p)\n",
7891 debugstr_a(pszDeviceInterface
), ulFlags
, hMachine
);
7893 if (pszDeviceInterface
== NULL
)
7894 return CR_INVALID_POINTER
;
7896 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
7897 return CR_INVALID_DATA
;
7899 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
7902 if (pszDeviceInterfaceW
!= NULL
)
7903 MyFree(pszDeviceInterfaceW
);
7909 /***********************************************************************
7910 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
7914 CM_Unregister_Device_Interface_ExW(
7915 _In_ LPCWSTR pszDeviceInterface
,
7917 _In_opt_ HMACHINE hMachine
)
7919 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7922 TRACE("CM_Unregister_Device_Interface_ExW(%s %lx %p)\n",
7923 debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
7925 if (pszDeviceInterface
== NULL
)
7926 return CR_INVALID_POINTER
;
7929 return CR_INVALID_FLAG
;
7931 if (hMachine
!= NULL
)
7933 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7934 if (BindingHandle
== NULL
)
7939 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7945 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
7946 (LPWSTR
)pszDeviceInterface
,
7949 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7951 ret
= RpcStatusToCmStatus(RpcExceptionCode());