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
75 struct _INTERNAL_RANGE_LIST
*pRangeList
;
78 } INTERNAL_RANGE
, *PINTERNAL_RANGE
;
80 typedef struct _INTERNAL_RANGE_LIST
85 } INTERNAL_RANGE_LIST
, *PINTERNAL_RANGE_LIST
;
87 #define RANGE_LIST_MAGIC 0x33445566
89 typedef struct _CONFLICT_DATA
92 PPNP_CONFLICT_LIST pConflictList
;
93 } CONFLICT_DATA
, *PCONFLICT_DATA
;
95 #define CONFLICT_MAGIC 0x11225588
98 /* FUNCTIONS ****************************************************************/
108 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
111 lstrcpyW(&String
[1], lpString
);
114 String
[MAX_GUID_STRING_LEN
- 2] = '}';
115 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
117 RpcStringFreeW(&lpString
);
126 _In_ RPC_STATUS Status
)
134 GetRegistryPropertyType(
135 _In_ ULONG ulProperty
)
139 case CM_DRP_DEVICEDESC
:
142 case CM_DRP_CLASSGUID
:
145 case CM_DRP_FRIENDLYNAME
:
146 case CM_DRP_LOCATION_INFORMATION
:
147 case CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME
:
148 case CM_DRP_ENUMERATOR_NAME
:
149 case CM_DRP_SECURITY_SDS
:
150 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
153 case CM_DRP_HARDWAREID
:
154 case CM_DRP_COMPATIBLEIDS
:
155 case CM_DRP_UPPERFILTERS
:
156 case CM_DRP_LOWERFILTERS
:
159 case CM_DRP_CONFIGFLAGS
:
160 case CM_DRP_CAPABILITIES
:
161 case CM_DRP_UI_NUMBER
:
162 case CM_DRP_LEGACYBUSTYPE
:
163 case CM_DRP_BUSNUMBER
:
165 case CM_DRP_EXCLUSIVE
:
166 case CM_DRP_CHARACTERISTICS
:
168 case CM_DRP_REMOVAL_POLICY
:
169 case CM_DRP_REMOVAL_POLICY_HW_DEFAULT
:
170 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
171 case CM_DRP_INSTALL_STATE
:
174 case CM_DRP_BUSTYPEGUID
:
175 case CM_DRP_SECURITY
:
176 case CM_DRP_DEVICE_POWER_DATA
:
187 SplitDeviceInstanceId(
188 _In_ PWSTR pszDeviceInstanceId
,
189 _Out_ PWSTR pszDeviceId
,
190 _Out_ PWSTR pszInstanceId
)
194 wcscpy(pszDeviceId
, pszDeviceInstanceId
);
196 ptr
= wcschr(pszDeviceId
, L
'\\');
202 wcscpy(pszInstanceId
, ptr
);
206 *pszInstanceId
= UNICODE_NULL
;
213 GetDeviceInstanceKeyPath(
214 _In_ RPC_BINDING_HANDLE BindingHandle
,
215 _In_ PWSTR pszDeviceInst
,
216 _Out_ PWSTR pszKeyPath
,
217 _Out_ PWSTR pszInstancePath
,
218 _In_ ULONG ulHardwareProfile
,
221 PWSTR pszBuffer
= NULL
;
223 ULONG ulTransferLength
, ulLength
;
224 CONFIGRET ret
= CR_SUCCESS
;
226 TRACE("GetDeviceInstanceKeyPath()\n");
228 /* Allocate a buffer for the device id */
229 pszBuffer
= MyMalloc(300 * sizeof(WCHAR
));
230 if (pszBuffer
== NULL
)
232 ERR("MyMalloc() failed\n");
233 return CR_OUT_OF_MEMORY
;
236 if (ulFlags
& CM_REGISTRY_SOFTWARE
)
238 /* Software Key Path */
240 ulTransferLength
= 300 * sizeof(WCHAR
);
241 ulLength
= 300 * sizeof(WCHAR
);
242 ret
= PNP_GetDeviceRegProp(BindingHandle
,
250 if (ret
!= CR_SUCCESS
)
252 ERR("PNP_GetDeviceRegProp() failed (Error %lu)\n", ret
);
256 TRACE("szBuffer: %S\n", pszBuffer
);
258 SplitDeviceInstanceId(pszBuffer
,
262 TRACE("szBuffer: %S\n", pszBuffer
);
264 if (ulFlags
& CM_REGISTRY_CONFIG
)
266 if (ulHardwareProfile
== 0)
268 wsprintfW(pszKeyPath
,
270 L
"System\\CurrentControlSet\\Hardware Profiles",
272 L
"System\\CurrentControlSet\\Control\\Class",
277 wsprintfW(pszKeyPath
,
278 L
"%s\\%04lu\\%s\\%s",
279 L
"System\\CurrentControlSet\\Hardware Profiles",
281 L
"System\\CurrentControlSet\\Control\\Class",
287 wsprintfW(pszKeyPath
,
289 L
"System\\CurrentControlSet\\Control\\Class",
295 /* Hardware Key Path */
297 if (ulFlags
& CM_REGISTRY_CONFIG
)
299 SplitDeviceInstanceId(pszDeviceInst
,
303 if (ulHardwareProfile
== 0)
305 wsprintfW(pszKeyPath
,
307 L
"System\\CurrentControlSet\\Hardware Profiles",
309 L
"System\\CurrentControlSet\\Enum",
314 wsprintfW(pszKeyPath
,
315 L
"%s\\%04lu\\%s\\%s",
316 L
"System\\CurrentControlSet\\Hardware Profiles",
318 L
"System\\CurrentControlSet\\Enum",
322 else if (ulFlags
& CM_REGISTRY_USER
)
324 wsprintfW(pszKeyPath
,
326 L
"System\\CurrentControlSet\\Enum",
329 wcscpy(pszInstancePath
,
330 L
"Device Parameters");
334 SplitDeviceInstanceId(pszDeviceInst
,
338 wsprintfW(pszKeyPath
,
340 L
"System\\CurrentControlSet\\Enum",
346 if (pszBuffer
!= NULL
)
355 _In_opt_ PINTERNAL_RANGE_LIST pRangeList
)
359 if (pRangeList
== NULL
)
364 if (pRangeList
->ulMagic
!= RANGE_LIST_MAGIC
)
367 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
379 _In_opt_ PLOG_CONF_INFO pLogConfInfo
)
383 if (pLogConfInfo
== NULL
)
388 if (pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
391 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
403 _In_opt_ PCONFLICT_DATA pConflictData
)
407 if (pConflictData
== NULL
)
412 if (pConflictData
->ulMagic
!= CONFLICT_MAGIC
)
415 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
425 /***********************************************************************
426 * CMP_GetBlockedDriverInfo [SETUPAPI.@]
430 CMP_GetBlockedDriverInfo(
431 _Out_opt_ LPWSTR pszNames
,
432 _Inout_ PULONG pulLength
,
434 _In_opt_ HMACHINE hMachine
)
436 RPC_BINDING_HANDLE BindingHandle
= NULL
;
437 ULONG ulTransferLength
;
440 TRACE("CMP_GetBlockedDriverInfo(%p %p %lx %p)\n",
441 pszNames
, pulLength
, ulFlags
, hMachine
);
443 if (hMachine
!= NULL
)
445 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
446 if (BindingHandle
== NULL
)
451 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
455 ulTransferLength
= *pulLength
;
459 ret
= PNP_GetBlockedDriverInfo(BindingHandle
,
465 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
467 ret
= RpcStatusToCmStatus(RpcExceptionCode());
475 /***********************************************************************
476 * CMP_GetServerSideDeviceInstallFlags [SETUPAPI.@]
480 CMP_GetServerSideDeviceInstallFlags(
481 _Out_ PULONG pulSSDIFlags
,
483 _In_opt_ HMACHINE hMachine
)
485 RPC_BINDING_HANDLE BindingHandle
= NULL
;
488 TRACE("CMP_GetServerSideDeviceInstallFlags(%p %lx %p)\n",
489 pulSSDIFlags
, ulFlags
, hMachine
);
491 if (pulSSDIFlags
== NULL
)
492 return CR_INVALID_POINTER
;
495 return CR_INVALID_FLAG
;
497 if (hMachine
!= NULL
)
499 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
500 if (BindingHandle
== NULL
)
505 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
511 ret
= PNP_GetServerSideDeviceInstallFlags(BindingHandle
,
515 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
517 ret
= RpcStatusToCmStatus(RpcExceptionCode());
525 /***********************************************************************
526 * CMP_Init_Detection [SETUPAPI.@]
533 RPC_BINDING_HANDLE BindingHandle
= NULL
;
536 TRACE("CMP_Init_Detection(%lu)\n", ulMagic
);
538 if (ulMagic
!= CMP_MAGIC
)
539 return CR_INVALID_DATA
;
541 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
546 ret
= PNP_InitDetection(BindingHandle
);
548 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
550 ret
= RpcStatusToCmStatus(RpcExceptionCode());
558 /***********************************************************************
559 * CMP_RegisterNotification [SETUPAPI.@]
563 CMP_RegisterNotification(
564 _In_ HANDLE hRecipient
,
565 _In_ LPVOID lpvNotificationFilter
,
567 _Out_ PHDEVNOTIFY phDevNotify
)
569 RPC_BINDING_HANDLE BindingHandle
= NULL
;
570 PNOTIFY_DATA pNotifyData
= NULL
;
571 CONFIGRET ret
= CR_SUCCESS
;
573 TRACE("CMP_RegisterNotification(%p %p %lu %p)\n",
574 hRecipient
, lpvNotificationFilter
, ulFlags
, phDevNotify
);
576 if ((hRecipient
== NULL
) ||
577 (lpvNotificationFilter
== NULL
) ||
578 (phDevNotify
== NULL
))
579 return CR_INVALID_POINTER
;
582 return CR_INVALID_FLAG
;
584 if (((PDEV_BROADCAST_HDR
)lpvNotificationFilter
)->dbch_size
< sizeof(DEV_BROADCAST_HDR
))
585 return CR_INVALID_DATA
;
587 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
590 pNotifyData
= HeapAlloc(GetProcessHeap(),
592 sizeof(NOTIFY_DATA
));
593 if (pNotifyData
== NULL
)
594 return CR_OUT_OF_MEMORY
;
596 pNotifyData
->ulMagic
= NOTIFY_MAGIC
;
599 if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_WINDOW_HANDLE)
603 else if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_SERVICE_HANDLE)
611 ret
= PNP_RegisterNotification(BindingHandle
,
613 &pNotifyData
->ulNotifyData
);
615 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
617 ret
= RpcStatusToCmStatus(RpcExceptionCode());
621 if (ret
== CR_SUCCESS
)
623 *phDevNotify
= (HDEVNOTIFY
)pNotifyData
;
627 if (pNotifyData
!= NULL
)
628 HeapFree(GetProcessHeap(), 0, pNotifyData
);
630 *phDevNotify
= (HDEVNOTIFY
)NULL
;
637 /***********************************************************************
638 * CMP_Report_LogOn [SETUPAPI.@]
644 _In_ DWORD dwProcessId
)
646 RPC_BINDING_HANDLE BindingHandle
= NULL
;
647 CONFIGRET ret
= CR_SUCCESS
;
651 TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic
, dwProcessId
);
653 if (dwMagic
!= CMP_MAGIC
)
654 return CR_INVALID_DATA
;
656 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
659 bAdmin
= pSetupIsUserAdmin();
661 for (i
= 0; i
< 30; i
++)
665 ret
= PNP_ReportLogOn(BindingHandle
,
669 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
671 ret
= RpcStatusToCmStatus(RpcExceptionCode());
675 if (ret
== CR_SUCCESS
)
685 /***********************************************************************
686 * CMP_UnregisterNotification [SETUPAPI.@]
690 CMP_UnregisterNotification(
691 _In_ HDEVNOTIFY hDevNotify
)
693 RPC_BINDING_HANDLE BindingHandle
= NULL
;
694 PNOTIFY_DATA pNotifyData
;
695 CONFIGRET ret
= CR_SUCCESS
;
697 TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify
);
699 pNotifyData
= (PNOTIFY_DATA
)hDevNotify
;
701 if ((pNotifyData
== NULL
) ||
702 (pNotifyData
->ulMagic
!= NOTIFY_MAGIC
))
703 return CR_INVALID_POINTER
;
705 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
710 ret
= PNP_UnregisterNotification(BindingHandle
,
711 pNotifyData
->ulNotifyData
);
713 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
715 ret
= RpcStatusToCmStatus(RpcExceptionCode());
719 if (ret
== CR_SUCCESS
)
720 HeapFree(GetProcessHeap(), 0, pNotifyData
);
726 /***********************************************************************
727 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
731 CMP_WaitNoPendingInstallEvents(
732 _In_ DWORD dwTimeout
)
737 TRACE("CMP_WaitNoPendingInstallEvents(%lu)\n", dwTimeout
);
739 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
743 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
749 /***********************************************************************
750 * CMP_WaitServicesAvailable [SETUPAPI.@]
754 CMP_WaitServicesAvailable(
755 _In_opt_ HMACHINE hMachine
)
757 RPC_BINDING_HANDLE BindingHandle
= NULL
;
758 CONFIGRET ret
= CR_SUCCESS
;
761 TRACE("CMP_WaitServicesAvailable(%p)\n", hMachine
);
763 if (hMachine
!= NULL
)
765 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
766 if (BindingHandle
== NULL
)
771 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
777 ret
= PNP_GetVersion(BindingHandle
, &Version
);
779 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
781 ret
= RpcStatusToCmStatus(RpcExceptionCode());
789 /***********************************************************************
790 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
794 CM_Add_Empty_Log_Conf(
795 _Out_ PLOG_CONF plcLogConf
,
796 _In_ DEVINST dnDevInst
,
797 _In_ PRIORITY Priority
,
800 TRACE("CM_Add_Empty_Log_Conf(%p %p %lu %lx)\n",
801 plcLogConf
, dnDevInst
, Priority
, ulFlags
);
803 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
808 /***********************************************************************
809 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
812 WINAPI
CM_Add_Empty_Log_Conf_Ex(
813 _Out_ PLOG_CONF plcLogConf
,
814 _In_ DEVINST dnDevInst
,
815 _In_ PRIORITY Priority
,
817 _In_opt_ HMACHINE hMachine
)
819 RPC_BINDING_HANDLE BindingHandle
= NULL
;
820 HSTRING_TABLE StringTable
= NULL
;
821 ULONG ulLogConfTag
= 0;
823 PLOG_CONF_INFO pLogConfInfo
;
824 CONFIGRET ret
= CR_SUCCESS
;
826 FIXME("CM_Add_Empty_Log_Conf_Ex(%p %p %lu %lx %p)\n",
827 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
829 if (!pSetupIsUserAdmin())
830 return CR_ACCESS_DENIED
;
832 if (plcLogConf
== NULL
)
833 return CR_INVALID_POINTER
;
836 return CR_INVALID_DEVINST
;
838 if (Priority
> 0xFFFF)
839 return CR_INVALID_PRIORITY
;
841 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
842 return CR_INVALID_FLAG
;
844 if (hMachine
!= NULL
)
846 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
847 if (BindingHandle
== NULL
)
850 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
851 if (StringTable
== 0)
856 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
860 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
861 if (lpDevInst
== NULL
)
862 return CR_INVALID_DEVNODE
;
866 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
867 &ulLogConfTag
, ulFlags
);
869 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
871 ret
= RpcStatusToCmStatus(RpcExceptionCode());
875 if (ret
== CR_SUCCESS
)
877 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
878 if (pLogConfInfo
== NULL
)
880 ret
= CR_OUT_OF_MEMORY
;
884 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
885 pLogConfInfo
->dnDevInst
= dnDevInst
;
886 pLogConfInfo
->ulFlags
= ulFlags
;
887 pLogConfInfo
->ulTag
= ulLogConfTag
;
889 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
899 /***********************************************************************
900 * CM_Add_IDA [SETUPAPI.@]
905 _In_ DEVINST dnDevInst
,
909 TRACE("CM_Add_IDA(%p %s %lx)\n",
910 dnDevInst
, debugstr_a(pszID
), ulFlags
);
912 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
916 /***********************************************************************
917 * CM_Add_IDW [SETUPAPI.@]
922 _In_ DEVINST dnDevInst
,
926 TRACE("CM_Add_IDW(%p %s %lx)\n",
927 dnDevInst
, debugstr_w(pszID
), ulFlags
);
929 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
933 /***********************************************************************
934 * CM_Add_ID_ExA [SETUPAPI.@]
939 _In_ DEVINST dnDevInst
,
942 _In_opt_ HMACHINE hMachine
)
947 TRACE("CM_Add_ID_ExA(%p %s %lx %p)\n",
948 dnDevInst
, debugstr_a(pszID
), ulFlags
, hMachine
);
950 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
951 return CR_INVALID_DATA
;
953 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
961 /***********************************************************************
962 * CM_Add_ID_ExW [SETUPAPI.@]
967 _In_ DEVINST dnDevInst
,
970 _In_opt_ HMACHINE hMachine
)
972 RPC_BINDING_HANDLE BindingHandle
= NULL
;
973 HSTRING_TABLE StringTable
= NULL
;
977 TRACE("CM_Add_ID_ExW(%p %s %lx %p)\n",
978 dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
980 if (!pSetupIsUserAdmin())
981 return CR_ACCESS_DENIED
;
984 return CR_INVALID_DEVINST
;
987 return CR_INVALID_POINTER
;
989 if (ulFlags
& ~CM_ADD_ID_BITS
)
990 return CR_INVALID_FLAG
;
992 if (hMachine
!= NULL
)
994 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
995 if (BindingHandle
== NULL
)
998 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
999 if (StringTable
== 0)
1004 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1008 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1009 if (lpDevInst
== NULL
)
1010 return CR_INVALID_DEVNODE
;
1014 ret
= PNP_AddID(BindingHandle
,
1019 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1021 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1029 /***********************************************************************
1030 * CM_Add_Range [SETUPAPI.@]
1035 _In_ DWORDLONG ullStartValue
,
1036 _In_ DWORDLONG ullEndValue
,
1037 _In_ RANGE_LIST rlh
,
1040 PINTERNAL_RANGE_LIST pRangeList
;
1041 PINTERNAL_RANGE pRange
;
1042 CONFIGRET ret
= CR_SUCCESS
;
1044 FIXME("CM_Add_Range(%I64u %I64u %p %lx)\n",
1045 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1047 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
1049 if (!IsValidRangeList(pRangeList
))
1050 return CR_INVALID_RANGE_LIST
;
1052 if (ulFlags
& ~CM_ADD_RANGE_BITS
)
1053 return CR_INVALID_FLAG
;
1055 if (ullEndValue
< ullStartValue
)
1056 return CR_INVALID_RANGE
;
1058 /* Lock the range list */
1059 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
1061 /* Allocate the new range */
1062 pRange
= HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNAL_RANGE
));
1065 ret
= CR_OUT_OF_MEMORY
;
1069 pRange
->pRangeList
= pRangeList
;
1070 pRange
->ullStart
= ullStartValue
;
1071 pRange
->ullEnd
= ullEndValue
;
1073 /* Insert the range */
1074 if (IsListEmpty(&pRangeList
->ListHead
))
1076 InsertTailList(&pRangeList
->ListHead
, &pRange
->ListEntry
);
1080 HeapFree(GetProcessHeap(), 0, pRange
);
1085 /* Unlock the range list */
1086 ReleaseMutex(pRangeList
->hMutex
);
1092 /***********************************************************************
1093 * CM_Add_Res_Des [SETUPAPI.@]
1098 _Out_opt_ PRES_DES prdResDes
,
1099 _In_ LOG_CONF lcLogConf
,
1100 _In_ RESOURCEID ResourceID
,
1101 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1102 _In_ ULONG ResourceLen
,
1105 TRACE("CM_Add_Res_Des(%p %p %lu %p %lu %lx)\n",
1106 prdResDes
, lcLogConf
, ResourceID
, ResourceData
, ResourceLen
, ulFlags
);
1108 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
1109 ResourceLen
, ulFlags
, NULL
);
1113 /***********************************************************************
1114 * CM_Add_Res_Des_Ex [SETUPAPI.@]
1119 _Out_opt_ PRES_DES prdResDes
,
1120 _In_ LOG_CONF lcLogConf
,
1121 _In_ RESOURCEID ResourceID
,
1122 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1123 _In_ ULONG ResourceLen
,
1125 _In_opt_ HMACHINE hMachine
)
1127 FIXME("CM_Add_Res_Des_Ex(%p %p %lu %p %lu %lx %p)\n",
1128 prdResDes
, lcLogConf
, ResourceID
,
1129 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
1131 return CR_CALL_NOT_IMPLEMENTED
;
1135 /***********************************************************************
1136 * CM_Connect_MachineA [SETUPAPI.@]
1140 CM_Connect_MachineA(
1141 _In_opt_ PCSTR UNCServerName
,
1142 _Out_ PHMACHINE phMachine
)
1147 TRACE("CM_Connect_MachineA(%s %p)\n",
1148 debugstr_a(UNCServerName
), phMachine
);
1150 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1151 return CM_Connect_MachineW(NULL
, phMachine
);
1153 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
1154 return CR_INVALID_DATA
;
1156 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
1158 MyFree(pServerNameW
);
1164 /***********************************************************************
1165 * CM_Connect_MachineW [SETUPAPI.@]
1169 CM_Connect_MachineW(
1170 _In_opt_ PCWSTR UNCServerName
,
1171 _Out_ PHMACHINE phMachine
)
1173 PMACHINE_INFO pMachine
;
1175 TRACE("CM_Connect_MachineW(%s %p)\n",
1176 debugstr_w(UNCServerName
), phMachine
);
1178 if (phMachine
== NULL
)
1179 return CR_INVALID_POINTER
;
1183 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
1184 if (pMachine
== NULL
)
1185 return CR_OUT_OF_MEMORY
;
1187 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1189 pMachine
->bLocal
= TRUE
;
1191 /* FIXME: store the computers name in pMachine->szMachineName */
1193 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
1194 &pMachine
->StringTable
))
1196 HeapFree(GetProcessHeap(), 0, pMachine
);
1202 pMachine
->bLocal
= FALSE
;
1203 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
1205 HeapFree(GetProcessHeap(), 0, pMachine
);
1206 return CR_INVALID_MACHINENAME
;
1208 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
1210 pMachine
->StringTable
= pSetupStringTableInitialize();
1211 if (pMachine
->StringTable
== NULL
)
1213 HeapFree(GetProcessHeap(), 0, pMachine
);
1217 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
1219 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
1221 pSetupStringTableDestroy(pMachine
->StringTable
);
1222 HeapFree(GetProcessHeap(), 0, pMachine
);
1223 return CR_INVALID_MACHINENAME
;
1227 *phMachine
= (PHMACHINE
)pMachine
;
1233 /***********************************************************************
1234 * CM_Create_DevNodeA [SETUPAPI.@]
1239 _Out_ PDEVINST pdnDevInst
,
1240 _In_ DEVINSTID_A pDeviceID
,
1241 _In_ DEVINST dnParent
,
1244 TRACE("CM_Create_DevNodeA(%p %s %p %lx)\n",
1245 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
1247 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
1252 /***********************************************************************
1253 * CM_Create_DevNodeW [SETUPAPI.@]
1258 _Out_ PDEVINST pdnDevInst
,
1259 _In_ DEVINSTID_W pDeviceID
,
1260 _In_ DEVINST dnParent
,
1263 TRACE("CM_Create_DevNodeW(%p %s %p %lx)\n",
1264 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
1266 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
1271 /***********************************************************************
1272 * CM_Create_DevNode_ExA [SETUPAPI.@]
1276 CM_Create_DevNode_ExA(
1277 _Out_ PDEVINST pdnDevInst
,
1278 _In_ DEVINSTID_A pDeviceID
,
1279 _In_ DEVINST dnParent
,
1281 _In_opt_ HANDLE hMachine
)
1283 DEVINSTID_W pDeviceIDW
;
1286 TRACE("CM_Create_DevNode_ExA(%p %s %p %lx %p)\n",
1287 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1289 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
1290 return CR_INVALID_DATA
;
1292 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
1301 /***********************************************************************
1302 * CM_Create_DevNode_ExW [SETUPAPI.@]
1306 CM_Create_DevNode_ExW(
1307 _Out_ PDEVINST pdnDevInst
,
1308 _In_ DEVINSTID_W pDeviceID
,
1309 _In_ DEVINST dnParent
,
1311 _In_opt_ HANDLE hMachine
)
1313 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1314 HSTRING_TABLE StringTable
= NULL
;
1315 LPWSTR lpParentDevInst
;
1316 CONFIGRET ret
= CR_SUCCESS
;
1317 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
1319 TRACE("CM_Create_DevNode_ExW(%p %s %p %lx %p)\n",
1320 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1322 if (!pSetupIsUserAdmin())
1323 return CR_ACCESS_DENIED
;
1325 if (pdnDevInst
== NULL
)
1326 return CR_INVALID_POINTER
;
1328 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
1329 return CR_INVALID_DEVICE_ID
;
1332 return CR_INVALID_DEVNODE
;
1334 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
1335 return CR_INVALID_FLAG
;
1337 if (hMachine
!= NULL
)
1339 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1340 if (BindingHandle
== NULL
)
1343 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1344 if (StringTable
== 0)
1349 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1353 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
1354 if (lpParentDevInst
== NULL
)
1355 return CR_INVALID_DEVNODE
;
1357 wcscpy(szLocalDeviceID
, pDeviceID
);
1361 ret
= PNP_CreateDevInst(BindingHandle
,
1367 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1369 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1373 if (ret
== CR_SUCCESS
)
1375 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
1376 * will return the generated device ID in szLocalDeviceID */
1377 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
1378 if (*pdnDevInst
== 0)
1379 ret
= CR_NO_SUCH_DEVNODE
;
1386 /***********************************************************************
1387 * CM_Create_Range_List [SETUPAPI.@]
1391 CM_Create_Range_List(
1392 _Out_ PRANGE_LIST prlh
,
1395 PINTERNAL_RANGE_LIST pRangeList
= NULL
;
1397 FIXME("CM_Create_Range_List(%p %lx)\n",
1401 return CR_INVALID_FLAG
;
1404 return CR_INVALID_POINTER
;
1406 /* Allocate the range list */
1407 pRangeList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(INTERNAL_RANGE_LIST
));
1408 if (pRangeList
== NULL
)
1409 return CR_OUT_OF_MEMORY
;
1411 /* Set the magic value */
1412 pRangeList
->ulMagic
= RANGE_LIST_MAGIC
;
1414 /* Initialize the mutex for synchonized access */
1415 pRangeList
->hMutex
= CreateMutex(NULL
, FALSE
, NULL
);
1416 if (pRangeList
->hMutex
== NULL
)
1418 HeapFree(GetProcessHeap(), 0, pRangeList
);
1422 InitializeListHead(&pRangeList
->ListHead
);
1424 *prlh
= (RANGE_LIST
)pRangeList
;
1430 /***********************************************************************
1431 * CM_Delete_Class_Key [SETUPAPI.@]
1435 CM_Delete_Class_Key(
1436 _In_ LPGUID ClassGuid
,
1439 TRACE("CM_Delete_Class_Key(%p %lx)\n",
1440 ClassGuid
, ulFlags
);
1442 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
1446 /***********************************************************************
1447 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
1451 CM_Delete_Class_Key_Ex(
1452 _In_ LPGUID ClassGuid
,
1454 _In_opt_ HANDLE hMachine
)
1456 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1457 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1460 TRACE("CM_Delete_Class_Key_Ex(%p %lx %p)\n",
1461 ClassGuid
, ulFlags
, hMachine
);
1463 if (ClassGuid
== NULL
)
1464 return CR_INVALID_POINTER
;
1466 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
1467 return CR_INVALID_FLAG
;
1469 if (!GuidToString(ClassGuid
, szGuidString
))
1470 return CR_INVALID_DATA
;
1472 if (hMachine
!= NULL
)
1474 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1475 if (BindingHandle
== NULL
)
1480 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1486 ret
= PNP_DeleteClassKey(BindingHandle
,
1490 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1492 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1500 /***********************************************************************
1501 * CM_Delete_DevNode_Key [SETUPAPI.@]
1505 CM_Delete_DevNode_Key(
1506 _In_ DEVNODE dnDevNode
,
1507 _In_ ULONG ulHardwareProfile
,
1510 TRACE("CM_Delete_DevNode_Key(%p %lu %lx)\n",
1511 dnDevNode
, ulHardwareProfile
, ulFlags
);
1513 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
1518 /***********************************************************************
1519 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
1523 CM_Delete_DevNode_Key_Ex(
1524 _In_ DEVNODE dnDevNode
,
1525 _In_ ULONG ulHardwareProfile
,
1527 _In_opt_ HANDLE hMachine
)
1529 FIXME("CM_Delete_DevNode_Key_Ex(%p %lu %lx %p)\n",
1530 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
1532 return CR_CALL_NOT_IMPLEMENTED
;
1536 /***********************************************************************
1537 * CM_Delete_Range [SETUPAPI.@]
1542 _In_ DWORDLONG ullStartValue
,
1543 _In_ DWORDLONG ullEndValue
,
1544 _In_ RANGE_LIST rlh
,
1547 FIXME("CM_Delete_Range(%I64u %I64u %p %lx)\n",
1548 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1550 return CR_CALL_NOT_IMPLEMENTED
;
1554 /***********************************************************************
1555 * CM_Detect_Resource_Conflict [SETUPAPI.@]
1559 CM_Detect_Resource_Conflict(
1560 _In_ DEVINST dnDevInst
,
1561 _In_ RESOURCEID ResourceID
,
1562 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1563 _In_ ULONG ResourceLen
,
1564 _Out_ PBOOL pbConflictDetected
,
1567 TRACE("CM_Detect_Resource_Conflict(%p %lu %p %lu %p 0x%lx)\n",
1568 dnDevInst
, ResourceID
, ResourceData
, ResourceLen
,
1569 pbConflictDetected
, ulFlags
);
1571 return CM_Detect_Resource_Conflict_Ex(dnDevInst
,
1581 /***********************************************************************
1582 * CM_Detect_Resource_Conflict_Ex [SETUPAPI.@]
1586 CM_Detect_Resource_Conflict_Ex(
1587 _In_ DEVINST dnDevInst
,
1588 _In_ RESOURCEID ResourceID
,
1589 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1590 _In_ ULONG ResourceLen
,
1591 _Out_ PBOOL pbConflictDetected
,
1593 _In_opt_ HMACHINE hMachine
)
1595 FIXME("CM_Detect_Resource_Conflict_Ex(%p %lu %p %lu %p 0x%lx %p)\n",
1596 dnDevInst
, ResourceID
, ResourceData
, ResourceLen
,
1597 pbConflictDetected
, ulFlags
, hMachine
);
1599 return CR_CALL_NOT_IMPLEMENTED
;
1603 /***********************************************************************
1604 * CM_Disable_DevNode [SETUPAPI.@]
1609 _In_ DEVINST dnDevInst
,
1612 TRACE("CM_Disable_DevNode(%p %lx)\n",
1613 dnDevInst
, ulFlags
);
1615 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1619 /***********************************************************************
1620 * CM_Disable_DevNode_Ex [SETUPAPI.@]
1624 CM_Disable_DevNode_Ex(
1625 _In_ DEVINST dnDevInst
,
1627 _In_opt_ HMACHINE hMachine
)
1629 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1630 HSTRING_TABLE StringTable
= NULL
;
1634 FIXME("CM_Disable_DevNode_Ex(%p %lx %p)\n",
1635 dnDevInst
, ulFlags
, hMachine
);
1637 if (!pSetupIsUserAdmin())
1638 return CR_ACCESS_DENIED
;
1641 return CR_INVALID_DEVINST
;
1644 return CR_INVALID_FLAG
;
1646 if (hMachine
!= NULL
)
1648 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1649 if (BindingHandle
== NULL
)
1652 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1653 if (StringTable
== 0)
1658 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1662 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1663 if (lpDevInst
== NULL
)
1664 return CR_INVALID_DEVNODE
;
1668 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1669 PNP_DEVINST_DISABLE
,
1674 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1676 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1684 /***********************************************************************
1685 * CM_Disconnect_Machine [SETUPAPI.@]
1689 CM_Disconnect_Machine(
1690 _In_opt_ HMACHINE hMachine
)
1692 PMACHINE_INFO pMachine
;
1694 TRACE("CM_Disconnect_Machine(%p)\n", hMachine
);
1696 pMachine
= (PMACHINE_INFO
)hMachine
;
1697 if (pMachine
== NULL
)
1700 if (pMachine
->bLocal
== FALSE
)
1702 if (pMachine
->StringTable
!= NULL
)
1703 pSetupStringTableDestroy(pMachine
->StringTable
);
1705 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
1706 return CR_ACCESS_DENIED
;
1709 HeapFree(GetProcessHeap(), 0, pMachine
);
1715 /***********************************************************************
1716 * CM_Dup_Range_List [SETUPAPI.@]
1721 _In_ RANGE_LIST rlhOld
,
1722 _In_ RANGE_LIST rlhNew
,
1725 FIXME("CM_Dup_Range_List(%p %p %lx)\n",
1726 rlhOld
, rlhNew
, ulFlags
);
1728 return CR_CALL_NOT_IMPLEMENTED
;
1732 /***********************************************************************
1733 * CM_Enable_DevNode [SETUPAPI.@]
1738 _In_ DEVINST dnDevInst
,
1741 TRACE("CM_Enable_DevNode(%p %lx)\n",
1742 dnDevInst
, ulFlags
);
1744 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1748 /***********************************************************************
1749 * CM_Enable_DevNode_Ex [SETUPAPI.@]
1753 CM_Enable_DevNode_Ex(
1754 _In_ DEVINST dnDevInst
,
1756 _In_opt_ HMACHINE hMachine
)
1758 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1759 HSTRING_TABLE StringTable
= NULL
;
1763 TRACE("CM_Enable_DevNode_Ex(%p %lx %p)\n",
1764 dnDevInst
, ulFlags
, hMachine
);
1766 if (!pSetupIsUserAdmin())
1767 return CR_ACCESS_DENIED
;
1770 return CR_INVALID_DEVINST
;
1773 return CR_INVALID_FLAG
;
1775 if (hMachine
!= NULL
)
1777 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1778 if (BindingHandle
== NULL
)
1781 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1782 if (StringTable
== 0)
1787 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1791 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1792 if (lpDevInst
== NULL
)
1793 return CR_INVALID_DEVNODE
;
1797 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1803 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1805 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1813 /***********************************************************************
1814 * CM_Enumerate_Classes [SETUPAPI.@]
1818 CM_Enumerate_Classes(
1819 _In_ ULONG ulClassIndex
,
1820 _Out_ LPGUID ClassGuid
,
1823 TRACE("CM_Enumerate_Classes(%lx %p %lx)\n",
1824 ulClassIndex
, ClassGuid
, ulFlags
);
1826 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
1830 /***********************************************************************
1831 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
1835 CM_Enumerate_Classes_Ex(
1836 _In_ ULONG ulClassIndex
,
1837 _Out_ LPGUID ClassGuid
,
1839 _In_opt_ HMACHINE hMachine
)
1841 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1842 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1843 CONFIGRET ret
= CR_SUCCESS
;
1844 ULONG ulLength
= MAX_GUID_STRING_LEN
;
1846 TRACE("CM_Enumerate_Classes_Ex(%lx %p %lx %p)\n",
1847 ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
1849 if (ClassGuid
== NULL
)
1850 return CR_INVALID_POINTER
;
1853 return CR_INVALID_FLAG
;
1855 if (hMachine
!= NULL
)
1857 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1858 if (BindingHandle
== NULL
)
1863 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1869 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1873 MAX_GUID_STRING_LEN
,
1877 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1879 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1883 if (ret
== CR_SUCCESS
)
1886 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1888 /* Convert the buffer to a GUID */
1889 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1897 /***********************************************************************
1898 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1902 CM_Enumerate_EnumeratorsA(
1903 _In_ ULONG ulEnumIndex
,
1904 _Out_writes_(*pulLength
) PCHAR Buffer
,
1905 _Inout_ PULONG pulLength
,
1908 TRACE("CM_Enumerate_EnumeratorsA(%lu %p %p %lx)\n",
1909 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1911 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1916 /***********************************************************************
1917 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1921 CM_Enumerate_EnumeratorsW(
1922 _In_ ULONG ulEnumIndex
,
1923 _Out_writes_(*pulLength
) PWCHAR Buffer
,
1924 _Inout_ PULONG pulLength
,
1927 TRACE("CM_Enumerate_EnumeratorsW(%lu %p %p %lx)\n",
1928 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1930 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1935 /***********************************************************************
1936 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1940 CM_Enumerate_Enumerators_ExA(
1941 _In_ ULONG ulEnumIndex
,
1942 _Out_writes_(*pulLength
) PCHAR Buffer
,
1943 _Inout_ PULONG pulLength
,
1945 _In_opt_ HMACHINE hMachine
)
1947 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1950 CONFIGRET ret
= CR_SUCCESS
;
1952 TRACE("CM_Enumerate_Enumerators_ExA(%lu %p %p %lx %p)\n",
1953 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
1955 if (Buffer
== NULL
|| pulLength
== NULL
)
1956 return CR_INVALID_POINTER
;
1959 return CR_INVALID_FLAG
;
1961 ulOrigLength
= *pulLength
;
1964 ulLength
= MAX_DEVICE_ID_LEN
;
1965 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1967 if (ret
== CR_SUCCESS
)
1969 if (WideCharToMultiByte(CP_ACP
,
1979 *pulLength
= lstrlenA(Buffer
) + 1;
1986 /***********************************************************************
1987 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1991 CM_Enumerate_Enumerators_ExW(
1992 _In_ ULONG ulEnumIndex
,
1993 _Out_writes_(*pulLength
) PWCHAR Buffer
,
1994 _Inout_ PULONG pulLength
,
1996 _In_opt_ HMACHINE hMachine
)
1998 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2001 TRACE("CM_Enumerate_Enumerators_ExW(%lu %p %p %lx %p)\n",
2002 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
2004 if (Buffer
== NULL
|| pulLength
== NULL
)
2005 return CR_INVALID_POINTER
;
2008 return CR_INVALID_FLAG
;
2010 *Buffer
= UNICODE_NULL
;
2012 if (hMachine
!= NULL
)
2014 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2015 if (BindingHandle
== NULL
)
2020 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2026 ret
= PNP_EnumerateSubKeys(BindingHandle
,
2027 PNP_ENUMERATOR_SUBKEYS
,
2034 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2036 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2044 /***********************************************************************
2045 * CM_Find_Range [SETUPAPI.@]
2050 _Out_ PDWORDLONG pullStart
,
2051 _In_ DWORDLONG ullStart
,
2052 _In_ ULONG ulLength
,
2053 _In_ DWORDLONG ullAlignment
,
2054 _In_ DWORDLONG ullEnd
,
2055 _In_ RANGE_LIST rlh
,
2058 FIXME("CM_Find_Range(%p %I64u %lu %I64u %I64u %p %lx)\n",
2059 pullStart
, ullStart
, ulLength
, ullAlignment
, ullEnd
, rlh
, ulFlags
);
2061 return CR_CALL_NOT_IMPLEMENTED
;
2065 /***********************************************************************
2066 * CM_First_Range [SETUPAPI.@]
2071 _In_ RANGE_LIST rlh
,
2072 _Out_ PDWORDLONG pullStart
,
2073 _Out_ PDWORDLONG pullEnd
,
2074 _Out_ PRANGE_ELEMENT preElement
,
2077 PINTERNAL_RANGE_LIST pRangeList
;
2078 PINTERNAL_RANGE pRange
;
2079 PLIST_ENTRY ListEntry
;
2080 CONFIGRET ret
= CR_SUCCESS
;
2082 FIXME("CM_First_Range(%p %p %p %p %lx)\n",
2083 rlh
, pullStart
, pullEnd
, preElement
, ulFlags
);
2085 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
2087 if (!IsValidRangeList(pRangeList
))
2088 return CR_INVALID_RANGE_LIST
;
2090 if (pullStart
== NULL
|| pullEnd
== NULL
|| preElement
== NULL
)
2091 return CR_INVALID_POINTER
;
2094 return CR_INVALID_FLAG
;
2096 /* Lock the range list */
2097 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2099 /* Fail, if the list is empty */
2100 if (IsListEmpty(&pRangeList
->ListHead
))
2106 /* Get the first range */
2107 ListEntry
= pRangeList
->ListHead
.Flink
;
2108 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2110 /* Return the range data */
2111 *pullStart
= pRange
->ullStart
;
2112 *pullEnd
= pRange
->ullEnd
;
2113 *preElement
= (RANGE_ELEMENT
)pRange
;
2116 /* Unlock the range list */
2117 ReleaseMutex(pRangeList
->hMutex
);
2123 /***********************************************************************
2124 * CM_Free_Log_Conf [SETUPAPI.@]
2129 _In_ LOG_CONF lcLogConfToBeFreed
,
2132 TRACE("CM_Free_Log_Conf(%lx %lx)\n",
2133 lcLogConfToBeFreed
, ulFlags
);
2135 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
2139 /***********************************************************************
2140 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
2144 CM_Free_Log_Conf_Ex(
2145 _In_ LOG_CONF lcLogConfToBeFreed
,
2147 _In_opt_ HMACHINE hMachine
)
2149 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2150 HSTRING_TABLE StringTable
= NULL
;
2152 PLOG_CONF_INFO pLogConfInfo
;
2155 TRACE("CM_Free_Log_Conf_Ex(%lx %lx %p)\n",
2156 lcLogConfToBeFreed
, ulFlags
, hMachine
);
2158 if (!pSetupIsUserAdmin())
2159 return CR_ACCESS_DENIED
;
2161 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
2162 if (!IsValidLogConf(pLogConfInfo
))
2163 return CR_INVALID_LOG_CONF
;
2166 return CR_INVALID_FLAG
;
2168 if (hMachine
!= NULL
)
2170 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2171 if (BindingHandle
== NULL
)
2174 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2175 if (StringTable
== 0)
2180 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2184 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2185 if (lpDevInst
== NULL
)
2186 return CR_INVALID_DEVNODE
;
2190 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
2191 pLogConfInfo
->ulTag
, 0);
2193 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2195 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2203 /***********************************************************************
2204 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
2208 CM_Free_Log_Conf_Handle(
2209 _In_ LOG_CONF lcLogConf
)
2211 PLOG_CONF_INFO pLogConfInfo
;
2213 TRACE("CM_Free_Log_Conf_Handle(%lx)\n", lcLogConf
);
2215 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2216 if (!IsValidLogConf(pLogConfInfo
))
2217 return CR_INVALID_LOG_CONF
;
2219 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
2225 /***********************************************************************
2226 * CM_Free_Range_List [SETUPAPI.@]
2231 _In_ RANGE_LIST RangeList
,
2234 PINTERNAL_RANGE_LIST pRangeList
;
2235 PINTERNAL_RANGE pRange
;
2236 PLIST_ENTRY ListEntry
;
2238 FIXME("CM_Free_Range_List(%p %lx)\n",
2239 RangeList
, ulFlags
);
2241 pRangeList
= (PINTERNAL_RANGE_LIST
)RangeList
;
2243 if (!IsValidRangeList(pRangeList
))
2244 return CR_INVALID_RANGE_LIST
;
2247 return CR_INVALID_FLAG
;
2249 /* Lock the range list */
2250 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2252 /* Free the list of ranges */
2253 while (!IsListEmpty(&pRangeList
->ListHead
))
2255 ListEntry
= RemoveHeadList(&pRangeList
->ListHead
);
2256 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2257 HeapFree(GetProcessHeap(), 0, pRange
);
2260 /* Unlock the range list */
2261 ReleaseMutex(pRangeList
->hMutex
);
2263 /* Close the mutex */
2264 CloseHandle(pRangeList
->hMutex
);
2266 /* Free the range list */
2267 HeapFree(GetProcessHeap(), 0, pRangeList
);
2273 /***********************************************************************
2274 * CM_Free_Res_Des [SETUPAPI.@]
2279 _Out_ PRES_DES prdResDes
,
2280 _In_ RES_DES rdResDes
,
2283 TRACE("CM_Free_Res_Des(%p %p %lx)\n",
2284 prdResDes
, rdResDes
, ulFlags
);
2286 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
2290 /***********************************************************************
2291 * CM_Free_Res_Des_Ex [SETUPAPI.@]
2296 _Out_ PRES_DES prdResDes
,
2297 _In_ RES_DES rdResDes
,
2299 _In_opt_ HMACHINE hMachine
)
2301 FIXME("CM_Free_Res_Des_Ex(%p %p %lx %p)\n",
2302 prdResDes
, rdResDes
, ulFlags
, hMachine
);
2304 return CR_CALL_NOT_IMPLEMENTED
;
2308 /***********************************************************************
2309 * CM_Free_Res_Des_Handle [SETUPAPI.@]
2313 CM_Free_Res_Des_Handle(
2314 _In_ RES_DES rdResDes
)
2316 FIXME("CM_Free_Res_Des_Handle(%p)\n", rdResDes
);
2318 return CR_CALL_NOT_IMPLEMENTED
;
2322 /***********************************************************************
2323 * CM_Free_Resource_Conflict_Handle [SETUPAPI.@]
2327 CM_Free_Resource_Conflict_Handle(
2328 _In_ CONFLICT_LIST clConflictList
)
2330 PCONFLICT_DATA pConflictData
;
2332 FIXME("CM_Free_Resource_Conflict_Handle(%p)\n",
2335 pConflictData
= (PCONFLICT_DATA
)clConflictList
;
2336 if (!IsValidConflictData(pConflictData
))
2337 return CR_INVALID_CONFLICT_LIST
;
2339 if (pConflictData
->pConflictList
!= NULL
)
2340 MyFree(pConflictData
->pConflictList
);
2342 MyFree(pConflictData
);
2348 /***********************************************************************
2349 * CM_Get_Child [SETUPAPI.@]
2354 _Out_ PDEVINST pdnDevInst
,
2355 _In_ DEVINST dnDevInst
,
2358 TRACE("CM_Get_Child(%p %p %lx)\n",
2359 pdnDevInst
, dnDevInst
, ulFlags
);
2361 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2365 /***********************************************************************
2366 * CM_Get_Child_Ex [SETUPAPI.@]
2371 _Out_ PDEVINST pdnDevInst
,
2372 _In_ DEVINST dnDevInst
,
2374 _In_opt_ HMACHINE hMachine
)
2376 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2377 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2378 HSTRING_TABLE StringTable
= NULL
;
2380 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
2383 TRACE("CM_Get_Child_Ex(%p %lx %lx %p)\n",
2384 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2386 if (pdnDevInst
== NULL
)
2387 return CR_INVALID_POINTER
;
2390 return CR_INVALID_DEVINST
;
2393 return CR_INVALID_FLAG
;
2397 if (hMachine
!= NULL
)
2399 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2400 if (BindingHandle
== NULL
)
2403 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2404 if (StringTable
== 0)
2409 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2413 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2414 if (lpDevInst
== NULL
)
2415 return CR_INVALID_DEVNODE
;
2419 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2420 PNP_GET_CHILD_DEVICE_INSTANCE
,
2426 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2428 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2432 if (ret
!= CR_SUCCESS
)
2435 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2437 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
2441 *pdnDevInst
= dwIndex
;
2447 /***********************************************************************
2448 * CM_Get_Class_Key_NameA [SETUPAPI.@]
2452 CM_Get_Class_Key_NameA(
2453 _In_ LPGUID ClassGuid
,
2454 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2455 _Inout_ PULONG pulLength
,
2458 TRACE("CM_Get_Class_Key_NameA(%p %p %p %lx)\n",
2459 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2461 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
2466 /***********************************************************************
2467 * CM_Get_Class_Key_NameW [SETUPAPI.@]
2471 CM_Get_Class_Key_NameW(
2472 _In_ LPGUID ClassGuid
,
2473 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2474 _Inout_ PULONG pulLength
,
2477 TRACE("CM_Get_Class_Key_NameW(%p %p %p %lx)\n",
2478 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2480 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
2485 /***********************************************************************
2486 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
2490 CM_Get_Class_Key_Name_ExA(
2491 _In_ LPGUID ClassGuid
,
2492 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2493 _Inout_ PULONG pulLength
,
2495 _In_opt_ HMACHINE hMachine
)
2497 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
2498 CONFIGRET ret
= CR_SUCCESS
;
2502 TRACE("CM_Get_Class_Key_Name_ExA(%p %p %p %lx %p)\n",
2503 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2505 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2506 return CR_INVALID_POINTER
;
2508 ulOrigLength
= *pulLength
;
2511 ulLength
= MAX_GUID_STRING_LEN
;
2512 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2514 if (ret
== CR_SUCCESS
)
2516 if (WideCharToMultiByte(CP_ACP
,
2526 *pulLength
= lstrlenA(pszKeyName
) + 1;
2533 /***********************************************************************
2534 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
2538 CM_Get_Class_Key_Name_ExW(
2539 _In_ LPGUID ClassGuid
,
2540 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2541 _Inout_ PULONG pulLength
,
2543 _In_opt_ HMACHINE hMachine
)
2545 TRACE("CM_Get_Class_Key_Name_ExW(%p %p %p %lx %p)\n",
2546 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2548 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2549 return CR_INVALID_POINTER
;
2552 return CR_INVALID_FLAG
;
2554 if (*pulLength
< MAX_GUID_STRING_LEN
)
2557 return CR_BUFFER_SMALL
;
2560 if (!GuidToString(ClassGuid
, pszKeyName
))
2561 return CR_INVALID_DATA
;
2563 *pulLength
= MAX_GUID_STRING_LEN
;
2569 /***********************************************************************
2570 * CM_Get_Class_NameA [SETUPAPI.@]
2575 _In_ LPGUID ClassGuid
,
2576 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2577 _Inout_ PULONG pulLength
,
2580 TRACE("CM_Get_Class_NameA(%p %p %p %lx)\n",
2581 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2583 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2588 /***********************************************************************
2589 * CM_Get_Class_NameW [SETUPAPI.@]
2594 _In_ LPGUID ClassGuid
,
2595 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2596 _Inout_ PULONG pulLength
,
2599 TRACE("CM_Get_Class_NameW(%p %p %p %lx)\n",
2600 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2602 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2607 /***********************************************************************
2608 * CM_Get_Class_Name_ExA [SETUPAPI.@]
2612 CM_Get_Class_Name_ExA(
2613 _In_ LPGUID ClassGuid
,
2614 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2615 _Inout_ PULONG pulLength
,
2617 _In_opt_ HMACHINE hMachine
)
2619 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
2620 CONFIGRET ret
= CR_SUCCESS
;
2624 TRACE("CM_Get_Class_Name_ExA(%p %p %p %lx %p)\n",
2625 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2627 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2628 return CR_INVALID_POINTER
;
2630 ulOrigLength
= *pulLength
;
2633 ulLength
= MAX_CLASS_NAME_LEN
;
2634 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2636 if (ret
== CR_SUCCESS
)
2638 if (WideCharToMultiByte(CP_ACP
,
2648 *pulLength
= lstrlenA(Buffer
) + 1;
2655 /***********************************************************************
2656 * CM_Get_Class_Name_ExW [SETUPAPI.@]
2660 CM_Get_Class_Name_ExW(
2661 _In_ LPGUID ClassGuid
,
2662 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2663 _Inout_ PULONG pulLength
,
2665 _In_opt_ HMACHINE hMachine
)
2667 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
2668 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2671 TRACE("CM_Get_Class_Name_ExW(%p %p %p %lx %p\n",
2672 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2674 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2675 return CR_INVALID_POINTER
;
2678 return CR_INVALID_FLAG
;
2680 if (!GuidToString(ClassGuid
, szGuidString
))
2681 return CR_INVALID_DATA
;
2683 TRACE("Guid %s\n", debugstr_w(szGuidString
));
2685 if (hMachine
!= NULL
)
2687 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2688 if (BindingHandle
== NULL
)
2693 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2699 ret
= PNP_GetClassName(BindingHandle
,
2705 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2707 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2715 /***********************************************************************
2716 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
2720 CM_Get_Class_Registry_PropertyA(
2723 PULONG pulRegDataType
,
2729 PWSTR BufferW
= NULL
;
2734 TRACE("CM_Get_Class_Registry_PropertyA(%p %lu %p %p %p %lx %p)\n",
2735 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2738 if (pulLength
== NULL
)
2739 return CR_INVALID_POINTER
;
2741 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2742 return CR_INVALID_PROPERTY
;
2744 ulType
= GetRegistryPropertyType(ulProperty
);
2745 if (ulType
== REG_SZ
|| ulType
== REG_MULTI_SZ
)
2747 /* Get the required buffer size */
2748 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2749 NULL
, &ulLength
, ulFlags
, hMachine
);
2750 if (ret
!= CR_BUFFER_SMALL
)
2753 /* Allocate the unicode buffer */
2754 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLength
);
2755 if (BufferW
== NULL
)
2756 return CR_OUT_OF_MEMORY
;
2758 /* Get the property */
2759 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2760 BufferW
, &ulLength
, ulFlags
, hMachine
);
2761 if (ret
!= CR_SUCCESS
)
2763 HeapFree(GetProcessHeap(), 0, BufferW
);
2767 /* Do W->A conversion */
2768 *pulLength
= WideCharToMultiByte(CP_ACP
,
2771 lstrlenW(BufferW
) + 1,
2777 /* Release the unicode buffer */
2778 HeapFree(GetProcessHeap(), 0, BufferW
);
2780 if (*pulLength
== 0)
2785 /* Get the property */
2786 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2787 Buffer
, pulLength
, ulFlags
, hMachine
);
2794 /***********************************************************************
2795 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
2799 CM_Get_Class_Registry_PropertyW(
2802 PULONG pulRegDataType
,
2808 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2809 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
2811 ULONG ulTransferLength
= 0;
2814 TRACE("CM_Get_Class_Registry_PropertyW(%p %lu %p %p %p %lx %p)\n",
2815 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2818 if (ClassGuid
== NULL
|| pulLength
== NULL
)
2819 return CR_INVALID_POINTER
;
2822 return CR_INVALID_FLAG
;
2824 if (pSetupStringFromGuid(ClassGuid
,
2826 PNP_MAX_GUID_STRING_LEN
) != 0)
2827 return CR_INVALID_DATA
;
2829 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2830 return CR_INVALID_PROPERTY
;
2832 if (hMachine
!= NULL
)
2834 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2835 if (BindingHandle
== NULL
)
2840 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2844 ulTransferLength
= *pulLength
;
2848 ret
= PNP_GetClassRegProp(BindingHandle
,
2857 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2859 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2863 if (ret
== CR_SUCCESS
)
2865 if (pulRegDataType
!= NULL
)
2866 *pulRegDataType
= ulType
;
2873 /***********************************************************************
2874 * CM_Get_Depth [SETUPAPI.@]
2879 _Out_ PULONG pulDepth
,
2880 _In_ DEVINST dnDevInst
,
2883 TRACE("CM_Get_Depth(%p %lx %lx)\n",
2884 pulDepth
, dnDevInst
, ulFlags
);
2886 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
2890 /***********************************************************************
2891 * CM_Get_Depth_Ex [SETUPAPI.@]
2896 _Out_ PULONG pulDepth
,
2897 _In_ DEVINST dnDevInst
,
2899 _In_opt_ HMACHINE hMachine
)
2901 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2902 HSTRING_TABLE StringTable
= NULL
;
2906 TRACE("CM_Get_Depth_Ex(%p %lx %lx %p)\n",
2907 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
2909 if (pulDepth
== NULL
)
2910 return CR_INVALID_POINTER
;
2913 return CR_INVALID_DEVINST
;
2916 return CR_INVALID_FLAG
;
2918 if (hMachine
!= NULL
)
2920 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2921 if (BindingHandle
== NULL
)
2924 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2925 if (StringTable
== 0)
2930 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2934 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2935 if (lpDevInst
== NULL
)
2936 return CR_INVALID_DEVNODE
;
2940 ret
= PNP_GetDepth(BindingHandle
,
2945 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2947 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2955 /***********************************************************************
2956 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
2960 CM_Get_DevNode_Custom_PropertyA(
2961 _In_ DEVINST dnDevInst
,
2962 _In_ PCSTR pszCustomPropertyName
,
2963 _Out_opt_ PULONG pulRegDataType
,
2964 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
2965 _Inout_ PULONG pulLength
,
2968 TRACE("CM_Get_DevNode_Custom_PropertyA(%lx %s %p %p %p %lx)\n",
2969 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
2970 Buffer
, pulLength
, ulFlags
);
2972 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
2973 pulRegDataType
, Buffer
,
2974 pulLength
, ulFlags
, NULL
);
2978 /***********************************************************************
2979 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
2983 CM_Get_DevNode_Custom_PropertyW(
2984 _In_ DEVINST dnDevInst
,
2985 _In_ PCWSTR pszCustomPropertyName
,
2986 _Out_opt_ PULONG pulRegDataType
,
2987 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
2988 _Inout_ PULONG pulLength
,
2991 TRACE("CM_Get_DevNode_Custom_PropertyW(%lx %s %p %p %p %lx)\n",
2992 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
2993 Buffer
, pulLength
, ulFlags
);
2995 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
2996 pulRegDataType
, Buffer
,
2997 pulLength
, ulFlags
, NULL
);
3001 /***********************************************************************
3002 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
3006 CM_Get_DevNode_Custom_Property_ExA(
3007 _In_ DEVINST dnDevInst
,
3008 _In_ PCSTR pszCustomPropertyName
,
3009 _Out_opt_ PULONG pulRegDataType
,
3010 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3011 _Inout_ PULONG pulLength
,
3013 _In_opt_ HMACHINE hMachine
)
3015 LPWSTR pszPropertyNameW
= NULL
;
3018 ULONG ulDataType
= REG_NONE
;
3021 TRACE("CM_Get_DevNode_Custom_Property_ExA(%lx %s %p %p %p %lx %p)\n",
3022 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
3023 Buffer
, pulLength
, ulFlags
, hMachine
);
3026 return CR_INVALID_POINTER
;
3028 ulLengthW
= *pulLength
* sizeof(WCHAR
);
3029 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
3031 return CR_OUT_OF_MEMORY
;
3033 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
3035 if (pszPropertyNameW
== NULL
)
3037 HeapFree(GetProcessHeap(), 0, BufferW
);
3038 return CR_OUT_OF_MEMORY
;
3041 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
3048 if (ret
== CR_SUCCESS
)
3050 if (ulDataType
== REG_SZ
||
3051 ulDataType
== REG_EXPAND_SZ
||
3052 ulDataType
== REG_MULTI_SZ
)
3054 /* Do W->A conversion */
3055 *pulLength
= WideCharToMultiByte(CP_ACP
,
3058 lstrlenW(BufferW
) + 1,
3063 if (*pulLength
== 0)
3068 /* Directly copy the value */
3069 if (ulLengthW
<= *pulLength
)
3070 memcpy(Buffer
, BufferW
, ulLengthW
);
3073 *pulLength
= ulLengthW
;
3074 ret
= CR_BUFFER_SMALL
;
3080 *pulRegDataType
= ulDataType
;
3082 HeapFree(GetProcessHeap(), 0, BufferW
);
3083 MyFree(pszPropertyNameW
);
3089 /***********************************************************************
3090 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
3094 CM_Get_DevNode_Custom_Property_ExW(
3095 _In_ DEVINST dnDevInst
,
3096 _In_ PCWSTR pszCustomPropertyName
,
3097 _Out_opt_ PULONG pulRegDataType
,
3098 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3099 _Inout_ PULONG pulLength
,
3101 _In_opt_ HMACHINE hMachine
)
3103 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3104 HSTRING_TABLE StringTable
= NULL
;
3106 ULONG ulDataType
= REG_NONE
;
3107 ULONG ulTransferLength
;
3108 CONFIGRET ret
= CR_SUCCESS
;
3110 TRACE("CM_Get_DevNode_Custom_Property_ExW(%lx %s %p %p %p %lx %p)\n",
3111 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
3112 Buffer
, pulLength
, ulFlags
, hMachine
);
3115 return CR_INVALID_DEVNODE
;
3117 if (pszCustomPropertyName
== NULL
||
3118 pulLength
== NULL
||
3120 return CR_INVALID_POINTER
;
3122 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
3123 return CR_INVALID_FLAG
;
3125 if (hMachine
!= NULL
)
3127 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3128 if (BindingHandle
== NULL
)
3131 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3132 if (StringTable
== 0)
3137 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3141 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3142 if (lpDevInst
== NULL
)
3143 return CR_INVALID_DEVNODE
;
3145 ulTransferLength
= *pulLength
;
3149 ret
= PNP_GetCustomDevProp(BindingHandle
,
3151 (LPWSTR
)pszCustomPropertyName
,
3158 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3160 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3164 if (ret
== CR_SUCCESS
)
3166 if (pulRegDataType
!= NULL
)
3167 *pulRegDataType
= ulDataType
;
3174 /***********************************************************************
3175 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
3179 CM_Get_DevNode_Registry_PropertyA(
3180 _In_ DEVINST dnDevInst
,
3181 _In_ ULONG ulProperty
,
3182 _Out_opt_ PULONG pulRegDataType
,
3183 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3184 _Inout_ PULONG pulLength
,
3187 TRACE("CM_Get_DevNode_Registry_PropertyA(%lx %lu %p %p %p %lx)\n",
3188 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3190 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
3191 pulRegDataType
, Buffer
,
3192 pulLength
, ulFlags
, NULL
);
3196 /***********************************************************************
3197 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
3201 CM_Get_DevNode_Registry_PropertyW(
3202 _In_ DEVINST dnDevInst
,
3203 _In_ ULONG ulProperty
,
3204 _Out_opt_ PULONG pulRegDataType
,
3205 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3206 _Inout_ PULONG pulLength
,
3209 TRACE("CM_Get_DevNode_Registry_PropertyW(%lx %lu %p %p %p %lx)\n",
3210 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3212 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
3213 pulRegDataType
, Buffer
,
3214 pulLength
, ulFlags
, NULL
);
3218 /***********************************************************************
3219 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
3223 CM_Get_DevNode_Registry_Property_ExA(
3224 _In_ DEVINST dnDevInst
,
3225 _In_ ULONG ulProperty
,
3226 _Out_opt_ PULONG pulRegDataType
,
3227 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3228 _Inout_ PULONG pulLength
,
3230 _In_opt_ HMACHINE hMachine
)
3234 ULONG ulDataType
= REG_NONE
;
3237 TRACE("CM_Get_DevNode_Registry_Property_ExA(%lx %lu %p %p %p %lx %p)\n",
3238 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3242 return CR_INVALID_POINTER
;
3244 LengthW
= *pulLength
* sizeof(WCHAR
);
3245 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
3248 return CR_OUT_OF_MEMORY
;
3250 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
3258 if (ret
== CR_SUCCESS
)
3260 if (ulDataType
== REG_SZ
||
3261 ulDataType
== REG_EXPAND_SZ
||
3262 ulDataType
== REG_MULTI_SZ
)
3264 /* Do W->A conversion */
3265 *pulLength
= WideCharToMultiByte(CP_ACP
,
3268 lstrlenW(BufferW
) + 1,
3273 if (*pulLength
== 0)
3278 /* Directly copy the value */
3279 if (LengthW
<= *pulLength
)
3280 memcpy(Buffer
, BufferW
, LengthW
);
3283 *pulLength
= LengthW
;
3284 ret
= CR_BUFFER_SMALL
;
3290 *pulRegDataType
= ulDataType
;
3292 HeapFree(GetProcessHeap(), 0, BufferW
);
3298 /***********************************************************************
3299 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
3303 CM_Get_DevNode_Registry_Property_ExW(
3304 _In_ DEVINST dnDevInst
,
3305 _In_ ULONG ulProperty
,
3306 _Out_opt_ PULONG pulRegDataType
,
3307 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3308 _Inout_ PULONG pulLength
,
3310 _In_opt_ HMACHINE hMachine
)
3312 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3313 HSTRING_TABLE StringTable
= NULL
;
3314 CONFIGRET ret
= CR_SUCCESS
;
3316 ULONG ulDataType
= REG_NONE
;
3317 ULONG ulTransferLength
= 0;
3319 TRACE("CM_Get_DevNode_Registry_Property_ExW(%lx %lu %p %p %p %lx %p)\n",
3320 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3324 return CR_INVALID_DEVNODE
;
3326 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
3327 return CR_INVALID_PROPERTY
;
3329 /* pulRegDataType is optional */
3331 /* Buffer is optional */
3333 if (pulLength
== NULL
)
3334 return CR_INVALID_POINTER
;
3336 if (*pulLength
== 0)
3337 return CR_INVALID_POINTER
;
3340 return CR_INVALID_FLAG
;
3342 if (hMachine
!= NULL
)
3344 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3345 if (BindingHandle
== NULL
)
3348 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3349 if (StringTable
== 0)
3354 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3358 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3359 if (lpDevInst
== NULL
)
3360 return CR_INVALID_DEVNODE
;
3362 ulTransferLength
= *pulLength
;
3366 ret
= PNP_GetDeviceRegProp(BindingHandle
,
3375 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3377 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3381 if (ret
== CR_SUCCESS
)
3383 if (pulRegDataType
!= NULL
)
3384 *pulRegDataType
= ulDataType
;
3391 /***********************************************************************
3392 * CM_Get_DevNode_Status [SETUPAPI.@]
3396 CM_Get_DevNode_Status(
3397 _Out_ PULONG pulStatus
,
3398 _Out_ PULONG pulProblemNumber
,
3399 _In_ DEVINST dnDevInst
,
3402 TRACE("CM_Get_DevNode_Status(%p %p %lx %lx)\n",
3403 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
3405 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
3410 /***********************************************************************
3411 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
3415 CM_Get_DevNode_Status_Ex(
3416 _Out_ PULONG pulStatus
,
3417 _Out_ PULONG pulProblemNumber
,
3418 _In_ DEVINST dnDevInst
,
3420 _In_opt_ HMACHINE hMachine
)
3422 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3423 HSTRING_TABLE StringTable
= NULL
;
3427 TRACE("CM_Get_DevNode_Status_Ex(%p %p %lx %lx %p)\n",
3428 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
3430 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
3431 return CR_INVALID_POINTER
;
3434 return CR_INVALID_DEVINST
;
3437 return CR_INVALID_FLAG
;
3439 if (hMachine
!= NULL
)
3441 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3442 if (BindingHandle
== NULL
)
3445 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3446 if (StringTable
== 0)
3451 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3455 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3456 if (lpDevInst
== NULL
)
3457 return CR_INVALID_DEVNODE
;
3461 ret
= PNP_GetDeviceStatus(BindingHandle
,
3467 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3469 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3477 /***********************************************************************
3478 * CM_Get_Device_IDA [SETUPAPI.@]
3483 _In_ DEVINST dnDevInst
,
3484 _Out_writes_(BufferLen
) PCHAR Buffer
,
3485 _In_ ULONG BufferLen
,
3488 TRACE("CM_Get_Device_IDA(%lx %p %lu %lx)\n",
3489 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3491 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3495 /***********************************************************************
3496 * CM_Get_Device_IDW [SETUPAPI.@]
3501 _In_ DEVINST dnDevInst
,
3502 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3503 _In_ ULONG BufferLen
,
3506 TRACE("CM_Get_Device_IDW(%lx %p %lu %lx)\n",
3507 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3509 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3513 /***********************************************************************
3514 * CM_Get_Device_ID_ExA [SETUPAPI.@]
3518 CM_Get_Device_ID_ExA(
3519 _In_ DEVINST dnDevInst
,
3520 _Out_writes_(BufferLen
) PCHAR Buffer
,
3521 _In_ ULONG BufferLen
,
3523 _In_opt_ HMACHINE hMachine
)
3525 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
3526 CONFIGRET ret
= CR_SUCCESS
;
3528 TRACE("CM_Get_Device_ID_ExA(%lx %p %lu %lx %p)\n",
3529 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3532 return CR_INVALID_POINTER
;
3534 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
3539 if (ret
== CR_SUCCESS
)
3541 if (WideCharToMultiByte(CP_ACP
,
3544 lstrlenW(szBufferW
) + 1,
3556 /***********************************************************************
3557 * CM_Get_Device_ID_ExW [SETUPAPI.@]
3561 CM_Get_Device_ID_ExW(
3562 _In_ DEVINST dnDevInst
,
3563 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3564 _In_ ULONG BufferLen
,
3566 _In_opt_ HMACHINE hMachine
)
3568 HSTRING_TABLE StringTable
= NULL
;
3570 TRACE("CM_Get_Device_ID_ExW(%lx %p %lu %lx %p)\n",
3571 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3574 return CR_INVALID_DEVINST
;
3577 return CR_INVALID_POINTER
;
3580 return CR_INVALID_FLAG
;
3582 if (hMachine
!= NULL
)
3584 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3585 if (StringTable
== NULL
)
3590 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3594 if (!pSetupStringTableStringFromIdEx(StringTable
,
3604 /***********************************************************************
3605 * CM_Get_Device_ID_ListA [SETUPAPI.@]
3609 CM_Get_Device_ID_ListA(
3610 _In_ PCSTR pszFilter
,
3611 _Out_writes_(BufferLen
) PCHAR Buffer
,
3612 _In_ ULONG BufferLen
,
3615 TRACE("CM_Get_Device_ID_ListA(%p %p %lu %lx)\n",
3616 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3618 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
3623 /***********************************************************************
3624 * CM_Get_Device_ID_ListW [SETUPAPI.@]
3628 CM_Get_Device_ID_ListW(
3629 _In_ PCWSTR pszFilter
,
3630 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3631 _In_ ULONG BufferLen
,
3634 TRACE("CM_Get_Device_ID_ListW(%p %p %lu %lx)\n",
3635 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3637 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
3642 /***********************************************************************
3643 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
3647 CM_Get_Device_ID_List_ExA(
3648 _In_ PCSTR pszFilter
,
3649 _Out_writes_(BufferLen
) PCHAR Buffer
,
3650 _In_ ULONG BufferLen
,
3652 _In_opt_ HMACHINE hMachine
)
3654 LPWSTR BufferW
= NULL
;
3655 LPWSTR pszFilterW
= NULL
;
3656 CONFIGRET ret
= CR_SUCCESS
;
3658 TRACE("CM_Get_Device_ID_List_ExA(%p %p %lu %lx %p)\n",
3659 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3661 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
3662 if (BufferW
== NULL
)
3663 return CR_OUT_OF_MEMORY
;
3665 if (pszFilter
== NULL
)
3667 ret
= CM_Get_Device_ID_List_ExW(NULL
,
3675 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3677 ret
= CR_INVALID_DEVICE_ID
;
3681 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
3690 if (WideCharToMultiByte(CP_ACP
,
3693 lstrlenW(BufferW
) + 1,
3707 /***********************************************************************
3708 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
3712 CM_Get_Device_ID_List_ExW(
3713 _In_ PCWSTR pszFilter
,
3714 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3715 _In_ ULONG BufferLen
,
3717 _In_opt_ HMACHINE hMachine
)
3719 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3722 TRACE("CM_Get_Device_ID_List_ExW(%p %p %lu %lx %p)\n",
3723 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3725 if (Buffer
== NULL
|| BufferLen
== 0)
3726 return CR_INVALID_POINTER
;
3728 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3729 return CR_INVALID_FLAG
;
3731 if (hMachine
!= NULL
)
3733 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3734 if (BindingHandle
== NULL
)
3739 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3747 ret
= PNP_GetDeviceList(BindingHandle
,
3753 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3755 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3763 /***********************************************************************
3764 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
3768 CM_Get_Device_ID_List_SizeA(
3769 _Out_ PULONG pulLen
,
3770 _In_opt_ PCSTR pszFilter
,
3773 TRACE("CM_Get_Device_ID_List_SizeA(%p %s %lx)\n",
3774 pulLen
, debugstr_a(pszFilter
), ulFlags
);
3776 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
3780 /***********************************************************************
3781 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
3785 CM_Get_Device_ID_List_SizeW(
3786 _Out_ PULONG pulLen
,
3787 _In_opt_ PCWSTR pszFilter
,
3790 TRACE("CM_Get_Device_ID_List_SizeW(%p %s %lx)\n",
3791 pulLen
, debugstr_w(pszFilter
), ulFlags
);
3793 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
3797 /***********************************************************************
3798 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
3802 CM_Get_Device_ID_List_Size_ExA(
3803 _Out_ PULONG pulLen
,
3804 _In_opt_ PCSTR pszFilter
,
3806 _In_opt_ HMACHINE hMachine
)
3808 LPWSTR pszFilterW
= NULL
;
3809 CONFIGRET ret
= CR_SUCCESS
;
3811 FIXME("CM_Get_Device_ID_List_Size_ExA(%p %s %lx %p)\n",
3812 pulLen
, debugstr_a(pszFilter
), ulFlags
, hMachine
);
3814 if (pszFilter
== NULL
)
3816 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3823 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3824 return CR_INVALID_DEVICE_ID
;
3826 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3838 /***********************************************************************
3839 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
3843 CM_Get_Device_ID_List_Size_ExW(
3844 _Out_ PULONG pulLen
,
3845 _In_opt_ PCWSTR pszFilter
,
3847 _In_opt_ HMACHINE hMachine
)
3849 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3852 FIXME("CM_Get_Device_ID_List_Size_ExW(%p %s %lx %p)\n",
3853 pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
3856 return CR_INVALID_POINTER
;
3858 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3859 return CR_INVALID_FLAG
;
3861 if (hMachine
!= NULL
)
3863 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3864 if (BindingHandle
== NULL
)
3869 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3877 ret
= PNP_GetDeviceListSize(BindingHandle
,
3882 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3884 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3892 /***********************************************************************
3893 * CM_Get_Device_ID_Size [SETUPAPI.@]
3897 CM_Get_Device_ID_Size(
3898 _Out_ PULONG pulLen
,
3899 _In_ DEVINST dnDevInst
,
3902 TRACE("CM_Get_Device_ID_Size(%p %lx %lx)\n",
3903 pulLen
, dnDevInst
, ulFlags
);
3905 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
3909 /***********************************************************************
3910 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
3914 CM_Get_Device_ID_Size_Ex(
3915 _Out_ PULONG pulLen
,
3916 _In_ DEVINST dnDevInst
,
3918 _In_opt_ HMACHINE hMachine
)
3920 HSTRING_TABLE StringTable
= NULL
;
3923 TRACE("CM_Get_Device_ID_Size_Ex(%p %lx %lx %p)\n",
3924 pulLen
, dnDevInst
, ulFlags
, hMachine
);
3927 return CR_INVALID_POINTER
;
3930 return CR_INVALID_DEVINST
;
3933 return CR_INVALID_FLAG
;
3935 if (hMachine
!= NULL
)
3937 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3938 if (StringTable
== NULL
)
3943 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3947 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3948 if (DeviceId
== NULL
)
3954 *pulLen
= lstrlenW(DeviceId
);
3960 /***********************************************************************
3961 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
3965 CM_Get_Device_Interface_AliasA(
3966 _In_ LPCSTR pszDeviceInterface
,
3967 _In_ LPGUID AliasInterfaceGuid
,
3968 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
3969 _Inout_ PULONG pulLength
,
3972 TRACE("CM_Get_Device_Interface_AliasA(%p %p %p %p %lx)\n",
3973 pszDeviceInterface
, AliasInterfaceGuid
,
3974 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3976 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
3977 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3982 /***********************************************************************
3983 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
3987 CM_Get_Device_Interface_AliasW(
3988 _In_ LPCWSTR pszDeviceInterface
,
3989 _In_ LPGUID AliasInterfaceGuid
,
3990 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
3991 _Inout_ PULONG pulLength
,
3994 TRACE("CM_Get_Device_Interface_AliasW(%p %p %p %p %lx)\n",
3995 pszDeviceInterface
, AliasInterfaceGuid
,
3996 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3998 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
3999 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
4004 /***********************************************************************
4005 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
4009 CM_Get_Device_Interface_Alias_ExA(
4010 _In_ LPCSTR pszDeviceInterface
,
4011 _In_ LPGUID AliasInterfaceGuid
,
4012 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
4013 _Inout_ PULONG pulLength
,
4015 _In_opt_ HMACHINE hMachine
)
4017 FIXME("CM_Get_Device_Interface_Alias_ExA(%p %p %p %p %lx %p)\n",
4018 pszDeviceInterface
, AliasInterfaceGuid
,
4019 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4021 return CR_CALL_NOT_IMPLEMENTED
;
4025 /***********************************************************************
4026 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
4030 CM_Get_Device_Interface_Alias_ExW(
4031 _In_ LPCWSTR pszDeviceInterface
,
4032 _In_ LPGUID AliasInterfaceGuid
,
4033 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
4034 _Inout_ PULONG pulLength
,
4036 _In_opt_ HMACHINE hMachine
)
4038 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4039 ULONG ulTransferLength
;
4040 CONFIGRET ret
= CR_SUCCESS
;
4042 TRACE("CM_Get_Device_Interface_Alias_ExW(%p %p %p %p %lx %p)\n",
4043 pszDeviceInterface
, AliasInterfaceGuid
,
4044 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4046 if (pszDeviceInterface
== NULL
||
4047 AliasInterfaceGuid
== NULL
||
4048 pszAliasDeviceInterface
== NULL
||
4050 return CR_INVALID_POINTER
;
4053 return CR_INVALID_FLAG
;
4055 if (hMachine
!= NULL
)
4057 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4058 if (BindingHandle
== NULL
)
4063 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4067 ulTransferLength
= *pulLength
;
4071 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
4072 (LPWSTR
)pszDeviceInterface
,
4074 pszAliasDeviceInterface
,
4079 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4081 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4089 /***********************************************************************
4090 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
4094 CM_Get_Device_Interface_ListA(
4095 _In_ LPGUID InterfaceClassGuid
,
4096 _In_opt_ DEVINSTID_A pDeviceID
,
4097 _Out_writes_(BufferLen
) PCHAR Buffer
,
4098 _In_ ULONG BufferLen
,
4101 TRACE("CM_Get_Device_Interface_ListA(%s %s %p %lu 0x%08lx)\n",
4102 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4103 Buffer
, BufferLen
, ulFlags
);
4105 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
4106 Buffer
, BufferLen
, ulFlags
, NULL
);
4110 /***********************************************************************
4111 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
4115 CM_Get_Device_Interface_ListW(
4116 _In_ LPGUID InterfaceClassGuid
,
4117 _In_opt_ DEVINSTID_W pDeviceID
,
4118 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4119 _In_ ULONG BufferLen
,
4122 TRACE("CM_Get_Device_Interface_ListW(%s %s %p %lu 0x%08lx)\n",
4123 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4124 Buffer
, BufferLen
, ulFlags
);
4126 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
4127 Buffer
, BufferLen
, ulFlags
, NULL
);
4131 /***********************************************************************
4132 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
4136 CM_Get_Device_Interface_List_ExA(
4137 _In_ LPGUID InterfaceClassGuid
,
4138 _In_opt_ DEVINSTID_A pDeviceID
,
4139 _Out_writes_(BufferLen
) PCHAR Buffer
,
4140 _In_ ULONG BufferLen
,
4142 _In_opt_ HMACHINE hMachine
)
4144 DEVINSTID_W pDeviceIdW
= NULL
;
4145 PWCHAR BufferW
= NULL
;
4146 CONFIGRET ret
= CR_SUCCESS
;
4148 TRACE("CM_Get_Device_Interface_List_ExA(%s %s %p %lu 0x%08lx %p)\n",
4149 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4150 Buffer
, BufferLen
, ulFlags
, hMachine
);
4152 if (Buffer
== NULL
||
4154 return CR_INVALID_POINTER
;
4156 if (pDeviceID
!= NULL
)
4158 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4159 return CR_INVALID_DEVICE_ID
;
4162 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
4163 if (BufferW
== NULL
)
4165 ret
= CR_OUT_OF_MEMORY
;
4169 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
4170 BufferW
, BufferLen
, ulFlags
,
4172 if (ret
!= CR_SUCCESS
)
4175 if (WideCharToMultiByte(CP_ACP
,
4178 lstrlenW(BufferW
) + 1,
4186 if (BufferW
!= NULL
)
4189 if (pDeviceIdW
!= NULL
)
4196 /***********************************************************************
4197 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
4201 CM_Get_Device_Interface_List_ExW(
4202 _In_ LPGUID InterfaceClassGuid
,
4203 _In_opt_ DEVINSTID_W pDeviceID
,
4204 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4205 _In_ ULONG BufferLen
,
4207 _In_opt_ HMACHINE hMachine
)
4209 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4210 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
4211 CONFIGRET ret
= CR_SUCCESS
;
4213 TRACE("CM_Get_Device_Interface_List_ExW(%s %s %p %lu 0x%08lx %p)\n",
4214 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4215 Buffer
, BufferLen
, ulFlags
, hMachine
);
4217 if (Buffer
== NULL
||
4219 return CR_INVALID_POINTER
;
4221 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4222 return CR_INVALID_FLAG
;
4224 if (hMachine
!= NULL
)
4226 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4227 if (BindingHandle
== NULL
)
4232 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4237 BufferSize
= BufferLen
;
4241 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
4248 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4250 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4258 /***********************************************************************
4259 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
4263 CM_Get_Device_Interface_List_SizeA(
4264 _Out_ PULONG pulLen
,
4265 _In_ LPGUID InterfaceClassGuid
,
4266 _In_opt_ DEVINSTID_A pDeviceID
,
4269 TRACE("CM_Get_Device_Interface_List_SizeA(%p %p %s 0x%08lx)\n",
4270 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
);
4272 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
4273 pDeviceID
, ulFlags
, NULL
);
4277 /***********************************************************************
4278 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
4282 CM_Get_Device_Interface_List_SizeW(
4283 _Out_ PULONG pulLen
,
4284 _In_ LPGUID InterfaceClassGuid
,
4285 _In_opt_ DEVINSTID_W pDeviceID
,
4288 TRACE("CM_Get_Device_Interface_List_SizeW(%p %p %s 0x%08lx)\n",
4289 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
);
4291 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4292 pDeviceID
, ulFlags
, NULL
);
4296 /***********************************************************************
4297 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
4301 CM_Get_Device_Interface_List_Size_ExA(
4302 _Out_ PULONG pulLen
,
4303 _In_ LPGUID InterfaceClassGuid
,
4304 _In_opt_ DEVINSTID_A pDeviceID
,
4306 _In_opt_ HMACHINE hMachine
)
4308 DEVINSTID_W pDeviceIdW
= NULL
;
4309 CONFIGRET ret
= CR_SUCCESS
;
4311 TRACE("CM_Get_Device_Interface_List_Size_ExA(%p %p %s 0x%08lx %p)\n",
4312 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
4315 return CR_INVALID_POINTER
;
4317 if (pDeviceID
!= NULL
)
4319 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4320 return CR_INVALID_DEVICE_ID
;
4325 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4326 pDeviceIdW
, ulFlags
, hMachine
);
4328 if (pDeviceIdW
!= NULL
)
4335 /***********************************************************************
4336 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
4340 CM_Get_Device_Interface_List_Size_ExW(
4341 _Out_ PULONG pulLen
,
4342 _In_ LPGUID InterfaceClassGuid
,
4343 _In_opt_ DEVINSTID_W pDeviceID
,
4345 _In_opt_ HMACHINE hMachine
)
4347 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4348 CONFIGRET ret
= CR_SUCCESS
;
4350 TRACE("CM_Get_Device_Interface_List_Size_ExW(%p %p %s 0x%08lx %p)\n",
4351 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
4354 return CR_INVALID_POINTER
;
4356 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4357 return CR_INVALID_FLAG
;
4359 if (hMachine
!= NULL
)
4361 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4362 if (BindingHandle
== NULL
)
4367 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4375 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
4381 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4383 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4391 /***********************************************************************
4392 * CM_Get_First_Log_Conf [SETUPAPI.@]
4396 CM_Get_First_Log_Conf(
4397 _Out_opt_ PLOG_CONF plcLogConf
,
4398 _In_ DEVINST dnDevInst
,
4401 TRACE("CM_Get_First_Log_Conf(%p %lx %lx)\n",
4402 plcLogConf
, dnDevInst
, ulFlags
);
4404 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
4408 /***********************************************************************
4409 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
4413 CM_Get_First_Log_Conf_Ex(
4414 _Out_opt_ PLOG_CONF plcLogConf
,
4415 _In_ DEVINST dnDevInst
,
4417 _In_opt_ HMACHINE hMachine
)
4419 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4420 HSTRING_TABLE StringTable
= NULL
;
4421 LPWSTR lpDevInst
= NULL
;
4422 CONFIGRET ret
= CR_SUCCESS
;
4424 PLOG_CONF_INFO pLogConfInfo
;
4426 FIXME("CM_Get_First_Log_Conf_Ex(%p %lx %lx %p)\n",
4427 plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
4430 return CR_INVALID_DEVINST
;
4432 if (ulFlags
& ~LOG_CONF_BITS
)
4433 return CR_INVALID_FLAG
;
4438 if (hMachine
!= NULL
)
4440 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4441 if (BindingHandle
== NULL
)
4444 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4445 if (StringTable
== 0)
4450 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4454 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4455 if (lpDevInst
== NULL
)
4456 return CR_INVALID_DEVNODE
;
4460 ret
= PNP_GetFirstLogConf(BindingHandle
,
4466 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4468 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4472 if (ret
!= CR_SUCCESS
)
4477 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4478 if (pLogConfInfo
== NULL
)
4479 return CR_OUT_OF_MEMORY
;
4481 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4482 pLogConfInfo
->dnDevInst
= dnDevInst
;
4483 pLogConfInfo
->ulFlags
= ulFlags
;
4484 pLogConfInfo
->ulTag
= ulTag
;
4486 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
4493 /***********************************************************************
4494 * CM_Get_Global_State [SETUPAPI.@]
4498 CM_Get_Global_State(
4499 _Out_ PULONG pulState
,
4502 TRACE("CM_Get_Global_State(%p %lx)\n",
4505 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
4509 /***********************************************************************
4510 * CM_Get_Global_State_Ex [SETUPAPI.@]
4514 CM_Get_Global_State_Ex(
4515 _Out_ PULONG pulState
,
4517 _In_opt_ HMACHINE hMachine
)
4519 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4522 TRACE("CM_Get_Global_State_Ex(%p %lx %p)\n",
4523 pulState
, ulFlags
, hMachine
);
4525 if (pulState
== NULL
)
4526 return CR_INVALID_POINTER
;
4529 return CR_INVALID_FLAG
;
4531 if (hMachine
!= NULL
)
4533 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4534 if (BindingHandle
== NULL
)
4539 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4545 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
4547 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4549 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4557 /***********************************************************************
4558 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
4562 CM_Get_HW_Prof_FlagsA(
4563 _In_ DEVINSTID_A szDevInstName
,
4564 _In_ ULONG ulHardwareProfile
,
4565 _Out_ PULONG pulValue
,
4568 TRACE("CM_Get_HW_Prof_FlagsA(%s %lu %p %lx)\n",
4569 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4571 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
4572 pulValue
, ulFlags
, NULL
);
4576 /***********************************************************************
4577 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
4581 CM_Get_HW_Prof_FlagsW(
4582 _In_ DEVINSTID_W szDevInstName
,
4583 _In_ ULONG ulHardwareProfile
,
4584 _Out_ PULONG pulValue
,
4587 TRACE("CM_Get_HW_Prof_FlagsW(%s %lu %p %lx)\n",
4588 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4590 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
4591 pulValue
, ulFlags
, NULL
);
4595 /***********************************************************************
4596 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
4600 CM_Get_HW_Prof_Flags_ExA(
4601 _In_ DEVINSTID_A szDevInstName
,
4602 _In_ ULONG ulHardwareProfile
,
4603 _Out_ PULONG pulValue
,
4605 _In_opt_ HMACHINE hMachine
)
4607 DEVINSTID_W pszDevIdW
= NULL
;
4608 CONFIGRET ret
= CR_SUCCESS
;
4610 TRACE("CM_Get_HW_Prof_Flags_ExA(%s %lu %p %lx %p)\n",
4611 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4613 if (szDevInstName
!= NULL
)
4615 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
4616 return CR_INVALID_DEVICE_ID
;
4619 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
4620 pulValue
, ulFlags
, hMachine
);
4622 if (pszDevIdW
!= NULL
)
4629 /***********************************************************************
4630 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
4634 CM_Get_HW_Prof_Flags_ExW(
4635 _In_ DEVINSTID_W szDevInstName
,
4636 _In_ ULONG ulHardwareProfile
,
4637 _Out_ PULONG pulValue
,
4639 _In_opt_ HMACHINE hMachine
)
4641 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4644 FIXME("CM_Get_HW_Prof_Flags_ExW(%s %lu %p %lx %p)\n",
4645 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4647 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
4648 return CR_INVALID_POINTER
;
4651 return CR_INVALID_FLAG
;
4653 /* FIXME: Check whether szDevInstName is valid */
4655 if (hMachine
!= NULL
)
4657 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4658 if (BindingHandle
== NULL
)
4663 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4669 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
4670 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
4672 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4674 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4682 /***********************************************************************
4683 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
4687 CM_Get_Hardware_Profile_InfoA(
4689 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4692 TRACE("CM_Get_Hardware_Profile_InfoA(%lu %p %lx)\n",
4693 ulIndex
, pHWProfileInfo
, ulFlags
);
4695 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
4700 /***********************************************************************
4701 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
4705 CM_Get_Hardware_Profile_InfoW(
4707 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4710 TRACE("CM_Get_Hardware_Profile_InfoW(%lu %p %lx)\n",
4711 ulIndex
, pHWProfileInfo
, ulFlags
);
4713 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
4718 /***********************************************************************
4719 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
4723 CM_Get_Hardware_Profile_Info_ExA(
4725 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4727 _In_opt_ HMACHINE hMachine
)
4729 HWPROFILEINFO_W LocalProfileInfo
;
4732 TRACE("CM_Get_Hardware_Profile_Info_ExA(%lu %p %lx %p)\n",
4733 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4735 if (pHWProfileInfo
== NULL
)
4736 return CR_INVALID_POINTER
;
4738 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
4740 if (ret
== CR_SUCCESS
)
4742 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
4743 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
4745 if (WideCharToMultiByte(CP_ACP
,
4747 LocalProfileInfo
.HWPI_szFriendlyName
,
4748 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
4749 pHWProfileInfo
->HWPI_szFriendlyName
,
4760 /***********************************************************************
4761 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
4765 CM_Get_Hardware_Profile_Info_ExW(
4767 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4769 _In_opt_ HMACHINE hMachine
)
4771 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4774 TRACE("CM_Get_Hardware_Profile_Info_ExW(%lu %p %lx %p)\n",
4775 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4777 if (pHWProfileInfo
== NULL
)
4778 return CR_INVALID_POINTER
;
4781 return CR_INVALID_FLAG
;
4783 if (hMachine
!= NULL
)
4785 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4786 if (BindingHandle
== NULL
)
4791 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4797 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
4798 sizeof(HWPROFILEINFO_W
), 0);
4800 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4802 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4810 /***********************************************************************
4811 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
4815 CM_Get_Log_Conf_Priority(
4816 _In_ LOG_CONF lcLogConf
,
4817 _Out_ PPRIORITY pPriority
,
4820 TRACE("CM_Get_Log_Conf_Priority(%p %p %lx)\n",
4821 lcLogConf
, pPriority
, ulFlags
);
4823 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
4827 /***********************************************************************
4828 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
4832 CM_Get_Log_Conf_Priority_Ex(
4833 _In_ LOG_CONF lcLogConf
,
4834 _Out_ PPRIORITY pPriority
,
4836 _In_opt_ HMACHINE hMachine
)
4838 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4839 HSTRING_TABLE StringTable
= NULL
;
4840 PLOG_CONF_INFO pLogConfInfo
;
4844 FIXME("CM_Get_Log_Conf_Priority_Ex(%p %p %lx %p)\n",
4845 lcLogConf
, pPriority
, ulFlags
, hMachine
);
4847 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4848 if (!IsValidLogConf(pLogConfInfo
))
4849 return CR_INVALID_LOG_CONF
;
4851 if (pPriority
== NULL
)
4852 return CR_INVALID_POINTER
;
4855 return CR_INVALID_FLAG
;
4857 if (hMachine
!= NULL
)
4859 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4860 if (BindingHandle
== NULL
)
4863 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4864 if (StringTable
== 0)
4869 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4873 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4874 if (lpDevInst
== NULL
)
4875 return CR_INVALID_DEVNODE
;
4879 ret
= PNP_GetLogConfPriority(BindingHandle
,
4881 pLogConfInfo
->ulFlags
,
4882 pLogConfInfo
->ulTag
,
4886 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4888 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4896 /***********************************************************************
4897 * CM_Get_Next_Log_Conf [SETUPAPI.@]
4901 CM_Get_Next_Log_Conf(
4902 _Out_opt_ PLOG_CONF plcLogConf
,
4903 _In_ LOG_CONF lcLogConf
,
4906 TRACE("CM_Get_Next_Log_Conf(%p %p %lx)\n",
4907 plcLogConf
, lcLogConf
, ulFlags
);
4909 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
4913 /***********************************************************************
4914 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
4918 CM_Get_Next_Log_Conf_Ex(
4919 _Out_opt_ PLOG_CONF plcLogConf
,
4920 _In_ LOG_CONF lcLogConf
,
4922 _In_opt_ HMACHINE hMachine
)
4924 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4925 HSTRING_TABLE StringTable
= NULL
;
4926 PLOG_CONF_INFO pLogConfInfo
;
4927 PLOG_CONF_INFO pNewLogConfInfo
;
4932 FIXME("CM_Get_Next_Log_Conf_Ex(%p %p %lx %p)\n",
4933 plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
4938 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4939 if (!IsValidLogConf(pLogConfInfo
))
4940 return CR_INVALID_LOG_CONF
;
4943 return CR_INVALID_FLAG
;
4945 if (hMachine
!= NULL
)
4947 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4948 if (BindingHandle
== NULL
)
4951 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4952 if (StringTable
== 0)
4957 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4961 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4962 if (lpDevInst
== NULL
)
4963 return CR_INVALID_DEVNODE
;
4967 ret
= PNP_GetNextLogConf(BindingHandle
,
4969 pLogConfInfo
->ulFlags
,
4970 pLogConfInfo
->ulTag
,
4974 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4976 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4980 if (ret
!= CR_SUCCESS
)
4985 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4986 if (pNewLogConfInfo
== NULL
)
4987 return CR_OUT_OF_MEMORY
;
4989 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4990 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
4991 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
4992 pNewLogConfInfo
->ulTag
= ulNewTag
;
4994 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
5001 /***********************************************************************
5002 * CM_Get_Next_Re_Des [SETUPAPI.@]
5006 CM_Get_Next_Res_Des(
5007 _Out_ PRES_DES prdResDes
,
5008 _In_ RES_DES rdResDes
,
5009 _In_ RESOURCEID ForResource
,
5010 _Out_opt_ PRESOURCEID pResourceID
,
5013 TRACE("CM_Get_Next_Res_Des(%p %p %lu %p %lx)\n",
5014 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
);
5016 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
5017 pResourceID
, ulFlags
, NULL
);
5021 /***********************************************************************
5022 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
5026 CM_Get_Next_Res_Des_Ex(
5027 _Out_ PRES_DES prdResDes
,
5028 _In_ RES_DES rdResDes
,
5029 _In_ RESOURCEID ForResource
,
5030 _Out_opt_ PRESOURCEID pResourceID
,
5032 _In_opt_ HMACHINE hMachine
)
5034 FIXME("CM_Get_Next_Res_Des_Ex(%p %p %lu %p %lx %p)\n",
5035 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
, hMachine
);
5037 return CR_CALL_NOT_IMPLEMENTED
;
5041 /***********************************************************************
5042 * CM_Get_Parent [SETUPAPI.@]
5047 _Out_ PDEVINST pdnDevInst
,
5048 _In_ DEVINST dnDevInst
,
5051 TRACE("CM_Get_Parent(%p %p %lx)\n",
5052 pdnDevInst
, dnDevInst
, ulFlags
);
5054 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5058 /***********************************************************************
5059 * CM_Get_Parent_Ex [SETUPAPI.@]
5064 _Out_ PDEVINST pdnDevInst
,
5065 _In_ DEVINST dnDevInst
,
5067 _In_opt_ HMACHINE hMachine
)
5069 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5070 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5071 HSTRING_TABLE StringTable
= NULL
;
5073 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5076 TRACE("CM_Get_Parent_Ex(%p %lx %lx %p)\n",
5077 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5079 if (pdnDevInst
== NULL
)
5080 return CR_INVALID_POINTER
;
5083 return CR_INVALID_DEVINST
;
5086 return CR_INVALID_FLAG
;
5090 if (hMachine
!= NULL
)
5092 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5093 if (BindingHandle
== NULL
)
5096 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5097 if (StringTable
== 0)
5102 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5106 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5107 if (lpDevInst
== NULL
)
5108 return CR_INVALID_DEVNODE
;
5112 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5113 PNP_GET_PARENT_DEVICE_INSTANCE
,
5119 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5121 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5125 if (ret
!= CR_SUCCESS
)
5128 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5130 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5134 *pdnDevInst
= dwIndex
;
5140 /***********************************************************************
5141 * CM_Get_Res_Des_Data [SETUPAPI.@]
5145 CM_Get_Res_Des_Data(
5146 _In_ RES_DES rdResDes
,
5147 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5148 _In_ ULONG BufferLen
,
5151 TRACE("CM_Get_Res_Des_Data(%p %p %lu %lx)\n",
5152 rdResDes
, Buffer
, BufferLen
, ulFlags
);
5154 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
5158 /***********************************************************************
5159 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
5163 CM_Get_Res_Des_Data_Ex(
5164 _In_ RES_DES rdResDes
,
5165 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5166 _In_ ULONG BufferLen
,
5168 _In_opt_ HMACHINE hMachine
)
5170 FIXME("CM_Get_Res_Des_Data_Ex(%p %p %lu %lx %p)\n",
5171 rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
5173 return CR_CALL_NOT_IMPLEMENTED
;
5177 /***********************************************************************
5178 * CM_Get_Res_Des_Size [SETUPAPI.@]
5182 CM_Get_Res_Des_Data_Size(
5183 _Out_ PULONG pulSize
,
5184 _In_ RES_DES rdResDes
,
5187 TRACE("CM_Get_Res_Des_Data_Size(%p %p %lx)\n",
5188 pulSize
, rdResDes
, ulFlags
);
5190 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
5194 /***********************************************************************
5195 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
5199 CM_Get_Res_Des_Data_Size_Ex(
5200 _Out_ PULONG pulSize
,
5201 _In_ RES_DES rdResDes
,
5203 _In_opt_ HMACHINE hMachine
)
5205 TRACE("CM_Get_Res_Des_Data_Size_Ex(%p %p %lx %p)\n",
5206 pulSize
, rdResDes
, ulFlags
, hMachine
);
5208 return CR_CALL_NOT_IMPLEMENTED
;
5212 /***********************************************************************
5213 * CM_Get_Resource_Conflict_Count [SETUPAPI.@]
5217 CM_Get_Resource_Conflict_Count(
5218 _In_ CONFLICT_LIST clConflictList
,
5219 _Out_ PULONG pulCount
)
5221 PCONFLICT_DATA pConflictData
;
5223 FIXME("CM_Get_Resource_Conflict_Count(%p %p)\n",
5224 clConflictList
, pulCount
);
5226 pConflictData
= (PCONFLICT_DATA
)clConflictList
;
5227 if (!IsValidConflictData(pConflictData
))
5228 return CR_INVALID_CONFLICT_LIST
;
5230 if (pulCount
== NULL
)
5231 return CR_INVALID_POINTER
;
5233 *pulCount
= pConflictData
->pConflictList
->ConflictsListed
;
5239 /***********************************************************************
5240 * CM_Get_Resource_Conflict_DetailsA [SETUPAPI.@]
5244 CM_Get_Resource_Conflict_DetailsA(
5245 _In_ CONFLICT_LIST clConflictList
,
5247 _Inout_ PCONFLICT_DETAILS_A pConflictDetails
)
5249 FIXME("CM_Get_Resource_Conflict_CountA(%p %lu %p)\n",
5250 clConflictList
, ulIndex
, pConflictDetails
);
5252 return CR_CALL_NOT_IMPLEMENTED
;
5256 /***********************************************************************
5257 * CM_Get_Resource_Conflict_DetailsW [SETUPAPI.@]
5261 CM_Get_Resource_Conflict_DetailsW(
5262 _In_ CONFLICT_LIST clConflictList
,
5264 _Inout_ PCONFLICT_DETAILS_W pConflictDetails
)
5266 FIXME("CM_Get_Resource_Conflict_CountW(%p %lu %p)\n",
5267 clConflictList
, ulIndex
, pConflictDetails
);
5269 return CR_CALL_NOT_IMPLEMENTED
;
5273 /***********************************************************************
5274 * CM_Get_Sibling [SETUPAPI.@]
5279 _Out_ PDEVINST pdnDevInst
,
5280 _In_ DEVINST dnDevInst
,
5283 TRACE("CM_Get_Sibling(%p %p %lx)\n",
5284 pdnDevInst
, dnDevInst
, ulFlags
);
5286 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5290 /***********************************************************************
5291 * CM_Get_Sibling_Ex [SETUPAPI.@]
5296 _Out_ PDEVINST pdnDevInst
,
5297 _In_ DEVINST dnDevInst
,
5299 _In_opt_ HMACHINE hMachine
)
5301 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5302 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5303 HSTRING_TABLE StringTable
= NULL
;
5305 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5308 TRACE("CM_Get_Sibling_Ex(%p %lx %lx %p)\n",
5309 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5311 if (pdnDevInst
== NULL
)
5312 return CR_INVALID_POINTER
;
5315 return CR_INVALID_DEVINST
;
5318 return CR_INVALID_FLAG
;
5322 if (hMachine
!= NULL
)
5324 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5325 if (BindingHandle
== NULL
)
5328 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5329 if (StringTable
== 0)
5334 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5338 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5339 if (lpDevInst
== NULL
)
5340 return CR_INVALID_DEVNODE
;
5344 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5345 PNP_GET_SIBLING_DEVICE_INSTANCE
,
5351 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5353 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5357 if (ret
!= CR_SUCCESS
)
5360 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5362 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5366 *pdnDevInst
= dwIndex
;
5372 /***********************************************************************
5373 * CM_Get_Version [SETUPAPI.@]
5377 CM_Get_Version(VOID
)
5379 TRACE("CM_Get_Version()\n");
5381 return CM_Get_Version_Ex(NULL
);
5385 /***********************************************************************
5386 * CM_Get_Version_Ex [SETUPAPI.@]
5391 _In_opt_ HMACHINE hMachine
)
5393 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5397 TRACE("CM_Get_Version_Ex(%p)\n", hMachine
);
5399 if (hMachine
!= NULL
)
5401 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5402 if (BindingHandle
== NULL
)
5407 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5413 ret
= PNP_GetVersion(BindingHandle
, &Version
);
5415 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5417 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5421 if (ret
!= CR_SUCCESS
)
5428 /***********************************************************************
5429 * CM_Intersect_Range_List [SETUPAPI.@]
5433 CM_Intersect_Range_List(
5434 _In_ RANGE_LIST rlhOld1
,
5435 _In_ RANGE_LIST rlhOld2
,
5436 _In_ RANGE_LIST rlhNew
,
5439 FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
5440 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5442 return CR_CALL_NOT_IMPLEMENTED
;
5446 /***********************************************************************
5447 * CM_Invert_Range_List [SETUPAPI.@]
5451 CM_Invert_Range_List(
5452 _In_ RANGE_LIST rlhOld
,
5453 _In_ RANGE_LIST rlhNew
,
5454 _In_ DWORDLONG ullMaxValue
,
5457 FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
5458 rlhOld
, rlhNew
, ullMaxValue
, ulFlags
);
5460 return CR_CALL_NOT_IMPLEMENTED
;
5464 /***********************************************************************
5465 * CM_Is_Dock_Station_Present [SETUPAPI.@]
5469 CM_Is_Dock_Station_Present(
5470 _Out_ PBOOL pbPresent
)
5472 TRACE("CM_Is_Dock_Station_Present(%p)\n",
5475 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
5479 /***********************************************************************
5480 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
5484 CM_Is_Dock_Station_Present_Ex(
5485 _Out_ PBOOL pbPresent
,
5486 _In_opt_ HMACHINE hMachine
)
5488 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5491 TRACE("CM_Is_Dock_Station_Present_Ex(%p %p)\n",
5492 pbPresent
, hMachine
);
5494 if (pbPresent
== NULL
)
5495 return CR_INVALID_POINTER
;
5499 if (hMachine
!= NULL
)
5501 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5502 if (BindingHandle
== NULL
)
5507 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5513 ret
= PNP_IsDockStationPresent(BindingHandle
,
5516 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5518 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5526 /***********************************************************************
5527 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5531 CM_Is_Version_Available(
5534 TRACE("CM_Is_Version_Available(%hu)\n",
5537 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
5541 /***********************************************************************
5542 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5546 CM_Is_Version_Available_Ex(
5548 _In_opt_ HMACHINE hMachine
)
5550 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5551 WORD wServerVersion
;
5554 TRACE("CM_Is_Version_Available_Ex(%hu %p)\n",
5555 wVersion
, hMachine
);
5557 if (wVersion
<= 0x400)
5560 if (hMachine
!= NULL
)
5562 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5563 if (BindingHandle
== NULL
)
5568 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5574 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
5576 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5578 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5582 if (ret
!= CR_SUCCESS
)
5585 return (wServerVersion
>= wVersion
);
5589 /***********************************************************************
5590 * CM_Locate_DevNodeA [SETUPAPI.@]
5595 _Out_ PDEVINST pdnDevInst
,
5596 _In_opt_ DEVINSTID_A pDeviceID
,
5599 TRACE("CM_Locate_DevNodeA(%p %s %lx)\n",
5600 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
);
5602 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5606 /***********************************************************************
5607 * CM_Locate_DevNodeW [SETUPAPI.@]
5612 _Out_ PDEVINST pdnDevInst
,
5613 _In_opt_ DEVINSTID_W pDeviceID
,
5616 TRACE("CM_Locate_DevNodeW(%p %s %lx)\n",
5617 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
5619 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5623 /***********************************************************************
5624 * CM_Locate_DevNode_ExA [SETUPAPI.@]
5628 CM_Locate_DevNode_ExA(
5629 _Out_ PDEVINST pdnDevInst
,
5630 _In_opt_ DEVINSTID_A pDeviceID
,
5632 _In_opt_ HMACHINE hMachine
)
5634 DEVINSTID_W pDevIdW
= NULL
;
5635 CONFIGRET ret
= CR_SUCCESS
;
5637 TRACE("CM_Locate_DevNode_ExA(%p %s %lx %p)\n",
5638 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
5640 if (pDeviceID
!= NULL
)
5642 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
5643 return CR_INVALID_DEVICE_ID
;
5646 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
5648 if (pDevIdW
!= NULL
)
5655 /***********************************************************************
5656 * CM_Locate_DevNode_ExW [SETUPAPI.@]
5660 CM_Locate_DevNode_ExW(
5661 _Out_ PDEVINST pdnDevInst
,
5662 _In_opt_ DEVINSTID_W pDeviceID
,
5664 _In_opt_ HMACHINE hMachine
)
5666 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
5667 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5668 HSTRING_TABLE StringTable
= NULL
;
5669 CONFIGRET ret
= CR_SUCCESS
;
5671 TRACE("CM_Locate_DevNode_ExW(%p %s %lx %p)\n",
5672 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
5674 if (pdnDevInst
== NULL
)
5675 return CR_INVALID_POINTER
;
5677 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
5678 return CR_INVALID_FLAG
;
5680 if (hMachine
!= NULL
)
5682 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5683 if (BindingHandle
== NULL
)
5686 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5687 if (StringTable
== 0)
5692 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5696 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
5698 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
5704 /* Get the root device ID */
5705 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
5709 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5711 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5715 if (ret
!= CR_SUCCESS
)
5718 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
5722 /* Validate the device ID */
5723 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
5727 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5729 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5733 if (ret
== CR_SUCCESS
)
5735 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
5736 if (*pdnDevInst
== -1)
5744 /***********************************************************************
5745 * CM_Merge_Range_List [SETUPAPI.@]
5749 CM_Merge_Range_List(
5750 _In_ RANGE_LIST rlhOld1
,
5751 _In_ RANGE_LIST rlhOld2
,
5752 _In_ RANGE_LIST rlhNew
,
5755 FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
5756 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5758 return CR_CALL_NOT_IMPLEMENTED
;
5762 /***********************************************************************
5763 * CM_Modify_Res_Des [SETUPAPI.@]
5768 _Out_ PRES_DES prdResDes
,
5769 _In_ RES_DES rdResDes
,
5770 _In_ RESOURCEID ResourceID
,
5771 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5772 _In_ ULONG ResourceLen
,
5775 TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
5776 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5777 ResourceLen
, ulFlags
);
5779 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5780 ResourceLen
, ulFlags
, NULL
);
5784 /***********************************************************************
5785 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
5789 CM_Modify_Res_Des_Ex(
5790 _Out_ PRES_DES prdResDes
,
5791 _In_ RES_DES rdResDes
,
5792 _In_ RESOURCEID ResourceID
,
5793 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5794 _In_ ULONG ResourceLen
,
5796 _In_opt_ HMACHINE hMachine
)
5798 FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %p)\n",
5799 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5800 ResourceLen
, ulFlags
, hMachine
);
5802 return CR_CALL_NOT_IMPLEMENTED
;
5806 /***********************************************************************
5807 * CM_Move_DevNode [SETUPAPI.@]
5812 _In_ DEVINST dnFromDevInst
,
5813 _In_ DEVINST dnToDevInst
,
5816 TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
5817 dnFromDevInst
, dnToDevInst
, ulFlags
);
5819 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
5823 /***********************************************************************
5824 * CM_Move_DevNode_Ex [SETUPAPI.@]
5829 _In_ DEVINST dnFromDevInst
,
5830 _In_ DEVINST dnToDevInst
,
5832 _In_opt_ HMACHINE hMachine
)
5834 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5835 HSTRING_TABLE StringTable
= NULL
;
5836 LPWSTR lpFromDevInst
;
5840 FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %p)\n",
5841 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
5843 if (!pSetupIsUserAdmin())
5844 return CR_ACCESS_DENIED
;
5846 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
5847 return CR_INVALID_DEVNODE
;
5850 return CR_INVALID_FLAG
;
5852 if (hMachine
!= NULL
)
5854 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5855 if (BindingHandle
== NULL
)
5858 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5859 if (StringTable
== 0)
5864 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5868 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
5869 if (lpFromDevInst
== NULL
)
5870 return CR_INVALID_DEVNODE
;
5872 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
5873 if (lpToDevInst
== NULL
)
5874 return CR_INVALID_DEVNODE
;
5878 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5884 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5886 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5894 /***********************************************************************
5895 * CM_Next_Range [SETUPAPI.@]
5900 _Inout_ PRANGE_ELEMENT preElement
,
5901 _Out_ PDWORDLONG pullStart
,
5902 _Out_ PDWORDLONG pullEnd
,
5905 PINTERNAL_RANGE_LIST pRangeList
;
5906 PINTERNAL_RANGE pRange
;
5907 PLIST_ENTRY ListEntry
;
5908 CONFIGRET ret
= CR_SUCCESS
;
5910 FIXME("CM_Next_Range(%p %p %p %lx)\n",
5911 preElement
, pullStart
, pullEnd
, ulFlags
);
5913 pRange
= (PINTERNAL_RANGE
)preElement
;
5915 if (pRange
== NULL
|| pRange
->pRangeList
== NULL
)
5918 if (pullStart
== NULL
|| pullEnd
== NULL
)
5919 return CR_INVALID_POINTER
;
5922 return CR_INVALID_FLAG
;
5924 pRangeList
= pRange
->pRangeList
;
5926 /* Lock the range list */
5927 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
5929 /* Fail, if we reached the end of the list */
5930 if (pRange
->ListEntry
.Flink
== &pRangeList
->ListHead
)
5936 /* Get the next range */
5937 ListEntry
= pRangeList
->ListHead
.Flink
;
5938 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
5940 /* Return the range data */
5941 *pullStart
= pRange
->ullStart
;
5942 *pullEnd
= pRange
->ullEnd
;
5943 *preElement
= (RANGE_ELEMENT
)pRange
;
5946 /* Unlock the range list */
5947 ReleaseMutex(pRangeList
->hMutex
);
5953 /***********************************************************************
5954 * CM_Open_Class_KeyA [SETUPAPI.@]
5959 _In_opt_ LPGUID pClassGuid
,
5960 _In_opt_ LPCSTR pszClassName
,
5961 _In_ REGSAM samDesired
,
5962 _In_ REGDISPOSITION Disposition
,
5963 _Out_ PHKEY phkClass
,
5966 TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
5967 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
5968 samDesired
, Disposition
, phkClass
, ulFlags
);
5970 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
5971 Disposition
, phkClass
, ulFlags
, NULL
);
5975 /***********************************************************************
5976 * CM_Open_Class_KeyW [SETUPAPI.@]
5981 _In_opt_ LPGUID pClassGuid
,
5982 _In_opt_ LPCWSTR pszClassName
,
5983 _In_ REGSAM samDesired
,
5984 _In_ REGDISPOSITION Disposition
,
5985 _Out_ PHKEY phkClass
,
5988 TRACE("CM_Open_Class_KeyW%p %s %lx %lx %p %lx)\n",
5989 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
5990 samDesired
, Disposition
, phkClass
, ulFlags
);
5992 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
5993 Disposition
, phkClass
, ulFlags
, NULL
);
5997 /***********************************************************************
5998 * CM_Open_Class_Key_ExA [SETUPAPI.@]
6002 CM_Open_Class_Key_ExA(
6003 _In_opt_ LPGUID pClassGuid
,
6004 _In_opt_ LPCSTR pszClassName
,
6005 _In_ REGSAM samDesired
,
6006 _In_ REGDISPOSITION Disposition
,
6007 _Out_ PHKEY phkClass
,
6009 _In_opt_ HMACHINE hMachine
)
6011 LPWSTR pszClassNameW
= NULL
;
6014 TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %p)\n",
6015 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
6016 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
6018 if (pszClassName
!= NULL
)
6020 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
6021 return CR_INVALID_DATA
;
6024 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
6025 Disposition
, phkClass
, ulFlags
, hMachine
);
6027 if (pszClassNameW
!= NULL
)
6028 MyFree(pszClassNameW
);
6034 /***********************************************************************
6035 * CM_Open_Class_Key_ExW [SETUPAPI.@]
6039 CM_Open_Class_Key_ExW(
6040 _In_opt_ LPGUID pClassGuid
,
6041 _In_opt_ LPCWSTR pszClassName
,
6042 _In_ REGSAM samDesired
,
6043 _In_ REGDISPOSITION Disposition
,
6044 _Out_ PHKEY phkClass
,
6046 _In_opt_ HMACHINE hMachine
)
6048 WCHAR szKeyName
[MAX_PATH
];
6049 LPWSTR lpGuidString
;
6050 DWORD dwDisposition
;
6054 TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %p)\n",
6055 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
6056 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
6058 /* Check Disposition and ulFlags */
6059 if ((Disposition
& ~RegDisposition_Bits
) ||
6060 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
6061 return CR_INVALID_FLAG
;
6063 /* Check phkClass */
6064 if (phkClass
== NULL
)
6065 return CR_INVALID_POINTER
;
6069 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
6070 pszClassName
!= NULL
)
6071 return CR_INVALID_DATA
;
6073 if (hMachine
== NULL
)
6075 hKey
= HKEY_LOCAL_MACHINE
;
6079 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6082 return CR_REGISTRY_ERROR
;
6085 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
6087 lstrcpyW(szKeyName
, DeviceClasses
);
6091 lstrcpyW(szKeyName
, ControlClass
);
6094 if (pClassGuid
!= NULL
)
6096 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
6099 return CR_INVALID_DATA
;
6102 lstrcatW(szKeyName
, Backslash
);
6103 lstrcatW(szKeyName
, lpGuidString
);
6106 if (Disposition
== RegDisposition_OpenAlways
)
6108 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
6109 NULL
, phkClass
, &dwDisposition
);
6113 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
6118 if (pClassGuid
!= NULL
)
6119 RpcStringFreeW(&lpGuidString
);
6121 if (dwError
!= ERROR_SUCCESS
)
6124 return CR_NO_SUCH_REGISTRY_KEY
;
6127 if (pszClassName
!= NULL
)
6129 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
6130 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
6137 /***********************************************************************
6138 * CM_Open_DevNode_Key [SETUPAPI.@]
6142 CM_Open_DevNode_Key(
6143 _In_ DEVINST dnDevNode
,
6144 _In_ REGSAM samDesired
,
6145 _In_ ULONG ulHardwareProfile
,
6146 _In_ REGDISPOSITION Disposition
,
6147 _Out_ PHKEY phkDevice
,
6150 TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
6151 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
6153 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
6154 Disposition
, phkDevice
, ulFlags
, NULL
);
6158 /***********************************************************************
6159 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
6163 CM_Open_DevNode_Key_Ex(
6164 _In_ DEVINST dnDevNode
,
6165 _In_ REGSAM samDesired
,
6166 _In_ ULONG ulHardwareProfile
,
6167 _In_ REGDISPOSITION Disposition
,
6168 _Out_ PHKEY phkDevice
,
6170 _In_opt_ HMACHINE hMachine
)
6172 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6173 HSTRING_TABLE StringTable
= NULL
;
6174 LPWSTR pszDevInst
, pszKeyPath
= NULL
, pszInstancePath
= NULL
;
6176 DWORD dwDisposition
;
6177 HKEY hRootKey
= NULL
;
6178 CONFIGRET ret
= CR_CALL_NOT_IMPLEMENTED
;
6180 TRACE("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %p)\n",
6181 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
6183 if (phkDevice
== NULL
)
6184 return CR_INVALID_POINTER
;
6189 return CR_INVALID_DEVNODE
;
6191 if (ulFlags
& ~CM_REGISTRY_BITS
)
6192 return CR_INVALID_FLAG
;
6194 if (Disposition
& ~RegDisposition_Bits
)
6195 return CR_INVALID_DATA
;
6197 if (hMachine
!= NULL
)
6199 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6200 if (BindingHandle
== NULL
)
6203 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6204 if (StringTable
== 0)
6209 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6213 pszDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevNode
);
6214 if (pszDevInst
== NULL
)
6215 return CR_INVALID_DEVNODE
;
6217 TRACE("pszDevInst: %S\n", pszDevInst
);
6219 pszKeyPath
= MyMalloc(512 * sizeof(WCHAR
));
6220 if (pszKeyPath
== NULL
)
6222 ret
= CR_OUT_OF_MEMORY
;
6226 pszInstancePath
= MyMalloc(512 * sizeof(WCHAR
));
6227 if (pszInstancePath
== NULL
)
6229 ret
= CR_OUT_OF_MEMORY
;
6233 ret
= GetDeviceInstanceKeyPath(BindingHandle
,
6239 if (ret
!= CR_SUCCESS
)
6242 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6243 TRACE("pszInstancePath: %S\n", pszInstancePath
);
6245 wcscat(pszKeyPath
, L
"\\");
6246 wcscat(pszKeyPath
, pszInstancePath
);
6248 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6250 if (hMachine
== NULL
)
6252 hRootKey
= HKEY_LOCAL_MACHINE
;
6256 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6260 ret
= CR_REGISTRY_ERROR
;
6265 if (Disposition
== RegDisposition_OpenAlways
)
6267 lError
= RegCreateKeyExW(hRootKey
,
6279 lError
= RegOpenKeyExW(hRootKey
,
6286 if (lError
!= ERROR_SUCCESS
)
6289 ret
= CR_NO_SUCH_REGISTRY_KEY
;
6293 if ((hRootKey
!= NULL
) && (hRootKey
!= HKEY_LOCAL_MACHINE
))
6294 RegCloseKey(hRootKey
);
6296 if (pszInstancePath
!= NULL
)
6297 MyFree(pszInstancePath
);
6299 if (pszKeyPath
!= NULL
)
6306 /***********************************************************************
6307 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
6311 CM_Query_And_Remove_SubTreeA(
6312 _In_ DEVINST dnAncestor
,
6313 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6314 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6315 _In_ ULONG ulNameLength
,
6318 TRACE("CM_Query_And_Remove_SubTreeA(%lx %p %s %lu %lx)\n",
6319 dnAncestor
, pVetoType
, pszVetoName
, ulNameLength
, ulFlags
);
6321 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
6322 ulNameLength
, ulFlags
, NULL
);
6326 /***********************************************************************
6327 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
6331 CM_Query_And_Remove_SubTreeW(
6332 _In_ DEVINST dnAncestor
,
6333 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6334 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6335 _In_ ULONG ulNameLength
,
6338 TRACE("CM_Query_And_Remove_SubTreeW(%lx %p %s %lu %lx)\n",
6339 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
6341 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
6342 ulNameLength
, ulFlags
, NULL
);
6346 /***********************************************************************
6347 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
6351 CM_Query_And_Remove_SubTree_ExA(
6352 _In_ DEVINST dnAncestor
,
6353 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6354 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6355 _In_ ULONG ulNameLength
,
6357 _In_opt_ HMACHINE hMachine
)
6359 LPWSTR lpLocalVetoName
;
6362 TRACE("CM_Query_And_Remove_SubTree_ExA(%lx %p %s %lu %lx %p)\n",
6363 dnAncestor
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
,
6366 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6367 return CR_INVALID_POINTER
;
6369 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
6370 if (lpLocalVetoName
== NULL
)
6371 return CR_OUT_OF_MEMORY
;
6373 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
6374 ulNameLength
, ulFlags
, hMachine
);
6375 if (ret
== CR_REMOVE_VETOED
)
6377 if (WideCharToMultiByte(CP_ACP
,
6388 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
6394 /***********************************************************************
6395 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
6399 CM_Query_And_Remove_SubTree_ExW(
6400 _In_ DEVINST dnAncestor
,
6401 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6402 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6403 _In_ ULONG ulNameLength
,
6405 _In_opt_ HMACHINE hMachine
)
6407 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6408 HSTRING_TABLE StringTable
= NULL
;
6412 TRACE("CM_Query_And_Remove_SubTree_ExW(%lx %p %s %lu %lx %p)\n",
6413 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
,
6416 if (dnAncestor
== 0)
6417 return CR_INVALID_DEVNODE
;
6419 if (ulFlags
& ~CM_REMOVE_BITS
)
6420 return CR_INVALID_FLAG
;
6422 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6423 return CR_INVALID_POINTER
;
6425 if (hMachine
!= NULL
)
6427 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6428 if (BindingHandle
== NULL
)
6431 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6432 if (StringTable
== 0)
6437 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6441 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
6442 if (lpDevInst
== NULL
)
6443 return CR_INVALID_DEVNODE
;
6447 ret
= PNP_QueryRemove(BindingHandle
,
6454 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6456 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6464 /***********************************************************************
6465 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
6469 CM_Query_Arbitrator_Free_Data(
6470 _Out_writes_bytes_(DataLen
) PVOID pData
,
6472 _In_ DEVINST dnDevInst
,
6473 _In_ RESOURCEID ResourceID
,
6476 TRACE("CM_Query_Arbitrator_Free_Data(%p %lu %lx %lu 0x%08lx)\n",
6477 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
);
6479 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
6480 ResourceID
, ulFlags
, NULL
);
6484 /***********************************************************************
6485 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
6489 CM_Query_Arbitrator_Free_Data_Ex(
6490 _Out_writes_bytes_(DataLen
) PVOID pData
,
6492 _In_ DEVINST dnDevInst
,
6493 _In_ RESOURCEID ResourceID
,
6495 _In_opt_ HMACHINE hMachine
)
6497 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6498 HSTRING_TABLE StringTable
= NULL
;
6502 TRACE("CM_Query_Arbitrator_Free_Data_Ex(%p %lu %lx %lu 0x%08lx %p)\n",
6503 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
, hMachine
);
6505 if (pData
== NULL
|| DataLen
== 0)
6506 return CR_INVALID_POINTER
;
6509 return CR_INVALID_DEVINST
;
6511 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6512 return CR_INVALID_FLAG
;
6514 if (hMachine
!= NULL
)
6516 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6517 if (BindingHandle
== NULL
)
6520 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6521 if (StringTable
== 0)
6526 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6530 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6531 if (lpDevInst
== NULL
)
6532 return CR_INVALID_DEVNODE
;
6536 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
6543 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6545 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6553 /***********************************************************************
6554 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
6558 CM_Query_Arbitrator_Free_Size(
6559 _Out_ PULONG pulSize
,
6560 _In_ DEVINST dnDevInst
,
6561 _In_ RESOURCEID ResourceID
,
6564 TRACE("CM_Query_Arbitrator_Free_Size(%p %lu %lx 0x%08lx)\n",
6565 pulSize
, dnDevInst
,ResourceID
, ulFlags
);
6567 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
6572 /***********************************************************************
6573 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
6577 CM_Query_Arbitrator_Free_Size_Ex(
6578 _Out_ PULONG pulSize
,
6579 _In_ DEVINST dnDevInst
,
6580 _In_ RESOURCEID ResourceID
,
6582 _In_opt_ HMACHINE hMachine
)
6584 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6585 HSTRING_TABLE StringTable
= NULL
;
6589 TRACE("CM_Query_Arbitrator_Free_Size_Ex(%p %lu %lx 0x%08lx %p)\n",
6590 pulSize
, dnDevInst
,ResourceID
, ulFlags
, hMachine
);
6592 if (pulSize
== NULL
)
6593 return CR_INVALID_POINTER
;
6596 return CR_INVALID_DEVINST
;
6598 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6599 return CR_INVALID_FLAG
;
6601 if (hMachine
!= NULL
)
6603 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6604 if (BindingHandle
== NULL
)
6607 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6608 if (StringTable
== 0)
6613 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6617 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6618 if (lpDevInst
== NULL
)
6619 return CR_INVALID_DEVNODE
;
6623 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
6629 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6631 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6639 /***********************************************************************
6640 * CM_Query_Remove_SubTree [SETUPAPI.@]
6642 * This function is obsolete in Windows XP and above.
6646 CM_Query_Remove_SubTree(
6647 _In_ DEVINST dnAncestor
,
6650 TRACE("CM_Query_Remove_SubTree(%lx %lx)\n",
6651 dnAncestor
, ulFlags
);
6653 return CR_CALL_NOT_IMPLEMENTED
;
6657 /***********************************************************************
6658 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
6660 * This function is obsolete in Windows XP and above.
6664 CM_Query_Remove_SubTree_Ex(
6665 _In_ DEVINST dnAncestor
,
6667 _In_opt_ HMACHINE hMachine
)
6669 TRACE("CM_Query_Remove_SubTree_Ex(%lx %lx %p)\n",
6670 dnAncestor
, ulFlags
, hMachine
);
6672 return CR_CALL_NOT_IMPLEMENTED
;
6676 /***********************************************************************
6677 * CM_Query_Resource_Conflict_List [SETUPAPI.@]
6681 CM_Query_Resource_Conflict_List(
6682 _Out_ PCONFLICT_LIST pclConflictList
,
6683 _In_ DEVINST dnDevInst
,
6684 _In_ RESOURCEID ResourceID
,
6685 _In_ PCVOID ResourceData
,
6686 _In_ ULONG ResourceLen
,
6688 _In_opt_ HMACHINE hMachine
)
6690 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6691 HSTRING_TABLE StringTable
= NULL
;
6692 PPNP_CONFLICT_LIST pConflictBuffer
= NULL
;
6693 PCONFLICT_DATA pConflictData
= NULL
;
6694 ULONG ulBufferLength
;
6698 FIXME("CM_Query_Resource_Conflict_List(%p %lx %lu %p %lu %lx %p)\n",
6699 pclConflictList
, dnDevInst
, ResourceID
, ResourceData
,
6700 ResourceLen
, ulFlags
, hMachine
);
6703 return CR_INVALID_DEVNODE
;
6705 if (ulFlags
& ~CM_RESDES_WIDTH_BITS
)
6706 return CR_INVALID_FLAG
;
6708 if (pclConflictList
== NULL
||
6709 ResourceData
== NULL
||
6711 return CR_INVALID_POINTER
;
6713 if (ResourceID
== 0)
6714 return CR_INVALID_RESOURCEID
;
6716 *pclConflictList
= 0;
6718 if (hMachine
!= NULL
)
6720 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6721 if (BindingHandle
== NULL
)
6724 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6725 if (StringTable
== 0)
6730 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6734 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6735 if (lpDevInst
== NULL
)
6736 return CR_INVALID_DEVNODE
;
6738 pConflictData
= MyMalloc(sizeof(CONFLICT_DATA
));
6739 if (pConflictData
== NULL
)
6741 ret
= CR_OUT_OF_MEMORY
;
6745 ulBufferLength
= sizeof(PNP_CONFLICT_LIST
) +
6746 sizeof(PNP_CONFLICT_STRINGS
) +
6747 (sizeof(wchar_t) * 200);
6748 pConflictBuffer
= MyMalloc(ulBufferLength
);
6749 if (pConflictBuffer
== NULL
)
6751 ret
= CR_OUT_OF_MEMORY
;
6757 ret
= PNP_QueryResConfList(BindingHandle
,
6760 (PBYTE
)ResourceData
,
6762 (PBYTE
)pConflictBuffer
,
6766 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6768 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6772 if (ret
!= CR_SUCCESS
)
6775 pConflictData
->ulMagic
= CONFLICT_MAGIC
;
6776 pConflictData
->pConflictList
= pConflictBuffer
;
6778 *pclConflictList
= (CONFLICT_LIST
)pConflictData
;
6781 if (ret
!= CR_SUCCESS
)
6783 if (pConflictBuffer
!= NULL
)
6784 MyFree(pConflictBuffer
);
6786 if (pConflictData
!= NULL
)
6787 MyFree(pConflictData
);
6794 /***********************************************************************
6795 * CM_Reenumerate_DevNode [SETUPAPI.@]
6799 CM_Reenumerate_DevNode(
6800 _In_ DEVINST dnDevInst
,
6803 TRACE("CM_Reenumerate_DevNode(%lx %lx)\n",
6804 dnDevInst
, ulFlags
);
6806 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
6810 /***********************************************************************
6811 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
6814 CM_Reenumerate_DevNode_Ex(
6815 _In_ DEVINST dnDevInst
,
6817 _In_opt_ HMACHINE hMachine
)
6819 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6820 HSTRING_TABLE StringTable
= NULL
;
6824 FIXME("CM_Reenumerate_DevNode_Ex(%lx %lx %p)\n",
6825 dnDevInst
, ulFlags
, hMachine
);
6828 return CR_INVALID_DEVNODE
;
6830 if (ulFlags
& ~CM_REENUMERATE_BITS
)
6831 return CR_INVALID_FLAG
;
6833 if (hMachine
!= NULL
)
6835 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6836 if (BindingHandle
== NULL
)
6839 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6840 if (StringTable
== 0)
6845 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6849 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6850 if (lpDevInst
== NULL
)
6851 return CR_INVALID_DEVNODE
;
6855 ret
= PNP_DeviceInstanceAction(BindingHandle
,
6856 PNP_DEVINST_REENUMERATE
,
6861 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6863 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6871 /***********************************************************************
6872 * CM_Register_Device_Driver [SETUPAPI.@]
6876 CM_Register_Device_Driver(
6877 _In_ DEVINST dnDevInst
,
6880 TRACE("CM_Register_Device_Driver(%lx 0x%08lx)\n",
6881 dnDevInst
, ulFlags
);
6883 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
6887 /***********************************************************************
6888 * CM_Register_Device_Driver_Ex [SETUPAPI.@]
6892 CM_Register_Device_Driver_Ex(
6893 _In_ DEVINST dnDevInst
,
6895 _In_opt_ HMACHINE hMachine
)
6897 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6898 HSTRING_TABLE StringTable
= NULL
;
6902 TRACE("CM_Register_Device_Driver_Ex(%lx 0x%08lx %p)\n",
6903 dnDevInst
, ulFlags
, hMachine
);
6906 return CR_INVALID_DEVNODE
;
6908 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
6909 return CR_INVALID_FLAG
;
6911 if (hMachine
!= NULL
)
6913 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6914 if (BindingHandle
== NULL
)
6917 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6918 if (StringTable
== 0)
6923 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6927 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6928 if (lpDevInst
== NULL
)
6929 return CR_INVALID_DEVNODE
;
6933 ret
= PNP_RegisterDriver(BindingHandle
,
6937 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6939 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6947 /***********************************************************************
6948 * CM_Register_Device_InterfaceA [SETUPAPI.@]
6952 CM_Register_Device_InterfaceA(
6953 _In_ DEVINST dnDevInst
,
6954 _In_ LPGUID InterfaceClassGuid
,
6955 _In_opt_ LPCSTR pszReference
,
6956 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
6957 _Inout_ PULONG pulLength
,
6960 TRACE("CM_Register_Device_InterfaceA(%lx %s %s %p %p %lx)\n",
6961 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
6962 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
6964 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
6965 pszReference
, pszDeviceInterface
,
6966 pulLength
, ulFlags
, NULL
);
6970 /***********************************************************************
6971 * CM_Register_Device_InterfaceW [SETUPAPI.@]
6975 CM_Register_Device_InterfaceW(
6976 _In_ DEVINST dnDevInst
,
6977 _In_ LPGUID InterfaceClassGuid
,
6978 _In_opt_ LPCWSTR pszReference
,
6979 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
6980 _Inout_ PULONG pulLength
,
6983 TRACE("CM_Register_Device_InterfaceW(%lx %s %s %p %p %lx)\n",
6984 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
6985 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
6987 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
6988 pszReference
, pszDeviceInterface
,
6989 pulLength
, ulFlags
, NULL
);
6993 /***********************************************************************
6994 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
6998 CM_Register_Device_Interface_ExA(
6999 _In_ DEVINST dnDevInst
,
7000 _In_ LPGUID InterfaceClassGuid
,
7001 _In_opt_ LPCSTR pszReference
,
7002 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
7003 _Inout_ PULONG pulLength
,
7005 _In_opt_ HMACHINE hMachine
)
7007 LPWSTR pszReferenceW
= NULL
;
7008 LPWSTR pszDeviceInterfaceW
= NULL
;
7012 TRACE("CM_Register_Device_Interface_ExA(%lx %s %s %p %p %lx %p)\n",
7013 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_a(pszReference
),
7014 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
7016 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
7017 return CR_INVALID_POINTER
;
7019 if (pszReference
!= NULL
)
7021 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
7022 return CR_INVALID_DATA
;
7025 ulLength
= *pulLength
;
7027 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
7028 if (pszDeviceInterfaceW
== NULL
)
7030 ret
= CR_OUT_OF_MEMORY
;
7034 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
7037 pszDeviceInterfaceW
,
7041 if (ret
== CR_SUCCESS
)
7043 if (WideCharToMultiByte(CP_ACP
,
7045 pszDeviceInterfaceW
,
7054 *pulLength
= ulLength
;
7057 if (pszDeviceInterfaceW
!= NULL
)
7058 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
7060 if (pszReferenceW
!= NULL
)
7061 MyFree(pszReferenceW
);
7067 /***********************************************************************
7068 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
7072 CM_Register_Device_Interface_ExW(
7073 _In_ DEVINST dnDevInst
,
7074 _In_ LPGUID InterfaceClassGuid
,
7075 _In_opt_ LPCWSTR pszReference
,
7076 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
7077 _Inout_ PULONG pulLength
,
7079 _In_opt_ HMACHINE hMachine
)
7081 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7082 HSTRING_TABLE StringTable
= NULL
;
7084 ULONG ulTransferLength
;
7087 TRACE("CM_Register_Device_Interface_ExW(%lx %s %s %p %p %lx %p)\n",
7088 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_w(pszReference
),
7089 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
7092 return CR_INVALID_DEVNODE
;
7094 if (InterfaceClassGuid
== NULL
||
7095 pszDeviceInterface
== NULL
||
7097 return CR_INVALID_POINTER
;
7100 return CR_INVALID_FLAG
;
7102 if (hMachine
!= NULL
)
7104 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7105 if (BindingHandle
== NULL
)
7108 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7109 if (StringTable
== 0)
7114 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7118 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7119 if (lpDevInst
== NULL
)
7120 return CR_INVALID_DEVNODE
;
7122 ulTransferLength
= *pulLength
;
7126 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
7129 (LPWSTR
)pszReference
,
7135 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7137 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7145 /***********************************************************************
7146 * CM_Remove_SubTree [SETUPAPI.@]
7148 * This function is obsolete in Windows XP and above.
7153 _In_ DEVINST dnAncestor
,
7156 TRACE("CM_Remove_SubTree(%lx %lx)\n",
7157 dnAncestor
, ulFlags
);
7159 return CR_CALL_NOT_IMPLEMENTED
;
7163 /***********************************************************************
7164 * CM_Remove_SubTree_Ex [SETUPAPI.@]
7166 * This function is obsolete in Windows XP and above.
7170 CM_Remove_SubTree_Ex(
7171 _In_ DEVINST dnAncestor
,
7173 _In_opt_ HMACHINE hMachine
)
7175 TRACE("CM_Remove_SubTree_Ex(%lx %lx %p)\n",
7176 dnAncestor
, ulFlags
, hMachine
);
7178 return CR_CALL_NOT_IMPLEMENTED
;
7182 /***********************************************************************
7183 * CM_Request_Device_EjectA [SETUPAPI.@]
7187 CM_Request_Device_EjectA(
7188 _In_ DEVINST dnDevInst
,
7189 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7190 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7191 _In_ ULONG ulNameLength
,
7194 TRACE("CM_Request_Device_EjectA(%lx %p %s %lu %lx)\n",
7195 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
);
7197 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
7198 ulNameLength
, ulFlags
, NULL
);
7202 /***********************************************************************
7203 * CM_Request_Device_EjectW [SETUPAPI.@]
7207 CM_Request_Device_EjectW(
7208 _In_ DEVINST dnDevInst
,
7209 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7210 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7211 _In_ ULONG ulNameLength
,
7214 TRACE("CM_Request_Device_EjectW(%lx %p %s %lu %lx)\n",
7215 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
7217 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
7218 ulNameLength
, ulFlags
, NULL
);
7222 /***********************************************************************
7223 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
7227 CM_Request_Device_Eject_ExA(
7228 _In_ DEVINST dnDevInst
,
7229 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7230 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7231 _In_ ULONG ulNameLength
,
7233 _In_opt_ HMACHINE hMachine
)
7235 LPWSTR lpLocalVetoName
;
7238 TRACE("CM_Request_Device_Eject_ExA(%lx %p %s %lu %lx %p)\n",
7239 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7241 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7242 return CR_INVALID_POINTER
;
7244 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
7245 if (lpLocalVetoName
== NULL
)
7246 return CR_OUT_OF_MEMORY
;
7248 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
7249 ulNameLength
, ulFlags
, hMachine
);
7250 if (ret
== CR_REMOVE_VETOED
)
7252 if (WideCharToMultiByte(CP_ACP
,
7263 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
7269 /***********************************************************************
7270 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
7274 CM_Request_Device_Eject_ExW(
7275 _In_ DEVINST dnDevInst
,
7276 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7277 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7278 _In_ ULONG ulNameLength
,
7280 _In_opt_ HMACHINE hMachine
)
7282 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7283 HSTRING_TABLE StringTable
= NULL
;
7287 TRACE("CM_Request_Device_Eject_ExW(%lx %p %s %lu %lx %p)\n",
7288 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7291 return CR_INVALID_DEVNODE
;
7294 return CR_INVALID_FLAG
;
7296 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7297 return CR_INVALID_POINTER
;
7299 if (hMachine
!= NULL
)
7301 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7302 if (BindingHandle
== NULL
)
7305 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7306 if (StringTable
== 0)
7311 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7315 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7316 if (lpDevInst
== NULL
)
7317 return CR_INVALID_DEVNODE
;
7321 ret
= PNP_RequestDeviceEject(BindingHandle
,
7328 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7330 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7338 /***********************************************************************
7339 * CM_Request_Eject_PC [SETUPAPI.@]
7343 CM_Request_Eject_PC(VOID
)
7345 TRACE("CM_Request_Eject_PC()\n");
7347 return CM_Request_Eject_PC_Ex(NULL
);
7351 /***********************************************************************
7352 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
7356 CM_Request_Eject_PC_Ex(
7357 _In_opt_ HMACHINE hMachine
)
7359 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7362 TRACE("CM_Request_Eject_PC_Ex(%p)\n", hMachine
);
7364 if (hMachine
!= NULL
)
7366 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7367 if (BindingHandle
== NULL
)
7372 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7378 ret
= PNP_RequestEjectPC(BindingHandle
);
7380 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7382 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7390 /***********************************************************************
7391 * CM_Run_Detection [SETUPAPI.@]
7398 TRACE("CM_Run_Detection(%lx)\n", ulFlags
);
7400 return CM_Run_Detection_Ex(ulFlags
, NULL
);
7404 /***********************************************************************
7405 * CM_Run_Detection_Ex [SETUPAPI.@]
7409 CM_Run_Detection_Ex(
7411 _In_opt_ HMACHINE hMachine
)
7413 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7416 TRACE("CM_Run_Detection_Ex(%lx %p)\n",
7419 if (!pSetupIsUserAdmin())
7420 return CR_ACCESS_DENIED
;
7422 if (ulFlags
& ~CM_DETECT_BITS
)
7423 return CR_INVALID_FLAG
;
7425 if (hMachine
!= NULL
)
7427 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7428 if (BindingHandle
== NULL
)
7433 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7439 ret
= PNP_RunDetection(BindingHandle
,
7442 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7444 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7452 /***********************************************************************
7453 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
7457 CM_Set_Class_Registry_PropertyA(
7458 _In_ LPGUID ClassGuid
,
7459 _In_ ULONG ulProperty
,
7460 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7461 _In_ ULONG ulLength
,
7463 _In_opt_ HMACHINE hMachine
)
7465 FIXME("CM_Set_Class_Registry_PropertyA(%p %lx %p %lu %lx %p)\n",
7466 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7468 return CR_CALL_NOT_IMPLEMENTED
;
7472 /***********************************************************************
7473 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
7477 CM_Set_Class_Registry_PropertyW(
7478 _In_ LPGUID ClassGuid
,
7479 _In_ ULONG ulProperty
,
7480 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7481 _In_ ULONG ulLength
,
7483 _In_opt_ HMACHINE hMachine
)
7485 FIXME("CM_Set_Class_Registry_PropertyW(%p %lx %p %lu %lx %p)\n",
7486 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7488 return CR_CALL_NOT_IMPLEMENTED
;
7492 /***********************************************************************
7493 * CM_Set_DevNode_Problem [SETUPAPI.@]
7497 CM_Set_DevNode_Problem(
7498 _In_ DEVINST dnDevInst
,
7499 _In_ ULONG ulProblem
,
7502 TRACE("CM_Set_DevNode_Problem(%lx %lx %lx)\n",
7503 dnDevInst
, ulProblem
, ulFlags
);
7505 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
7509 /***********************************************************************
7510 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
7514 CM_Set_DevNode_Problem_Ex(
7515 _In_ DEVINST dnDevInst
,
7516 _In_ ULONG ulProblem
,
7518 _In_opt_ HMACHINE hMachine
)
7520 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7521 HSTRING_TABLE StringTable
= NULL
;
7525 TRACE("CM_Set_DevNode_Problem_Ex(%lx %lx %lx %p)\n",
7526 dnDevInst
, ulProblem
, ulFlags
, hMachine
);
7529 return CR_INVALID_DEVNODE
;
7531 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
7532 return CR_INVALID_FLAG
;
7534 if (hMachine
!= NULL
)
7536 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7537 if (BindingHandle
== NULL
)
7540 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7541 if (StringTable
== 0)
7546 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7550 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7551 if (lpDevInst
== NULL
)
7552 return CR_INVALID_DEVNODE
;
7556 ret
= PNP_SetDeviceProblem(BindingHandle
,
7561 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7563 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7571 /***********************************************************************
7572 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
7576 CM_Set_DevNode_Registry_PropertyA(
7577 _In_ DEVINST dnDevInst
,
7578 _In_ ULONG ulProperty
,
7579 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7580 _In_ ULONG ulLength
,
7583 TRACE("CM_Set_DevNode_Registry_PropertyA(%lx %lu %p %lx %lx)\n",
7584 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7586 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
7592 /***********************************************************************
7593 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
7597 CM_Set_DevNode_Registry_PropertyW(
7598 _In_ DEVINST dnDevInst
,
7599 _In_ ULONG ulProperty
,
7600 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7601 _In_ ULONG ulLength
,
7604 TRACE("CM_Set_DevNode_Registry_PropertyW(%lx %lu %p %lx %lx)\n",
7605 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7607 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
7613 /***********************************************************************
7614 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
7618 CM_Set_DevNode_Registry_Property_ExA(
7619 _In_ DEVINST dnDevInst
,
7620 _In_ ULONG ulProperty
,
7621 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7622 _In_ ULONG ulLength
,
7624 _In_opt_ HMACHINE hMachine
)
7626 CONFIGRET ret
= CR_SUCCESS
;
7630 FIXME("CM_Set_DevNode_Registry_Property_ExA(%lx %lu %p %lx %lx %p)\n",
7631 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7633 if (Buffer
== NULL
&& ulLength
!= 0)
7634 return CR_INVALID_POINTER
;
7636 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7637 return CR_INVALID_PROPERTY
;
7641 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7650 /* Get property type */
7651 ulType
= GetRegistryPropertyType(ulProperty
);
7653 /* Allocate buffer if needed */
7654 if (ulType
== REG_SZ
||
7655 ulType
== REG_MULTI_SZ
)
7657 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
7658 if (lpBuffer
== NULL
)
7660 ret
= CR_OUT_OF_MEMORY
;
7664 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
7665 ulLength
, lpBuffer
, ulLength
))
7672 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7675 ulLength
* sizeof(WCHAR
),
7684 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7692 ret
= CR_CALL_NOT_IMPLEMENTED
;
7699 /***********************************************************************
7700 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
7704 CM_Set_DevNode_Registry_Property_ExW(
7705 _In_ DEVINST dnDevInst
,
7706 _In_ ULONG ulProperty
,
7707 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7708 _In_ ULONG ulLength
,
7710 _In_opt_ HMACHINE hMachine
)
7712 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7713 HSTRING_TABLE StringTable
= NULL
;
7718 TRACE("CM_Set_DevNode_Registry_Property_ExW(%lx %lu %p %lx %lx %p)\n",
7719 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7722 return CR_INVALID_DEVNODE
;
7724 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7725 return CR_INVALID_PROPERTY
;
7727 if (Buffer
!= NULL
&& ulLength
== 0)
7728 return CR_INVALID_POINTER
;
7731 return CR_INVALID_FLAG
;
7733 if (hMachine
!= NULL
)
7735 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7736 if (BindingHandle
== NULL
)
7739 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7740 if (StringTable
== 0)
7745 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7749 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7750 if (lpDevInst
== NULL
)
7751 return CR_INVALID_DEVNODE
;
7753 /* Get property type */
7754 ulType
= GetRegistryPropertyType(ulProperty
);
7758 ret
= PNP_SetDeviceRegProp(BindingHandle
,
7766 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7768 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7776 /***********************************************************************
7777 * CM_Set_HW_Prof [SETUPAPI.@]
7782 _In_ ULONG ulHardwareProfile
,
7785 TRACE("CM_Set_HW_Prof(%lu %lx)\n",
7786 ulHardwareProfile
, ulFlags
);
7788 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
7792 /***********************************************************************
7793 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
7798 _In_ ULONG ulHardwareProfile
,
7800 _In_opt_ HMACHINE hMachine
)
7802 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7805 TRACE("CM_Set_HW_Prof_Ex(%lu %lx %p)\n",
7806 ulHardwareProfile
, ulFlags
, hMachine
);
7808 if (!pSetupIsUserAdmin())
7809 return CR_ACCESS_DENIED
;
7812 return CR_INVALID_FLAG
;
7814 if (hMachine
!= NULL
)
7816 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7817 if (BindingHandle
== NULL
)
7822 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7828 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
7830 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7832 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7840 /***********************************************************************
7841 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
7845 CM_Set_HW_Prof_FlagsA(
7846 _In_ DEVINSTID_A szDevInstName
,
7847 _In_ ULONG ulConfig
,
7851 TRACE("CM_Set_HW_Prof_FlagsA(%s %lu %lu %lx)\n",
7852 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7854 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
7859 /***********************************************************************
7860 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
7864 CM_Set_HW_Prof_FlagsW(
7865 _In_ DEVINSTID_W szDevInstName
,
7866 _In_ ULONG ulConfig
,
7870 TRACE("CM_Set_HW_Prof_FlagsW(%s %lu %lu %lx)\n",
7871 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7873 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
7878 /***********************************************************************
7879 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
7883 CM_Set_HW_Prof_Flags_ExA(
7884 _In_ DEVINSTID_A szDevInstName
,
7885 _In_ ULONG ulConfig
,
7888 _In_opt_ HMACHINE hMachine
)
7890 DEVINSTID_W pszDevIdW
= NULL
;
7891 CONFIGRET ret
= CR_SUCCESS
;
7893 TRACE("CM_Set_HW_Prof_Flags_ExA(%s %lu %lu %lx %p)\n",
7894 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7896 if (szDevInstName
!= NULL
)
7898 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
7899 return CR_INVALID_DEVICE_ID
;
7902 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
7905 if (pszDevIdW
!= NULL
)
7912 /***********************************************************************
7913 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
7917 CM_Set_HW_Prof_Flags_ExW(
7918 _In_ DEVINSTID_W szDevInstName
,
7919 _In_ ULONG ulConfig
,
7922 _In_opt_ HMACHINE hMachine
)
7924 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7927 FIXME("CM_Set_HW_Prof_Flags_ExW(%s %lu %lu %lx %p)\n",
7928 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7930 if (szDevInstName
== NULL
)
7931 return CR_INVALID_POINTER
;
7933 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
7934 return CR_INVALID_FLAG
;
7936 /* FIXME: Check whether szDevInstName is valid */
7938 if (hMachine
!= NULL
)
7940 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7941 if (BindingHandle
== NULL
)
7946 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7952 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
7953 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
7955 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7957 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7965 /***********************************************************************
7966 * CM_Setup_DevNode [SETUPAPI.@]
7971 _In_ DEVINST dnDevInst
,
7974 TRACE("CM_Setup_DevNode(%lx %lx)\n",
7975 dnDevInst
, ulFlags
);
7977 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
7981 /***********************************************************************
7982 * CM_Setup_DevNode_Ex [SETUPAPI.@]
7986 CM_Setup_DevNode_Ex(
7987 _In_ DEVINST dnDevInst
,
7989 _In_opt_ HMACHINE hMachine
)
7991 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7992 HSTRING_TABLE StringTable
= NULL
;
7996 FIXME("CM_Setup_DevNode_Ex(%lx %lx %p)\n",
7997 dnDevInst
, ulFlags
, hMachine
);
7999 if (!pSetupIsUserAdmin())
8000 return CR_ACCESS_DENIED
;
8003 return CR_INVALID_DEVNODE
;
8005 if (ulFlags
& ~CM_SETUP_BITS
)
8006 return CR_INVALID_FLAG
;
8008 if (hMachine
!= NULL
)
8010 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8011 if (BindingHandle
== NULL
)
8014 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
8015 if (StringTable
== 0)
8020 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
8024 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
8025 if (lpDevInst
== NULL
)
8026 return CR_INVALID_DEVNODE
;
8030 ret
= PNP_DeviceInstanceAction(BindingHandle
,
8036 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8038 ret
= RpcStatusToCmStatus(RpcExceptionCode());
8046 /***********************************************************************
8047 * CM_Test_Range_Available [SETUPAPI.@]
8051 CM_Test_Range_Available(
8052 _In_ DWORDLONG ullStartValue
,
8053 _In_ DWORDLONG ullEndValue
,
8054 _In_ RANGE_LIST rlh
,
8057 FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
8058 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
8059 return CR_CALL_NOT_IMPLEMENTED
;
8063 /***********************************************************************
8064 * CM_Uninstall_DevNode [SETUPAPI.@]
8068 CM_Uninstall_DevNode(
8069 _In_ DEVINST dnPhantom
,
8072 TRACE("CM_Uninstall_DevNode(%lx %lx)\n",
8073 dnPhantom
, ulFlags
);
8075 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
8079 /***********************************************************************
8080 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
8084 CM_Uninstall_DevNode_Ex(
8085 _In_ DEVINST dnPhantom
,
8087 _In_opt_ HMACHINE hMachine
)
8089 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8090 HSTRING_TABLE StringTable
= NULL
;
8094 TRACE("CM_Uninstall_DevNode_Ex(%lx %lx %p)\n",
8095 dnPhantom
, ulFlags
, hMachine
);
8098 return CR_INVALID_DEVNODE
;
8101 return CR_INVALID_FLAG
;
8103 if (hMachine
!= NULL
)
8105 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8106 if (BindingHandle
== NULL
)
8109 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
8110 if (StringTable
== 0)
8115 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
8119 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
8120 if (lpDevInst
== NULL
)
8121 return CR_INVALID_DEVNODE
;
8125 ret
= PNP_UninstallDevInst(BindingHandle
,
8129 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8131 ret
= RpcStatusToCmStatus(RpcExceptionCode());
8139 /***********************************************************************
8140 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
8144 CM_Unregister_Device_InterfaceA(
8145 _In_ LPCSTR pszDeviceInterface
,
8148 TRACE("CM_Unregister_Device_InterfaceA(%s %lx)\n",
8149 debugstr_a(pszDeviceInterface
), ulFlags
);
8151 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
8156 /***********************************************************************
8157 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
8161 CM_Unregister_Device_InterfaceW(
8162 _In_ LPCWSTR pszDeviceInterface
,
8165 TRACE("CM_Unregister_Device_InterfaceW(%s %lx)\n",
8166 debugstr_w(pszDeviceInterface
), ulFlags
);
8168 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
8173 /***********************************************************************
8174 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
8178 CM_Unregister_Device_Interface_ExA(
8179 _In_ LPCSTR pszDeviceInterface
,
8181 _In_opt_ HMACHINE hMachine
)
8183 LPWSTR pszDeviceInterfaceW
= NULL
;
8186 TRACE("CM_Unregister_Device_Interface_ExA(%s %lx %p)\n",
8187 debugstr_a(pszDeviceInterface
), ulFlags
, hMachine
);
8189 if (pszDeviceInterface
== NULL
)
8190 return CR_INVALID_POINTER
;
8192 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
8193 return CR_INVALID_DATA
;
8195 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
8198 if (pszDeviceInterfaceW
!= NULL
)
8199 MyFree(pszDeviceInterfaceW
);
8205 /***********************************************************************
8206 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
8210 CM_Unregister_Device_Interface_ExW(
8211 _In_ LPCWSTR pszDeviceInterface
,
8213 _In_opt_ HMACHINE hMachine
)
8215 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8218 TRACE("CM_Unregister_Device_Interface_ExW(%s %lx %p)\n",
8219 debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
8221 if (pszDeviceInterface
== NULL
)
8222 return CR_INVALID_POINTER
;
8225 return CR_INVALID_FLAG
;
8227 if (hMachine
!= NULL
)
8229 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8230 if (BindingHandle
== NULL
)
8235 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
8241 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
8242 (LPWSTR
)pszDeviceInterface
,
8245 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8247 ret
= RpcStatusToCmStatus(RpcExceptionCode());