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
);
245 ret
= PNP_GetDeviceRegProp(BindingHandle
,
254 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
256 ret
= RpcStatusToCmStatus(RpcExceptionCode());
260 if (ret
!= CR_SUCCESS
)
264 ret
= PNP_GetClassInstance(BindingHandle
,
269 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
271 ret
= RpcStatusToCmStatus(RpcExceptionCode());
275 if (ret
!= CR_SUCCESS
)
281 TRACE("szBuffer: %S\n", pszBuffer
);
283 SplitDeviceInstanceId(pszBuffer
,
287 TRACE("szBuffer: %S\n", pszBuffer
);
289 if (ulFlags
& CM_REGISTRY_CONFIG
)
291 if (ulHardwareProfile
== 0)
293 wsprintfW(pszKeyPath
,
295 L
"System\\CurrentControlSet\\Hardware Profiles",
297 L
"System\\CurrentControlSet\\Control\\Class",
302 wsprintfW(pszKeyPath
,
303 L
"%s\\%04lu\\%s\\%s",
304 L
"System\\CurrentControlSet\\Hardware Profiles",
306 L
"System\\CurrentControlSet\\Control\\Class",
312 wsprintfW(pszKeyPath
,
314 L
"System\\CurrentControlSet\\Control\\Class",
320 /* Hardware Key Path */
322 if (ulFlags
& CM_REGISTRY_CONFIG
)
324 SplitDeviceInstanceId(pszDeviceInst
,
328 if (ulHardwareProfile
== 0)
330 wsprintfW(pszKeyPath
,
332 L
"System\\CurrentControlSet\\Hardware Profiles",
334 L
"System\\CurrentControlSet\\Enum",
339 wsprintfW(pszKeyPath
,
340 L
"%s\\%04lu\\%s\\%s",
341 L
"System\\CurrentControlSet\\Hardware Profiles",
343 L
"System\\CurrentControlSet\\Enum",
347 else if (ulFlags
& CM_REGISTRY_USER
)
349 wsprintfW(pszKeyPath
,
351 L
"System\\CurrentControlSet\\Enum",
354 wcscpy(pszInstancePath
,
355 L
"Device Parameters");
359 SplitDeviceInstanceId(pszDeviceInst
,
363 wsprintfW(pszKeyPath
,
365 L
"System\\CurrentControlSet\\Enum",
371 if (pszBuffer
!= NULL
)
380 _In_opt_ PINTERNAL_RANGE_LIST pRangeList
)
384 if (pRangeList
== NULL
)
389 if (pRangeList
->ulMagic
!= RANGE_LIST_MAGIC
)
392 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
404 _In_opt_ PLOG_CONF_INFO pLogConfInfo
)
408 if (pLogConfInfo
== NULL
)
413 if (pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
416 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
428 _In_opt_ PCONFLICT_DATA pConflictData
)
432 if (pConflictData
== NULL
)
437 if (pConflictData
->ulMagic
!= CONFLICT_MAGIC
)
440 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
450 /***********************************************************************
451 * CMP_GetBlockedDriverInfo [SETUPAPI.@]
455 CMP_GetBlockedDriverInfo(
456 _Out_opt_ LPWSTR pszNames
,
457 _Inout_ PULONG pulLength
,
459 _In_opt_ HMACHINE hMachine
)
461 RPC_BINDING_HANDLE BindingHandle
= NULL
;
462 ULONG ulTransferLength
;
465 TRACE("CMP_GetBlockedDriverInfo(%p %p %lx %p)\n",
466 pszNames
, pulLength
, ulFlags
, hMachine
);
468 if (hMachine
!= NULL
)
470 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
471 if (BindingHandle
== NULL
)
476 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
480 ulTransferLength
= *pulLength
;
484 ret
= PNP_GetBlockedDriverInfo(BindingHandle
,
490 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
492 ret
= RpcStatusToCmStatus(RpcExceptionCode());
500 /***********************************************************************
501 * CMP_GetServerSideDeviceInstallFlags [SETUPAPI.@]
505 CMP_GetServerSideDeviceInstallFlags(
506 _Out_ PULONG pulSSDIFlags
,
508 _In_opt_ HMACHINE hMachine
)
510 RPC_BINDING_HANDLE BindingHandle
= NULL
;
513 TRACE("CMP_GetServerSideDeviceInstallFlags(%p %lx %p)\n",
514 pulSSDIFlags
, ulFlags
, hMachine
);
516 if (pulSSDIFlags
== NULL
)
517 return CR_INVALID_POINTER
;
520 return CR_INVALID_FLAG
;
522 if (hMachine
!= NULL
)
524 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
525 if (BindingHandle
== NULL
)
530 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
536 ret
= PNP_GetServerSideDeviceInstallFlags(BindingHandle
,
540 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
542 ret
= RpcStatusToCmStatus(RpcExceptionCode());
550 /***********************************************************************
551 * CMP_Init_Detection [SETUPAPI.@]
558 RPC_BINDING_HANDLE BindingHandle
= NULL
;
561 TRACE("CMP_Init_Detection(%lu)\n", ulMagic
);
563 if (ulMagic
!= CMP_MAGIC
)
564 return CR_INVALID_DATA
;
566 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
571 ret
= PNP_InitDetection(BindingHandle
);
573 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
575 ret
= RpcStatusToCmStatus(RpcExceptionCode());
583 /***********************************************************************
584 * CMP_RegisterNotification [SETUPAPI.@]
588 CMP_RegisterNotification(
589 _In_ HANDLE hRecipient
,
590 _In_ LPVOID lpvNotificationFilter
,
592 _Out_ PHDEVNOTIFY phDevNotify
)
594 RPC_BINDING_HANDLE BindingHandle
= NULL
;
595 PNOTIFY_DATA pNotifyData
= NULL
;
596 CONFIGRET ret
= CR_SUCCESS
;
598 TRACE("CMP_RegisterNotification(%p %p %lu %p)\n",
599 hRecipient
, lpvNotificationFilter
, ulFlags
, phDevNotify
);
601 if ((hRecipient
== NULL
) ||
602 (lpvNotificationFilter
== NULL
) ||
603 (phDevNotify
== NULL
))
604 return CR_INVALID_POINTER
;
607 return CR_INVALID_FLAG
;
609 if (((PDEV_BROADCAST_HDR
)lpvNotificationFilter
)->dbch_size
< sizeof(DEV_BROADCAST_HDR
))
610 return CR_INVALID_DATA
;
612 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
615 pNotifyData
= HeapAlloc(GetProcessHeap(),
617 sizeof(NOTIFY_DATA
));
618 if (pNotifyData
== NULL
)
619 return CR_OUT_OF_MEMORY
;
621 pNotifyData
->ulMagic
= NOTIFY_MAGIC
;
624 if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_WINDOW_HANDLE)
628 else if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_SERVICE_HANDLE)
636 ret
= PNP_RegisterNotification(BindingHandle
,
637 (BYTE
*)lpvNotificationFilter
,
638 ((DEV_BROADCAST_HDR
*)lpvNotificationFilter
)->dbch_size
,
640 &pNotifyData
->ulNotifyData
);
642 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
644 ret
= RpcStatusToCmStatus(RpcExceptionCode());
648 if (ret
== CR_SUCCESS
)
650 *phDevNotify
= (HDEVNOTIFY
)pNotifyData
;
654 if (pNotifyData
!= NULL
)
655 HeapFree(GetProcessHeap(), 0, pNotifyData
);
657 *phDevNotify
= (HDEVNOTIFY
)NULL
;
664 /***********************************************************************
665 * CMP_Report_LogOn [SETUPAPI.@]
671 _In_ DWORD dwProcessId
)
673 RPC_BINDING_HANDLE BindingHandle
= NULL
;
674 CONFIGRET ret
= CR_SUCCESS
;
678 TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic
, dwProcessId
);
680 if (dwMagic
!= CMP_MAGIC
)
681 return CR_INVALID_DATA
;
683 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
686 bAdmin
= pSetupIsUserAdmin();
688 for (i
= 0; i
< 30; i
++)
692 ret
= PNP_ReportLogOn(BindingHandle
,
696 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
698 ret
= RpcStatusToCmStatus(RpcExceptionCode());
702 if (ret
== CR_SUCCESS
)
712 /***********************************************************************
713 * CMP_UnregisterNotification [SETUPAPI.@]
717 CMP_UnregisterNotification(
718 _In_ HDEVNOTIFY hDevNotify
)
720 RPC_BINDING_HANDLE BindingHandle
= NULL
;
721 PNOTIFY_DATA pNotifyData
;
722 CONFIGRET ret
= CR_SUCCESS
;
724 TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify
);
726 pNotifyData
= (PNOTIFY_DATA
)hDevNotify
;
728 if ((pNotifyData
== NULL
) ||
729 (pNotifyData
->ulMagic
!= NOTIFY_MAGIC
))
730 return CR_INVALID_POINTER
;
732 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
737 ret
= PNP_UnregisterNotification(BindingHandle
,
738 pNotifyData
->ulNotifyData
);
740 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
742 ret
= RpcStatusToCmStatus(RpcExceptionCode());
746 if (ret
== CR_SUCCESS
)
747 HeapFree(GetProcessHeap(), 0, pNotifyData
);
753 /***********************************************************************
754 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
758 CMP_WaitNoPendingInstallEvents(
759 _In_ DWORD dwTimeout
)
764 TRACE("CMP_WaitNoPendingInstallEvents(%lu)\n", dwTimeout
);
766 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
770 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
776 /***********************************************************************
777 * CMP_WaitServicesAvailable [SETUPAPI.@]
781 CMP_WaitServicesAvailable(
782 _In_opt_ HMACHINE hMachine
)
784 RPC_BINDING_HANDLE BindingHandle
= NULL
;
785 CONFIGRET ret
= CR_SUCCESS
;
788 TRACE("CMP_WaitServicesAvailable(%p)\n", hMachine
);
790 if (hMachine
!= NULL
)
792 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
793 if (BindingHandle
== NULL
)
798 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
804 ret
= PNP_GetVersion(BindingHandle
, &Version
);
806 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
808 ret
= RpcStatusToCmStatus(RpcExceptionCode());
816 /***********************************************************************
817 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
821 CM_Add_Empty_Log_Conf(
822 _Out_ PLOG_CONF plcLogConf
,
823 _In_ DEVINST dnDevInst
,
824 _In_ PRIORITY Priority
,
827 TRACE("CM_Add_Empty_Log_Conf(%p %p %lu %lx)\n",
828 plcLogConf
, dnDevInst
, Priority
, ulFlags
);
830 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
835 /***********************************************************************
836 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
840 CM_Add_Empty_Log_Conf_Ex(
841 _Out_ PLOG_CONF plcLogConf
,
842 _In_ DEVINST dnDevInst
,
843 _In_ PRIORITY Priority
,
845 _In_opt_ HMACHINE hMachine
)
847 RPC_BINDING_HANDLE BindingHandle
= NULL
;
848 HSTRING_TABLE StringTable
= NULL
;
849 ULONG ulLogConfTag
= 0;
851 PLOG_CONF_INFO pLogConfInfo
;
852 CONFIGRET ret
= CR_SUCCESS
;
854 FIXME("CM_Add_Empty_Log_Conf_Ex(%p %p %lu %lx %p)\n",
855 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
857 if (!pSetupIsUserAdmin())
858 return CR_ACCESS_DENIED
;
860 if (plcLogConf
== NULL
)
861 return CR_INVALID_POINTER
;
864 return CR_INVALID_DEVINST
;
866 if (Priority
> 0xFFFF)
867 return CR_INVALID_PRIORITY
;
869 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
870 return CR_INVALID_FLAG
;
872 if (hMachine
!= NULL
)
874 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
875 if (BindingHandle
== NULL
)
878 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
879 if (StringTable
== 0)
884 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
888 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
889 if (lpDevInst
== NULL
)
890 return CR_INVALID_DEVNODE
;
894 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
895 &ulLogConfTag
, ulFlags
);
897 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
899 ret
= RpcStatusToCmStatus(RpcExceptionCode());
903 if (ret
== CR_SUCCESS
)
905 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
906 if (pLogConfInfo
== NULL
)
908 ret
= CR_OUT_OF_MEMORY
;
912 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
913 pLogConfInfo
->dnDevInst
= dnDevInst
;
914 pLogConfInfo
->ulFlags
= ulFlags
;
915 pLogConfInfo
->ulTag
= ulLogConfTag
;
917 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
927 /***********************************************************************
928 * CM_Add_IDA [SETUPAPI.@]
933 _In_ DEVINST dnDevInst
,
937 TRACE("CM_Add_IDA(%p %s %lx)\n",
938 dnDevInst
, debugstr_a(pszID
), ulFlags
);
940 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
944 /***********************************************************************
945 * CM_Add_IDW [SETUPAPI.@]
950 _In_ DEVINST dnDevInst
,
954 TRACE("CM_Add_IDW(%p %s %lx)\n",
955 dnDevInst
, debugstr_w(pszID
), ulFlags
);
957 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
961 /***********************************************************************
962 * CM_Add_ID_ExA [SETUPAPI.@]
967 _In_ DEVINST dnDevInst
,
970 _In_opt_ HMACHINE hMachine
)
975 TRACE("CM_Add_ID_ExA(%p %s %lx %p)\n",
976 dnDevInst
, debugstr_a(pszID
), ulFlags
, hMachine
);
978 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
979 return CR_INVALID_DATA
;
981 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
989 /***********************************************************************
990 * CM_Add_ID_ExW [SETUPAPI.@]
995 _In_ DEVINST dnDevInst
,
998 _In_opt_ HMACHINE hMachine
)
1000 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1001 HSTRING_TABLE StringTable
= NULL
;
1005 TRACE("CM_Add_ID_ExW(%p %s %lx %p)\n",
1006 dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
1008 if (!pSetupIsUserAdmin())
1009 return CR_ACCESS_DENIED
;
1012 return CR_INVALID_DEVINST
;
1015 return CR_INVALID_POINTER
;
1017 if (ulFlags
& ~CM_ADD_ID_BITS
)
1018 return CR_INVALID_FLAG
;
1020 if (hMachine
!= NULL
)
1022 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1023 if (BindingHandle
== NULL
)
1026 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1027 if (StringTable
== 0)
1032 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1036 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1037 if (lpDevInst
== NULL
)
1038 return CR_INVALID_DEVNODE
;
1042 ret
= PNP_AddID(BindingHandle
,
1047 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1049 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1057 /***********************************************************************
1058 * CM_Add_Range [SETUPAPI.@]
1063 _In_ DWORDLONG ullStartValue
,
1064 _In_ DWORDLONG ullEndValue
,
1065 _In_ RANGE_LIST rlh
,
1068 PINTERNAL_RANGE_LIST pRangeList
;
1069 PINTERNAL_RANGE pRange
;
1070 CONFIGRET ret
= CR_SUCCESS
;
1072 FIXME("CM_Add_Range(%I64u %I64u %p %lx)\n",
1073 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1075 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
1077 if (!IsValidRangeList(pRangeList
))
1078 return CR_INVALID_RANGE_LIST
;
1080 if (ulFlags
& ~CM_ADD_RANGE_BITS
)
1081 return CR_INVALID_FLAG
;
1083 if (ullEndValue
< ullStartValue
)
1084 return CR_INVALID_RANGE
;
1086 /* Lock the range list */
1087 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
1089 /* Allocate the new range */
1090 pRange
= HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNAL_RANGE
));
1093 ret
= CR_OUT_OF_MEMORY
;
1097 pRange
->pRangeList
= pRangeList
;
1098 pRange
->ullStart
= ullStartValue
;
1099 pRange
->ullEnd
= ullEndValue
;
1101 /* Insert the range */
1102 if (IsListEmpty(&pRangeList
->ListHead
))
1104 InsertTailList(&pRangeList
->ListHead
, &pRange
->ListEntry
);
1108 HeapFree(GetProcessHeap(), 0, pRange
);
1113 /* Unlock the range list */
1114 ReleaseMutex(pRangeList
->hMutex
);
1120 /***********************************************************************
1121 * CM_Add_Res_Des [SETUPAPI.@]
1126 _Out_opt_ PRES_DES prdResDes
,
1127 _In_ LOG_CONF lcLogConf
,
1128 _In_ RESOURCEID ResourceID
,
1129 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1130 _In_ ULONG ResourceLen
,
1133 TRACE("CM_Add_Res_Des(%p %p %lu %p %lu %lx)\n",
1134 prdResDes
, lcLogConf
, ResourceID
, ResourceData
, ResourceLen
, ulFlags
);
1136 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
1137 ResourceLen
, ulFlags
, NULL
);
1141 /***********************************************************************
1142 * CM_Add_Res_Des_Ex [SETUPAPI.@]
1147 _Out_opt_ PRES_DES prdResDes
,
1148 _In_ LOG_CONF lcLogConf
,
1149 _In_ RESOURCEID ResourceID
,
1150 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1151 _In_ ULONG ResourceLen
,
1153 _In_opt_ HMACHINE hMachine
)
1155 FIXME("CM_Add_Res_Des_Ex(%p %p %lu %p %lu %lx %p)\n",
1156 prdResDes
, lcLogConf
, ResourceID
,
1157 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
1159 return CR_CALL_NOT_IMPLEMENTED
;
1163 /***********************************************************************
1164 * CM_Connect_MachineA [SETUPAPI.@]
1168 CM_Connect_MachineA(
1169 _In_opt_ PCSTR UNCServerName
,
1170 _Out_ PHMACHINE phMachine
)
1175 TRACE("CM_Connect_MachineA(%s %p)\n",
1176 debugstr_a(UNCServerName
), phMachine
);
1178 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1179 return CM_Connect_MachineW(NULL
, phMachine
);
1181 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
1182 return CR_INVALID_DATA
;
1184 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
1186 MyFree(pServerNameW
);
1192 /***********************************************************************
1193 * CM_Connect_MachineW [SETUPAPI.@]
1197 CM_Connect_MachineW(
1198 _In_opt_ PCWSTR UNCServerName
,
1199 _Out_ PHMACHINE phMachine
)
1201 PMACHINE_INFO pMachine
;
1203 TRACE("CM_Connect_MachineW(%s %p)\n",
1204 debugstr_w(UNCServerName
), phMachine
);
1206 if (phMachine
== NULL
)
1207 return CR_INVALID_POINTER
;
1211 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
1212 if (pMachine
== NULL
)
1213 return CR_OUT_OF_MEMORY
;
1215 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1217 pMachine
->bLocal
= TRUE
;
1219 /* FIXME: store the computers name in pMachine->szMachineName */
1221 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
1222 &pMachine
->StringTable
))
1224 HeapFree(GetProcessHeap(), 0, pMachine
);
1230 pMachine
->bLocal
= FALSE
;
1231 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
1233 HeapFree(GetProcessHeap(), 0, pMachine
);
1234 return CR_INVALID_MACHINENAME
;
1236 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
1238 pMachine
->StringTable
= pSetupStringTableInitialize();
1239 if (pMachine
->StringTable
== NULL
)
1241 HeapFree(GetProcessHeap(), 0, pMachine
);
1245 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
1247 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
1249 pSetupStringTableDestroy(pMachine
->StringTable
);
1250 HeapFree(GetProcessHeap(), 0, pMachine
);
1251 return CR_INVALID_MACHINENAME
;
1255 *phMachine
= (PHMACHINE
)pMachine
;
1261 /***********************************************************************
1262 * CM_Create_DevNodeA [SETUPAPI.@]
1267 _Out_ PDEVINST pdnDevInst
,
1268 _In_ DEVINSTID_A pDeviceID
,
1269 _In_ DEVINST dnParent
,
1272 TRACE("CM_Create_DevNodeA(%p %s %p %lx)\n",
1273 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
1275 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
1280 /***********************************************************************
1281 * CM_Create_DevNodeW [SETUPAPI.@]
1286 _Out_ PDEVINST pdnDevInst
,
1287 _In_ DEVINSTID_W pDeviceID
,
1288 _In_ DEVINST dnParent
,
1291 TRACE("CM_Create_DevNodeW(%p %s %p %lx)\n",
1292 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
1294 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
1299 /***********************************************************************
1300 * CM_Create_DevNode_ExA [SETUPAPI.@]
1304 CM_Create_DevNode_ExA(
1305 _Out_ PDEVINST pdnDevInst
,
1306 _In_ DEVINSTID_A pDeviceID
,
1307 _In_ DEVINST dnParent
,
1309 _In_opt_ HANDLE hMachine
)
1311 DEVINSTID_W pDeviceIDW
;
1314 TRACE("CM_Create_DevNode_ExA(%p %s %p %lx %p)\n",
1315 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1317 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
1318 return CR_INVALID_DATA
;
1320 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
1329 /***********************************************************************
1330 * CM_Create_DevNode_ExW [SETUPAPI.@]
1334 CM_Create_DevNode_ExW(
1335 _Out_ PDEVINST pdnDevInst
,
1336 _In_ DEVINSTID_W pDeviceID
,
1337 _In_ DEVINST dnParent
,
1339 _In_opt_ HANDLE hMachine
)
1341 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1342 HSTRING_TABLE StringTable
= NULL
;
1343 LPWSTR lpParentDevInst
;
1344 CONFIGRET ret
= CR_SUCCESS
;
1345 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
1347 TRACE("CM_Create_DevNode_ExW(%p %s %p %lx %p)\n",
1348 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1350 if (!pSetupIsUserAdmin())
1351 return CR_ACCESS_DENIED
;
1353 if (pdnDevInst
== NULL
)
1354 return CR_INVALID_POINTER
;
1356 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
1357 return CR_INVALID_DEVICE_ID
;
1360 return CR_INVALID_DEVNODE
;
1362 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
1363 return CR_INVALID_FLAG
;
1365 if (hMachine
!= NULL
)
1367 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1368 if (BindingHandle
== NULL
)
1371 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1372 if (StringTable
== 0)
1377 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1381 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
1382 if (lpParentDevInst
== NULL
)
1383 return CR_INVALID_DEVNODE
;
1385 wcscpy(szLocalDeviceID
, pDeviceID
);
1389 ret
= PNP_CreateDevInst(BindingHandle
,
1395 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1397 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1401 if (ret
== CR_SUCCESS
)
1403 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
1404 * will return the generated device ID in szLocalDeviceID */
1405 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
1406 if (*pdnDevInst
== 0)
1407 ret
= CR_NO_SUCH_DEVNODE
;
1414 /***********************************************************************
1415 * CM_Create_Range_List [SETUPAPI.@]
1419 CM_Create_Range_List(
1420 _Out_ PRANGE_LIST prlh
,
1423 PINTERNAL_RANGE_LIST pRangeList
= NULL
;
1425 FIXME("CM_Create_Range_List(%p %lx)\n",
1429 return CR_INVALID_FLAG
;
1432 return CR_INVALID_POINTER
;
1434 /* Allocate the range list */
1435 pRangeList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(INTERNAL_RANGE_LIST
));
1436 if (pRangeList
== NULL
)
1437 return CR_OUT_OF_MEMORY
;
1439 /* Set the magic value */
1440 pRangeList
->ulMagic
= RANGE_LIST_MAGIC
;
1442 /* Initialize the mutex for synchonized access */
1443 pRangeList
->hMutex
= CreateMutex(NULL
, FALSE
, NULL
);
1444 if (pRangeList
->hMutex
== NULL
)
1446 HeapFree(GetProcessHeap(), 0, pRangeList
);
1450 InitializeListHead(&pRangeList
->ListHead
);
1452 *prlh
= (RANGE_LIST
)pRangeList
;
1458 /***********************************************************************
1459 * CM_Delete_Class_Key [SETUPAPI.@]
1463 CM_Delete_Class_Key(
1464 _In_ LPGUID ClassGuid
,
1467 TRACE("CM_Delete_Class_Key(%p %lx)\n",
1468 ClassGuid
, ulFlags
);
1470 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
1474 /***********************************************************************
1475 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
1479 CM_Delete_Class_Key_Ex(
1480 _In_ LPGUID ClassGuid
,
1482 _In_opt_ HANDLE hMachine
)
1484 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1485 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1488 TRACE("CM_Delete_Class_Key_Ex(%p %lx %p)\n",
1489 ClassGuid
, ulFlags
, hMachine
);
1491 if (ClassGuid
== NULL
)
1492 return CR_INVALID_POINTER
;
1494 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
1495 return CR_INVALID_FLAG
;
1497 if (!GuidToString(ClassGuid
, szGuidString
))
1498 return CR_INVALID_DATA
;
1500 if (hMachine
!= NULL
)
1502 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1503 if (BindingHandle
== NULL
)
1508 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1514 ret
= PNP_DeleteClassKey(BindingHandle
,
1518 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1520 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1528 /***********************************************************************
1529 * CM_Delete_DevNode_Key [SETUPAPI.@]
1533 CM_Delete_DevNode_Key(
1534 _In_ DEVNODE dnDevNode
,
1535 _In_ ULONG ulHardwareProfile
,
1538 TRACE("CM_Delete_DevNode_Key(%p %lu %lx)\n",
1539 dnDevNode
, ulHardwareProfile
, ulFlags
);
1541 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
1546 /***********************************************************************
1547 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
1551 CM_Delete_DevNode_Key_Ex(
1552 _In_ DEVNODE dnDevNode
,
1553 _In_ ULONG ulHardwareProfile
,
1555 _In_opt_ HANDLE hMachine
)
1557 FIXME("CM_Delete_DevNode_Key_Ex(%p %lu %lx %p)\n",
1558 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
1560 return CR_CALL_NOT_IMPLEMENTED
;
1564 /***********************************************************************
1565 * CM_Delete_Range [SETUPAPI.@]
1570 _In_ DWORDLONG ullStartValue
,
1571 _In_ DWORDLONG ullEndValue
,
1572 _In_ RANGE_LIST rlh
,
1575 FIXME("CM_Delete_Range(%I64u %I64u %p %lx)\n",
1576 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1578 return CR_CALL_NOT_IMPLEMENTED
;
1582 /***********************************************************************
1583 * CM_Detect_Resource_Conflict [SETUPAPI.@]
1587 CM_Detect_Resource_Conflict(
1588 _In_ DEVINST dnDevInst
,
1589 _In_ RESOURCEID ResourceID
,
1590 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1591 _In_ ULONG ResourceLen
,
1592 _Out_ PBOOL pbConflictDetected
,
1595 TRACE("CM_Detect_Resource_Conflict(%p %lu %p %lu %p 0x%lx)\n",
1596 dnDevInst
, ResourceID
, ResourceData
, ResourceLen
,
1597 pbConflictDetected
, ulFlags
);
1599 return CM_Detect_Resource_Conflict_Ex(dnDevInst
,
1609 /***********************************************************************
1610 * CM_Detect_Resource_Conflict_Ex [SETUPAPI.@]
1614 CM_Detect_Resource_Conflict_Ex(
1615 _In_ DEVINST dnDevInst
,
1616 _In_ RESOURCEID ResourceID
,
1617 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1618 _In_ ULONG ResourceLen
,
1619 _Out_ PBOOL pbConflictDetected
,
1621 _In_opt_ HMACHINE hMachine
)
1623 FIXME("CM_Detect_Resource_Conflict_Ex(%p %lu %p %lu %p 0x%lx %p)\n",
1624 dnDevInst
, ResourceID
, ResourceData
, ResourceLen
,
1625 pbConflictDetected
, ulFlags
, hMachine
);
1627 return CR_CALL_NOT_IMPLEMENTED
;
1631 /***********************************************************************
1632 * CM_Disable_DevNode [SETUPAPI.@]
1637 _In_ DEVINST dnDevInst
,
1640 TRACE("CM_Disable_DevNode(%p %lx)\n",
1641 dnDevInst
, ulFlags
);
1643 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1647 /***********************************************************************
1648 * CM_Disable_DevNode_Ex [SETUPAPI.@]
1652 CM_Disable_DevNode_Ex(
1653 _In_ DEVINST dnDevInst
,
1655 _In_opt_ HMACHINE hMachine
)
1657 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1658 HSTRING_TABLE StringTable
= NULL
;
1662 FIXME("CM_Disable_DevNode_Ex(%p %lx %p)\n",
1663 dnDevInst
, ulFlags
, hMachine
);
1665 if (!pSetupIsUserAdmin())
1666 return CR_ACCESS_DENIED
;
1669 return CR_INVALID_DEVINST
;
1672 return CR_INVALID_FLAG
;
1674 if (hMachine
!= NULL
)
1676 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1677 if (BindingHandle
== NULL
)
1680 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1681 if (StringTable
== 0)
1686 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1690 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1691 if (lpDevInst
== NULL
)
1692 return CR_INVALID_DEVNODE
;
1696 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1697 PNP_DEVINST_DISABLE
,
1702 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1704 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1712 /***********************************************************************
1713 * CM_Disconnect_Machine [SETUPAPI.@]
1717 CM_Disconnect_Machine(
1718 _In_opt_ HMACHINE hMachine
)
1720 PMACHINE_INFO pMachine
;
1722 TRACE("CM_Disconnect_Machine(%p)\n", hMachine
);
1724 pMachine
= (PMACHINE_INFO
)hMachine
;
1725 if (pMachine
== NULL
)
1728 if (pMachine
->bLocal
== FALSE
)
1730 if (pMachine
->StringTable
!= NULL
)
1731 pSetupStringTableDestroy(pMachine
->StringTable
);
1733 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
1734 return CR_ACCESS_DENIED
;
1737 HeapFree(GetProcessHeap(), 0, pMachine
);
1743 /***********************************************************************
1744 * CM_Dup_Range_List [SETUPAPI.@]
1749 _In_ RANGE_LIST rlhOld
,
1750 _In_ RANGE_LIST rlhNew
,
1753 FIXME("CM_Dup_Range_List(%p %p %lx)\n",
1754 rlhOld
, rlhNew
, ulFlags
);
1756 return CR_CALL_NOT_IMPLEMENTED
;
1760 /***********************************************************************
1761 * CM_Enable_DevNode [SETUPAPI.@]
1766 _In_ DEVINST dnDevInst
,
1769 TRACE("CM_Enable_DevNode(%p %lx)\n",
1770 dnDevInst
, ulFlags
);
1772 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1776 /***********************************************************************
1777 * CM_Enable_DevNode_Ex [SETUPAPI.@]
1781 CM_Enable_DevNode_Ex(
1782 _In_ DEVINST dnDevInst
,
1784 _In_opt_ HMACHINE hMachine
)
1786 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1787 HSTRING_TABLE StringTable
= NULL
;
1791 TRACE("CM_Enable_DevNode_Ex(%p %lx %p)\n",
1792 dnDevInst
, ulFlags
, hMachine
);
1794 if (!pSetupIsUserAdmin())
1795 return CR_ACCESS_DENIED
;
1798 return CR_INVALID_DEVINST
;
1801 return CR_INVALID_FLAG
;
1803 if (hMachine
!= NULL
)
1805 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1806 if (BindingHandle
== NULL
)
1809 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1810 if (StringTable
== 0)
1815 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1819 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1820 if (lpDevInst
== NULL
)
1821 return CR_INVALID_DEVNODE
;
1825 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1831 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1833 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1841 /***********************************************************************
1842 * CM_Enumerate_Classes [SETUPAPI.@]
1846 CM_Enumerate_Classes(
1847 _In_ ULONG ulClassIndex
,
1848 _Out_ LPGUID ClassGuid
,
1851 TRACE("CM_Enumerate_Classes(%lx %p %lx)\n",
1852 ulClassIndex
, ClassGuid
, ulFlags
);
1854 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
1858 /***********************************************************************
1859 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
1863 CM_Enumerate_Classes_Ex(
1864 _In_ ULONG ulClassIndex
,
1865 _Out_ LPGUID ClassGuid
,
1867 _In_opt_ HMACHINE hMachine
)
1869 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1870 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1871 CONFIGRET ret
= CR_SUCCESS
;
1872 ULONG ulLength
= MAX_GUID_STRING_LEN
;
1874 TRACE("CM_Enumerate_Classes_Ex(%lx %p %lx %p)\n",
1875 ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
1877 if (ClassGuid
== NULL
)
1878 return CR_INVALID_POINTER
;
1881 return CR_INVALID_FLAG
;
1883 if (hMachine
!= NULL
)
1885 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1886 if (BindingHandle
== NULL
)
1891 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1897 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1901 MAX_GUID_STRING_LEN
,
1905 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1907 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1911 if (ret
== CR_SUCCESS
)
1914 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1916 /* Convert the buffer to a GUID */
1917 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1925 /***********************************************************************
1926 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1930 CM_Enumerate_EnumeratorsA(
1931 _In_ ULONG ulEnumIndex
,
1932 _Out_writes_(*pulLength
) PCHAR Buffer
,
1933 _Inout_ PULONG pulLength
,
1936 TRACE("CM_Enumerate_EnumeratorsA(%lu %p %p %lx)\n",
1937 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1939 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1944 /***********************************************************************
1945 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1949 CM_Enumerate_EnumeratorsW(
1950 _In_ ULONG ulEnumIndex
,
1951 _Out_writes_(*pulLength
) PWCHAR Buffer
,
1952 _Inout_ PULONG pulLength
,
1955 TRACE("CM_Enumerate_EnumeratorsW(%lu %p %p %lx)\n",
1956 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1958 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1963 /***********************************************************************
1964 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1968 CM_Enumerate_Enumerators_ExA(
1969 _In_ ULONG ulEnumIndex
,
1970 _Out_writes_(*pulLength
) PCHAR Buffer
,
1971 _Inout_ PULONG pulLength
,
1973 _In_opt_ HMACHINE hMachine
)
1975 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1978 CONFIGRET ret
= CR_SUCCESS
;
1980 TRACE("CM_Enumerate_Enumerators_ExA(%lu %p %p %lx %p)\n",
1981 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
1983 if (Buffer
== NULL
|| pulLength
== NULL
)
1984 return CR_INVALID_POINTER
;
1987 return CR_INVALID_FLAG
;
1989 ulOrigLength
= *pulLength
;
1992 ulLength
= MAX_DEVICE_ID_LEN
;
1993 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1995 if (ret
== CR_SUCCESS
)
1997 if (WideCharToMultiByte(CP_ACP
,
2007 *pulLength
= lstrlenA(Buffer
) + 1;
2014 /***********************************************************************
2015 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
2019 CM_Enumerate_Enumerators_ExW(
2020 _In_ ULONG ulEnumIndex
,
2021 _Out_writes_(*pulLength
) PWCHAR Buffer
,
2022 _Inout_ PULONG pulLength
,
2024 _In_opt_ HMACHINE hMachine
)
2026 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2029 TRACE("CM_Enumerate_Enumerators_ExW(%lu %p %p %lx %p)\n",
2030 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
2032 if (Buffer
== NULL
|| pulLength
== NULL
)
2033 return CR_INVALID_POINTER
;
2036 return CR_INVALID_FLAG
;
2038 *Buffer
= UNICODE_NULL
;
2040 if (hMachine
!= NULL
)
2042 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2043 if (BindingHandle
== NULL
)
2048 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2054 ret
= PNP_EnumerateSubKeys(BindingHandle
,
2055 PNP_ENUMERATOR_SUBKEYS
,
2062 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2064 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2072 /***********************************************************************
2073 * CM_Find_Range [SETUPAPI.@]
2078 _Out_ PDWORDLONG pullStart
,
2079 _In_ DWORDLONG ullStart
,
2080 _In_ ULONG ulLength
,
2081 _In_ DWORDLONG ullAlignment
,
2082 _In_ DWORDLONG ullEnd
,
2083 _In_ RANGE_LIST rlh
,
2086 FIXME("CM_Find_Range(%p %I64u %lu %I64u %I64u %p %lx)\n",
2087 pullStart
, ullStart
, ulLength
, ullAlignment
, ullEnd
, rlh
, ulFlags
);
2089 return CR_CALL_NOT_IMPLEMENTED
;
2093 /***********************************************************************
2094 * CM_First_Range [SETUPAPI.@]
2099 _In_ RANGE_LIST rlh
,
2100 _Out_ PDWORDLONG pullStart
,
2101 _Out_ PDWORDLONG pullEnd
,
2102 _Out_ PRANGE_ELEMENT preElement
,
2105 PINTERNAL_RANGE_LIST pRangeList
;
2106 PINTERNAL_RANGE pRange
;
2107 PLIST_ENTRY ListEntry
;
2108 CONFIGRET ret
= CR_SUCCESS
;
2110 FIXME("CM_First_Range(%p %p %p %p %lx)\n",
2111 rlh
, pullStart
, pullEnd
, preElement
, ulFlags
);
2113 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
2115 if (!IsValidRangeList(pRangeList
))
2116 return CR_INVALID_RANGE_LIST
;
2118 if (pullStart
== NULL
|| pullEnd
== NULL
|| preElement
== NULL
)
2119 return CR_INVALID_POINTER
;
2122 return CR_INVALID_FLAG
;
2124 /* Lock the range list */
2125 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2127 /* Fail, if the list is empty */
2128 if (IsListEmpty(&pRangeList
->ListHead
))
2134 /* Get the first range */
2135 ListEntry
= pRangeList
->ListHead
.Flink
;
2136 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2138 /* Return the range data */
2139 *pullStart
= pRange
->ullStart
;
2140 *pullEnd
= pRange
->ullEnd
;
2141 *preElement
= (RANGE_ELEMENT
)pRange
;
2144 /* Unlock the range list */
2145 ReleaseMutex(pRangeList
->hMutex
);
2151 /***********************************************************************
2152 * CM_Free_Log_Conf [SETUPAPI.@]
2157 _In_ LOG_CONF lcLogConfToBeFreed
,
2160 TRACE("CM_Free_Log_Conf(%lx %lx)\n",
2161 lcLogConfToBeFreed
, ulFlags
);
2163 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
2167 /***********************************************************************
2168 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
2172 CM_Free_Log_Conf_Ex(
2173 _In_ LOG_CONF lcLogConfToBeFreed
,
2175 _In_opt_ HMACHINE hMachine
)
2177 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2178 HSTRING_TABLE StringTable
= NULL
;
2180 PLOG_CONF_INFO pLogConfInfo
;
2183 TRACE("CM_Free_Log_Conf_Ex(%lx %lx %p)\n",
2184 lcLogConfToBeFreed
, ulFlags
, hMachine
);
2186 if (!pSetupIsUserAdmin())
2187 return CR_ACCESS_DENIED
;
2189 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
2190 if (!IsValidLogConf(pLogConfInfo
))
2191 return CR_INVALID_LOG_CONF
;
2194 return CR_INVALID_FLAG
;
2196 if (hMachine
!= NULL
)
2198 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2199 if (BindingHandle
== NULL
)
2202 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2203 if (StringTable
== 0)
2208 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2212 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2213 if (lpDevInst
== NULL
)
2214 return CR_INVALID_DEVNODE
;
2218 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
2219 pLogConfInfo
->ulTag
, 0);
2221 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2223 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2231 /***********************************************************************
2232 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
2236 CM_Free_Log_Conf_Handle(
2237 _In_ LOG_CONF lcLogConf
)
2239 PLOG_CONF_INFO pLogConfInfo
;
2241 TRACE("CM_Free_Log_Conf_Handle(%lx)\n", lcLogConf
);
2243 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2244 if (!IsValidLogConf(pLogConfInfo
))
2245 return CR_INVALID_LOG_CONF
;
2247 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
2253 /***********************************************************************
2254 * CM_Free_Range_List [SETUPAPI.@]
2259 _In_ RANGE_LIST RangeList
,
2262 PINTERNAL_RANGE_LIST pRangeList
;
2263 PINTERNAL_RANGE pRange
;
2264 PLIST_ENTRY ListEntry
;
2266 FIXME("CM_Free_Range_List(%p %lx)\n",
2267 RangeList
, ulFlags
);
2269 pRangeList
= (PINTERNAL_RANGE_LIST
)RangeList
;
2271 if (!IsValidRangeList(pRangeList
))
2272 return CR_INVALID_RANGE_LIST
;
2275 return CR_INVALID_FLAG
;
2277 /* Lock the range list */
2278 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2280 /* Free the list of ranges */
2281 while (!IsListEmpty(&pRangeList
->ListHead
))
2283 ListEntry
= RemoveHeadList(&pRangeList
->ListHead
);
2284 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2285 HeapFree(GetProcessHeap(), 0, pRange
);
2288 /* Unlock the range list */
2289 ReleaseMutex(pRangeList
->hMutex
);
2291 /* Close the mutex */
2292 CloseHandle(pRangeList
->hMutex
);
2294 /* Free the range list */
2295 HeapFree(GetProcessHeap(), 0, pRangeList
);
2301 /***********************************************************************
2302 * CM_Free_Res_Des [SETUPAPI.@]
2307 _Out_ PRES_DES prdResDes
,
2308 _In_ RES_DES rdResDes
,
2311 TRACE("CM_Free_Res_Des(%p %p %lx)\n",
2312 prdResDes
, rdResDes
, ulFlags
);
2314 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
2318 /***********************************************************************
2319 * CM_Free_Res_Des_Ex [SETUPAPI.@]
2324 _Out_ PRES_DES prdResDes
,
2325 _In_ RES_DES rdResDes
,
2327 _In_opt_ HMACHINE hMachine
)
2329 FIXME("CM_Free_Res_Des_Ex(%p %p %lx %p)\n",
2330 prdResDes
, rdResDes
, ulFlags
, hMachine
);
2332 return CR_CALL_NOT_IMPLEMENTED
;
2336 /***********************************************************************
2337 * CM_Free_Res_Des_Handle [SETUPAPI.@]
2341 CM_Free_Res_Des_Handle(
2342 _In_ RES_DES rdResDes
)
2344 FIXME("CM_Free_Res_Des_Handle(%p)\n", rdResDes
);
2346 return CR_CALL_NOT_IMPLEMENTED
;
2350 /***********************************************************************
2351 * CM_Free_Resource_Conflict_Handle [SETUPAPI.@]
2355 CM_Free_Resource_Conflict_Handle(
2356 _In_ CONFLICT_LIST clConflictList
)
2358 PCONFLICT_DATA pConflictData
;
2360 FIXME("CM_Free_Resource_Conflict_Handle(%p)\n",
2363 pConflictData
= (PCONFLICT_DATA
)clConflictList
;
2364 if (!IsValidConflictData(pConflictData
))
2365 return CR_INVALID_CONFLICT_LIST
;
2367 if (pConflictData
->pConflictList
!= NULL
)
2368 MyFree(pConflictData
->pConflictList
);
2370 MyFree(pConflictData
);
2376 /***********************************************************************
2377 * CM_Get_Child [SETUPAPI.@]
2382 _Out_ PDEVINST pdnDevInst
,
2383 _In_ DEVINST dnDevInst
,
2386 TRACE("CM_Get_Child(%p %p %lx)\n",
2387 pdnDevInst
, dnDevInst
, ulFlags
);
2389 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2393 /***********************************************************************
2394 * CM_Get_Child_Ex [SETUPAPI.@]
2399 _Out_ PDEVINST pdnDevInst
,
2400 _In_ DEVINST dnDevInst
,
2402 _In_opt_ HMACHINE hMachine
)
2404 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2405 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2406 HSTRING_TABLE StringTable
= NULL
;
2408 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
2411 TRACE("CM_Get_Child_Ex(%p %lx %lx %p)\n",
2412 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2414 if (pdnDevInst
== NULL
)
2415 return CR_INVALID_POINTER
;
2418 return CR_INVALID_DEVINST
;
2421 return CR_INVALID_FLAG
;
2425 if (hMachine
!= NULL
)
2427 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2428 if (BindingHandle
== NULL
)
2431 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2432 if (StringTable
== 0)
2437 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2441 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2442 if (lpDevInst
== NULL
)
2443 return CR_INVALID_DEVNODE
;
2447 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2448 PNP_GET_CHILD_DEVICE_INSTANCE
,
2454 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2456 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2460 if (ret
!= CR_SUCCESS
)
2463 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2465 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
2469 *pdnDevInst
= dwIndex
;
2475 /***********************************************************************
2476 * CM_Get_Class_Key_NameA [SETUPAPI.@]
2480 CM_Get_Class_Key_NameA(
2481 _In_ LPGUID ClassGuid
,
2482 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2483 _Inout_ PULONG pulLength
,
2486 TRACE("CM_Get_Class_Key_NameA(%p %p %p %lx)\n",
2487 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2489 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
2494 /***********************************************************************
2495 * CM_Get_Class_Key_NameW [SETUPAPI.@]
2499 CM_Get_Class_Key_NameW(
2500 _In_ LPGUID ClassGuid
,
2501 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2502 _Inout_ PULONG pulLength
,
2505 TRACE("CM_Get_Class_Key_NameW(%p %p %p %lx)\n",
2506 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2508 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
2513 /***********************************************************************
2514 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
2518 CM_Get_Class_Key_Name_ExA(
2519 _In_ LPGUID ClassGuid
,
2520 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2521 _Inout_ PULONG pulLength
,
2523 _In_opt_ HMACHINE hMachine
)
2525 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
2526 CONFIGRET ret
= CR_SUCCESS
;
2530 TRACE("CM_Get_Class_Key_Name_ExA(%p %p %p %lx %p)\n",
2531 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2533 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2534 return CR_INVALID_POINTER
;
2536 ulOrigLength
= *pulLength
;
2539 ulLength
= MAX_GUID_STRING_LEN
;
2540 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2542 if (ret
== CR_SUCCESS
)
2544 if (WideCharToMultiByte(CP_ACP
,
2554 *pulLength
= lstrlenA(pszKeyName
) + 1;
2561 /***********************************************************************
2562 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
2566 CM_Get_Class_Key_Name_ExW(
2567 _In_ LPGUID ClassGuid
,
2568 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2569 _Inout_ PULONG pulLength
,
2571 _In_opt_ HMACHINE hMachine
)
2573 TRACE("CM_Get_Class_Key_Name_ExW(%p %p %p %lx %p)\n",
2574 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2576 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2577 return CR_INVALID_POINTER
;
2580 return CR_INVALID_FLAG
;
2582 if (*pulLength
< MAX_GUID_STRING_LEN
)
2585 return CR_BUFFER_SMALL
;
2588 if (!GuidToString(ClassGuid
, pszKeyName
))
2589 return CR_INVALID_DATA
;
2591 *pulLength
= MAX_GUID_STRING_LEN
;
2597 /***********************************************************************
2598 * CM_Get_Class_NameA [SETUPAPI.@]
2603 _In_ LPGUID ClassGuid
,
2604 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2605 _Inout_ PULONG pulLength
,
2608 TRACE("CM_Get_Class_NameA(%p %p %p %lx)\n",
2609 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2611 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2616 /***********************************************************************
2617 * CM_Get_Class_NameW [SETUPAPI.@]
2622 _In_ LPGUID ClassGuid
,
2623 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2624 _Inout_ PULONG pulLength
,
2627 TRACE("CM_Get_Class_NameW(%p %p %p %lx)\n",
2628 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2630 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2635 /***********************************************************************
2636 * CM_Get_Class_Name_ExA [SETUPAPI.@]
2640 CM_Get_Class_Name_ExA(
2641 _In_ LPGUID ClassGuid
,
2642 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2643 _Inout_ PULONG pulLength
,
2645 _In_opt_ HMACHINE hMachine
)
2647 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
2648 CONFIGRET ret
= CR_SUCCESS
;
2652 TRACE("CM_Get_Class_Name_ExA(%p %p %p %lx %p)\n",
2653 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2655 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2656 return CR_INVALID_POINTER
;
2658 ulOrigLength
= *pulLength
;
2661 ulLength
= MAX_CLASS_NAME_LEN
;
2662 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2664 if (ret
== CR_SUCCESS
)
2666 if (WideCharToMultiByte(CP_ACP
,
2676 *pulLength
= lstrlenA(Buffer
) + 1;
2683 /***********************************************************************
2684 * CM_Get_Class_Name_ExW [SETUPAPI.@]
2688 CM_Get_Class_Name_ExW(
2689 _In_ LPGUID ClassGuid
,
2690 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2691 _Inout_ PULONG pulLength
,
2693 _In_opt_ HMACHINE hMachine
)
2695 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
2696 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2699 TRACE("CM_Get_Class_Name_ExW(%p %p %p %lx %p\n",
2700 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2702 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2703 return CR_INVALID_POINTER
;
2706 return CR_INVALID_FLAG
;
2708 if (!GuidToString(ClassGuid
, szGuidString
))
2709 return CR_INVALID_DATA
;
2711 TRACE("Guid %s\n", debugstr_w(szGuidString
));
2713 if (hMachine
!= NULL
)
2715 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2716 if (BindingHandle
== NULL
)
2721 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2727 ret
= PNP_GetClassName(BindingHandle
,
2733 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2735 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2743 /***********************************************************************
2744 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
2748 CM_Get_Class_Registry_PropertyA(
2751 PULONG pulRegDataType
,
2757 PWSTR BufferW
= NULL
;
2762 TRACE("CM_Get_Class_Registry_PropertyA(%p %lu %p %p %p %lx %p)\n",
2763 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2766 if (pulLength
== NULL
)
2767 return CR_INVALID_POINTER
;
2769 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2770 return CR_INVALID_PROPERTY
;
2772 ulType
= GetRegistryPropertyType(ulProperty
);
2773 if (ulType
== REG_SZ
|| ulType
== REG_MULTI_SZ
)
2775 /* Get the required buffer size */
2776 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2777 NULL
, &ulLength
, ulFlags
, hMachine
);
2778 if (ret
!= CR_BUFFER_SMALL
)
2781 /* Allocate the unicode buffer */
2782 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLength
);
2783 if (BufferW
== NULL
)
2784 return CR_OUT_OF_MEMORY
;
2786 /* Get the property */
2787 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2788 BufferW
, &ulLength
, ulFlags
, hMachine
);
2789 if (ret
!= CR_SUCCESS
)
2791 HeapFree(GetProcessHeap(), 0, BufferW
);
2795 /* Do W->A conversion */
2796 *pulLength
= WideCharToMultiByte(CP_ACP
,
2799 lstrlenW(BufferW
) + 1,
2805 /* Release the unicode buffer */
2806 HeapFree(GetProcessHeap(), 0, BufferW
);
2808 if (*pulLength
== 0)
2813 /* Get the property */
2814 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2815 Buffer
, pulLength
, ulFlags
, hMachine
);
2822 /***********************************************************************
2823 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
2827 CM_Get_Class_Registry_PropertyW(
2830 PULONG pulRegDataType
,
2836 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2837 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
2839 ULONG ulTransferLength
= 0;
2842 TRACE("CM_Get_Class_Registry_PropertyW(%p %lu %p %p %p %lx %p)\n",
2843 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2846 if (ClassGuid
== NULL
|| pulLength
== NULL
)
2847 return CR_INVALID_POINTER
;
2850 return CR_INVALID_FLAG
;
2852 if (pSetupStringFromGuid(ClassGuid
,
2854 PNP_MAX_GUID_STRING_LEN
) != 0)
2855 return CR_INVALID_DATA
;
2857 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2858 return CR_INVALID_PROPERTY
;
2860 if (hMachine
!= NULL
)
2862 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2863 if (BindingHandle
== NULL
)
2868 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2872 ulTransferLength
= *pulLength
;
2876 ret
= PNP_GetClassRegProp(BindingHandle
,
2885 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2887 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2891 if (ret
== CR_SUCCESS
)
2893 if (pulRegDataType
!= NULL
)
2894 *pulRegDataType
= ulType
;
2901 /***********************************************************************
2902 * CM_Get_Depth [SETUPAPI.@]
2907 _Out_ PULONG pulDepth
,
2908 _In_ DEVINST dnDevInst
,
2911 TRACE("CM_Get_Depth(%p %lx %lx)\n",
2912 pulDepth
, dnDevInst
, ulFlags
);
2914 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
2918 /***********************************************************************
2919 * CM_Get_Depth_Ex [SETUPAPI.@]
2924 _Out_ PULONG pulDepth
,
2925 _In_ DEVINST dnDevInst
,
2927 _In_opt_ HMACHINE hMachine
)
2929 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2930 HSTRING_TABLE StringTable
= NULL
;
2934 TRACE("CM_Get_Depth_Ex(%p %lx %lx %p)\n",
2935 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
2937 if (pulDepth
== NULL
)
2938 return CR_INVALID_POINTER
;
2941 return CR_INVALID_DEVINST
;
2944 return CR_INVALID_FLAG
;
2946 if (hMachine
!= NULL
)
2948 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2949 if (BindingHandle
== NULL
)
2952 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2953 if (StringTable
== 0)
2958 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2962 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2963 if (lpDevInst
== NULL
)
2964 return CR_INVALID_DEVNODE
;
2968 ret
= PNP_GetDepth(BindingHandle
,
2973 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2975 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2983 /***********************************************************************
2984 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
2988 CM_Get_DevNode_Custom_PropertyA(
2989 _In_ DEVINST dnDevInst
,
2990 _In_ PCSTR pszCustomPropertyName
,
2991 _Out_opt_ PULONG pulRegDataType
,
2992 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
2993 _Inout_ PULONG pulLength
,
2996 TRACE("CM_Get_DevNode_Custom_PropertyA(%lx %s %p %p %p %lx)\n",
2997 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
2998 Buffer
, pulLength
, ulFlags
);
3000 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
3001 pulRegDataType
, Buffer
,
3002 pulLength
, ulFlags
, NULL
);
3006 /***********************************************************************
3007 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
3011 CM_Get_DevNode_Custom_PropertyW(
3012 _In_ DEVINST dnDevInst
,
3013 _In_ PCWSTR pszCustomPropertyName
,
3014 _Out_opt_ PULONG pulRegDataType
,
3015 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3016 _Inout_ PULONG pulLength
,
3019 TRACE("CM_Get_DevNode_Custom_PropertyW(%lx %s %p %p %p %lx)\n",
3020 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
3021 Buffer
, pulLength
, ulFlags
);
3023 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
3024 pulRegDataType
, Buffer
,
3025 pulLength
, ulFlags
, NULL
);
3029 /***********************************************************************
3030 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
3034 CM_Get_DevNode_Custom_Property_ExA(
3035 _In_ DEVINST dnDevInst
,
3036 _In_ PCSTR pszCustomPropertyName
,
3037 _Out_opt_ PULONG pulRegDataType
,
3038 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3039 _Inout_ PULONG pulLength
,
3041 _In_opt_ HMACHINE hMachine
)
3043 LPWSTR pszPropertyNameW
= NULL
;
3046 ULONG ulDataType
= REG_NONE
;
3049 TRACE("CM_Get_DevNode_Custom_Property_ExA(%lx %s %p %p %p %lx %p)\n",
3050 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
3051 Buffer
, pulLength
, ulFlags
, hMachine
);
3054 return CR_INVALID_POINTER
;
3056 ulLengthW
= *pulLength
* sizeof(WCHAR
);
3057 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
3059 return CR_OUT_OF_MEMORY
;
3061 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
3063 if (pszPropertyNameW
== NULL
)
3065 HeapFree(GetProcessHeap(), 0, BufferW
);
3066 return CR_OUT_OF_MEMORY
;
3069 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
3076 if (ret
== CR_SUCCESS
)
3078 if (ulDataType
== REG_SZ
||
3079 ulDataType
== REG_EXPAND_SZ
||
3080 ulDataType
== REG_MULTI_SZ
)
3082 /* Do W->A conversion */
3083 *pulLength
= WideCharToMultiByte(CP_ACP
,
3086 lstrlenW(BufferW
) + 1,
3091 if (*pulLength
== 0)
3096 /* Directly copy the value */
3097 if (ulLengthW
<= *pulLength
)
3098 memcpy(Buffer
, BufferW
, ulLengthW
);
3101 *pulLength
= ulLengthW
;
3102 ret
= CR_BUFFER_SMALL
;
3108 *pulRegDataType
= ulDataType
;
3110 HeapFree(GetProcessHeap(), 0, BufferW
);
3111 MyFree(pszPropertyNameW
);
3117 /***********************************************************************
3118 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
3122 CM_Get_DevNode_Custom_Property_ExW(
3123 _In_ DEVINST dnDevInst
,
3124 _In_ PCWSTR pszCustomPropertyName
,
3125 _Out_opt_ PULONG pulRegDataType
,
3126 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3127 _Inout_ PULONG pulLength
,
3129 _In_opt_ HMACHINE hMachine
)
3131 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3132 HSTRING_TABLE StringTable
= NULL
;
3134 ULONG ulDataType
= REG_NONE
;
3135 ULONG ulTransferLength
;
3136 CONFIGRET ret
= CR_SUCCESS
;
3138 TRACE("CM_Get_DevNode_Custom_Property_ExW(%lx %s %p %p %p %lx %p)\n",
3139 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
3140 Buffer
, pulLength
, ulFlags
, hMachine
);
3143 return CR_INVALID_DEVNODE
;
3145 if (pszCustomPropertyName
== NULL
||
3146 pulLength
== NULL
||
3148 return CR_INVALID_POINTER
;
3150 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
3151 return CR_INVALID_FLAG
;
3153 if (hMachine
!= NULL
)
3155 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3156 if (BindingHandle
== NULL
)
3159 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3160 if (StringTable
== 0)
3165 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3169 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3170 if (lpDevInst
== NULL
)
3171 return CR_INVALID_DEVNODE
;
3173 ulTransferLength
= *pulLength
;
3177 ret
= PNP_GetCustomDevProp(BindingHandle
,
3179 (LPWSTR
)pszCustomPropertyName
,
3186 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3188 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3192 if (ret
== CR_SUCCESS
)
3194 if (pulRegDataType
!= NULL
)
3195 *pulRegDataType
= ulDataType
;
3202 /***********************************************************************
3203 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
3207 CM_Get_DevNode_Registry_PropertyA(
3208 _In_ DEVINST dnDevInst
,
3209 _In_ ULONG ulProperty
,
3210 _Out_opt_ PULONG pulRegDataType
,
3211 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3212 _Inout_ PULONG pulLength
,
3215 TRACE("CM_Get_DevNode_Registry_PropertyA(%lx %lu %p %p %p %lx)\n",
3216 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3218 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
3219 pulRegDataType
, Buffer
,
3220 pulLength
, ulFlags
, NULL
);
3224 /***********************************************************************
3225 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
3229 CM_Get_DevNode_Registry_PropertyW(
3230 _In_ DEVINST dnDevInst
,
3231 _In_ ULONG ulProperty
,
3232 _Out_opt_ PULONG pulRegDataType
,
3233 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3234 _Inout_ PULONG pulLength
,
3237 TRACE("CM_Get_DevNode_Registry_PropertyW(%lx %lu %p %p %p %lx)\n",
3238 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3240 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
3241 pulRegDataType
, Buffer
,
3242 pulLength
, ulFlags
, NULL
);
3246 /***********************************************************************
3247 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
3251 CM_Get_DevNode_Registry_Property_ExA(
3252 _In_ DEVINST dnDevInst
,
3253 _In_ ULONG ulProperty
,
3254 _Out_opt_ PULONG pulRegDataType
,
3255 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3256 _Inout_ PULONG pulLength
,
3258 _In_opt_ HMACHINE hMachine
)
3262 ULONG ulDataType
= REG_NONE
;
3265 TRACE("CM_Get_DevNode_Registry_Property_ExA(%lx %lu %p %p %p %lx %p)\n",
3266 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3270 return CR_INVALID_POINTER
;
3272 LengthW
= *pulLength
* sizeof(WCHAR
);
3273 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
3276 return CR_OUT_OF_MEMORY
;
3278 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
3286 if (ret
== CR_SUCCESS
)
3288 if (ulDataType
== REG_SZ
||
3289 ulDataType
== REG_EXPAND_SZ
||
3290 ulDataType
== REG_MULTI_SZ
)
3292 /* Do W->A conversion */
3293 *pulLength
= WideCharToMultiByte(CP_ACP
,
3296 lstrlenW(BufferW
) + 1,
3301 if (*pulLength
== 0)
3306 /* Directly copy the value */
3307 if (LengthW
<= *pulLength
)
3308 memcpy(Buffer
, BufferW
, LengthW
);
3311 *pulLength
= LengthW
;
3312 ret
= CR_BUFFER_SMALL
;
3318 *pulRegDataType
= ulDataType
;
3320 HeapFree(GetProcessHeap(), 0, BufferW
);
3326 /***********************************************************************
3327 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
3331 CM_Get_DevNode_Registry_Property_ExW(
3332 _In_ DEVINST dnDevInst
,
3333 _In_ ULONG ulProperty
,
3334 _Out_opt_ PULONG pulRegDataType
,
3335 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3336 _Inout_ PULONG pulLength
,
3338 _In_opt_ HMACHINE hMachine
)
3340 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3341 HSTRING_TABLE StringTable
= NULL
;
3342 CONFIGRET ret
= CR_SUCCESS
;
3344 ULONG ulDataType
= REG_NONE
;
3345 ULONG ulTransferLength
= 0;
3347 TRACE("CM_Get_DevNode_Registry_Property_ExW(%lx %lu %p %p %p %lx %p)\n",
3348 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3352 return CR_INVALID_DEVNODE
;
3354 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
3355 return CR_INVALID_PROPERTY
;
3357 /* pulRegDataType is optional */
3359 /* Buffer is optional */
3361 if (pulLength
== NULL
)
3362 return CR_INVALID_POINTER
;
3364 if (*pulLength
== 0)
3365 return CR_INVALID_POINTER
;
3368 return CR_INVALID_FLAG
;
3370 if (hMachine
!= NULL
)
3372 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3373 if (BindingHandle
== NULL
)
3376 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3377 if (StringTable
== 0)
3382 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3386 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3387 if (lpDevInst
== NULL
)
3388 return CR_INVALID_DEVNODE
;
3390 ulTransferLength
= *pulLength
;
3394 ret
= PNP_GetDeviceRegProp(BindingHandle
,
3403 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3405 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3409 if (ret
== CR_SUCCESS
)
3411 if (pulRegDataType
!= NULL
)
3412 *pulRegDataType
= ulDataType
;
3419 /***********************************************************************
3420 * CM_Get_DevNode_Status [SETUPAPI.@]
3424 CM_Get_DevNode_Status(
3425 _Out_ PULONG pulStatus
,
3426 _Out_ PULONG pulProblemNumber
,
3427 _In_ DEVINST dnDevInst
,
3430 TRACE("CM_Get_DevNode_Status(%p %p %lx %lx)\n",
3431 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
3433 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
3438 /***********************************************************************
3439 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
3443 CM_Get_DevNode_Status_Ex(
3444 _Out_ PULONG pulStatus
,
3445 _Out_ PULONG pulProblemNumber
,
3446 _In_ DEVINST dnDevInst
,
3448 _In_opt_ HMACHINE hMachine
)
3450 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3451 HSTRING_TABLE StringTable
= NULL
;
3455 TRACE("CM_Get_DevNode_Status_Ex(%p %p %lx %lx %p)\n",
3456 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
3458 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
3459 return CR_INVALID_POINTER
;
3462 return CR_INVALID_DEVINST
;
3465 return CR_INVALID_FLAG
;
3467 if (hMachine
!= NULL
)
3469 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3470 if (BindingHandle
== NULL
)
3473 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3474 if (StringTable
== 0)
3479 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3483 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3484 if (lpDevInst
== NULL
)
3485 return CR_INVALID_DEVNODE
;
3489 ret
= PNP_GetDeviceStatus(BindingHandle
,
3495 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3497 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3505 /***********************************************************************
3506 * CM_Get_Device_IDA [SETUPAPI.@]
3511 _In_ DEVINST dnDevInst
,
3512 _Out_writes_(BufferLen
) PCHAR Buffer
,
3513 _In_ ULONG BufferLen
,
3516 TRACE("CM_Get_Device_IDA(%lx %p %lu %lx)\n",
3517 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3519 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3523 /***********************************************************************
3524 * CM_Get_Device_IDW [SETUPAPI.@]
3529 _In_ DEVINST dnDevInst
,
3530 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3531 _In_ ULONG BufferLen
,
3534 TRACE("CM_Get_Device_IDW(%lx %p %lu %lx)\n",
3535 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3537 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3541 /***********************************************************************
3542 * CM_Get_Device_ID_ExA [SETUPAPI.@]
3546 CM_Get_Device_ID_ExA(
3547 _In_ DEVINST dnDevInst
,
3548 _Out_writes_(BufferLen
) PCHAR Buffer
,
3549 _In_ ULONG BufferLen
,
3551 _In_opt_ HMACHINE hMachine
)
3553 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
3554 CONFIGRET ret
= CR_SUCCESS
;
3556 TRACE("CM_Get_Device_ID_ExA(%lx %p %lu %lx %p)\n",
3557 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3560 return CR_INVALID_POINTER
;
3562 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
3567 if (ret
== CR_SUCCESS
)
3569 if (WideCharToMultiByte(CP_ACP
,
3572 lstrlenW(szBufferW
) + 1,
3584 /***********************************************************************
3585 * CM_Get_Device_ID_ExW [SETUPAPI.@]
3589 CM_Get_Device_ID_ExW(
3590 _In_ DEVINST dnDevInst
,
3591 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3592 _In_ ULONG BufferLen
,
3594 _In_opt_ HMACHINE hMachine
)
3596 HSTRING_TABLE StringTable
= NULL
;
3598 TRACE("CM_Get_Device_ID_ExW(%lx %p %lu %lx %p)\n",
3599 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3602 return CR_INVALID_DEVINST
;
3605 return CR_INVALID_POINTER
;
3608 return CR_INVALID_FLAG
;
3610 if (hMachine
!= NULL
)
3612 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3613 if (StringTable
== NULL
)
3618 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3622 if (!pSetupStringTableStringFromIdEx(StringTable
,
3632 /***********************************************************************
3633 * CM_Get_Device_ID_ListA [SETUPAPI.@]
3637 CM_Get_Device_ID_ListA(
3638 _In_ PCSTR pszFilter
,
3639 _Out_writes_(BufferLen
) PCHAR Buffer
,
3640 _In_ ULONG BufferLen
,
3643 TRACE("CM_Get_Device_ID_ListA(%p %p %lu %lx)\n",
3644 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3646 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
3651 /***********************************************************************
3652 * CM_Get_Device_ID_ListW [SETUPAPI.@]
3656 CM_Get_Device_ID_ListW(
3657 _In_ PCWSTR pszFilter
,
3658 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3659 _In_ ULONG BufferLen
,
3662 TRACE("CM_Get_Device_ID_ListW(%p %p %lu %lx)\n",
3663 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3665 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
3670 /***********************************************************************
3671 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
3675 CM_Get_Device_ID_List_ExA(
3676 _In_ PCSTR pszFilter
,
3677 _Out_writes_(BufferLen
) PCHAR Buffer
,
3678 _In_ ULONG BufferLen
,
3680 _In_opt_ HMACHINE hMachine
)
3682 LPWSTR BufferW
= NULL
;
3683 LPWSTR pszFilterW
= NULL
;
3684 CONFIGRET ret
= CR_SUCCESS
;
3686 TRACE("CM_Get_Device_ID_List_ExA(%p %p %lu %lx %p)\n",
3687 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3689 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
3690 if (BufferW
== NULL
)
3691 return CR_OUT_OF_MEMORY
;
3693 if (pszFilter
== NULL
)
3695 ret
= CM_Get_Device_ID_List_ExW(NULL
,
3703 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3705 ret
= CR_INVALID_DEVICE_ID
;
3709 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
3718 if (WideCharToMultiByte(CP_ACP
,
3721 lstrlenW(BufferW
) + 1,
3735 /***********************************************************************
3736 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
3740 CM_Get_Device_ID_List_ExW(
3741 _In_ PCWSTR pszFilter
,
3742 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3743 _In_ ULONG BufferLen
,
3745 _In_opt_ HMACHINE hMachine
)
3747 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3750 TRACE("CM_Get_Device_ID_List_ExW(%p %p %lu %lx %p)\n",
3751 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3753 if (Buffer
== NULL
|| BufferLen
== 0)
3754 return CR_INVALID_POINTER
;
3756 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3757 return CR_INVALID_FLAG
;
3759 if (hMachine
!= NULL
)
3761 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3762 if (BindingHandle
== NULL
)
3767 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3775 ret
= PNP_GetDeviceList(BindingHandle
,
3781 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3783 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3791 /***********************************************************************
3792 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
3796 CM_Get_Device_ID_List_SizeA(
3797 _Out_ PULONG pulLen
,
3798 _In_opt_ PCSTR pszFilter
,
3801 TRACE("CM_Get_Device_ID_List_SizeA(%p %s %lx)\n",
3802 pulLen
, debugstr_a(pszFilter
), ulFlags
);
3804 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
3808 /***********************************************************************
3809 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
3813 CM_Get_Device_ID_List_SizeW(
3814 _Out_ PULONG pulLen
,
3815 _In_opt_ PCWSTR pszFilter
,
3818 TRACE("CM_Get_Device_ID_List_SizeW(%p %s %lx)\n",
3819 pulLen
, debugstr_w(pszFilter
), ulFlags
);
3821 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
3825 /***********************************************************************
3826 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
3830 CM_Get_Device_ID_List_Size_ExA(
3831 _Out_ PULONG pulLen
,
3832 _In_opt_ PCSTR pszFilter
,
3834 _In_opt_ HMACHINE hMachine
)
3836 LPWSTR pszFilterW
= NULL
;
3837 CONFIGRET ret
= CR_SUCCESS
;
3839 FIXME("CM_Get_Device_ID_List_Size_ExA(%p %s %lx %p)\n",
3840 pulLen
, debugstr_a(pszFilter
), ulFlags
, hMachine
);
3842 if (pszFilter
== NULL
)
3844 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3851 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3852 return CR_INVALID_DEVICE_ID
;
3854 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3866 /***********************************************************************
3867 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
3871 CM_Get_Device_ID_List_Size_ExW(
3872 _Out_ PULONG pulLen
,
3873 _In_opt_ PCWSTR pszFilter
,
3875 _In_opt_ HMACHINE hMachine
)
3877 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3880 FIXME("CM_Get_Device_ID_List_Size_ExW(%p %s %lx %p)\n",
3881 pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
3884 return CR_INVALID_POINTER
;
3886 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3887 return CR_INVALID_FLAG
;
3889 if (hMachine
!= NULL
)
3891 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3892 if (BindingHandle
== NULL
)
3897 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3905 ret
= PNP_GetDeviceListSize(BindingHandle
,
3910 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3912 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3920 /***********************************************************************
3921 * CM_Get_Device_ID_Size [SETUPAPI.@]
3925 CM_Get_Device_ID_Size(
3926 _Out_ PULONG pulLen
,
3927 _In_ DEVINST dnDevInst
,
3930 TRACE("CM_Get_Device_ID_Size(%p %lx %lx)\n",
3931 pulLen
, dnDevInst
, ulFlags
);
3933 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
3937 /***********************************************************************
3938 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
3942 CM_Get_Device_ID_Size_Ex(
3943 _Out_ PULONG pulLen
,
3944 _In_ DEVINST dnDevInst
,
3946 _In_opt_ HMACHINE hMachine
)
3948 HSTRING_TABLE StringTable
= NULL
;
3951 TRACE("CM_Get_Device_ID_Size_Ex(%p %lx %lx %p)\n",
3952 pulLen
, dnDevInst
, ulFlags
, hMachine
);
3955 return CR_INVALID_POINTER
;
3958 return CR_INVALID_DEVINST
;
3961 return CR_INVALID_FLAG
;
3963 if (hMachine
!= NULL
)
3965 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3966 if (StringTable
== NULL
)
3971 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3975 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3976 if (DeviceId
== NULL
)
3982 *pulLen
= lstrlenW(DeviceId
);
3988 /***********************************************************************
3989 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
3993 CM_Get_Device_Interface_AliasA(
3994 _In_ LPCSTR pszDeviceInterface
,
3995 _In_ LPGUID AliasInterfaceGuid
,
3996 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
3997 _Inout_ PULONG pulLength
,
4000 TRACE("CM_Get_Device_Interface_AliasA(%p %p %p %p %lx)\n",
4001 pszDeviceInterface
, AliasInterfaceGuid
,
4002 pszAliasDeviceInterface
, pulLength
, ulFlags
);
4004 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
4005 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
4010 /***********************************************************************
4011 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
4015 CM_Get_Device_Interface_AliasW(
4016 _In_ LPCWSTR pszDeviceInterface
,
4017 _In_ LPGUID AliasInterfaceGuid
,
4018 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
4019 _Inout_ PULONG pulLength
,
4022 TRACE("CM_Get_Device_Interface_AliasW(%p %p %p %p %lx)\n",
4023 pszDeviceInterface
, AliasInterfaceGuid
,
4024 pszAliasDeviceInterface
, pulLength
, ulFlags
);
4026 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
4027 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
4032 /***********************************************************************
4033 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
4037 CM_Get_Device_Interface_Alias_ExA(
4038 _In_ LPCSTR pszDeviceInterface
,
4039 _In_ LPGUID AliasInterfaceGuid
,
4040 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
4041 _Inout_ PULONG pulLength
,
4043 _In_opt_ HMACHINE hMachine
)
4045 FIXME("CM_Get_Device_Interface_Alias_ExA(%p %p %p %p %lx %p)\n",
4046 pszDeviceInterface
, AliasInterfaceGuid
,
4047 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4049 return CR_CALL_NOT_IMPLEMENTED
;
4053 /***********************************************************************
4054 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
4058 CM_Get_Device_Interface_Alias_ExW(
4059 _In_ LPCWSTR pszDeviceInterface
,
4060 _In_ LPGUID AliasInterfaceGuid
,
4061 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
4062 _Inout_ PULONG pulLength
,
4064 _In_opt_ HMACHINE hMachine
)
4066 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4067 ULONG ulTransferLength
;
4068 CONFIGRET ret
= CR_SUCCESS
;
4070 TRACE("CM_Get_Device_Interface_Alias_ExW(%p %p %p %p %lx %p)\n",
4071 pszDeviceInterface
, AliasInterfaceGuid
,
4072 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4074 if (pszDeviceInterface
== NULL
||
4075 AliasInterfaceGuid
== NULL
||
4076 pszAliasDeviceInterface
== NULL
||
4078 return CR_INVALID_POINTER
;
4081 return CR_INVALID_FLAG
;
4083 if (hMachine
!= NULL
)
4085 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4086 if (BindingHandle
== NULL
)
4091 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4095 ulTransferLength
= *pulLength
;
4099 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
4100 (LPWSTR
)pszDeviceInterface
,
4102 pszAliasDeviceInterface
,
4107 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4109 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4117 /***********************************************************************
4118 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
4122 CM_Get_Device_Interface_ListA(
4123 _In_ LPGUID InterfaceClassGuid
,
4124 _In_opt_ DEVINSTID_A pDeviceID
,
4125 _Out_writes_(BufferLen
) PCHAR Buffer
,
4126 _In_ ULONG BufferLen
,
4129 TRACE("CM_Get_Device_Interface_ListA(%s %s %p %lu 0x%08lx)\n",
4130 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4131 Buffer
, BufferLen
, ulFlags
);
4133 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
4134 Buffer
, BufferLen
, ulFlags
, NULL
);
4138 /***********************************************************************
4139 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
4143 CM_Get_Device_Interface_ListW(
4144 _In_ LPGUID InterfaceClassGuid
,
4145 _In_opt_ DEVINSTID_W pDeviceID
,
4146 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4147 _In_ ULONG BufferLen
,
4150 TRACE("CM_Get_Device_Interface_ListW(%s %s %p %lu 0x%08lx)\n",
4151 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4152 Buffer
, BufferLen
, ulFlags
);
4154 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
4155 Buffer
, BufferLen
, ulFlags
, NULL
);
4159 /***********************************************************************
4160 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
4164 CM_Get_Device_Interface_List_ExA(
4165 _In_ LPGUID InterfaceClassGuid
,
4166 _In_opt_ DEVINSTID_A pDeviceID
,
4167 _Out_writes_(BufferLen
) PCHAR Buffer
,
4168 _In_ ULONG BufferLen
,
4170 _In_opt_ HMACHINE hMachine
)
4172 DEVINSTID_W pDeviceIdW
= NULL
;
4173 PWCHAR BufferW
= NULL
;
4174 CONFIGRET ret
= CR_SUCCESS
;
4176 TRACE("CM_Get_Device_Interface_List_ExA(%s %s %p %lu 0x%08lx %p)\n",
4177 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4178 Buffer
, BufferLen
, ulFlags
, hMachine
);
4180 if (Buffer
== NULL
||
4182 return CR_INVALID_POINTER
;
4184 if (pDeviceID
!= NULL
)
4186 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4187 return CR_INVALID_DEVICE_ID
;
4190 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
4191 if (BufferW
== NULL
)
4193 ret
= CR_OUT_OF_MEMORY
;
4197 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
4198 BufferW
, BufferLen
, ulFlags
,
4200 if (ret
!= CR_SUCCESS
)
4203 if (WideCharToMultiByte(CP_ACP
,
4206 lstrlenW(BufferW
) + 1,
4214 if (BufferW
!= NULL
)
4217 if (pDeviceIdW
!= NULL
)
4224 /***********************************************************************
4225 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
4229 CM_Get_Device_Interface_List_ExW(
4230 _In_ LPGUID InterfaceClassGuid
,
4231 _In_opt_ DEVINSTID_W pDeviceID
,
4232 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4233 _In_ ULONG BufferLen
,
4235 _In_opt_ HMACHINE hMachine
)
4237 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4238 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
4239 CONFIGRET ret
= CR_SUCCESS
;
4241 TRACE("CM_Get_Device_Interface_List_ExW(%s %s %p %lu 0x%08lx %p)\n",
4242 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4243 Buffer
, BufferLen
, ulFlags
, hMachine
);
4245 if (Buffer
== NULL
||
4247 return CR_INVALID_POINTER
;
4249 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4250 return CR_INVALID_FLAG
;
4252 if (hMachine
!= NULL
)
4254 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4255 if (BindingHandle
== NULL
)
4260 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4265 BufferSize
= BufferLen
;
4269 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
4276 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4278 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4286 /***********************************************************************
4287 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
4291 CM_Get_Device_Interface_List_SizeA(
4292 _Out_ PULONG pulLen
,
4293 _In_ LPGUID InterfaceClassGuid
,
4294 _In_opt_ DEVINSTID_A pDeviceID
,
4297 TRACE("CM_Get_Device_Interface_List_SizeA(%p %p %s 0x%08lx)\n",
4298 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
);
4300 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
4301 pDeviceID
, ulFlags
, NULL
);
4305 /***********************************************************************
4306 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
4310 CM_Get_Device_Interface_List_SizeW(
4311 _Out_ PULONG pulLen
,
4312 _In_ LPGUID InterfaceClassGuid
,
4313 _In_opt_ DEVINSTID_W pDeviceID
,
4316 TRACE("CM_Get_Device_Interface_List_SizeW(%p %p %s 0x%08lx)\n",
4317 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
);
4319 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4320 pDeviceID
, ulFlags
, NULL
);
4324 /***********************************************************************
4325 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
4329 CM_Get_Device_Interface_List_Size_ExA(
4330 _Out_ PULONG pulLen
,
4331 _In_ LPGUID InterfaceClassGuid
,
4332 _In_opt_ DEVINSTID_A pDeviceID
,
4334 _In_opt_ HMACHINE hMachine
)
4336 DEVINSTID_W pDeviceIdW
= NULL
;
4337 CONFIGRET ret
= CR_SUCCESS
;
4339 TRACE("CM_Get_Device_Interface_List_Size_ExA(%p %p %s 0x%08lx %p)\n",
4340 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
4343 return CR_INVALID_POINTER
;
4345 if (pDeviceID
!= NULL
)
4347 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4348 return CR_INVALID_DEVICE_ID
;
4353 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4354 pDeviceIdW
, ulFlags
, hMachine
);
4356 if (pDeviceIdW
!= NULL
)
4363 /***********************************************************************
4364 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
4368 CM_Get_Device_Interface_List_Size_ExW(
4369 _Out_ PULONG pulLen
,
4370 _In_ LPGUID InterfaceClassGuid
,
4371 _In_opt_ DEVINSTID_W pDeviceID
,
4373 _In_opt_ HMACHINE hMachine
)
4375 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4376 CONFIGRET ret
= CR_SUCCESS
;
4378 TRACE("CM_Get_Device_Interface_List_Size_ExW(%p %p %s 0x%08lx %p)\n",
4379 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
4382 return CR_INVALID_POINTER
;
4384 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4385 return CR_INVALID_FLAG
;
4387 if (hMachine
!= NULL
)
4389 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4390 if (BindingHandle
== NULL
)
4395 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4403 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
4409 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4411 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4419 /***********************************************************************
4420 * CM_Get_First_Log_Conf [SETUPAPI.@]
4424 CM_Get_First_Log_Conf(
4425 _Out_opt_ PLOG_CONF plcLogConf
,
4426 _In_ DEVINST dnDevInst
,
4429 TRACE("CM_Get_First_Log_Conf(%p %lx %lx)\n",
4430 plcLogConf
, dnDevInst
, ulFlags
);
4432 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
4436 /***********************************************************************
4437 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
4441 CM_Get_First_Log_Conf_Ex(
4442 _Out_opt_ PLOG_CONF plcLogConf
,
4443 _In_ DEVINST dnDevInst
,
4445 _In_opt_ HMACHINE hMachine
)
4447 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4448 HSTRING_TABLE StringTable
= NULL
;
4449 LPWSTR lpDevInst
= NULL
;
4450 CONFIGRET ret
= CR_SUCCESS
;
4452 PLOG_CONF_INFO pLogConfInfo
;
4454 FIXME("CM_Get_First_Log_Conf_Ex(%p %lx %lx %p)\n",
4455 plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
4458 return CR_INVALID_DEVINST
;
4460 if (ulFlags
& ~LOG_CONF_BITS
)
4461 return CR_INVALID_FLAG
;
4466 if (hMachine
!= NULL
)
4468 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4469 if (BindingHandle
== NULL
)
4472 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4473 if (StringTable
== 0)
4478 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4482 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4483 if (lpDevInst
== NULL
)
4484 return CR_INVALID_DEVNODE
;
4488 ret
= PNP_GetFirstLogConf(BindingHandle
,
4494 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4496 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4500 if (ret
!= CR_SUCCESS
)
4505 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4506 if (pLogConfInfo
== NULL
)
4507 return CR_OUT_OF_MEMORY
;
4509 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4510 pLogConfInfo
->dnDevInst
= dnDevInst
;
4511 pLogConfInfo
->ulFlags
= ulFlags
;
4512 pLogConfInfo
->ulTag
= ulTag
;
4514 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
4521 /***********************************************************************
4522 * CM_Get_Global_State [SETUPAPI.@]
4526 CM_Get_Global_State(
4527 _Out_ PULONG pulState
,
4530 TRACE("CM_Get_Global_State(%p %lx)\n",
4533 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
4537 /***********************************************************************
4538 * CM_Get_Global_State_Ex [SETUPAPI.@]
4542 CM_Get_Global_State_Ex(
4543 _Out_ PULONG pulState
,
4545 _In_opt_ HMACHINE hMachine
)
4547 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4550 TRACE("CM_Get_Global_State_Ex(%p %lx %p)\n",
4551 pulState
, ulFlags
, hMachine
);
4553 if (pulState
== NULL
)
4554 return CR_INVALID_POINTER
;
4557 return CR_INVALID_FLAG
;
4559 if (hMachine
!= NULL
)
4561 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4562 if (BindingHandle
== NULL
)
4567 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4573 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
4575 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4577 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4585 /***********************************************************************
4586 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
4590 CM_Get_HW_Prof_FlagsA(
4591 _In_ DEVINSTID_A szDevInstName
,
4592 _In_ ULONG ulHardwareProfile
,
4593 _Out_ PULONG pulValue
,
4596 TRACE("CM_Get_HW_Prof_FlagsA(%s %lu %p %lx)\n",
4597 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4599 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
4600 pulValue
, ulFlags
, NULL
);
4604 /***********************************************************************
4605 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
4609 CM_Get_HW_Prof_FlagsW(
4610 _In_ DEVINSTID_W szDevInstName
,
4611 _In_ ULONG ulHardwareProfile
,
4612 _Out_ PULONG pulValue
,
4615 TRACE("CM_Get_HW_Prof_FlagsW(%s %lu %p %lx)\n",
4616 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4618 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
4619 pulValue
, ulFlags
, NULL
);
4623 /***********************************************************************
4624 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
4628 CM_Get_HW_Prof_Flags_ExA(
4629 _In_ DEVINSTID_A szDevInstName
,
4630 _In_ ULONG ulHardwareProfile
,
4631 _Out_ PULONG pulValue
,
4633 _In_opt_ HMACHINE hMachine
)
4635 DEVINSTID_W pszDevIdW
= NULL
;
4636 CONFIGRET ret
= CR_SUCCESS
;
4638 TRACE("CM_Get_HW_Prof_Flags_ExA(%s %lu %p %lx %p)\n",
4639 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4641 if (szDevInstName
!= NULL
)
4643 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
4644 return CR_INVALID_DEVICE_ID
;
4647 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
4648 pulValue
, ulFlags
, hMachine
);
4650 if (pszDevIdW
!= NULL
)
4657 /***********************************************************************
4658 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
4662 CM_Get_HW_Prof_Flags_ExW(
4663 _In_ DEVINSTID_W szDevInstName
,
4664 _In_ ULONG ulHardwareProfile
,
4665 _Out_ PULONG pulValue
,
4667 _In_opt_ HMACHINE hMachine
)
4669 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4672 FIXME("CM_Get_HW_Prof_Flags_ExW(%s %lu %p %lx %p)\n",
4673 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4675 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
4676 return CR_INVALID_POINTER
;
4679 return CR_INVALID_FLAG
;
4681 /* FIXME: Check whether szDevInstName is valid */
4683 if (hMachine
!= NULL
)
4685 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4686 if (BindingHandle
== NULL
)
4691 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4697 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
4698 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
4700 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4702 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4710 /***********************************************************************
4711 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
4715 CM_Get_Hardware_Profile_InfoA(
4717 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4720 TRACE("CM_Get_Hardware_Profile_InfoA(%lu %p %lx)\n",
4721 ulIndex
, pHWProfileInfo
, ulFlags
);
4723 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
4728 /***********************************************************************
4729 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
4733 CM_Get_Hardware_Profile_InfoW(
4735 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4738 TRACE("CM_Get_Hardware_Profile_InfoW(%lu %p %lx)\n",
4739 ulIndex
, pHWProfileInfo
, ulFlags
);
4741 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
4746 /***********************************************************************
4747 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
4751 CM_Get_Hardware_Profile_Info_ExA(
4753 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4755 _In_opt_ HMACHINE hMachine
)
4757 HWPROFILEINFO_W LocalProfileInfo
;
4760 TRACE("CM_Get_Hardware_Profile_Info_ExA(%lu %p %lx %p)\n",
4761 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4763 if (pHWProfileInfo
== NULL
)
4764 return CR_INVALID_POINTER
;
4766 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
4768 if (ret
== CR_SUCCESS
)
4770 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
4771 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
4773 if (WideCharToMultiByte(CP_ACP
,
4775 LocalProfileInfo
.HWPI_szFriendlyName
,
4776 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
4777 pHWProfileInfo
->HWPI_szFriendlyName
,
4788 /***********************************************************************
4789 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
4793 CM_Get_Hardware_Profile_Info_ExW(
4795 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4797 _In_opt_ HMACHINE hMachine
)
4799 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4802 TRACE("CM_Get_Hardware_Profile_Info_ExW(%lu %p %lx %p)\n",
4803 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4805 if (pHWProfileInfo
== NULL
)
4806 return CR_INVALID_POINTER
;
4809 return CR_INVALID_FLAG
;
4811 if (hMachine
!= NULL
)
4813 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4814 if (BindingHandle
== NULL
)
4819 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4825 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
4826 sizeof(HWPROFILEINFO_W
), 0);
4828 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4830 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4838 /***********************************************************************
4839 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
4843 CM_Get_Log_Conf_Priority(
4844 _In_ LOG_CONF lcLogConf
,
4845 _Out_ PPRIORITY pPriority
,
4848 TRACE("CM_Get_Log_Conf_Priority(%p %p %lx)\n",
4849 lcLogConf
, pPriority
, ulFlags
);
4851 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
4855 /***********************************************************************
4856 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
4860 CM_Get_Log_Conf_Priority_Ex(
4861 _In_ LOG_CONF lcLogConf
,
4862 _Out_ PPRIORITY pPriority
,
4864 _In_opt_ HMACHINE hMachine
)
4866 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4867 HSTRING_TABLE StringTable
= NULL
;
4868 PLOG_CONF_INFO pLogConfInfo
;
4872 FIXME("CM_Get_Log_Conf_Priority_Ex(%p %p %lx %p)\n",
4873 lcLogConf
, pPriority
, ulFlags
, hMachine
);
4875 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4876 if (!IsValidLogConf(pLogConfInfo
))
4877 return CR_INVALID_LOG_CONF
;
4879 if (pPriority
== NULL
)
4880 return CR_INVALID_POINTER
;
4883 return CR_INVALID_FLAG
;
4885 if (hMachine
!= NULL
)
4887 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4888 if (BindingHandle
== NULL
)
4891 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4892 if (StringTable
== 0)
4897 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4901 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4902 if (lpDevInst
== NULL
)
4903 return CR_INVALID_DEVNODE
;
4907 ret
= PNP_GetLogConfPriority(BindingHandle
,
4909 pLogConfInfo
->ulFlags
,
4910 pLogConfInfo
->ulTag
,
4914 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4916 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4924 /***********************************************************************
4925 * CM_Get_Next_Log_Conf [SETUPAPI.@]
4929 CM_Get_Next_Log_Conf(
4930 _Out_opt_ PLOG_CONF plcLogConf
,
4931 _In_ LOG_CONF lcLogConf
,
4934 TRACE("CM_Get_Next_Log_Conf(%p %p %lx)\n",
4935 plcLogConf
, lcLogConf
, ulFlags
);
4937 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
4941 /***********************************************************************
4942 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
4946 CM_Get_Next_Log_Conf_Ex(
4947 _Out_opt_ PLOG_CONF plcLogConf
,
4948 _In_ LOG_CONF lcLogConf
,
4950 _In_opt_ HMACHINE hMachine
)
4952 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4953 HSTRING_TABLE StringTable
= NULL
;
4954 PLOG_CONF_INFO pLogConfInfo
;
4955 PLOG_CONF_INFO pNewLogConfInfo
;
4960 FIXME("CM_Get_Next_Log_Conf_Ex(%p %p %lx %p)\n",
4961 plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
4966 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4967 if (!IsValidLogConf(pLogConfInfo
))
4968 return CR_INVALID_LOG_CONF
;
4971 return CR_INVALID_FLAG
;
4973 if (hMachine
!= NULL
)
4975 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4976 if (BindingHandle
== NULL
)
4979 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4980 if (StringTable
== 0)
4985 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4989 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4990 if (lpDevInst
== NULL
)
4991 return CR_INVALID_DEVNODE
;
4995 ret
= PNP_GetNextLogConf(BindingHandle
,
4997 pLogConfInfo
->ulFlags
,
4998 pLogConfInfo
->ulTag
,
5002 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5004 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5008 if (ret
!= CR_SUCCESS
)
5013 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
5014 if (pNewLogConfInfo
== NULL
)
5015 return CR_OUT_OF_MEMORY
;
5017 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
5018 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
5019 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
5020 pNewLogConfInfo
->ulTag
= ulNewTag
;
5022 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
5029 /***********************************************************************
5030 * CM_Get_Next_Re_Des [SETUPAPI.@]
5034 CM_Get_Next_Res_Des(
5035 _Out_ PRES_DES prdResDes
,
5036 _In_ RES_DES rdResDes
,
5037 _In_ RESOURCEID ForResource
,
5038 _Out_opt_ PRESOURCEID pResourceID
,
5041 TRACE("CM_Get_Next_Res_Des(%p %p %lu %p %lx)\n",
5042 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
);
5044 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
5045 pResourceID
, ulFlags
, NULL
);
5049 /***********************************************************************
5050 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
5054 CM_Get_Next_Res_Des_Ex(
5055 _Out_ PRES_DES prdResDes
,
5056 _In_ RES_DES rdResDes
,
5057 _In_ RESOURCEID ForResource
,
5058 _Out_opt_ PRESOURCEID pResourceID
,
5060 _In_opt_ HMACHINE hMachine
)
5062 FIXME("CM_Get_Next_Res_Des_Ex(%p %p %lu %p %lx %p)\n",
5063 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
, hMachine
);
5065 return CR_CALL_NOT_IMPLEMENTED
;
5069 /***********************************************************************
5070 * CM_Get_Parent [SETUPAPI.@]
5075 _Out_ PDEVINST pdnDevInst
,
5076 _In_ DEVINST dnDevInst
,
5079 TRACE("CM_Get_Parent(%p %p %lx)\n",
5080 pdnDevInst
, dnDevInst
, ulFlags
);
5082 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5086 /***********************************************************************
5087 * CM_Get_Parent_Ex [SETUPAPI.@]
5092 _Out_ PDEVINST pdnDevInst
,
5093 _In_ DEVINST dnDevInst
,
5095 _In_opt_ HMACHINE hMachine
)
5097 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5098 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5099 HSTRING_TABLE StringTable
= NULL
;
5101 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5104 TRACE("CM_Get_Parent_Ex(%p %lx %lx %p)\n",
5105 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5107 if (pdnDevInst
== NULL
)
5108 return CR_INVALID_POINTER
;
5111 return CR_INVALID_DEVINST
;
5114 return CR_INVALID_FLAG
;
5118 if (hMachine
!= NULL
)
5120 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5121 if (BindingHandle
== NULL
)
5124 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5125 if (StringTable
== 0)
5130 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5134 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5135 if (lpDevInst
== NULL
)
5136 return CR_INVALID_DEVNODE
;
5140 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5141 PNP_GET_PARENT_DEVICE_INSTANCE
,
5147 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5149 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5153 if (ret
!= CR_SUCCESS
)
5156 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5158 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5162 *pdnDevInst
= dwIndex
;
5168 /***********************************************************************
5169 * CM_Get_Res_Des_Data [SETUPAPI.@]
5173 CM_Get_Res_Des_Data(
5174 _In_ RES_DES rdResDes
,
5175 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5176 _In_ ULONG BufferLen
,
5179 TRACE("CM_Get_Res_Des_Data(%p %p %lu %lx)\n",
5180 rdResDes
, Buffer
, BufferLen
, ulFlags
);
5182 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
5186 /***********************************************************************
5187 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
5191 CM_Get_Res_Des_Data_Ex(
5192 _In_ RES_DES rdResDes
,
5193 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5194 _In_ ULONG BufferLen
,
5196 _In_opt_ HMACHINE hMachine
)
5198 FIXME("CM_Get_Res_Des_Data_Ex(%p %p %lu %lx %p)\n",
5199 rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
5201 return CR_CALL_NOT_IMPLEMENTED
;
5205 /***********************************************************************
5206 * CM_Get_Res_Des_Size [SETUPAPI.@]
5210 CM_Get_Res_Des_Data_Size(
5211 _Out_ PULONG pulSize
,
5212 _In_ RES_DES rdResDes
,
5215 TRACE("CM_Get_Res_Des_Data_Size(%p %p %lx)\n",
5216 pulSize
, rdResDes
, ulFlags
);
5218 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
5222 /***********************************************************************
5223 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
5227 CM_Get_Res_Des_Data_Size_Ex(
5228 _Out_ PULONG pulSize
,
5229 _In_ RES_DES rdResDes
,
5231 _In_opt_ HMACHINE hMachine
)
5233 TRACE("CM_Get_Res_Des_Data_Size_Ex(%p %p %lx %p)\n",
5234 pulSize
, rdResDes
, ulFlags
, hMachine
);
5236 return CR_CALL_NOT_IMPLEMENTED
;
5240 /***********************************************************************
5241 * CM_Get_Resource_Conflict_Count [SETUPAPI.@]
5245 CM_Get_Resource_Conflict_Count(
5246 _In_ CONFLICT_LIST clConflictList
,
5247 _Out_ PULONG pulCount
)
5249 PCONFLICT_DATA pConflictData
;
5251 FIXME("CM_Get_Resource_Conflict_Count(%p %p)\n",
5252 clConflictList
, pulCount
);
5254 pConflictData
= (PCONFLICT_DATA
)clConflictList
;
5255 if (!IsValidConflictData(pConflictData
))
5256 return CR_INVALID_CONFLICT_LIST
;
5258 if (pulCount
== NULL
)
5259 return CR_INVALID_POINTER
;
5261 *pulCount
= pConflictData
->pConflictList
->ConflictsListed
;
5267 /***********************************************************************
5268 * CM_Get_Resource_Conflict_DetailsA [SETUPAPI.@]
5272 CM_Get_Resource_Conflict_DetailsA(
5273 _In_ CONFLICT_LIST clConflictList
,
5275 _Inout_ PCONFLICT_DETAILS_A pConflictDetails
)
5277 FIXME("CM_Get_Resource_Conflict_CountA(%p %lu %p)\n",
5278 clConflictList
, ulIndex
, pConflictDetails
);
5280 return CR_CALL_NOT_IMPLEMENTED
;
5284 /***********************************************************************
5285 * CM_Get_Resource_Conflict_DetailsW [SETUPAPI.@]
5289 CM_Get_Resource_Conflict_DetailsW(
5290 _In_ CONFLICT_LIST clConflictList
,
5292 _Inout_ PCONFLICT_DETAILS_W pConflictDetails
)
5294 FIXME("CM_Get_Resource_Conflict_CountW(%p %lu %p)\n",
5295 clConflictList
, ulIndex
, pConflictDetails
);
5297 return CR_CALL_NOT_IMPLEMENTED
;
5301 /***********************************************************************
5302 * CM_Get_Sibling [SETUPAPI.@]
5307 _Out_ PDEVINST pdnDevInst
,
5308 _In_ DEVINST dnDevInst
,
5311 TRACE("CM_Get_Sibling(%p %p %lx)\n",
5312 pdnDevInst
, dnDevInst
, ulFlags
);
5314 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5318 /***********************************************************************
5319 * CM_Get_Sibling_Ex [SETUPAPI.@]
5324 _Out_ PDEVINST pdnDevInst
,
5325 _In_ DEVINST dnDevInst
,
5327 _In_opt_ HMACHINE hMachine
)
5329 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5330 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5331 HSTRING_TABLE StringTable
= NULL
;
5333 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5336 TRACE("CM_Get_Sibling_Ex(%p %lx %lx %p)\n",
5337 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5339 if (pdnDevInst
== NULL
)
5340 return CR_INVALID_POINTER
;
5343 return CR_INVALID_DEVINST
;
5346 return CR_INVALID_FLAG
;
5350 if (hMachine
!= NULL
)
5352 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5353 if (BindingHandle
== NULL
)
5356 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5357 if (StringTable
== 0)
5362 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5366 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5367 if (lpDevInst
== NULL
)
5368 return CR_INVALID_DEVNODE
;
5372 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5373 PNP_GET_SIBLING_DEVICE_INSTANCE
,
5379 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5381 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5385 if (ret
!= CR_SUCCESS
)
5388 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5390 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5394 *pdnDevInst
= dwIndex
;
5400 /***********************************************************************
5401 * CM_Get_Version [SETUPAPI.@]
5405 CM_Get_Version(VOID
)
5407 TRACE("CM_Get_Version()\n");
5409 return CM_Get_Version_Ex(NULL
);
5413 /***********************************************************************
5414 * CM_Get_Version_Ex [SETUPAPI.@]
5419 _In_opt_ HMACHINE hMachine
)
5421 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5425 TRACE("CM_Get_Version_Ex(%p)\n", hMachine
);
5427 if (hMachine
!= NULL
)
5429 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5430 if (BindingHandle
== NULL
)
5435 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5441 ret
= PNP_GetVersion(BindingHandle
, &Version
);
5443 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5445 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5449 if (ret
!= CR_SUCCESS
)
5456 /***********************************************************************
5457 * CM_Intersect_Range_List [SETUPAPI.@]
5461 CM_Intersect_Range_List(
5462 _In_ RANGE_LIST rlhOld1
,
5463 _In_ RANGE_LIST rlhOld2
,
5464 _In_ RANGE_LIST rlhNew
,
5467 FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
5468 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5470 return CR_CALL_NOT_IMPLEMENTED
;
5474 /***********************************************************************
5475 * CM_Invert_Range_List [SETUPAPI.@]
5479 CM_Invert_Range_List(
5480 _In_ RANGE_LIST rlhOld
,
5481 _In_ RANGE_LIST rlhNew
,
5482 _In_ DWORDLONG ullMaxValue
,
5485 FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
5486 rlhOld
, rlhNew
, ullMaxValue
, ulFlags
);
5488 return CR_CALL_NOT_IMPLEMENTED
;
5492 /***********************************************************************
5493 * CM_Is_Dock_Station_Present [SETUPAPI.@]
5497 CM_Is_Dock_Station_Present(
5498 _Out_ PBOOL pbPresent
)
5500 TRACE("CM_Is_Dock_Station_Present(%p)\n",
5503 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
5507 /***********************************************************************
5508 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
5512 CM_Is_Dock_Station_Present_Ex(
5513 _Out_ PBOOL pbPresent
,
5514 _In_opt_ HMACHINE hMachine
)
5516 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5519 TRACE("CM_Is_Dock_Station_Present_Ex(%p %p)\n",
5520 pbPresent
, hMachine
);
5522 if (pbPresent
== NULL
)
5523 return CR_INVALID_POINTER
;
5527 if (hMachine
!= NULL
)
5529 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5530 if (BindingHandle
== NULL
)
5535 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5541 ret
= PNP_IsDockStationPresent(BindingHandle
,
5544 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5546 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5554 /***********************************************************************
5555 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5559 CM_Is_Version_Available(
5562 TRACE("CM_Is_Version_Available(%hu)\n",
5565 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
5569 /***********************************************************************
5570 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5574 CM_Is_Version_Available_Ex(
5576 _In_opt_ HMACHINE hMachine
)
5578 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5579 WORD wServerVersion
;
5582 TRACE("CM_Is_Version_Available_Ex(%hu %p)\n",
5583 wVersion
, hMachine
);
5585 if (wVersion
<= 0x400)
5588 if (hMachine
!= NULL
)
5590 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5591 if (BindingHandle
== NULL
)
5596 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5602 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
5604 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5606 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5610 if (ret
!= CR_SUCCESS
)
5613 return (wServerVersion
>= wVersion
);
5617 /***********************************************************************
5618 * CM_Locate_DevNodeA [SETUPAPI.@]
5623 _Out_ PDEVINST pdnDevInst
,
5624 _In_opt_ DEVINSTID_A pDeviceID
,
5627 TRACE("CM_Locate_DevNodeA(%p %s %lx)\n",
5628 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
);
5630 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5634 /***********************************************************************
5635 * CM_Locate_DevNodeW [SETUPAPI.@]
5640 _Out_ PDEVINST pdnDevInst
,
5641 _In_opt_ DEVINSTID_W pDeviceID
,
5644 TRACE("CM_Locate_DevNodeW(%p %s %lx)\n",
5645 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
5647 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5651 /***********************************************************************
5652 * CM_Locate_DevNode_ExA [SETUPAPI.@]
5656 CM_Locate_DevNode_ExA(
5657 _Out_ PDEVINST pdnDevInst
,
5658 _In_opt_ DEVINSTID_A pDeviceID
,
5660 _In_opt_ HMACHINE hMachine
)
5662 DEVINSTID_W pDevIdW
= NULL
;
5663 CONFIGRET ret
= CR_SUCCESS
;
5665 TRACE("CM_Locate_DevNode_ExA(%p %s %lx %p)\n",
5666 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
5668 if (pDeviceID
!= NULL
)
5670 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
5671 return CR_INVALID_DEVICE_ID
;
5674 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
5676 if (pDevIdW
!= NULL
)
5683 /***********************************************************************
5684 * CM_Locate_DevNode_ExW [SETUPAPI.@]
5688 CM_Locate_DevNode_ExW(
5689 _Out_ PDEVINST pdnDevInst
,
5690 _In_opt_ DEVINSTID_W pDeviceID
,
5692 _In_opt_ HMACHINE hMachine
)
5694 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
5695 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5696 HSTRING_TABLE StringTable
= NULL
;
5697 CONFIGRET ret
= CR_SUCCESS
;
5699 TRACE("CM_Locate_DevNode_ExW(%p %s %lx %p)\n",
5700 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
5702 if (pdnDevInst
== NULL
)
5703 return CR_INVALID_POINTER
;
5705 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
5706 return CR_INVALID_FLAG
;
5708 if (hMachine
!= NULL
)
5710 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5711 if (BindingHandle
== NULL
)
5714 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5715 if (StringTable
== 0)
5720 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5724 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
5726 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
5732 /* Get the root device ID */
5733 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
5737 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5739 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5743 if (ret
!= CR_SUCCESS
)
5746 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
5750 /* Validate the device ID */
5751 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
5755 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5757 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5761 if (ret
== CR_SUCCESS
)
5763 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
5764 if (*pdnDevInst
== -1)
5772 /***********************************************************************
5773 * CM_Merge_Range_List [SETUPAPI.@]
5777 CM_Merge_Range_List(
5778 _In_ RANGE_LIST rlhOld1
,
5779 _In_ RANGE_LIST rlhOld2
,
5780 _In_ RANGE_LIST rlhNew
,
5783 FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
5784 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5786 return CR_CALL_NOT_IMPLEMENTED
;
5790 /***********************************************************************
5791 * CM_Modify_Res_Des [SETUPAPI.@]
5796 _Out_ PRES_DES prdResDes
,
5797 _In_ RES_DES rdResDes
,
5798 _In_ RESOURCEID ResourceID
,
5799 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5800 _In_ ULONG ResourceLen
,
5803 TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
5804 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5805 ResourceLen
, ulFlags
);
5807 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5808 ResourceLen
, ulFlags
, NULL
);
5812 /***********************************************************************
5813 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
5817 CM_Modify_Res_Des_Ex(
5818 _Out_ PRES_DES prdResDes
,
5819 _In_ RES_DES rdResDes
,
5820 _In_ RESOURCEID ResourceID
,
5821 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5822 _In_ ULONG ResourceLen
,
5824 _In_opt_ HMACHINE hMachine
)
5826 FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %p)\n",
5827 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5828 ResourceLen
, ulFlags
, hMachine
);
5830 return CR_CALL_NOT_IMPLEMENTED
;
5834 /***********************************************************************
5835 * CM_Move_DevNode [SETUPAPI.@]
5840 _In_ DEVINST dnFromDevInst
,
5841 _In_ DEVINST dnToDevInst
,
5844 TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
5845 dnFromDevInst
, dnToDevInst
, ulFlags
);
5847 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
5851 /***********************************************************************
5852 * CM_Move_DevNode_Ex [SETUPAPI.@]
5857 _In_ DEVINST dnFromDevInst
,
5858 _In_ DEVINST dnToDevInst
,
5860 _In_opt_ HMACHINE hMachine
)
5862 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5863 HSTRING_TABLE StringTable
= NULL
;
5864 LPWSTR lpFromDevInst
;
5868 FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %p)\n",
5869 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
5871 if (!pSetupIsUserAdmin())
5872 return CR_ACCESS_DENIED
;
5874 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
5875 return CR_INVALID_DEVNODE
;
5878 return CR_INVALID_FLAG
;
5880 if (hMachine
!= NULL
)
5882 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5883 if (BindingHandle
== NULL
)
5886 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5887 if (StringTable
== 0)
5892 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5896 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
5897 if (lpFromDevInst
== NULL
)
5898 return CR_INVALID_DEVNODE
;
5900 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
5901 if (lpToDevInst
== NULL
)
5902 return CR_INVALID_DEVNODE
;
5906 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5912 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5914 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5922 /***********************************************************************
5923 * CM_Next_Range [SETUPAPI.@]
5928 _Inout_ PRANGE_ELEMENT preElement
,
5929 _Out_ PDWORDLONG pullStart
,
5930 _Out_ PDWORDLONG pullEnd
,
5933 PINTERNAL_RANGE_LIST pRangeList
;
5934 PINTERNAL_RANGE pRange
;
5935 PLIST_ENTRY ListEntry
;
5936 CONFIGRET ret
= CR_SUCCESS
;
5938 FIXME("CM_Next_Range(%p %p %p %lx)\n",
5939 preElement
, pullStart
, pullEnd
, ulFlags
);
5941 pRange
= (PINTERNAL_RANGE
)preElement
;
5943 if (pRange
== NULL
|| pRange
->pRangeList
== NULL
)
5946 if (pullStart
== NULL
|| pullEnd
== NULL
)
5947 return CR_INVALID_POINTER
;
5950 return CR_INVALID_FLAG
;
5952 pRangeList
= pRange
->pRangeList
;
5954 /* Lock the range list */
5955 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
5957 /* Fail, if we reached the end of the list */
5958 if (pRange
->ListEntry
.Flink
== &pRangeList
->ListHead
)
5964 /* Get the next range */
5965 ListEntry
= pRangeList
->ListHead
.Flink
;
5966 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
5968 /* Return the range data */
5969 *pullStart
= pRange
->ullStart
;
5970 *pullEnd
= pRange
->ullEnd
;
5971 *preElement
= (RANGE_ELEMENT
)pRange
;
5974 /* Unlock the range list */
5975 ReleaseMutex(pRangeList
->hMutex
);
5981 /***********************************************************************
5982 * CM_Open_Class_KeyA [SETUPAPI.@]
5987 _In_opt_ LPGUID pClassGuid
,
5988 _In_opt_ LPCSTR pszClassName
,
5989 _In_ REGSAM samDesired
,
5990 _In_ REGDISPOSITION Disposition
,
5991 _Out_ PHKEY phkClass
,
5994 TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
5995 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
5996 samDesired
, Disposition
, phkClass
, ulFlags
);
5998 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
5999 Disposition
, phkClass
, ulFlags
, NULL
);
6003 /***********************************************************************
6004 * CM_Open_Class_KeyW [SETUPAPI.@]
6009 _In_opt_ LPGUID pClassGuid
,
6010 _In_opt_ LPCWSTR pszClassName
,
6011 _In_ REGSAM samDesired
,
6012 _In_ REGDISPOSITION Disposition
,
6013 _Out_ PHKEY phkClass
,
6016 TRACE("CM_Open_Class_KeyW%p %s %lx %lx %p %lx)\n",
6017 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
6018 samDesired
, Disposition
, phkClass
, ulFlags
);
6020 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
6021 Disposition
, phkClass
, ulFlags
, NULL
);
6025 /***********************************************************************
6026 * CM_Open_Class_Key_ExA [SETUPAPI.@]
6030 CM_Open_Class_Key_ExA(
6031 _In_opt_ LPGUID pClassGuid
,
6032 _In_opt_ LPCSTR pszClassName
,
6033 _In_ REGSAM samDesired
,
6034 _In_ REGDISPOSITION Disposition
,
6035 _Out_ PHKEY phkClass
,
6037 _In_opt_ HMACHINE hMachine
)
6039 LPWSTR pszClassNameW
= NULL
;
6042 TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %p)\n",
6043 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
6044 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
6046 if (pszClassName
!= NULL
)
6048 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
6049 return CR_INVALID_DATA
;
6052 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
6053 Disposition
, phkClass
, ulFlags
, hMachine
);
6055 if (pszClassNameW
!= NULL
)
6056 MyFree(pszClassNameW
);
6062 /***********************************************************************
6063 * CM_Open_Class_Key_ExW [SETUPAPI.@]
6067 CM_Open_Class_Key_ExW(
6068 _In_opt_ LPGUID pClassGuid
,
6069 _In_opt_ LPCWSTR pszClassName
,
6070 _In_ REGSAM samDesired
,
6071 _In_ REGDISPOSITION Disposition
,
6072 _Out_ PHKEY phkClass
,
6074 _In_opt_ HMACHINE hMachine
)
6076 WCHAR szKeyName
[MAX_PATH
];
6077 LPWSTR lpGuidString
;
6078 DWORD dwDisposition
;
6082 TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %p)\n",
6083 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
6084 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
6086 /* Check Disposition and ulFlags */
6087 if ((Disposition
& ~RegDisposition_Bits
) ||
6088 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
6089 return CR_INVALID_FLAG
;
6091 /* Check phkClass */
6092 if (phkClass
== NULL
)
6093 return CR_INVALID_POINTER
;
6097 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
6098 pszClassName
!= NULL
)
6099 return CR_INVALID_DATA
;
6101 if (hMachine
== NULL
)
6103 hKey
= HKEY_LOCAL_MACHINE
;
6107 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6110 return CR_REGISTRY_ERROR
;
6113 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
6115 lstrcpyW(szKeyName
, DeviceClasses
);
6119 lstrcpyW(szKeyName
, ControlClass
);
6122 if (pClassGuid
!= NULL
)
6124 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
6127 return CR_INVALID_DATA
;
6130 lstrcatW(szKeyName
, Backslash
);
6131 lstrcatW(szKeyName
, lpGuidString
);
6134 if (Disposition
== RegDisposition_OpenAlways
)
6136 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
6137 NULL
, phkClass
, &dwDisposition
);
6141 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
6146 if (pClassGuid
!= NULL
)
6147 RpcStringFreeW(&lpGuidString
);
6149 if (dwError
!= ERROR_SUCCESS
)
6152 return CR_NO_SUCH_REGISTRY_KEY
;
6155 if (pszClassName
!= NULL
)
6157 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
6158 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
6165 /***********************************************************************
6166 * CM_Open_DevNode_Key [SETUPAPI.@]
6170 CM_Open_DevNode_Key(
6171 _In_ DEVINST dnDevNode
,
6172 _In_ REGSAM samDesired
,
6173 _In_ ULONG ulHardwareProfile
,
6174 _In_ REGDISPOSITION Disposition
,
6175 _Out_ PHKEY phkDevice
,
6178 TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
6179 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
6181 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
6182 Disposition
, phkDevice
, ulFlags
, NULL
);
6186 /***********************************************************************
6187 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
6191 CM_Open_DevNode_Key_Ex(
6192 _In_ DEVINST dnDevNode
,
6193 _In_ REGSAM samDesired
,
6194 _In_ ULONG ulHardwareProfile
,
6195 _In_ REGDISPOSITION Disposition
,
6196 _Out_ PHKEY phkDevice
,
6198 _In_opt_ HMACHINE hMachine
)
6200 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6201 HSTRING_TABLE StringTable
= NULL
;
6202 LPWSTR pszDevInst
, pszKeyPath
= NULL
, pszInstancePath
= NULL
;
6204 DWORD dwDisposition
;
6205 HKEY hRootKey
= NULL
;
6206 CONFIGRET ret
= CR_CALL_NOT_IMPLEMENTED
;
6208 TRACE("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %p)\n",
6209 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
6211 if (phkDevice
== NULL
)
6212 return CR_INVALID_POINTER
;
6217 return CR_INVALID_DEVNODE
;
6219 if (ulFlags
& ~CM_REGISTRY_BITS
)
6220 return CR_INVALID_FLAG
;
6222 if (Disposition
& ~RegDisposition_Bits
)
6223 return CR_INVALID_DATA
;
6225 if (hMachine
!= NULL
)
6227 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6228 if (BindingHandle
== NULL
)
6231 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6232 if (StringTable
== 0)
6237 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6241 pszDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevNode
);
6242 if (pszDevInst
== NULL
)
6243 return CR_INVALID_DEVNODE
;
6245 TRACE("pszDevInst: %S\n", pszDevInst
);
6247 pszKeyPath
= MyMalloc(512 * sizeof(WCHAR
));
6248 if (pszKeyPath
== NULL
)
6250 ret
= CR_OUT_OF_MEMORY
;
6254 pszInstancePath
= MyMalloc(512 * sizeof(WCHAR
));
6255 if (pszInstancePath
== NULL
)
6257 ret
= CR_OUT_OF_MEMORY
;
6261 ret
= GetDeviceInstanceKeyPath(BindingHandle
,
6267 if (ret
!= CR_SUCCESS
)
6270 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6271 TRACE("pszInstancePath: %S\n", pszInstancePath
);
6273 wcscat(pszKeyPath
, L
"\\");
6274 wcscat(pszKeyPath
, pszInstancePath
);
6276 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6278 if (hMachine
== NULL
)
6280 hRootKey
= HKEY_LOCAL_MACHINE
;
6284 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6288 ret
= CR_REGISTRY_ERROR
;
6293 if (Disposition
== RegDisposition_OpenAlways
)
6295 lError
= RegCreateKeyExW(hRootKey
,
6307 lError
= RegOpenKeyExW(hRootKey
,
6314 if (lError
!= ERROR_SUCCESS
)
6317 ret
= CR_NO_SUCH_REGISTRY_KEY
;
6321 if ((hRootKey
!= NULL
) && (hRootKey
!= HKEY_LOCAL_MACHINE
))
6322 RegCloseKey(hRootKey
);
6324 if (pszInstancePath
!= NULL
)
6325 MyFree(pszInstancePath
);
6327 if (pszKeyPath
!= NULL
)
6334 /***********************************************************************
6335 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
6339 CM_Query_And_Remove_SubTreeA(
6340 _In_ DEVINST dnAncestor
,
6341 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6342 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6343 _In_ ULONG ulNameLength
,
6346 TRACE("CM_Query_And_Remove_SubTreeA(%lx %p %s %lu %lx)\n",
6347 dnAncestor
, pVetoType
, pszVetoName
, ulNameLength
, ulFlags
);
6349 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
6350 ulNameLength
, ulFlags
, NULL
);
6354 /***********************************************************************
6355 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
6359 CM_Query_And_Remove_SubTreeW(
6360 _In_ DEVINST dnAncestor
,
6361 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6362 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6363 _In_ ULONG ulNameLength
,
6366 TRACE("CM_Query_And_Remove_SubTreeW(%lx %p %s %lu %lx)\n",
6367 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
6369 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
6370 ulNameLength
, ulFlags
, NULL
);
6374 /***********************************************************************
6375 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
6379 CM_Query_And_Remove_SubTree_ExA(
6380 _In_ DEVINST dnAncestor
,
6381 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6382 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6383 _In_ ULONG ulNameLength
,
6385 _In_opt_ HMACHINE hMachine
)
6387 LPWSTR lpLocalVetoName
;
6390 TRACE("CM_Query_And_Remove_SubTree_ExA(%lx %p %s %lu %lx %p)\n",
6391 dnAncestor
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
,
6394 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6395 return CR_INVALID_POINTER
;
6397 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
6398 if (lpLocalVetoName
== NULL
)
6399 return CR_OUT_OF_MEMORY
;
6401 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
6402 ulNameLength
, ulFlags
, hMachine
);
6403 if (ret
== CR_REMOVE_VETOED
)
6405 if (WideCharToMultiByte(CP_ACP
,
6416 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
6422 /***********************************************************************
6423 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
6427 CM_Query_And_Remove_SubTree_ExW(
6428 _In_ DEVINST dnAncestor
,
6429 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6430 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6431 _In_ ULONG ulNameLength
,
6433 _In_opt_ HMACHINE hMachine
)
6435 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6436 HSTRING_TABLE StringTable
= NULL
;
6440 TRACE("CM_Query_And_Remove_SubTree_ExW(%lx %p %s %lu %lx %p)\n",
6441 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
,
6444 if (dnAncestor
== 0)
6445 return CR_INVALID_DEVNODE
;
6447 if (ulFlags
& ~CM_REMOVE_BITS
)
6448 return CR_INVALID_FLAG
;
6450 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6451 return CR_INVALID_POINTER
;
6453 if (hMachine
!= NULL
)
6455 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6456 if (BindingHandle
== NULL
)
6459 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6460 if (StringTable
== 0)
6465 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6469 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
6470 if (lpDevInst
== NULL
)
6471 return CR_INVALID_DEVNODE
;
6475 ret
= PNP_QueryRemove(BindingHandle
,
6482 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6484 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6492 /***********************************************************************
6493 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
6497 CM_Query_Arbitrator_Free_Data(
6498 _Out_writes_bytes_(DataLen
) PVOID pData
,
6500 _In_ DEVINST dnDevInst
,
6501 _In_ RESOURCEID ResourceID
,
6504 TRACE("CM_Query_Arbitrator_Free_Data(%p %lu %lx %lu 0x%08lx)\n",
6505 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
);
6507 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
6508 ResourceID
, ulFlags
, NULL
);
6512 /***********************************************************************
6513 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
6517 CM_Query_Arbitrator_Free_Data_Ex(
6518 _Out_writes_bytes_(DataLen
) PVOID pData
,
6520 _In_ DEVINST dnDevInst
,
6521 _In_ RESOURCEID ResourceID
,
6523 _In_opt_ HMACHINE hMachine
)
6525 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6526 HSTRING_TABLE StringTable
= NULL
;
6530 TRACE("CM_Query_Arbitrator_Free_Data_Ex(%p %lu %lx %lu 0x%08lx %p)\n",
6531 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
, hMachine
);
6533 if (pData
== NULL
|| DataLen
== 0)
6534 return CR_INVALID_POINTER
;
6537 return CR_INVALID_DEVINST
;
6539 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6540 return CR_INVALID_FLAG
;
6542 if (hMachine
!= NULL
)
6544 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6545 if (BindingHandle
== NULL
)
6548 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6549 if (StringTable
== 0)
6554 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6558 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6559 if (lpDevInst
== NULL
)
6560 return CR_INVALID_DEVNODE
;
6564 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
6571 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6573 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6581 /***********************************************************************
6582 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
6586 CM_Query_Arbitrator_Free_Size(
6587 _Out_ PULONG pulSize
,
6588 _In_ DEVINST dnDevInst
,
6589 _In_ RESOURCEID ResourceID
,
6592 TRACE("CM_Query_Arbitrator_Free_Size(%p %lu %lx 0x%08lx)\n",
6593 pulSize
, dnDevInst
,ResourceID
, ulFlags
);
6595 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
6600 /***********************************************************************
6601 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
6605 CM_Query_Arbitrator_Free_Size_Ex(
6606 _Out_ PULONG pulSize
,
6607 _In_ DEVINST dnDevInst
,
6608 _In_ RESOURCEID ResourceID
,
6610 _In_opt_ HMACHINE hMachine
)
6612 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6613 HSTRING_TABLE StringTable
= NULL
;
6617 TRACE("CM_Query_Arbitrator_Free_Size_Ex(%p %lu %lx 0x%08lx %p)\n",
6618 pulSize
, dnDevInst
,ResourceID
, ulFlags
, hMachine
);
6620 if (pulSize
== NULL
)
6621 return CR_INVALID_POINTER
;
6624 return CR_INVALID_DEVINST
;
6626 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6627 return CR_INVALID_FLAG
;
6629 if (hMachine
!= NULL
)
6631 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6632 if (BindingHandle
== NULL
)
6635 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6636 if (StringTable
== 0)
6641 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6645 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6646 if (lpDevInst
== NULL
)
6647 return CR_INVALID_DEVNODE
;
6651 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
6657 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6659 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6667 /***********************************************************************
6668 * CM_Query_Remove_SubTree [SETUPAPI.@]
6670 * This function is obsolete in Windows XP and above.
6674 CM_Query_Remove_SubTree(
6675 _In_ DEVINST dnAncestor
,
6678 TRACE("CM_Query_Remove_SubTree(%lx %lx)\n",
6679 dnAncestor
, ulFlags
);
6681 return CR_CALL_NOT_IMPLEMENTED
;
6685 /***********************************************************************
6686 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
6688 * This function is obsolete in Windows XP and above.
6692 CM_Query_Remove_SubTree_Ex(
6693 _In_ DEVINST dnAncestor
,
6695 _In_opt_ HMACHINE hMachine
)
6697 TRACE("CM_Query_Remove_SubTree_Ex(%lx %lx %p)\n",
6698 dnAncestor
, ulFlags
, hMachine
);
6700 return CR_CALL_NOT_IMPLEMENTED
;
6704 /***********************************************************************
6705 * CM_Query_Resource_Conflict_List [SETUPAPI.@]
6709 CM_Query_Resource_Conflict_List(
6710 _Out_ PCONFLICT_LIST pclConflictList
,
6711 _In_ DEVINST dnDevInst
,
6712 _In_ RESOURCEID ResourceID
,
6713 _In_ PCVOID ResourceData
,
6714 _In_ ULONG ResourceLen
,
6716 _In_opt_ HMACHINE hMachine
)
6718 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6719 HSTRING_TABLE StringTable
= NULL
;
6720 PPNP_CONFLICT_LIST pConflictBuffer
= NULL
;
6721 PCONFLICT_DATA pConflictData
= NULL
;
6722 ULONG ulBufferLength
;
6726 FIXME("CM_Query_Resource_Conflict_List(%p %lx %lu %p %lu %lx %p)\n",
6727 pclConflictList
, dnDevInst
, ResourceID
, ResourceData
,
6728 ResourceLen
, ulFlags
, hMachine
);
6731 return CR_INVALID_DEVNODE
;
6733 if (ulFlags
& ~CM_RESDES_WIDTH_BITS
)
6734 return CR_INVALID_FLAG
;
6736 if (pclConflictList
== NULL
||
6737 ResourceData
== NULL
||
6739 return CR_INVALID_POINTER
;
6741 if (ResourceID
== 0)
6742 return CR_INVALID_RESOURCEID
;
6744 *pclConflictList
= 0;
6746 if (hMachine
!= NULL
)
6748 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6749 if (BindingHandle
== NULL
)
6752 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6753 if (StringTable
== 0)
6758 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6762 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6763 if (lpDevInst
== NULL
)
6764 return CR_INVALID_DEVNODE
;
6766 pConflictData
= MyMalloc(sizeof(CONFLICT_DATA
));
6767 if (pConflictData
== NULL
)
6769 ret
= CR_OUT_OF_MEMORY
;
6773 ulBufferLength
= sizeof(PNP_CONFLICT_LIST
) +
6774 sizeof(PNP_CONFLICT_STRINGS
) +
6775 (sizeof(wchar_t) * 200);
6776 pConflictBuffer
= MyMalloc(ulBufferLength
);
6777 if (pConflictBuffer
== NULL
)
6779 ret
= CR_OUT_OF_MEMORY
;
6785 ret
= PNP_QueryResConfList(BindingHandle
,
6788 (PBYTE
)ResourceData
,
6790 (PBYTE
)pConflictBuffer
,
6794 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6796 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6800 if (ret
!= CR_SUCCESS
)
6803 pConflictData
->ulMagic
= CONFLICT_MAGIC
;
6804 pConflictData
->pConflictList
= pConflictBuffer
;
6806 *pclConflictList
= (CONFLICT_LIST
)pConflictData
;
6809 if (ret
!= CR_SUCCESS
)
6811 if (pConflictBuffer
!= NULL
)
6812 MyFree(pConflictBuffer
);
6814 if (pConflictData
!= NULL
)
6815 MyFree(pConflictData
);
6822 /***********************************************************************
6823 * CM_Reenumerate_DevNode [SETUPAPI.@]
6827 CM_Reenumerate_DevNode(
6828 _In_ DEVINST dnDevInst
,
6831 TRACE("CM_Reenumerate_DevNode(%lx %lx)\n",
6832 dnDevInst
, ulFlags
);
6834 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
6838 /***********************************************************************
6839 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
6842 CM_Reenumerate_DevNode_Ex(
6843 _In_ DEVINST dnDevInst
,
6845 _In_opt_ HMACHINE hMachine
)
6847 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6848 HSTRING_TABLE StringTable
= NULL
;
6852 FIXME("CM_Reenumerate_DevNode_Ex(%lx %lx %p)\n",
6853 dnDevInst
, ulFlags
, hMachine
);
6856 return CR_INVALID_DEVNODE
;
6858 if (ulFlags
& ~CM_REENUMERATE_BITS
)
6859 return CR_INVALID_FLAG
;
6861 if (hMachine
!= NULL
)
6863 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6864 if (BindingHandle
== NULL
)
6867 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6868 if (StringTable
== 0)
6873 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6877 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6878 if (lpDevInst
== NULL
)
6879 return CR_INVALID_DEVNODE
;
6883 ret
= PNP_DeviceInstanceAction(BindingHandle
,
6884 PNP_DEVINST_REENUMERATE
,
6889 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6891 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6899 /***********************************************************************
6900 * CM_Register_Device_Driver [SETUPAPI.@]
6904 CM_Register_Device_Driver(
6905 _In_ DEVINST dnDevInst
,
6908 TRACE("CM_Register_Device_Driver(%lx 0x%08lx)\n",
6909 dnDevInst
, ulFlags
);
6911 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
6915 /***********************************************************************
6916 * CM_Register_Device_Driver_Ex [SETUPAPI.@]
6920 CM_Register_Device_Driver_Ex(
6921 _In_ DEVINST dnDevInst
,
6923 _In_opt_ HMACHINE hMachine
)
6925 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6926 HSTRING_TABLE StringTable
= NULL
;
6930 TRACE("CM_Register_Device_Driver_Ex(%lx 0x%08lx %p)\n",
6931 dnDevInst
, ulFlags
, hMachine
);
6934 return CR_INVALID_DEVNODE
;
6936 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
6937 return CR_INVALID_FLAG
;
6939 if (hMachine
!= NULL
)
6941 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6942 if (BindingHandle
== NULL
)
6945 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6946 if (StringTable
== 0)
6951 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6955 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6956 if (lpDevInst
== NULL
)
6957 return CR_INVALID_DEVNODE
;
6961 ret
= PNP_RegisterDriver(BindingHandle
,
6965 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6967 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6975 /***********************************************************************
6976 * CM_Register_Device_InterfaceA [SETUPAPI.@]
6980 CM_Register_Device_InterfaceA(
6981 _In_ DEVINST dnDevInst
,
6982 _In_ LPGUID InterfaceClassGuid
,
6983 _In_opt_ LPCSTR pszReference
,
6984 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
6985 _Inout_ PULONG pulLength
,
6988 TRACE("CM_Register_Device_InterfaceA(%lx %s %s %p %p %lx)\n",
6989 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
6990 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
6992 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
6993 pszReference
, pszDeviceInterface
,
6994 pulLength
, ulFlags
, NULL
);
6998 /***********************************************************************
6999 * CM_Register_Device_InterfaceW [SETUPAPI.@]
7003 CM_Register_Device_InterfaceW(
7004 _In_ DEVINST dnDevInst
,
7005 _In_ LPGUID InterfaceClassGuid
,
7006 _In_opt_ LPCWSTR pszReference
,
7007 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
7008 _Inout_ PULONG pulLength
,
7011 TRACE("CM_Register_Device_InterfaceW(%lx %s %s %p %p %lx)\n",
7012 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
7013 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
7015 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
7016 pszReference
, pszDeviceInterface
,
7017 pulLength
, ulFlags
, NULL
);
7021 /***********************************************************************
7022 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
7026 CM_Register_Device_Interface_ExA(
7027 _In_ DEVINST dnDevInst
,
7028 _In_ LPGUID InterfaceClassGuid
,
7029 _In_opt_ LPCSTR pszReference
,
7030 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
7031 _Inout_ PULONG pulLength
,
7033 _In_opt_ HMACHINE hMachine
)
7035 LPWSTR pszReferenceW
= NULL
;
7036 LPWSTR pszDeviceInterfaceW
= NULL
;
7040 TRACE("CM_Register_Device_Interface_ExA(%lx %s %s %p %p %lx %p)\n",
7041 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_a(pszReference
),
7042 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
7044 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
7045 return CR_INVALID_POINTER
;
7047 if (pszReference
!= NULL
)
7049 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
7050 return CR_INVALID_DATA
;
7053 ulLength
= *pulLength
;
7055 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
7056 if (pszDeviceInterfaceW
== NULL
)
7058 ret
= CR_OUT_OF_MEMORY
;
7062 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
7065 pszDeviceInterfaceW
,
7069 if (ret
== CR_SUCCESS
)
7071 if (WideCharToMultiByte(CP_ACP
,
7073 pszDeviceInterfaceW
,
7082 *pulLength
= ulLength
;
7085 if (pszDeviceInterfaceW
!= NULL
)
7086 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
7088 if (pszReferenceW
!= NULL
)
7089 MyFree(pszReferenceW
);
7095 /***********************************************************************
7096 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
7100 CM_Register_Device_Interface_ExW(
7101 _In_ DEVINST dnDevInst
,
7102 _In_ LPGUID InterfaceClassGuid
,
7103 _In_opt_ LPCWSTR pszReference
,
7104 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
7105 _Inout_ PULONG pulLength
,
7107 _In_opt_ HMACHINE hMachine
)
7109 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7110 HSTRING_TABLE StringTable
= NULL
;
7112 ULONG ulTransferLength
;
7115 TRACE("CM_Register_Device_Interface_ExW(%lx %s %s %p %p %lx %p)\n",
7116 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_w(pszReference
),
7117 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
7120 return CR_INVALID_DEVNODE
;
7122 if (InterfaceClassGuid
== NULL
||
7123 pszDeviceInterface
== NULL
||
7125 return CR_INVALID_POINTER
;
7128 return CR_INVALID_FLAG
;
7130 if (hMachine
!= NULL
)
7132 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7133 if (BindingHandle
== NULL
)
7136 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7137 if (StringTable
== 0)
7142 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7146 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7147 if (lpDevInst
== NULL
)
7148 return CR_INVALID_DEVNODE
;
7150 ulTransferLength
= *pulLength
;
7154 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
7157 (LPWSTR
)pszReference
,
7163 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7165 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7173 /***********************************************************************
7174 * CM_Remove_SubTree [SETUPAPI.@]
7176 * This function is obsolete in Windows XP and above.
7181 _In_ DEVINST dnAncestor
,
7184 TRACE("CM_Remove_SubTree(%lx %lx)\n",
7185 dnAncestor
, ulFlags
);
7187 return CR_CALL_NOT_IMPLEMENTED
;
7191 /***********************************************************************
7192 * CM_Remove_SubTree_Ex [SETUPAPI.@]
7194 * This function is obsolete in Windows XP and above.
7198 CM_Remove_SubTree_Ex(
7199 _In_ DEVINST dnAncestor
,
7201 _In_opt_ HMACHINE hMachine
)
7203 TRACE("CM_Remove_SubTree_Ex(%lx %lx %p)\n",
7204 dnAncestor
, ulFlags
, hMachine
);
7206 return CR_CALL_NOT_IMPLEMENTED
;
7210 /***********************************************************************
7211 * CM_Request_Device_EjectA [SETUPAPI.@]
7215 CM_Request_Device_EjectA(
7216 _In_ DEVINST dnDevInst
,
7217 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7218 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7219 _In_ ULONG ulNameLength
,
7222 TRACE("CM_Request_Device_EjectA(%lx %p %s %lu %lx)\n",
7223 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
);
7225 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
7226 ulNameLength
, ulFlags
, NULL
);
7230 /***********************************************************************
7231 * CM_Request_Device_EjectW [SETUPAPI.@]
7235 CM_Request_Device_EjectW(
7236 _In_ DEVINST dnDevInst
,
7237 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7238 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7239 _In_ ULONG ulNameLength
,
7242 TRACE("CM_Request_Device_EjectW(%lx %p %s %lu %lx)\n",
7243 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
7245 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
7246 ulNameLength
, ulFlags
, NULL
);
7250 /***********************************************************************
7251 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
7255 CM_Request_Device_Eject_ExA(
7256 _In_ DEVINST dnDevInst
,
7257 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7258 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7259 _In_ ULONG ulNameLength
,
7261 _In_opt_ HMACHINE hMachine
)
7263 LPWSTR lpLocalVetoName
;
7266 TRACE("CM_Request_Device_Eject_ExA(%lx %p %s %lu %lx %p)\n",
7267 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7269 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7270 return CR_INVALID_POINTER
;
7272 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
7273 if (lpLocalVetoName
== NULL
)
7274 return CR_OUT_OF_MEMORY
;
7276 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
7277 ulNameLength
, ulFlags
, hMachine
);
7278 if (ret
== CR_REMOVE_VETOED
)
7280 if (WideCharToMultiByte(CP_ACP
,
7291 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
7297 /***********************************************************************
7298 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
7302 CM_Request_Device_Eject_ExW(
7303 _In_ DEVINST dnDevInst
,
7304 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7305 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7306 _In_ ULONG ulNameLength
,
7308 _In_opt_ HMACHINE hMachine
)
7310 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7311 HSTRING_TABLE StringTable
= NULL
;
7315 TRACE("CM_Request_Device_Eject_ExW(%lx %p %s %lu %lx %p)\n",
7316 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7319 return CR_INVALID_DEVNODE
;
7322 return CR_INVALID_FLAG
;
7324 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7325 return CR_INVALID_POINTER
;
7327 if (hMachine
!= NULL
)
7329 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7330 if (BindingHandle
== NULL
)
7333 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7334 if (StringTable
== 0)
7339 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7343 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7344 if (lpDevInst
== NULL
)
7345 return CR_INVALID_DEVNODE
;
7349 ret
= PNP_RequestDeviceEject(BindingHandle
,
7356 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7358 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7366 /***********************************************************************
7367 * CM_Request_Eject_PC [SETUPAPI.@]
7371 CM_Request_Eject_PC(VOID
)
7373 TRACE("CM_Request_Eject_PC()\n");
7375 return CM_Request_Eject_PC_Ex(NULL
);
7379 /***********************************************************************
7380 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
7384 CM_Request_Eject_PC_Ex(
7385 _In_opt_ HMACHINE hMachine
)
7387 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7390 TRACE("CM_Request_Eject_PC_Ex(%p)\n", hMachine
);
7392 if (hMachine
!= NULL
)
7394 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7395 if (BindingHandle
== NULL
)
7400 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7406 ret
= PNP_RequestEjectPC(BindingHandle
);
7408 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7410 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7418 /***********************************************************************
7419 * CM_Run_Detection [SETUPAPI.@]
7426 TRACE("CM_Run_Detection(%lx)\n", ulFlags
);
7428 return CM_Run_Detection_Ex(ulFlags
, NULL
);
7432 /***********************************************************************
7433 * CM_Run_Detection_Ex [SETUPAPI.@]
7437 CM_Run_Detection_Ex(
7439 _In_opt_ HMACHINE hMachine
)
7441 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7444 TRACE("CM_Run_Detection_Ex(%lx %p)\n",
7447 if (!pSetupIsUserAdmin())
7448 return CR_ACCESS_DENIED
;
7450 if (ulFlags
& ~CM_DETECT_BITS
)
7451 return CR_INVALID_FLAG
;
7453 if (hMachine
!= NULL
)
7455 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7456 if (BindingHandle
== NULL
)
7461 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7467 ret
= PNP_RunDetection(BindingHandle
,
7470 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7472 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7480 /***********************************************************************
7481 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
7485 CM_Set_Class_Registry_PropertyA(
7486 _In_ LPGUID ClassGuid
,
7487 _In_ ULONG ulProperty
,
7488 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7489 _In_ ULONG ulLength
,
7491 _In_opt_ HMACHINE hMachine
)
7493 FIXME("CM_Set_Class_Registry_PropertyA(%p %lx %p %lu %lx %p)\n",
7494 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7496 return CR_CALL_NOT_IMPLEMENTED
;
7500 /***********************************************************************
7501 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
7505 CM_Set_Class_Registry_PropertyW(
7506 _In_ LPGUID ClassGuid
,
7507 _In_ ULONG ulProperty
,
7508 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7509 _In_ ULONG ulLength
,
7511 _In_opt_ HMACHINE hMachine
)
7513 FIXME("CM_Set_Class_Registry_PropertyW(%p %lx %p %lu %lx %p)\n",
7514 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7516 return CR_CALL_NOT_IMPLEMENTED
;
7520 /***********************************************************************
7521 * CM_Set_DevNode_Problem [SETUPAPI.@]
7525 CM_Set_DevNode_Problem(
7526 _In_ DEVINST dnDevInst
,
7527 _In_ ULONG ulProblem
,
7530 TRACE("CM_Set_DevNode_Problem(%lx %lx %lx)\n",
7531 dnDevInst
, ulProblem
, ulFlags
);
7533 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
7537 /***********************************************************************
7538 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
7542 CM_Set_DevNode_Problem_Ex(
7543 _In_ DEVINST dnDevInst
,
7544 _In_ ULONG ulProblem
,
7546 _In_opt_ HMACHINE hMachine
)
7548 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7549 HSTRING_TABLE StringTable
= NULL
;
7553 TRACE("CM_Set_DevNode_Problem_Ex(%lx %lx %lx %p)\n",
7554 dnDevInst
, ulProblem
, ulFlags
, hMachine
);
7557 return CR_INVALID_DEVNODE
;
7559 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
7560 return CR_INVALID_FLAG
;
7562 if (hMachine
!= NULL
)
7564 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7565 if (BindingHandle
== NULL
)
7568 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7569 if (StringTable
== 0)
7574 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7578 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7579 if (lpDevInst
== NULL
)
7580 return CR_INVALID_DEVNODE
;
7584 ret
= PNP_SetDeviceProblem(BindingHandle
,
7589 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7591 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7599 /***********************************************************************
7600 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
7604 CM_Set_DevNode_Registry_PropertyA(
7605 _In_ DEVINST dnDevInst
,
7606 _In_ ULONG ulProperty
,
7607 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7608 _In_ ULONG ulLength
,
7611 TRACE("CM_Set_DevNode_Registry_PropertyA(%lx %lu %p %lx %lx)\n",
7612 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7614 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
7620 /***********************************************************************
7621 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
7625 CM_Set_DevNode_Registry_PropertyW(
7626 _In_ DEVINST dnDevInst
,
7627 _In_ ULONG ulProperty
,
7628 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7629 _In_ ULONG ulLength
,
7632 TRACE("CM_Set_DevNode_Registry_PropertyW(%lx %lu %p %lx %lx)\n",
7633 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7635 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
7641 /***********************************************************************
7642 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
7646 CM_Set_DevNode_Registry_Property_ExA(
7647 _In_ DEVINST dnDevInst
,
7648 _In_ ULONG ulProperty
,
7649 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7650 _In_ ULONG ulLength
,
7652 _In_opt_ HMACHINE hMachine
)
7654 CONFIGRET ret
= CR_SUCCESS
;
7658 FIXME("CM_Set_DevNode_Registry_Property_ExA(%lx %lu %p %lx %lx %p)\n",
7659 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7661 if (Buffer
== NULL
&& ulLength
!= 0)
7662 return CR_INVALID_POINTER
;
7664 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7665 return CR_INVALID_PROPERTY
;
7669 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7678 /* Get property type */
7679 ulType
= GetRegistryPropertyType(ulProperty
);
7681 /* Allocate buffer if needed */
7682 if (ulType
== REG_SZ
||
7683 ulType
== REG_MULTI_SZ
)
7685 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
7686 if (lpBuffer
== NULL
)
7688 ret
= CR_OUT_OF_MEMORY
;
7692 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
7693 ulLength
, lpBuffer
, ulLength
))
7700 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7703 ulLength
* sizeof(WCHAR
),
7712 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7720 ret
= CR_CALL_NOT_IMPLEMENTED
;
7727 /***********************************************************************
7728 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
7732 CM_Set_DevNode_Registry_Property_ExW(
7733 _In_ DEVINST dnDevInst
,
7734 _In_ ULONG ulProperty
,
7735 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7736 _In_ ULONG ulLength
,
7738 _In_opt_ HMACHINE hMachine
)
7740 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7741 HSTRING_TABLE StringTable
= NULL
;
7746 TRACE("CM_Set_DevNode_Registry_Property_ExW(%lx %lu %p %lx %lx %p)\n",
7747 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7750 return CR_INVALID_DEVNODE
;
7752 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7753 return CR_INVALID_PROPERTY
;
7755 if (Buffer
!= NULL
&& ulLength
== 0)
7756 return CR_INVALID_POINTER
;
7759 return CR_INVALID_FLAG
;
7761 if (hMachine
!= NULL
)
7763 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7764 if (BindingHandle
== NULL
)
7767 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7768 if (StringTable
== 0)
7773 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7777 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7778 if (lpDevInst
== NULL
)
7779 return CR_INVALID_DEVNODE
;
7781 /* Get property type */
7782 ulType
= GetRegistryPropertyType(ulProperty
);
7786 ret
= PNP_SetDeviceRegProp(BindingHandle
,
7794 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7796 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7804 /***********************************************************************
7805 * CM_Set_HW_Prof [SETUPAPI.@]
7810 _In_ ULONG ulHardwareProfile
,
7813 TRACE("CM_Set_HW_Prof(%lu %lx)\n",
7814 ulHardwareProfile
, ulFlags
);
7816 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
7820 /***********************************************************************
7821 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
7826 _In_ ULONG ulHardwareProfile
,
7828 _In_opt_ HMACHINE hMachine
)
7830 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7833 TRACE("CM_Set_HW_Prof_Ex(%lu %lx %p)\n",
7834 ulHardwareProfile
, ulFlags
, hMachine
);
7836 if (!pSetupIsUserAdmin())
7837 return CR_ACCESS_DENIED
;
7840 return CR_INVALID_FLAG
;
7842 if (hMachine
!= NULL
)
7844 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7845 if (BindingHandle
== NULL
)
7850 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7856 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
7858 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7860 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7868 /***********************************************************************
7869 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
7873 CM_Set_HW_Prof_FlagsA(
7874 _In_ DEVINSTID_A szDevInstName
,
7875 _In_ ULONG ulConfig
,
7879 TRACE("CM_Set_HW_Prof_FlagsA(%s %lu %lu %lx)\n",
7880 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7882 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
7887 /***********************************************************************
7888 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
7892 CM_Set_HW_Prof_FlagsW(
7893 _In_ DEVINSTID_W szDevInstName
,
7894 _In_ ULONG ulConfig
,
7898 TRACE("CM_Set_HW_Prof_FlagsW(%s %lu %lu %lx)\n",
7899 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7901 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
7906 /***********************************************************************
7907 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
7911 CM_Set_HW_Prof_Flags_ExA(
7912 _In_ DEVINSTID_A szDevInstName
,
7913 _In_ ULONG ulConfig
,
7916 _In_opt_ HMACHINE hMachine
)
7918 DEVINSTID_W pszDevIdW
= NULL
;
7919 CONFIGRET ret
= CR_SUCCESS
;
7921 TRACE("CM_Set_HW_Prof_Flags_ExA(%s %lu %lu %lx %p)\n",
7922 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7924 if (szDevInstName
!= NULL
)
7926 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
7927 return CR_INVALID_DEVICE_ID
;
7930 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
7933 if (pszDevIdW
!= NULL
)
7940 /***********************************************************************
7941 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
7945 CM_Set_HW_Prof_Flags_ExW(
7946 _In_ DEVINSTID_W szDevInstName
,
7947 _In_ ULONG ulConfig
,
7950 _In_opt_ HMACHINE hMachine
)
7952 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7955 FIXME("CM_Set_HW_Prof_Flags_ExW(%s %lu %lu %lx %p)\n",
7956 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7958 if (szDevInstName
== NULL
)
7959 return CR_INVALID_POINTER
;
7961 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
7962 return CR_INVALID_FLAG
;
7964 /* FIXME: Check whether szDevInstName is valid */
7966 if (hMachine
!= NULL
)
7968 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7969 if (BindingHandle
== NULL
)
7974 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7980 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
7981 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
7983 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7985 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7993 /***********************************************************************
7994 * CM_Setup_DevNode [SETUPAPI.@]
7999 _In_ DEVINST dnDevInst
,
8002 TRACE("CM_Setup_DevNode(%lx %lx)\n",
8003 dnDevInst
, ulFlags
);
8005 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
8009 /***********************************************************************
8010 * CM_Setup_DevNode_Ex [SETUPAPI.@]
8014 CM_Setup_DevNode_Ex(
8015 _In_ DEVINST dnDevInst
,
8017 _In_opt_ HMACHINE hMachine
)
8019 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8020 HSTRING_TABLE StringTable
= NULL
;
8024 FIXME("CM_Setup_DevNode_Ex(%lx %lx %p)\n",
8025 dnDevInst
, ulFlags
, hMachine
);
8027 if (!pSetupIsUserAdmin())
8028 return CR_ACCESS_DENIED
;
8031 return CR_INVALID_DEVNODE
;
8033 if (ulFlags
& ~CM_SETUP_BITS
)
8034 return CR_INVALID_FLAG
;
8036 if (hMachine
!= NULL
)
8038 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8039 if (BindingHandle
== NULL
)
8042 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
8043 if (StringTable
== 0)
8048 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
8052 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
8053 if (lpDevInst
== NULL
)
8054 return CR_INVALID_DEVNODE
;
8058 ret
= PNP_DeviceInstanceAction(BindingHandle
,
8064 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8066 ret
= RpcStatusToCmStatus(RpcExceptionCode());
8074 /***********************************************************************
8075 * CM_Test_Range_Available [SETUPAPI.@]
8079 CM_Test_Range_Available(
8080 _In_ DWORDLONG ullStartValue
,
8081 _In_ DWORDLONG ullEndValue
,
8082 _In_ RANGE_LIST rlh
,
8085 FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
8086 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
8087 return CR_CALL_NOT_IMPLEMENTED
;
8091 /***********************************************************************
8092 * CM_Uninstall_DevNode [SETUPAPI.@]
8096 CM_Uninstall_DevNode(
8097 _In_ DEVINST dnPhantom
,
8100 TRACE("CM_Uninstall_DevNode(%lx %lx)\n",
8101 dnPhantom
, ulFlags
);
8103 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
8107 /***********************************************************************
8108 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
8112 CM_Uninstall_DevNode_Ex(
8113 _In_ DEVINST dnPhantom
,
8115 _In_opt_ HMACHINE hMachine
)
8117 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8118 HSTRING_TABLE StringTable
= NULL
;
8122 TRACE("CM_Uninstall_DevNode_Ex(%lx %lx %p)\n",
8123 dnPhantom
, ulFlags
, hMachine
);
8126 return CR_INVALID_DEVNODE
;
8129 return CR_INVALID_FLAG
;
8131 if (hMachine
!= NULL
)
8133 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8134 if (BindingHandle
== NULL
)
8137 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
8138 if (StringTable
== 0)
8143 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
8147 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
8148 if (lpDevInst
== NULL
)
8149 return CR_INVALID_DEVNODE
;
8153 ret
= PNP_UninstallDevInst(BindingHandle
,
8157 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8159 ret
= RpcStatusToCmStatus(RpcExceptionCode());
8167 /***********************************************************************
8168 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
8172 CM_Unregister_Device_InterfaceA(
8173 _In_ LPCSTR pszDeviceInterface
,
8176 TRACE("CM_Unregister_Device_InterfaceA(%s %lx)\n",
8177 debugstr_a(pszDeviceInterface
), ulFlags
);
8179 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
8184 /***********************************************************************
8185 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
8189 CM_Unregister_Device_InterfaceW(
8190 _In_ LPCWSTR pszDeviceInterface
,
8193 TRACE("CM_Unregister_Device_InterfaceW(%s %lx)\n",
8194 debugstr_w(pszDeviceInterface
), ulFlags
);
8196 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
8201 /***********************************************************************
8202 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
8206 CM_Unregister_Device_Interface_ExA(
8207 _In_ LPCSTR pszDeviceInterface
,
8209 _In_opt_ HMACHINE hMachine
)
8211 LPWSTR pszDeviceInterfaceW
= NULL
;
8214 TRACE("CM_Unregister_Device_Interface_ExA(%s %lx %p)\n",
8215 debugstr_a(pszDeviceInterface
), ulFlags
, hMachine
);
8217 if (pszDeviceInterface
== NULL
)
8218 return CR_INVALID_POINTER
;
8220 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
8221 return CR_INVALID_DATA
;
8223 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
8226 if (pszDeviceInterfaceW
!= NULL
)
8227 MyFree(pszDeviceInterfaceW
);
8233 /***********************************************************************
8234 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
8238 CM_Unregister_Device_Interface_ExW(
8239 _In_ LPCWSTR pszDeviceInterface
,
8241 _In_opt_ HMACHINE hMachine
)
8243 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8246 TRACE("CM_Unregister_Device_Interface_ExW(%s %lx %p)\n",
8247 debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
8249 if (pszDeviceInterface
== NULL
)
8250 return CR_INVALID_POINTER
;
8253 return CR_INVALID_FLAG
;
8255 if (hMachine
!= NULL
)
8257 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8258 if (BindingHandle
== NULL
)
8263 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
8269 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
8270 (LPWSTR
)pszDeviceInterface
,
8273 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8275 ret
= RpcStatusToCmStatus(RpcExceptionCode());