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
,
638 &pNotifyData
->ulNotifyData
);
640 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
642 ret
= RpcStatusToCmStatus(RpcExceptionCode());
646 if (ret
== CR_SUCCESS
)
648 *phDevNotify
= (HDEVNOTIFY
)pNotifyData
;
652 if (pNotifyData
!= NULL
)
653 HeapFree(GetProcessHeap(), 0, pNotifyData
);
655 *phDevNotify
= (HDEVNOTIFY
)NULL
;
662 /***********************************************************************
663 * CMP_Report_LogOn [SETUPAPI.@]
669 _In_ DWORD dwProcessId
)
671 RPC_BINDING_HANDLE BindingHandle
= NULL
;
672 CONFIGRET ret
= CR_SUCCESS
;
676 TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic
, dwProcessId
);
678 if (dwMagic
!= CMP_MAGIC
)
679 return CR_INVALID_DATA
;
681 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
684 bAdmin
= pSetupIsUserAdmin();
686 for (i
= 0; i
< 30; i
++)
690 ret
= PNP_ReportLogOn(BindingHandle
,
694 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
696 ret
= RpcStatusToCmStatus(RpcExceptionCode());
700 if (ret
== CR_SUCCESS
)
710 /***********************************************************************
711 * CMP_UnregisterNotification [SETUPAPI.@]
715 CMP_UnregisterNotification(
716 _In_ HDEVNOTIFY hDevNotify
)
718 RPC_BINDING_HANDLE BindingHandle
= NULL
;
719 PNOTIFY_DATA pNotifyData
;
720 CONFIGRET ret
= CR_SUCCESS
;
722 TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify
);
724 pNotifyData
= (PNOTIFY_DATA
)hDevNotify
;
726 if ((pNotifyData
== NULL
) ||
727 (pNotifyData
->ulMagic
!= NOTIFY_MAGIC
))
728 return CR_INVALID_POINTER
;
730 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
735 ret
= PNP_UnregisterNotification(BindingHandle
,
736 pNotifyData
->ulNotifyData
);
738 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
740 ret
= RpcStatusToCmStatus(RpcExceptionCode());
744 if (ret
== CR_SUCCESS
)
745 HeapFree(GetProcessHeap(), 0, pNotifyData
);
751 /***********************************************************************
752 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
756 CMP_WaitNoPendingInstallEvents(
757 _In_ DWORD dwTimeout
)
762 TRACE("CMP_WaitNoPendingInstallEvents(%lu)\n", dwTimeout
);
764 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
768 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
774 /***********************************************************************
775 * CMP_WaitServicesAvailable [SETUPAPI.@]
779 CMP_WaitServicesAvailable(
780 _In_opt_ HMACHINE hMachine
)
782 RPC_BINDING_HANDLE BindingHandle
= NULL
;
783 CONFIGRET ret
= CR_SUCCESS
;
786 TRACE("CMP_WaitServicesAvailable(%p)\n", hMachine
);
788 if (hMachine
!= NULL
)
790 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
791 if (BindingHandle
== NULL
)
796 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
802 ret
= PNP_GetVersion(BindingHandle
, &Version
);
804 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
806 ret
= RpcStatusToCmStatus(RpcExceptionCode());
814 /***********************************************************************
815 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
819 CM_Add_Empty_Log_Conf(
820 _Out_ PLOG_CONF plcLogConf
,
821 _In_ DEVINST dnDevInst
,
822 _In_ PRIORITY Priority
,
825 TRACE("CM_Add_Empty_Log_Conf(%p %p %lu %lx)\n",
826 plcLogConf
, dnDevInst
, Priority
, ulFlags
);
828 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
833 /***********************************************************************
834 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
838 CM_Add_Empty_Log_Conf_Ex(
839 _Out_ PLOG_CONF plcLogConf
,
840 _In_ DEVINST dnDevInst
,
841 _In_ PRIORITY Priority
,
843 _In_opt_ HMACHINE hMachine
)
845 RPC_BINDING_HANDLE BindingHandle
= NULL
;
846 HSTRING_TABLE StringTable
= NULL
;
847 ULONG ulLogConfTag
= 0;
849 PLOG_CONF_INFO pLogConfInfo
;
850 CONFIGRET ret
= CR_SUCCESS
;
852 FIXME("CM_Add_Empty_Log_Conf_Ex(%p %p %lu %lx %p)\n",
853 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
855 if (!pSetupIsUserAdmin())
856 return CR_ACCESS_DENIED
;
858 if (plcLogConf
== NULL
)
859 return CR_INVALID_POINTER
;
862 return CR_INVALID_DEVINST
;
864 if (Priority
> 0xFFFF)
865 return CR_INVALID_PRIORITY
;
867 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
868 return CR_INVALID_FLAG
;
870 if (hMachine
!= NULL
)
872 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
873 if (BindingHandle
== NULL
)
876 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
877 if (StringTable
== 0)
882 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
886 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
887 if (lpDevInst
== NULL
)
888 return CR_INVALID_DEVNODE
;
892 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
893 &ulLogConfTag
, ulFlags
);
895 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
897 ret
= RpcStatusToCmStatus(RpcExceptionCode());
901 if (ret
== CR_SUCCESS
)
903 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
904 if (pLogConfInfo
== NULL
)
906 ret
= CR_OUT_OF_MEMORY
;
910 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
911 pLogConfInfo
->dnDevInst
= dnDevInst
;
912 pLogConfInfo
->ulFlags
= ulFlags
;
913 pLogConfInfo
->ulTag
= ulLogConfTag
;
915 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
925 /***********************************************************************
926 * CM_Add_IDA [SETUPAPI.@]
931 _In_ DEVINST dnDevInst
,
935 TRACE("CM_Add_IDA(%p %s %lx)\n",
936 dnDevInst
, debugstr_a(pszID
), ulFlags
);
938 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
942 /***********************************************************************
943 * CM_Add_IDW [SETUPAPI.@]
948 _In_ DEVINST dnDevInst
,
952 TRACE("CM_Add_IDW(%p %s %lx)\n",
953 dnDevInst
, debugstr_w(pszID
), ulFlags
);
955 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
959 /***********************************************************************
960 * CM_Add_ID_ExA [SETUPAPI.@]
965 _In_ DEVINST dnDevInst
,
968 _In_opt_ HMACHINE hMachine
)
973 TRACE("CM_Add_ID_ExA(%p %s %lx %p)\n",
974 dnDevInst
, debugstr_a(pszID
), ulFlags
, hMachine
);
976 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
977 return CR_INVALID_DATA
;
979 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
987 /***********************************************************************
988 * CM_Add_ID_ExW [SETUPAPI.@]
993 _In_ DEVINST dnDevInst
,
996 _In_opt_ HMACHINE hMachine
)
998 RPC_BINDING_HANDLE BindingHandle
= NULL
;
999 HSTRING_TABLE StringTable
= NULL
;
1003 TRACE("CM_Add_ID_ExW(%p %s %lx %p)\n",
1004 dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
1006 if (!pSetupIsUserAdmin())
1007 return CR_ACCESS_DENIED
;
1010 return CR_INVALID_DEVINST
;
1013 return CR_INVALID_POINTER
;
1015 if (ulFlags
& ~CM_ADD_ID_BITS
)
1016 return CR_INVALID_FLAG
;
1018 if (hMachine
!= NULL
)
1020 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1021 if (BindingHandle
== NULL
)
1024 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1025 if (StringTable
== 0)
1030 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1034 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1035 if (lpDevInst
== NULL
)
1036 return CR_INVALID_DEVNODE
;
1040 ret
= PNP_AddID(BindingHandle
,
1045 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1047 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1055 /***********************************************************************
1056 * CM_Add_Range [SETUPAPI.@]
1061 _In_ DWORDLONG ullStartValue
,
1062 _In_ DWORDLONG ullEndValue
,
1063 _In_ RANGE_LIST rlh
,
1066 PINTERNAL_RANGE_LIST pRangeList
;
1067 PINTERNAL_RANGE pRange
;
1068 CONFIGRET ret
= CR_SUCCESS
;
1070 FIXME("CM_Add_Range(%I64u %I64u %p %lx)\n",
1071 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1073 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
1075 if (!IsValidRangeList(pRangeList
))
1076 return CR_INVALID_RANGE_LIST
;
1078 if (ulFlags
& ~CM_ADD_RANGE_BITS
)
1079 return CR_INVALID_FLAG
;
1081 if (ullEndValue
< ullStartValue
)
1082 return CR_INVALID_RANGE
;
1084 /* Lock the range list */
1085 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
1087 /* Allocate the new range */
1088 pRange
= HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNAL_RANGE
));
1091 ret
= CR_OUT_OF_MEMORY
;
1095 pRange
->pRangeList
= pRangeList
;
1096 pRange
->ullStart
= ullStartValue
;
1097 pRange
->ullEnd
= ullEndValue
;
1099 /* Insert the range */
1100 if (IsListEmpty(&pRangeList
->ListHead
))
1102 InsertTailList(&pRangeList
->ListHead
, &pRange
->ListEntry
);
1106 HeapFree(GetProcessHeap(), 0, pRange
);
1111 /* Unlock the range list */
1112 ReleaseMutex(pRangeList
->hMutex
);
1118 /***********************************************************************
1119 * CM_Add_Res_Des [SETUPAPI.@]
1124 _Out_opt_ PRES_DES prdResDes
,
1125 _In_ LOG_CONF lcLogConf
,
1126 _In_ RESOURCEID ResourceID
,
1127 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1128 _In_ ULONG ResourceLen
,
1131 TRACE("CM_Add_Res_Des(%p %p %lu %p %lu %lx)\n",
1132 prdResDes
, lcLogConf
, ResourceID
, ResourceData
, ResourceLen
, ulFlags
);
1134 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
1135 ResourceLen
, ulFlags
, NULL
);
1139 /***********************************************************************
1140 * CM_Add_Res_Des_Ex [SETUPAPI.@]
1145 _Out_opt_ PRES_DES prdResDes
,
1146 _In_ LOG_CONF lcLogConf
,
1147 _In_ RESOURCEID ResourceID
,
1148 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1149 _In_ ULONG ResourceLen
,
1151 _In_opt_ HMACHINE hMachine
)
1153 FIXME("CM_Add_Res_Des_Ex(%p %p %lu %p %lu %lx %p)\n",
1154 prdResDes
, lcLogConf
, ResourceID
,
1155 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
1157 return CR_CALL_NOT_IMPLEMENTED
;
1161 /***********************************************************************
1162 * CM_Connect_MachineA [SETUPAPI.@]
1166 CM_Connect_MachineA(
1167 _In_opt_ PCSTR UNCServerName
,
1168 _Out_ PHMACHINE phMachine
)
1173 TRACE("CM_Connect_MachineA(%s %p)\n",
1174 debugstr_a(UNCServerName
), phMachine
);
1176 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1177 return CM_Connect_MachineW(NULL
, phMachine
);
1179 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
1180 return CR_INVALID_DATA
;
1182 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
1184 MyFree(pServerNameW
);
1190 /***********************************************************************
1191 * CM_Connect_MachineW [SETUPAPI.@]
1195 CM_Connect_MachineW(
1196 _In_opt_ PCWSTR UNCServerName
,
1197 _Out_ PHMACHINE phMachine
)
1199 PMACHINE_INFO pMachine
;
1201 TRACE("CM_Connect_MachineW(%s %p)\n",
1202 debugstr_w(UNCServerName
), phMachine
);
1204 if (phMachine
== NULL
)
1205 return CR_INVALID_POINTER
;
1209 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
1210 if (pMachine
== NULL
)
1211 return CR_OUT_OF_MEMORY
;
1213 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1215 pMachine
->bLocal
= TRUE
;
1217 /* FIXME: store the computers name in pMachine->szMachineName */
1219 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
1220 &pMachine
->StringTable
))
1222 HeapFree(GetProcessHeap(), 0, pMachine
);
1228 pMachine
->bLocal
= FALSE
;
1229 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
1231 HeapFree(GetProcessHeap(), 0, pMachine
);
1232 return CR_INVALID_MACHINENAME
;
1234 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
1236 pMachine
->StringTable
= pSetupStringTableInitialize();
1237 if (pMachine
->StringTable
== NULL
)
1239 HeapFree(GetProcessHeap(), 0, pMachine
);
1243 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
1245 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
1247 pSetupStringTableDestroy(pMachine
->StringTable
);
1248 HeapFree(GetProcessHeap(), 0, pMachine
);
1249 return CR_INVALID_MACHINENAME
;
1253 *phMachine
= (PHMACHINE
)pMachine
;
1259 /***********************************************************************
1260 * CM_Create_DevNodeA [SETUPAPI.@]
1265 _Out_ PDEVINST pdnDevInst
,
1266 _In_ DEVINSTID_A pDeviceID
,
1267 _In_ DEVINST dnParent
,
1270 TRACE("CM_Create_DevNodeA(%p %s %p %lx)\n",
1271 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
1273 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
1278 /***********************************************************************
1279 * CM_Create_DevNodeW [SETUPAPI.@]
1284 _Out_ PDEVINST pdnDevInst
,
1285 _In_ DEVINSTID_W pDeviceID
,
1286 _In_ DEVINST dnParent
,
1289 TRACE("CM_Create_DevNodeW(%p %s %p %lx)\n",
1290 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
1292 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
1297 /***********************************************************************
1298 * CM_Create_DevNode_ExA [SETUPAPI.@]
1302 CM_Create_DevNode_ExA(
1303 _Out_ PDEVINST pdnDevInst
,
1304 _In_ DEVINSTID_A pDeviceID
,
1305 _In_ DEVINST dnParent
,
1307 _In_opt_ HANDLE hMachine
)
1309 DEVINSTID_W pDeviceIDW
;
1312 TRACE("CM_Create_DevNode_ExA(%p %s %p %lx %p)\n",
1313 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1315 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
1316 return CR_INVALID_DATA
;
1318 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
1327 /***********************************************************************
1328 * CM_Create_DevNode_ExW [SETUPAPI.@]
1332 CM_Create_DevNode_ExW(
1333 _Out_ PDEVINST pdnDevInst
,
1334 _In_ DEVINSTID_W pDeviceID
,
1335 _In_ DEVINST dnParent
,
1337 _In_opt_ HANDLE hMachine
)
1339 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1340 HSTRING_TABLE StringTable
= NULL
;
1341 LPWSTR lpParentDevInst
;
1342 CONFIGRET ret
= CR_SUCCESS
;
1343 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
1345 TRACE("CM_Create_DevNode_ExW(%p %s %p %lx %p)\n",
1346 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1348 if (!pSetupIsUserAdmin())
1349 return CR_ACCESS_DENIED
;
1351 if (pdnDevInst
== NULL
)
1352 return CR_INVALID_POINTER
;
1354 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
1355 return CR_INVALID_DEVICE_ID
;
1358 return CR_INVALID_DEVNODE
;
1360 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
1361 return CR_INVALID_FLAG
;
1363 if (hMachine
!= NULL
)
1365 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1366 if (BindingHandle
== NULL
)
1369 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1370 if (StringTable
== 0)
1375 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1379 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
1380 if (lpParentDevInst
== NULL
)
1381 return CR_INVALID_DEVNODE
;
1383 wcscpy(szLocalDeviceID
, pDeviceID
);
1387 ret
= PNP_CreateDevInst(BindingHandle
,
1393 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1395 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1399 if (ret
== CR_SUCCESS
)
1401 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
1402 * will return the generated device ID in szLocalDeviceID */
1403 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
1404 if (*pdnDevInst
== 0)
1405 ret
= CR_NO_SUCH_DEVNODE
;
1412 /***********************************************************************
1413 * CM_Create_Range_List [SETUPAPI.@]
1417 CM_Create_Range_List(
1418 _Out_ PRANGE_LIST prlh
,
1421 PINTERNAL_RANGE_LIST pRangeList
= NULL
;
1423 FIXME("CM_Create_Range_List(%p %lx)\n",
1427 return CR_INVALID_FLAG
;
1430 return CR_INVALID_POINTER
;
1432 /* Allocate the range list */
1433 pRangeList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(INTERNAL_RANGE_LIST
));
1434 if (pRangeList
== NULL
)
1435 return CR_OUT_OF_MEMORY
;
1437 /* Set the magic value */
1438 pRangeList
->ulMagic
= RANGE_LIST_MAGIC
;
1440 /* Initialize the mutex for synchonized access */
1441 pRangeList
->hMutex
= CreateMutex(NULL
, FALSE
, NULL
);
1442 if (pRangeList
->hMutex
== NULL
)
1444 HeapFree(GetProcessHeap(), 0, pRangeList
);
1448 InitializeListHead(&pRangeList
->ListHead
);
1450 *prlh
= (RANGE_LIST
)pRangeList
;
1456 /***********************************************************************
1457 * CM_Delete_Class_Key [SETUPAPI.@]
1461 CM_Delete_Class_Key(
1462 _In_ LPGUID ClassGuid
,
1465 TRACE("CM_Delete_Class_Key(%p %lx)\n",
1466 ClassGuid
, ulFlags
);
1468 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
1472 /***********************************************************************
1473 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
1477 CM_Delete_Class_Key_Ex(
1478 _In_ LPGUID ClassGuid
,
1480 _In_opt_ HANDLE hMachine
)
1482 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1483 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1486 TRACE("CM_Delete_Class_Key_Ex(%p %lx %p)\n",
1487 ClassGuid
, ulFlags
, hMachine
);
1489 if (ClassGuid
== NULL
)
1490 return CR_INVALID_POINTER
;
1492 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
1493 return CR_INVALID_FLAG
;
1495 if (!GuidToString(ClassGuid
, szGuidString
))
1496 return CR_INVALID_DATA
;
1498 if (hMachine
!= NULL
)
1500 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1501 if (BindingHandle
== NULL
)
1506 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1512 ret
= PNP_DeleteClassKey(BindingHandle
,
1516 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1518 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1526 /***********************************************************************
1527 * CM_Delete_DevNode_Key [SETUPAPI.@]
1531 CM_Delete_DevNode_Key(
1532 _In_ DEVNODE dnDevNode
,
1533 _In_ ULONG ulHardwareProfile
,
1536 TRACE("CM_Delete_DevNode_Key(%p %lu %lx)\n",
1537 dnDevNode
, ulHardwareProfile
, ulFlags
);
1539 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
1544 /***********************************************************************
1545 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
1549 CM_Delete_DevNode_Key_Ex(
1550 _In_ DEVNODE dnDevNode
,
1551 _In_ ULONG ulHardwareProfile
,
1553 _In_opt_ HANDLE hMachine
)
1555 FIXME("CM_Delete_DevNode_Key_Ex(%p %lu %lx %p)\n",
1556 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
1558 return CR_CALL_NOT_IMPLEMENTED
;
1562 /***********************************************************************
1563 * CM_Delete_Range [SETUPAPI.@]
1568 _In_ DWORDLONG ullStartValue
,
1569 _In_ DWORDLONG ullEndValue
,
1570 _In_ RANGE_LIST rlh
,
1573 FIXME("CM_Delete_Range(%I64u %I64u %p %lx)\n",
1574 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1576 return CR_CALL_NOT_IMPLEMENTED
;
1580 /***********************************************************************
1581 * CM_Detect_Resource_Conflict [SETUPAPI.@]
1585 CM_Detect_Resource_Conflict(
1586 _In_ DEVINST dnDevInst
,
1587 _In_ RESOURCEID ResourceID
,
1588 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1589 _In_ ULONG ResourceLen
,
1590 _Out_ PBOOL pbConflictDetected
,
1593 TRACE("CM_Detect_Resource_Conflict(%p %lu %p %lu %p 0x%lx)\n",
1594 dnDevInst
, ResourceID
, ResourceData
, ResourceLen
,
1595 pbConflictDetected
, ulFlags
);
1597 return CM_Detect_Resource_Conflict_Ex(dnDevInst
,
1607 /***********************************************************************
1608 * CM_Detect_Resource_Conflict_Ex [SETUPAPI.@]
1612 CM_Detect_Resource_Conflict_Ex(
1613 _In_ DEVINST dnDevInst
,
1614 _In_ RESOURCEID ResourceID
,
1615 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1616 _In_ ULONG ResourceLen
,
1617 _Out_ PBOOL pbConflictDetected
,
1619 _In_opt_ HMACHINE hMachine
)
1621 FIXME("CM_Detect_Resource_Conflict_Ex(%p %lu %p %lu %p 0x%lx %p)\n",
1622 dnDevInst
, ResourceID
, ResourceData
, ResourceLen
,
1623 pbConflictDetected
, ulFlags
, hMachine
);
1625 return CR_CALL_NOT_IMPLEMENTED
;
1629 /***********************************************************************
1630 * CM_Disable_DevNode [SETUPAPI.@]
1635 _In_ DEVINST dnDevInst
,
1638 TRACE("CM_Disable_DevNode(%p %lx)\n",
1639 dnDevInst
, ulFlags
);
1641 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1645 /***********************************************************************
1646 * CM_Disable_DevNode_Ex [SETUPAPI.@]
1650 CM_Disable_DevNode_Ex(
1651 _In_ DEVINST dnDevInst
,
1653 _In_opt_ HMACHINE hMachine
)
1655 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1656 HSTRING_TABLE StringTable
= NULL
;
1660 FIXME("CM_Disable_DevNode_Ex(%p %lx %p)\n",
1661 dnDevInst
, ulFlags
, hMachine
);
1663 if (!pSetupIsUserAdmin())
1664 return CR_ACCESS_DENIED
;
1667 return CR_INVALID_DEVINST
;
1670 return CR_INVALID_FLAG
;
1672 if (hMachine
!= NULL
)
1674 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1675 if (BindingHandle
== NULL
)
1678 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1679 if (StringTable
== 0)
1684 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1688 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1689 if (lpDevInst
== NULL
)
1690 return CR_INVALID_DEVNODE
;
1694 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1695 PNP_DEVINST_DISABLE
,
1700 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1702 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1710 /***********************************************************************
1711 * CM_Disconnect_Machine [SETUPAPI.@]
1715 CM_Disconnect_Machine(
1716 _In_opt_ HMACHINE hMachine
)
1718 PMACHINE_INFO pMachine
;
1720 TRACE("CM_Disconnect_Machine(%p)\n", hMachine
);
1722 pMachine
= (PMACHINE_INFO
)hMachine
;
1723 if (pMachine
== NULL
)
1726 if (pMachine
->bLocal
== FALSE
)
1728 if (pMachine
->StringTable
!= NULL
)
1729 pSetupStringTableDestroy(pMachine
->StringTable
);
1731 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
1732 return CR_ACCESS_DENIED
;
1735 HeapFree(GetProcessHeap(), 0, pMachine
);
1741 /***********************************************************************
1742 * CM_Dup_Range_List [SETUPAPI.@]
1747 _In_ RANGE_LIST rlhOld
,
1748 _In_ RANGE_LIST rlhNew
,
1751 FIXME("CM_Dup_Range_List(%p %p %lx)\n",
1752 rlhOld
, rlhNew
, ulFlags
);
1754 return CR_CALL_NOT_IMPLEMENTED
;
1758 /***********************************************************************
1759 * CM_Enable_DevNode [SETUPAPI.@]
1764 _In_ DEVINST dnDevInst
,
1767 TRACE("CM_Enable_DevNode(%p %lx)\n",
1768 dnDevInst
, ulFlags
);
1770 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1774 /***********************************************************************
1775 * CM_Enable_DevNode_Ex [SETUPAPI.@]
1779 CM_Enable_DevNode_Ex(
1780 _In_ DEVINST dnDevInst
,
1782 _In_opt_ HMACHINE hMachine
)
1784 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1785 HSTRING_TABLE StringTable
= NULL
;
1789 TRACE("CM_Enable_DevNode_Ex(%p %lx %p)\n",
1790 dnDevInst
, ulFlags
, hMachine
);
1792 if (!pSetupIsUserAdmin())
1793 return CR_ACCESS_DENIED
;
1796 return CR_INVALID_DEVINST
;
1799 return CR_INVALID_FLAG
;
1801 if (hMachine
!= NULL
)
1803 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1804 if (BindingHandle
== NULL
)
1807 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1808 if (StringTable
== 0)
1813 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1817 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1818 if (lpDevInst
== NULL
)
1819 return CR_INVALID_DEVNODE
;
1823 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1829 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1831 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1839 /***********************************************************************
1840 * CM_Enumerate_Classes [SETUPAPI.@]
1844 CM_Enumerate_Classes(
1845 _In_ ULONG ulClassIndex
,
1846 _Out_ LPGUID ClassGuid
,
1849 TRACE("CM_Enumerate_Classes(%lx %p %lx)\n",
1850 ulClassIndex
, ClassGuid
, ulFlags
);
1852 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
1856 /***********************************************************************
1857 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
1861 CM_Enumerate_Classes_Ex(
1862 _In_ ULONG ulClassIndex
,
1863 _Out_ LPGUID ClassGuid
,
1865 _In_opt_ HMACHINE hMachine
)
1867 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1868 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1869 CONFIGRET ret
= CR_SUCCESS
;
1870 ULONG ulLength
= MAX_GUID_STRING_LEN
;
1872 TRACE("CM_Enumerate_Classes_Ex(%lx %p %lx %p)\n",
1873 ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
1875 if (ClassGuid
== NULL
)
1876 return CR_INVALID_POINTER
;
1879 return CR_INVALID_FLAG
;
1881 if (hMachine
!= NULL
)
1883 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1884 if (BindingHandle
== NULL
)
1889 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1895 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1899 MAX_GUID_STRING_LEN
,
1903 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1905 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1909 if (ret
== CR_SUCCESS
)
1912 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1914 /* Convert the buffer to a GUID */
1915 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1923 /***********************************************************************
1924 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1928 CM_Enumerate_EnumeratorsA(
1929 _In_ ULONG ulEnumIndex
,
1930 _Out_writes_(*pulLength
) PCHAR Buffer
,
1931 _Inout_ PULONG pulLength
,
1934 TRACE("CM_Enumerate_EnumeratorsA(%lu %p %p %lx)\n",
1935 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1937 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1942 /***********************************************************************
1943 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1947 CM_Enumerate_EnumeratorsW(
1948 _In_ ULONG ulEnumIndex
,
1949 _Out_writes_(*pulLength
) PWCHAR Buffer
,
1950 _Inout_ PULONG pulLength
,
1953 TRACE("CM_Enumerate_EnumeratorsW(%lu %p %p %lx)\n",
1954 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1956 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1961 /***********************************************************************
1962 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1966 CM_Enumerate_Enumerators_ExA(
1967 _In_ ULONG ulEnumIndex
,
1968 _Out_writes_(*pulLength
) PCHAR Buffer
,
1969 _Inout_ PULONG pulLength
,
1971 _In_opt_ HMACHINE hMachine
)
1973 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1976 CONFIGRET ret
= CR_SUCCESS
;
1978 TRACE("CM_Enumerate_Enumerators_ExA(%lu %p %p %lx %p)\n",
1979 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
1981 if (Buffer
== NULL
|| pulLength
== NULL
)
1982 return CR_INVALID_POINTER
;
1985 return CR_INVALID_FLAG
;
1987 ulOrigLength
= *pulLength
;
1990 ulLength
= MAX_DEVICE_ID_LEN
;
1991 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1993 if (ret
== CR_SUCCESS
)
1995 if (WideCharToMultiByte(CP_ACP
,
2005 *pulLength
= lstrlenA(Buffer
) + 1;
2012 /***********************************************************************
2013 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
2017 CM_Enumerate_Enumerators_ExW(
2018 _In_ ULONG ulEnumIndex
,
2019 _Out_writes_(*pulLength
) PWCHAR Buffer
,
2020 _Inout_ PULONG pulLength
,
2022 _In_opt_ HMACHINE hMachine
)
2024 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2027 TRACE("CM_Enumerate_Enumerators_ExW(%lu %p %p %lx %p)\n",
2028 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
2030 if (Buffer
== NULL
|| pulLength
== NULL
)
2031 return CR_INVALID_POINTER
;
2034 return CR_INVALID_FLAG
;
2036 *Buffer
= UNICODE_NULL
;
2038 if (hMachine
!= NULL
)
2040 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2041 if (BindingHandle
== NULL
)
2046 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2052 ret
= PNP_EnumerateSubKeys(BindingHandle
,
2053 PNP_ENUMERATOR_SUBKEYS
,
2060 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2062 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2070 /***********************************************************************
2071 * CM_Find_Range [SETUPAPI.@]
2076 _Out_ PDWORDLONG pullStart
,
2077 _In_ DWORDLONG ullStart
,
2078 _In_ ULONG ulLength
,
2079 _In_ DWORDLONG ullAlignment
,
2080 _In_ DWORDLONG ullEnd
,
2081 _In_ RANGE_LIST rlh
,
2084 FIXME("CM_Find_Range(%p %I64u %lu %I64u %I64u %p %lx)\n",
2085 pullStart
, ullStart
, ulLength
, ullAlignment
, ullEnd
, rlh
, ulFlags
);
2087 return CR_CALL_NOT_IMPLEMENTED
;
2091 /***********************************************************************
2092 * CM_First_Range [SETUPAPI.@]
2097 _In_ RANGE_LIST rlh
,
2098 _Out_ PDWORDLONG pullStart
,
2099 _Out_ PDWORDLONG pullEnd
,
2100 _Out_ PRANGE_ELEMENT preElement
,
2103 PINTERNAL_RANGE_LIST pRangeList
;
2104 PINTERNAL_RANGE pRange
;
2105 PLIST_ENTRY ListEntry
;
2106 CONFIGRET ret
= CR_SUCCESS
;
2108 FIXME("CM_First_Range(%p %p %p %p %lx)\n",
2109 rlh
, pullStart
, pullEnd
, preElement
, ulFlags
);
2111 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
2113 if (!IsValidRangeList(pRangeList
))
2114 return CR_INVALID_RANGE_LIST
;
2116 if (pullStart
== NULL
|| pullEnd
== NULL
|| preElement
== NULL
)
2117 return CR_INVALID_POINTER
;
2120 return CR_INVALID_FLAG
;
2122 /* Lock the range list */
2123 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2125 /* Fail, if the list is empty */
2126 if (IsListEmpty(&pRangeList
->ListHead
))
2132 /* Get the first range */
2133 ListEntry
= pRangeList
->ListHead
.Flink
;
2134 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2136 /* Return the range data */
2137 *pullStart
= pRange
->ullStart
;
2138 *pullEnd
= pRange
->ullEnd
;
2139 *preElement
= (RANGE_ELEMENT
)pRange
;
2142 /* Unlock the range list */
2143 ReleaseMutex(pRangeList
->hMutex
);
2149 /***********************************************************************
2150 * CM_Free_Log_Conf [SETUPAPI.@]
2155 _In_ LOG_CONF lcLogConfToBeFreed
,
2158 TRACE("CM_Free_Log_Conf(%lx %lx)\n",
2159 lcLogConfToBeFreed
, ulFlags
);
2161 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
2165 /***********************************************************************
2166 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
2170 CM_Free_Log_Conf_Ex(
2171 _In_ LOG_CONF lcLogConfToBeFreed
,
2173 _In_opt_ HMACHINE hMachine
)
2175 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2176 HSTRING_TABLE StringTable
= NULL
;
2178 PLOG_CONF_INFO pLogConfInfo
;
2181 TRACE("CM_Free_Log_Conf_Ex(%lx %lx %p)\n",
2182 lcLogConfToBeFreed
, ulFlags
, hMachine
);
2184 if (!pSetupIsUserAdmin())
2185 return CR_ACCESS_DENIED
;
2187 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
2188 if (!IsValidLogConf(pLogConfInfo
))
2189 return CR_INVALID_LOG_CONF
;
2192 return CR_INVALID_FLAG
;
2194 if (hMachine
!= NULL
)
2196 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2197 if (BindingHandle
== NULL
)
2200 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2201 if (StringTable
== 0)
2206 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2210 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2211 if (lpDevInst
== NULL
)
2212 return CR_INVALID_DEVNODE
;
2216 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
2217 pLogConfInfo
->ulTag
, 0);
2219 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2221 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2229 /***********************************************************************
2230 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
2234 CM_Free_Log_Conf_Handle(
2235 _In_ LOG_CONF lcLogConf
)
2237 PLOG_CONF_INFO pLogConfInfo
;
2239 TRACE("CM_Free_Log_Conf_Handle(%lx)\n", lcLogConf
);
2241 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2242 if (!IsValidLogConf(pLogConfInfo
))
2243 return CR_INVALID_LOG_CONF
;
2245 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
2251 /***********************************************************************
2252 * CM_Free_Range_List [SETUPAPI.@]
2257 _In_ RANGE_LIST RangeList
,
2260 PINTERNAL_RANGE_LIST pRangeList
;
2261 PINTERNAL_RANGE pRange
;
2262 PLIST_ENTRY ListEntry
;
2264 FIXME("CM_Free_Range_List(%p %lx)\n",
2265 RangeList
, ulFlags
);
2267 pRangeList
= (PINTERNAL_RANGE_LIST
)RangeList
;
2269 if (!IsValidRangeList(pRangeList
))
2270 return CR_INVALID_RANGE_LIST
;
2273 return CR_INVALID_FLAG
;
2275 /* Lock the range list */
2276 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2278 /* Free the list of ranges */
2279 while (!IsListEmpty(&pRangeList
->ListHead
))
2281 ListEntry
= RemoveHeadList(&pRangeList
->ListHead
);
2282 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2283 HeapFree(GetProcessHeap(), 0, pRange
);
2286 /* Unlock the range list */
2287 ReleaseMutex(pRangeList
->hMutex
);
2289 /* Close the mutex */
2290 CloseHandle(pRangeList
->hMutex
);
2292 /* Free the range list */
2293 HeapFree(GetProcessHeap(), 0, pRangeList
);
2299 /***********************************************************************
2300 * CM_Free_Res_Des [SETUPAPI.@]
2305 _Out_ PRES_DES prdResDes
,
2306 _In_ RES_DES rdResDes
,
2309 TRACE("CM_Free_Res_Des(%p %p %lx)\n",
2310 prdResDes
, rdResDes
, ulFlags
);
2312 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
2316 /***********************************************************************
2317 * CM_Free_Res_Des_Ex [SETUPAPI.@]
2322 _Out_ PRES_DES prdResDes
,
2323 _In_ RES_DES rdResDes
,
2325 _In_opt_ HMACHINE hMachine
)
2327 FIXME("CM_Free_Res_Des_Ex(%p %p %lx %p)\n",
2328 prdResDes
, rdResDes
, ulFlags
, hMachine
);
2330 return CR_CALL_NOT_IMPLEMENTED
;
2334 /***********************************************************************
2335 * CM_Free_Res_Des_Handle [SETUPAPI.@]
2339 CM_Free_Res_Des_Handle(
2340 _In_ RES_DES rdResDes
)
2342 FIXME("CM_Free_Res_Des_Handle(%p)\n", rdResDes
);
2344 return CR_CALL_NOT_IMPLEMENTED
;
2348 /***********************************************************************
2349 * CM_Free_Resource_Conflict_Handle [SETUPAPI.@]
2353 CM_Free_Resource_Conflict_Handle(
2354 _In_ CONFLICT_LIST clConflictList
)
2356 PCONFLICT_DATA pConflictData
;
2358 FIXME("CM_Free_Resource_Conflict_Handle(%p)\n",
2361 pConflictData
= (PCONFLICT_DATA
)clConflictList
;
2362 if (!IsValidConflictData(pConflictData
))
2363 return CR_INVALID_CONFLICT_LIST
;
2365 if (pConflictData
->pConflictList
!= NULL
)
2366 MyFree(pConflictData
->pConflictList
);
2368 MyFree(pConflictData
);
2374 /***********************************************************************
2375 * CM_Get_Child [SETUPAPI.@]
2380 _Out_ PDEVINST pdnDevInst
,
2381 _In_ DEVINST dnDevInst
,
2384 TRACE("CM_Get_Child(%p %p %lx)\n",
2385 pdnDevInst
, dnDevInst
, ulFlags
);
2387 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2391 /***********************************************************************
2392 * CM_Get_Child_Ex [SETUPAPI.@]
2397 _Out_ PDEVINST pdnDevInst
,
2398 _In_ DEVINST dnDevInst
,
2400 _In_opt_ HMACHINE hMachine
)
2402 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2403 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2404 HSTRING_TABLE StringTable
= NULL
;
2406 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
2409 TRACE("CM_Get_Child_Ex(%p %lx %lx %p)\n",
2410 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2412 if (pdnDevInst
== NULL
)
2413 return CR_INVALID_POINTER
;
2416 return CR_INVALID_DEVINST
;
2419 return CR_INVALID_FLAG
;
2423 if (hMachine
!= NULL
)
2425 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2426 if (BindingHandle
== NULL
)
2429 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2430 if (StringTable
== 0)
2435 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2439 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2440 if (lpDevInst
== NULL
)
2441 return CR_INVALID_DEVNODE
;
2445 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2446 PNP_GET_CHILD_DEVICE_INSTANCE
,
2452 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2454 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2458 if (ret
!= CR_SUCCESS
)
2461 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2463 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
2467 *pdnDevInst
= dwIndex
;
2473 /***********************************************************************
2474 * CM_Get_Class_Key_NameA [SETUPAPI.@]
2478 CM_Get_Class_Key_NameA(
2479 _In_ LPGUID ClassGuid
,
2480 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2481 _Inout_ PULONG pulLength
,
2484 TRACE("CM_Get_Class_Key_NameA(%p %p %p %lx)\n",
2485 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2487 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
2492 /***********************************************************************
2493 * CM_Get_Class_Key_NameW [SETUPAPI.@]
2497 CM_Get_Class_Key_NameW(
2498 _In_ LPGUID ClassGuid
,
2499 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2500 _Inout_ PULONG pulLength
,
2503 TRACE("CM_Get_Class_Key_NameW(%p %p %p %lx)\n",
2504 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2506 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
2511 /***********************************************************************
2512 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
2516 CM_Get_Class_Key_Name_ExA(
2517 _In_ LPGUID ClassGuid
,
2518 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2519 _Inout_ PULONG pulLength
,
2521 _In_opt_ HMACHINE hMachine
)
2523 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
2524 CONFIGRET ret
= CR_SUCCESS
;
2528 TRACE("CM_Get_Class_Key_Name_ExA(%p %p %p %lx %p)\n",
2529 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2531 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2532 return CR_INVALID_POINTER
;
2534 ulOrigLength
= *pulLength
;
2537 ulLength
= MAX_GUID_STRING_LEN
;
2538 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2540 if (ret
== CR_SUCCESS
)
2542 if (WideCharToMultiByte(CP_ACP
,
2552 *pulLength
= lstrlenA(pszKeyName
) + 1;
2559 /***********************************************************************
2560 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
2564 CM_Get_Class_Key_Name_ExW(
2565 _In_ LPGUID ClassGuid
,
2566 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2567 _Inout_ PULONG pulLength
,
2569 _In_opt_ HMACHINE hMachine
)
2571 TRACE("CM_Get_Class_Key_Name_ExW(%p %p %p %lx %p)\n",
2572 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2574 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2575 return CR_INVALID_POINTER
;
2578 return CR_INVALID_FLAG
;
2580 if (*pulLength
< MAX_GUID_STRING_LEN
)
2583 return CR_BUFFER_SMALL
;
2586 if (!GuidToString(ClassGuid
, pszKeyName
))
2587 return CR_INVALID_DATA
;
2589 *pulLength
= MAX_GUID_STRING_LEN
;
2595 /***********************************************************************
2596 * CM_Get_Class_NameA [SETUPAPI.@]
2601 _In_ LPGUID ClassGuid
,
2602 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2603 _Inout_ PULONG pulLength
,
2606 TRACE("CM_Get_Class_NameA(%p %p %p %lx)\n",
2607 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2609 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2614 /***********************************************************************
2615 * CM_Get_Class_NameW [SETUPAPI.@]
2620 _In_ LPGUID ClassGuid
,
2621 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2622 _Inout_ PULONG pulLength
,
2625 TRACE("CM_Get_Class_NameW(%p %p %p %lx)\n",
2626 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2628 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2633 /***********************************************************************
2634 * CM_Get_Class_Name_ExA [SETUPAPI.@]
2638 CM_Get_Class_Name_ExA(
2639 _In_ LPGUID ClassGuid
,
2640 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2641 _Inout_ PULONG pulLength
,
2643 _In_opt_ HMACHINE hMachine
)
2645 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
2646 CONFIGRET ret
= CR_SUCCESS
;
2650 TRACE("CM_Get_Class_Name_ExA(%p %p %p %lx %p)\n",
2651 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2653 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2654 return CR_INVALID_POINTER
;
2656 ulOrigLength
= *pulLength
;
2659 ulLength
= MAX_CLASS_NAME_LEN
;
2660 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2662 if (ret
== CR_SUCCESS
)
2664 if (WideCharToMultiByte(CP_ACP
,
2674 *pulLength
= lstrlenA(Buffer
) + 1;
2681 /***********************************************************************
2682 * CM_Get_Class_Name_ExW [SETUPAPI.@]
2686 CM_Get_Class_Name_ExW(
2687 _In_ LPGUID ClassGuid
,
2688 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2689 _Inout_ PULONG pulLength
,
2691 _In_opt_ HMACHINE hMachine
)
2693 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
2694 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2697 TRACE("CM_Get_Class_Name_ExW(%p %p %p %lx %p\n",
2698 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2700 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2701 return CR_INVALID_POINTER
;
2704 return CR_INVALID_FLAG
;
2706 if (!GuidToString(ClassGuid
, szGuidString
))
2707 return CR_INVALID_DATA
;
2709 TRACE("Guid %s\n", debugstr_w(szGuidString
));
2711 if (hMachine
!= NULL
)
2713 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2714 if (BindingHandle
== NULL
)
2719 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2725 ret
= PNP_GetClassName(BindingHandle
,
2731 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2733 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2741 /***********************************************************************
2742 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
2746 CM_Get_Class_Registry_PropertyA(
2749 PULONG pulRegDataType
,
2755 PWSTR BufferW
= NULL
;
2760 TRACE("CM_Get_Class_Registry_PropertyA(%p %lu %p %p %p %lx %p)\n",
2761 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2764 if (pulLength
== NULL
)
2765 return CR_INVALID_POINTER
;
2767 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2768 return CR_INVALID_PROPERTY
;
2770 ulType
= GetRegistryPropertyType(ulProperty
);
2771 if (ulType
== REG_SZ
|| ulType
== REG_MULTI_SZ
)
2773 /* Get the required buffer size */
2774 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2775 NULL
, &ulLength
, ulFlags
, hMachine
);
2776 if (ret
!= CR_BUFFER_SMALL
)
2779 /* Allocate the unicode buffer */
2780 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLength
);
2781 if (BufferW
== NULL
)
2782 return CR_OUT_OF_MEMORY
;
2784 /* Get the property */
2785 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2786 BufferW
, &ulLength
, ulFlags
, hMachine
);
2787 if (ret
!= CR_SUCCESS
)
2789 HeapFree(GetProcessHeap(), 0, BufferW
);
2793 /* Do W->A conversion */
2794 *pulLength
= WideCharToMultiByte(CP_ACP
,
2797 lstrlenW(BufferW
) + 1,
2803 /* Release the unicode buffer */
2804 HeapFree(GetProcessHeap(), 0, BufferW
);
2806 if (*pulLength
== 0)
2811 /* Get the property */
2812 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2813 Buffer
, pulLength
, ulFlags
, hMachine
);
2820 /***********************************************************************
2821 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
2825 CM_Get_Class_Registry_PropertyW(
2828 PULONG pulRegDataType
,
2834 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2835 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
2837 ULONG ulTransferLength
= 0;
2840 TRACE("CM_Get_Class_Registry_PropertyW(%p %lu %p %p %p %lx %p)\n",
2841 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2844 if (ClassGuid
== NULL
|| pulLength
== NULL
)
2845 return CR_INVALID_POINTER
;
2848 return CR_INVALID_FLAG
;
2850 if (pSetupStringFromGuid(ClassGuid
,
2852 PNP_MAX_GUID_STRING_LEN
) != 0)
2853 return CR_INVALID_DATA
;
2855 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2856 return CR_INVALID_PROPERTY
;
2858 if (hMachine
!= NULL
)
2860 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2861 if (BindingHandle
== NULL
)
2866 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2870 ulTransferLength
= *pulLength
;
2874 ret
= PNP_GetClassRegProp(BindingHandle
,
2883 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2885 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2889 if (ret
== CR_SUCCESS
)
2891 if (pulRegDataType
!= NULL
)
2892 *pulRegDataType
= ulType
;
2899 /***********************************************************************
2900 * CM_Get_Depth [SETUPAPI.@]
2905 _Out_ PULONG pulDepth
,
2906 _In_ DEVINST dnDevInst
,
2909 TRACE("CM_Get_Depth(%p %lx %lx)\n",
2910 pulDepth
, dnDevInst
, ulFlags
);
2912 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
2916 /***********************************************************************
2917 * CM_Get_Depth_Ex [SETUPAPI.@]
2922 _Out_ PULONG pulDepth
,
2923 _In_ DEVINST dnDevInst
,
2925 _In_opt_ HMACHINE hMachine
)
2927 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2928 HSTRING_TABLE StringTable
= NULL
;
2932 TRACE("CM_Get_Depth_Ex(%p %lx %lx %p)\n",
2933 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
2935 if (pulDepth
== NULL
)
2936 return CR_INVALID_POINTER
;
2939 return CR_INVALID_DEVINST
;
2942 return CR_INVALID_FLAG
;
2944 if (hMachine
!= NULL
)
2946 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2947 if (BindingHandle
== NULL
)
2950 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2951 if (StringTable
== 0)
2956 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2960 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2961 if (lpDevInst
== NULL
)
2962 return CR_INVALID_DEVNODE
;
2966 ret
= PNP_GetDepth(BindingHandle
,
2971 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2973 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2981 /***********************************************************************
2982 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
2986 CM_Get_DevNode_Custom_PropertyA(
2987 _In_ DEVINST dnDevInst
,
2988 _In_ PCSTR pszCustomPropertyName
,
2989 _Out_opt_ PULONG pulRegDataType
,
2990 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
2991 _Inout_ PULONG pulLength
,
2994 TRACE("CM_Get_DevNode_Custom_PropertyA(%lx %s %p %p %p %lx)\n",
2995 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
2996 Buffer
, pulLength
, ulFlags
);
2998 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
2999 pulRegDataType
, Buffer
,
3000 pulLength
, ulFlags
, NULL
);
3004 /***********************************************************************
3005 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
3009 CM_Get_DevNode_Custom_PropertyW(
3010 _In_ DEVINST dnDevInst
,
3011 _In_ PCWSTR pszCustomPropertyName
,
3012 _Out_opt_ PULONG pulRegDataType
,
3013 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3014 _Inout_ PULONG pulLength
,
3017 TRACE("CM_Get_DevNode_Custom_PropertyW(%lx %s %p %p %p %lx)\n",
3018 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
3019 Buffer
, pulLength
, ulFlags
);
3021 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
3022 pulRegDataType
, Buffer
,
3023 pulLength
, ulFlags
, NULL
);
3027 /***********************************************************************
3028 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
3032 CM_Get_DevNode_Custom_Property_ExA(
3033 _In_ DEVINST dnDevInst
,
3034 _In_ PCSTR pszCustomPropertyName
,
3035 _Out_opt_ PULONG pulRegDataType
,
3036 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3037 _Inout_ PULONG pulLength
,
3039 _In_opt_ HMACHINE hMachine
)
3041 LPWSTR pszPropertyNameW
= NULL
;
3044 ULONG ulDataType
= REG_NONE
;
3047 TRACE("CM_Get_DevNode_Custom_Property_ExA(%lx %s %p %p %p %lx %p)\n",
3048 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
3049 Buffer
, pulLength
, ulFlags
, hMachine
);
3052 return CR_INVALID_POINTER
;
3054 ulLengthW
= *pulLength
* sizeof(WCHAR
);
3055 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
3057 return CR_OUT_OF_MEMORY
;
3059 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
3061 if (pszPropertyNameW
== NULL
)
3063 HeapFree(GetProcessHeap(), 0, BufferW
);
3064 return CR_OUT_OF_MEMORY
;
3067 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
3074 if (ret
== CR_SUCCESS
)
3076 if (ulDataType
== REG_SZ
||
3077 ulDataType
== REG_EXPAND_SZ
||
3078 ulDataType
== REG_MULTI_SZ
)
3080 /* Do W->A conversion */
3081 *pulLength
= WideCharToMultiByte(CP_ACP
,
3084 lstrlenW(BufferW
) + 1,
3089 if (*pulLength
== 0)
3094 /* Directly copy the value */
3095 if (ulLengthW
<= *pulLength
)
3096 memcpy(Buffer
, BufferW
, ulLengthW
);
3099 *pulLength
= ulLengthW
;
3100 ret
= CR_BUFFER_SMALL
;
3106 *pulRegDataType
= ulDataType
;
3108 HeapFree(GetProcessHeap(), 0, BufferW
);
3109 MyFree(pszPropertyNameW
);
3115 /***********************************************************************
3116 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
3120 CM_Get_DevNode_Custom_Property_ExW(
3121 _In_ DEVINST dnDevInst
,
3122 _In_ PCWSTR pszCustomPropertyName
,
3123 _Out_opt_ PULONG pulRegDataType
,
3124 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3125 _Inout_ PULONG pulLength
,
3127 _In_opt_ HMACHINE hMachine
)
3129 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3130 HSTRING_TABLE StringTable
= NULL
;
3132 ULONG ulDataType
= REG_NONE
;
3133 ULONG ulTransferLength
;
3134 CONFIGRET ret
= CR_SUCCESS
;
3136 TRACE("CM_Get_DevNode_Custom_Property_ExW(%lx %s %p %p %p %lx %p)\n",
3137 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
3138 Buffer
, pulLength
, ulFlags
, hMachine
);
3141 return CR_INVALID_DEVNODE
;
3143 if (pszCustomPropertyName
== NULL
||
3144 pulLength
== NULL
||
3146 return CR_INVALID_POINTER
;
3148 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
3149 return CR_INVALID_FLAG
;
3151 if (hMachine
!= NULL
)
3153 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3154 if (BindingHandle
== NULL
)
3157 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3158 if (StringTable
== 0)
3163 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3167 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3168 if (lpDevInst
== NULL
)
3169 return CR_INVALID_DEVNODE
;
3171 ulTransferLength
= *pulLength
;
3175 ret
= PNP_GetCustomDevProp(BindingHandle
,
3177 (LPWSTR
)pszCustomPropertyName
,
3184 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3186 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3190 if (ret
== CR_SUCCESS
)
3192 if (pulRegDataType
!= NULL
)
3193 *pulRegDataType
= ulDataType
;
3200 /***********************************************************************
3201 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
3205 CM_Get_DevNode_Registry_PropertyA(
3206 _In_ DEVINST dnDevInst
,
3207 _In_ ULONG ulProperty
,
3208 _Out_opt_ PULONG pulRegDataType
,
3209 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3210 _Inout_ PULONG pulLength
,
3213 TRACE("CM_Get_DevNode_Registry_PropertyA(%lx %lu %p %p %p %lx)\n",
3214 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3216 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
3217 pulRegDataType
, Buffer
,
3218 pulLength
, ulFlags
, NULL
);
3222 /***********************************************************************
3223 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
3227 CM_Get_DevNode_Registry_PropertyW(
3228 _In_ DEVINST dnDevInst
,
3229 _In_ ULONG ulProperty
,
3230 _Out_opt_ PULONG pulRegDataType
,
3231 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3232 _Inout_ PULONG pulLength
,
3235 TRACE("CM_Get_DevNode_Registry_PropertyW(%lx %lu %p %p %p %lx)\n",
3236 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3238 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
3239 pulRegDataType
, Buffer
,
3240 pulLength
, ulFlags
, NULL
);
3244 /***********************************************************************
3245 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
3249 CM_Get_DevNode_Registry_Property_ExA(
3250 _In_ DEVINST dnDevInst
,
3251 _In_ ULONG ulProperty
,
3252 _Out_opt_ PULONG pulRegDataType
,
3253 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3254 _Inout_ PULONG pulLength
,
3256 _In_opt_ HMACHINE hMachine
)
3260 ULONG ulDataType
= REG_NONE
;
3263 TRACE("CM_Get_DevNode_Registry_Property_ExA(%lx %lu %p %p %p %lx %p)\n",
3264 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3268 return CR_INVALID_POINTER
;
3270 LengthW
= *pulLength
* sizeof(WCHAR
);
3271 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
3274 return CR_OUT_OF_MEMORY
;
3276 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
3284 if (ret
== CR_SUCCESS
)
3286 if (ulDataType
== REG_SZ
||
3287 ulDataType
== REG_EXPAND_SZ
||
3288 ulDataType
== REG_MULTI_SZ
)
3290 /* Do W->A conversion */
3291 *pulLength
= WideCharToMultiByte(CP_ACP
,
3294 lstrlenW(BufferW
) + 1,
3299 if (*pulLength
== 0)
3304 /* Directly copy the value */
3305 if (LengthW
<= *pulLength
)
3306 memcpy(Buffer
, BufferW
, LengthW
);
3309 *pulLength
= LengthW
;
3310 ret
= CR_BUFFER_SMALL
;
3316 *pulRegDataType
= ulDataType
;
3318 HeapFree(GetProcessHeap(), 0, BufferW
);
3324 /***********************************************************************
3325 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
3329 CM_Get_DevNode_Registry_Property_ExW(
3330 _In_ DEVINST dnDevInst
,
3331 _In_ ULONG ulProperty
,
3332 _Out_opt_ PULONG pulRegDataType
,
3333 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3334 _Inout_ PULONG pulLength
,
3336 _In_opt_ HMACHINE hMachine
)
3338 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3339 HSTRING_TABLE StringTable
= NULL
;
3340 CONFIGRET ret
= CR_SUCCESS
;
3342 ULONG ulDataType
= REG_NONE
;
3343 ULONG ulTransferLength
= 0;
3345 TRACE("CM_Get_DevNode_Registry_Property_ExW(%lx %lu %p %p %p %lx %p)\n",
3346 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3350 return CR_INVALID_DEVNODE
;
3352 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
3353 return CR_INVALID_PROPERTY
;
3355 /* pulRegDataType is optional */
3357 /* Buffer is optional */
3359 if (pulLength
== NULL
)
3360 return CR_INVALID_POINTER
;
3362 if (*pulLength
== 0)
3363 return CR_INVALID_POINTER
;
3366 return CR_INVALID_FLAG
;
3368 if (hMachine
!= NULL
)
3370 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3371 if (BindingHandle
== NULL
)
3374 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3375 if (StringTable
== 0)
3380 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3384 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3385 if (lpDevInst
== NULL
)
3386 return CR_INVALID_DEVNODE
;
3388 ulTransferLength
= *pulLength
;
3392 ret
= PNP_GetDeviceRegProp(BindingHandle
,
3401 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3403 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3407 if (ret
== CR_SUCCESS
)
3409 if (pulRegDataType
!= NULL
)
3410 *pulRegDataType
= ulDataType
;
3417 /***********************************************************************
3418 * CM_Get_DevNode_Status [SETUPAPI.@]
3422 CM_Get_DevNode_Status(
3423 _Out_ PULONG pulStatus
,
3424 _Out_ PULONG pulProblemNumber
,
3425 _In_ DEVINST dnDevInst
,
3428 TRACE("CM_Get_DevNode_Status(%p %p %lx %lx)\n",
3429 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
3431 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
3436 /***********************************************************************
3437 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
3441 CM_Get_DevNode_Status_Ex(
3442 _Out_ PULONG pulStatus
,
3443 _Out_ PULONG pulProblemNumber
,
3444 _In_ DEVINST dnDevInst
,
3446 _In_opt_ HMACHINE hMachine
)
3448 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3449 HSTRING_TABLE StringTable
= NULL
;
3453 TRACE("CM_Get_DevNode_Status_Ex(%p %p %lx %lx %p)\n",
3454 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
3456 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
3457 return CR_INVALID_POINTER
;
3460 return CR_INVALID_DEVINST
;
3463 return CR_INVALID_FLAG
;
3465 if (hMachine
!= NULL
)
3467 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3468 if (BindingHandle
== NULL
)
3471 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3472 if (StringTable
== 0)
3477 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3481 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3482 if (lpDevInst
== NULL
)
3483 return CR_INVALID_DEVNODE
;
3487 ret
= PNP_GetDeviceStatus(BindingHandle
,
3493 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3495 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3503 /***********************************************************************
3504 * CM_Get_Device_IDA [SETUPAPI.@]
3509 _In_ DEVINST dnDevInst
,
3510 _Out_writes_(BufferLen
) PCHAR Buffer
,
3511 _In_ ULONG BufferLen
,
3514 TRACE("CM_Get_Device_IDA(%lx %p %lu %lx)\n",
3515 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3517 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3521 /***********************************************************************
3522 * CM_Get_Device_IDW [SETUPAPI.@]
3527 _In_ DEVINST dnDevInst
,
3528 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3529 _In_ ULONG BufferLen
,
3532 TRACE("CM_Get_Device_IDW(%lx %p %lu %lx)\n",
3533 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3535 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3539 /***********************************************************************
3540 * CM_Get_Device_ID_ExA [SETUPAPI.@]
3544 CM_Get_Device_ID_ExA(
3545 _In_ DEVINST dnDevInst
,
3546 _Out_writes_(BufferLen
) PCHAR Buffer
,
3547 _In_ ULONG BufferLen
,
3549 _In_opt_ HMACHINE hMachine
)
3551 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
3552 CONFIGRET ret
= CR_SUCCESS
;
3554 TRACE("CM_Get_Device_ID_ExA(%lx %p %lu %lx %p)\n",
3555 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3558 return CR_INVALID_POINTER
;
3560 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
3565 if (ret
== CR_SUCCESS
)
3567 if (WideCharToMultiByte(CP_ACP
,
3570 lstrlenW(szBufferW
) + 1,
3582 /***********************************************************************
3583 * CM_Get_Device_ID_ExW [SETUPAPI.@]
3587 CM_Get_Device_ID_ExW(
3588 _In_ DEVINST dnDevInst
,
3589 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3590 _In_ ULONG BufferLen
,
3592 _In_opt_ HMACHINE hMachine
)
3594 HSTRING_TABLE StringTable
= NULL
;
3596 TRACE("CM_Get_Device_ID_ExW(%lx %p %lu %lx %p)\n",
3597 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3600 return CR_INVALID_DEVINST
;
3603 return CR_INVALID_POINTER
;
3606 return CR_INVALID_FLAG
;
3608 if (hMachine
!= NULL
)
3610 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3611 if (StringTable
== NULL
)
3616 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3620 if (!pSetupStringTableStringFromIdEx(StringTable
,
3630 /***********************************************************************
3631 * CM_Get_Device_ID_ListA [SETUPAPI.@]
3635 CM_Get_Device_ID_ListA(
3636 _In_ PCSTR pszFilter
,
3637 _Out_writes_(BufferLen
) PCHAR Buffer
,
3638 _In_ ULONG BufferLen
,
3641 TRACE("CM_Get_Device_ID_ListA(%p %p %lu %lx)\n",
3642 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3644 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
3649 /***********************************************************************
3650 * CM_Get_Device_ID_ListW [SETUPAPI.@]
3654 CM_Get_Device_ID_ListW(
3655 _In_ PCWSTR pszFilter
,
3656 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3657 _In_ ULONG BufferLen
,
3660 TRACE("CM_Get_Device_ID_ListW(%p %p %lu %lx)\n",
3661 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3663 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
3668 /***********************************************************************
3669 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
3673 CM_Get_Device_ID_List_ExA(
3674 _In_ PCSTR pszFilter
,
3675 _Out_writes_(BufferLen
) PCHAR Buffer
,
3676 _In_ ULONG BufferLen
,
3678 _In_opt_ HMACHINE hMachine
)
3680 LPWSTR BufferW
= NULL
;
3681 LPWSTR pszFilterW
= NULL
;
3682 CONFIGRET ret
= CR_SUCCESS
;
3684 TRACE("CM_Get_Device_ID_List_ExA(%p %p %lu %lx %p)\n",
3685 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3687 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
3688 if (BufferW
== NULL
)
3689 return CR_OUT_OF_MEMORY
;
3691 if (pszFilter
== NULL
)
3693 ret
= CM_Get_Device_ID_List_ExW(NULL
,
3701 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3703 ret
= CR_INVALID_DEVICE_ID
;
3707 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
3716 if (WideCharToMultiByte(CP_ACP
,
3719 lstrlenW(BufferW
) + 1,
3733 /***********************************************************************
3734 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
3738 CM_Get_Device_ID_List_ExW(
3739 _In_ PCWSTR pszFilter
,
3740 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3741 _In_ ULONG BufferLen
,
3743 _In_opt_ HMACHINE hMachine
)
3745 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3748 TRACE("CM_Get_Device_ID_List_ExW(%p %p %lu %lx %p)\n",
3749 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3751 if (Buffer
== NULL
|| BufferLen
== 0)
3752 return CR_INVALID_POINTER
;
3754 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3755 return CR_INVALID_FLAG
;
3757 if (hMachine
!= NULL
)
3759 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3760 if (BindingHandle
== NULL
)
3765 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3773 ret
= PNP_GetDeviceList(BindingHandle
,
3779 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3781 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3789 /***********************************************************************
3790 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
3794 CM_Get_Device_ID_List_SizeA(
3795 _Out_ PULONG pulLen
,
3796 _In_opt_ PCSTR pszFilter
,
3799 TRACE("CM_Get_Device_ID_List_SizeA(%p %s %lx)\n",
3800 pulLen
, debugstr_a(pszFilter
), ulFlags
);
3802 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
3806 /***********************************************************************
3807 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
3811 CM_Get_Device_ID_List_SizeW(
3812 _Out_ PULONG pulLen
,
3813 _In_opt_ PCWSTR pszFilter
,
3816 TRACE("CM_Get_Device_ID_List_SizeW(%p %s %lx)\n",
3817 pulLen
, debugstr_w(pszFilter
), ulFlags
);
3819 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
3823 /***********************************************************************
3824 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
3828 CM_Get_Device_ID_List_Size_ExA(
3829 _Out_ PULONG pulLen
,
3830 _In_opt_ PCSTR pszFilter
,
3832 _In_opt_ HMACHINE hMachine
)
3834 LPWSTR pszFilterW
= NULL
;
3835 CONFIGRET ret
= CR_SUCCESS
;
3837 FIXME("CM_Get_Device_ID_List_Size_ExA(%p %s %lx %p)\n",
3838 pulLen
, debugstr_a(pszFilter
), ulFlags
, hMachine
);
3840 if (pszFilter
== NULL
)
3842 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3849 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3850 return CR_INVALID_DEVICE_ID
;
3852 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3864 /***********************************************************************
3865 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
3869 CM_Get_Device_ID_List_Size_ExW(
3870 _Out_ PULONG pulLen
,
3871 _In_opt_ PCWSTR pszFilter
,
3873 _In_opt_ HMACHINE hMachine
)
3875 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3878 FIXME("CM_Get_Device_ID_List_Size_ExW(%p %s %lx %p)\n",
3879 pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
3882 return CR_INVALID_POINTER
;
3884 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3885 return CR_INVALID_FLAG
;
3887 if (hMachine
!= NULL
)
3889 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3890 if (BindingHandle
== NULL
)
3895 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3903 ret
= PNP_GetDeviceListSize(BindingHandle
,
3908 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3910 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3918 /***********************************************************************
3919 * CM_Get_Device_ID_Size [SETUPAPI.@]
3923 CM_Get_Device_ID_Size(
3924 _Out_ PULONG pulLen
,
3925 _In_ DEVINST dnDevInst
,
3928 TRACE("CM_Get_Device_ID_Size(%p %lx %lx)\n",
3929 pulLen
, dnDevInst
, ulFlags
);
3931 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
3935 /***********************************************************************
3936 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
3940 CM_Get_Device_ID_Size_Ex(
3941 _Out_ PULONG pulLen
,
3942 _In_ DEVINST dnDevInst
,
3944 _In_opt_ HMACHINE hMachine
)
3946 HSTRING_TABLE StringTable
= NULL
;
3949 TRACE("CM_Get_Device_ID_Size_Ex(%p %lx %lx %p)\n",
3950 pulLen
, dnDevInst
, ulFlags
, hMachine
);
3953 return CR_INVALID_POINTER
;
3956 return CR_INVALID_DEVINST
;
3959 return CR_INVALID_FLAG
;
3961 if (hMachine
!= NULL
)
3963 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3964 if (StringTable
== NULL
)
3969 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3973 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3974 if (DeviceId
== NULL
)
3980 *pulLen
= lstrlenW(DeviceId
);
3986 /***********************************************************************
3987 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
3991 CM_Get_Device_Interface_AliasA(
3992 _In_ LPCSTR pszDeviceInterface
,
3993 _In_ LPGUID AliasInterfaceGuid
,
3994 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
3995 _Inout_ PULONG pulLength
,
3998 TRACE("CM_Get_Device_Interface_AliasA(%p %p %p %p %lx)\n",
3999 pszDeviceInterface
, AliasInterfaceGuid
,
4000 pszAliasDeviceInterface
, pulLength
, ulFlags
);
4002 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
4003 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
4008 /***********************************************************************
4009 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
4013 CM_Get_Device_Interface_AliasW(
4014 _In_ LPCWSTR pszDeviceInterface
,
4015 _In_ LPGUID AliasInterfaceGuid
,
4016 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
4017 _Inout_ PULONG pulLength
,
4020 TRACE("CM_Get_Device_Interface_AliasW(%p %p %p %p %lx)\n",
4021 pszDeviceInterface
, AliasInterfaceGuid
,
4022 pszAliasDeviceInterface
, pulLength
, ulFlags
);
4024 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
4025 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
4030 /***********************************************************************
4031 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
4035 CM_Get_Device_Interface_Alias_ExA(
4036 _In_ LPCSTR pszDeviceInterface
,
4037 _In_ LPGUID AliasInterfaceGuid
,
4038 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
4039 _Inout_ PULONG pulLength
,
4041 _In_opt_ HMACHINE hMachine
)
4043 FIXME("CM_Get_Device_Interface_Alias_ExA(%p %p %p %p %lx %p)\n",
4044 pszDeviceInterface
, AliasInterfaceGuid
,
4045 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4047 return CR_CALL_NOT_IMPLEMENTED
;
4051 /***********************************************************************
4052 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
4056 CM_Get_Device_Interface_Alias_ExW(
4057 _In_ LPCWSTR pszDeviceInterface
,
4058 _In_ LPGUID AliasInterfaceGuid
,
4059 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
4060 _Inout_ PULONG pulLength
,
4062 _In_opt_ HMACHINE hMachine
)
4064 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4065 ULONG ulTransferLength
;
4066 CONFIGRET ret
= CR_SUCCESS
;
4068 TRACE("CM_Get_Device_Interface_Alias_ExW(%p %p %p %p %lx %p)\n",
4069 pszDeviceInterface
, AliasInterfaceGuid
,
4070 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4072 if (pszDeviceInterface
== NULL
||
4073 AliasInterfaceGuid
== NULL
||
4074 pszAliasDeviceInterface
== NULL
||
4076 return CR_INVALID_POINTER
;
4079 return CR_INVALID_FLAG
;
4081 if (hMachine
!= NULL
)
4083 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4084 if (BindingHandle
== NULL
)
4089 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4093 ulTransferLength
= *pulLength
;
4097 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
4098 (LPWSTR
)pszDeviceInterface
,
4100 pszAliasDeviceInterface
,
4105 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4107 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4115 /***********************************************************************
4116 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
4120 CM_Get_Device_Interface_ListA(
4121 _In_ LPGUID InterfaceClassGuid
,
4122 _In_opt_ DEVINSTID_A pDeviceID
,
4123 _Out_writes_(BufferLen
) PCHAR Buffer
,
4124 _In_ ULONG BufferLen
,
4127 TRACE("CM_Get_Device_Interface_ListA(%s %s %p %lu 0x%08lx)\n",
4128 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4129 Buffer
, BufferLen
, ulFlags
);
4131 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
4132 Buffer
, BufferLen
, ulFlags
, NULL
);
4136 /***********************************************************************
4137 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
4141 CM_Get_Device_Interface_ListW(
4142 _In_ LPGUID InterfaceClassGuid
,
4143 _In_opt_ DEVINSTID_W pDeviceID
,
4144 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4145 _In_ ULONG BufferLen
,
4148 TRACE("CM_Get_Device_Interface_ListW(%s %s %p %lu 0x%08lx)\n",
4149 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4150 Buffer
, BufferLen
, ulFlags
);
4152 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
4153 Buffer
, BufferLen
, ulFlags
, NULL
);
4157 /***********************************************************************
4158 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
4162 CM_Get_Device_Interface_List_ExA(
4163 _In_ LPGUID InterfaceClassGuid
,
4164 _In_opt_ DEVINSTID_A pDeviceID
,
4165 _Out_writes_(BufferLen
) PCHAR Buffer
,
4166 _In_ ULONG BufferLen
,
4168 _In_opt_ HMACHINE hMachine
)
4170 DEVINSTID_W pDeviceIdW
= NULL
;
4171 PWCHAR BufferW
= NULL
;
4172 CONFIGRET ret
= CR_SUCCESS
;
4174 TRACE("CM_Get_Device_Interface_List_ExA(%s %s %p %lu 0x%08lx %p)\n",
4175 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4176 Buffer
, BufferLen
, ulFlags
, hMachine
);
4178 if (Buffer
== NULL
||
4180 return CR_INVALID_POINTER
;
4182 if (pDeviceID
!= NULL
)
4184 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4185 return CR_INVALID_DEVICE_ID
;
4188 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
4189 if (BufferW
== NULL
)
4191 ret
= CR_OUT_OF_MEMORY
;
4195 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
4196 BufferW
, BufferLen
, ulFlags
,
4198 if (ret
!= CR_SUCCESS
)
4201 if (WideCharToMultiByte(CP_ACP
,
4204 lstrlenW(BufferW
) + 1,
4212 if (BufferW
!= NULL
)
4215 if (pDeviceIdW
!= NULL
)
4222 /***********************************************************************
4223 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
4227 CM_Get_Device_Interface_List_ExW(
4228 _In_ LPGUID InterfaceClassGuid
,
4229 _In_opt_ DEVINSTID_W pDeviceID
,
4230 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4231 _In_ ULONG BufferLen
,
4233 _In_opt_ HMACHINE hMachine
)
4235 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4236 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
4237 CONFIGRET ret
= CR_SUCCESS
;
4239 TRACE("CM_Get_Device_Interface_List_ExW(%s %s %p %lu 0x%08lx %p)\n",
4240 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4241 Buffer
, BufferLen
, ulFlags
, hMachine
);
4243 if (Buffer
== NULL
||
4245 return CR_INVALID_POINTER
;
4247 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4248 return CR_INVALID_FLAG
;
4250 if (hMachine
!= NULL
)
4252 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4253 if (BindingHandle
== NULL
)
4258 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4263 BufferSize
= BufferLen
;
4267 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
4274 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4276 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4284 /***********************************************************************
4285 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
4289 CM_Get_Device_Interface_List_SizeA(
4290 _Out_ PULONG pulLen
,
4291 _In_ LPGUID InterfaceClassGuid
,
4292 _In_opt_ DEVINSTID_A pDeviceID
,
4295 TRACE("CM_Get_Device_Interface_List_SizeA(%p %p %s 0x%08lx)\n",
4296 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
);
4298 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
4299 pDeviceID
, ulFlags
, NULL
);
4303 /***********************************************************************
4304 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
4308 CM_Get_Device_Interface_List_SizeW(
4309 _Out_ PULONG pulLen
,
4310 _In_ LPGUID InterfaceClassGuid
,
4311 _In_opt_ DEVINSTID_W pDeviceID
,
4314 TRACE("CM_Get_Device_Interface_List_SizeW(%p %p %s 0x%08lx)\n",
4315 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
);
4317 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4318 pDeviceID
, ulFlags
, NULL
);
4322 /***********************************************************************
4323 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
4327 CM_Get_Device_Interface_List_Size_ExA(
4328 _Out_ PULONG pulLen
,
4329 _In_ LPGUID InterfaceClassGuid
,
4330 _In_opt_ DEVINSTID_A pDeviceID
,
4332 _In_opt_ HMACHINE hMachine
)
4334 DEVINSTID_W pDeviceIdW
= NULL
;
4335 CONFIGRET ret
= CR_SUCCESS
;
4337 TRACE("CM_Get_Device_Interface_List_Size_ExA(%p %p %s 0x%08lx %p)\n",
4338 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
4341 return CR_INVALID_POINTER
;
4343 if (pDeviceID
!= NULL
)
4345 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4346 return CR_INVALID_DEVICE_ID
;
4351 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4352 pDeviceIdW
, ulFlags
, hMachine
);
4354 if (pDeviceIdW
!= NULL
)
4361 /***********************************************************************
4362 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
4366 CM_Get_Device_Interface_List_Size_ExW(
4367 _Out_ PULONG pulLen
,
4368 _In_ LPGUID InterfaceClassGuid
,
4369 _In_opt_ DEVINSTID_W pDeviceID
,
4371 _In_opt_ HMACHINE hMachine
)
4373 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4374 CONFIGRET ret
= CR_SUCCESS
;
4376 TRACE("CM_Get_Device_Interface_List_Size_ExW(%p %p %s 0x%08lx %p)\n",
4377 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
4380 return CR_INVALID_POINTER
;
4382 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4383 return CR_INVALID_FLAG
;
4385 if (hMachine
!= NULL
)
4387 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4388 if (BindingHandle
== NULL
)
4393 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4401 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
4407 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4409 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4417 /***********************************************************************
4418 * CM_Get_First_Log_Conf [SETUPAPI.@]
4422 CM_Get_First_Log_Conf(
4423 _Out_opt_ PLOG_CONF plcLogConf
,
4424 _In_ DEVINST dnDevInst
,
4427 TRACE("CM_Get_First_Log_Conf(%p %lx %lx)\n",
4428 plcLogConf
, dnDevInst
, ulFlags
);
4430 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
4434 /***********************************************************************
4435 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
4439 CM_Get_First_Log_Conf_Ex(
4440 _Out_opt_ PLOG_CONF plcLogConf
,
4441 _In_ DEVINST dnDevInst
,
4443 _In_opt_ HMACHINE hMachine
)
4445 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4446 HSTRING_TABLE StringTable
= NULL
;
4447 LPWSTR lpDevInst
= NULL
;
4448 CONFIGRET ret
= CR_SUCCESS
;
4450 PLOG_CONF_INFO pLogConfInfo
;
4452 FIXME("CM_Get_First_Log_Conf_Ex(%p %lx %lx %p)\n",
4453 plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
4456 return CR_INVALID_DEVINST
;
4458 if (ulFlags
& ~LOG_CONF_BITS
)
4459 return CR_INVALID_FLAG
;
4464 if (hMachine
!= NULL
)
4466 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4467 if (BindingHandle
== NULL
)
4470 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4471 if (StringTable
== 0)
4476 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4480 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4481 if (lpDevInst
== NULL
)
4482 return CR_INVALID_DEVNODE
;
4486 ret
= PNP_GetFirstLogConf(BindingHandle
,
4492 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4494 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4498 if (ret
!= CR_SUCCESS
)
4503 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4504 if (pLogConfInfo
== NULL
)
4505 return CR_OUT_OF_MEMORY
;
4507 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4508 pLogConfInfo
->dnDevInst
= dnDevInst
;
4509 pLogConfInfo
->ulFlags
= ulFlags
;
4510 pLogConfInfo
->ulTag
= ulTag
;
4512 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
4519 /***********************************************************************
4520 * CM_Get_Global_State [SETUPAPI.@]
4524 CM_Get_Global_State(
4525 _Out_ PULONG pulState
,
4528 TRACE("CM_Get_Global_State(%p %lx)\n",
4531 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
4535 /***********************************************************************
4536 * CM_Get_Global_State_Ex [SETUPAPI.@]
4540 CM_Get_Global_State_Ex(
4541 _Out_ PULONG pulState
,
4543 _In_opt_ HMACHINE hMachine
)
4545 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4548 TRACE("CM_Get_Global_State_Ex(%p %lx %p)\n",
4549 pulState
, ulFlags
, hMachine
);
4551 if (pulState
== NULL
)
4552 return CR_INVALID_POINTER
;
4555 return CR_INVALID_FLAG
;
4557 if (hMachine
!= NULL
)
4559 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4560 if (BindingHandle
== NULL
)
4565 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4571 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
4573 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4575 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4583 /***********************************************************************
4584 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
4588 CM_Get_HW_Prof_FlagsA(
4589 _In_ DEVINSTID_A szDevInstName
,
4590 _In_ ULONG ulHardwareProfile
,
4591 _Out_ PULONG pulValue
,
4594 TRACE("CM_Get_HW_Prof_FlagsA(%s %lu %p %lx)\n",
4595 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4597 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
4598 pulValue
, ulFlags
, NULL
);
4602 /***********************************************************************
4603 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
4607 CM_Get_HW_Prof_FlagsW(
4608 _In_ DEVINSTID_W szDevInstName
,
4609 _In_ ULONG ulHardwareProfile
,
4610 _Out_ PULONG pulValue
,
4613 TRACE("CM_Get_HW_Prof_FlagsW(%s %lu %p %lx)\n",
4614 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4616 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
4617 pulValue
, ulFlags
, NULL
);
4621 /***********************************************************************
4622 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
4626 CM_Get_HW_Prof_Flags_ExA(
4627 _In_ DEVINSTID_A szDevInstName
,
4628 _In_ ULONG ulHardwareProfile
,
4629 _Out_ PULONG pulValue
,
4631 _In_opt_ HMACHINE hMachine
)
4633 DEVINSTID_W pszDevIdW
= NULL
;
4634 CONFIGRET ret
= CR_SUCCESS
;
4636 TRACE("CM_Get_HW_Prof_Flags_ExA(%s %lu %p %lx %p)\n",
4637 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4639 if (szDevInstName
!= NULL
)
4641 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
4642 return CR_INVALID_DEVICE_ID
;
4645 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
4646 pulValue
, ulFlags
, hMachine
);
4648 if (pszDevIdW
!= NULL
)
4655 /***********************************************************************
4656 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
4660 CM_Get_HW_Prof_Flags_ExW(
4661 _In_ DEVINSTID_W szDevInstName
,
4662 _In_ ULONG ulHardwareProfile
,
4663 _Out_ PULONG pulValue
,
4665 _In_opt_ HMACHINE hMachine
)
4667 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4670 FIXME("CM_Get_HW_Prof_Flags_ExW(%s %lu %p %lx %p)\n",
4671 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4673 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
4674 return CR_INVALID_POINTER
;
4677 return CR_INVALID_FLAG
;
4679 /* FIXME: Check whether szDevInstName is valid */
4681 if (hMachine
!= NULL
)
4683 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4684 if (BindingHandle
== NULL
)
4689 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4695 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
4696 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
4698 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4700 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4708 /***********************************************************************
4709 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
4713 CM_Get_Hardware_Profile_InfoA(
4715 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4718 TRACE("CM_Get_Hardware_Profile_InfoA(%lu %p %lx)\n",
4719 ulIndex
, pHWProfileInfo
, ulFlags
);
4721 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
4726 /***********************************************************************
4727 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
4731 CM_Get_Hardware_Profile_InfoW(
4733 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4736 TRACE("CM_Get_Hardware_Profile_InfoW(%lu %p %lx)\n",
4737 ulIndex
, pHWProfileInfo
, ulFlags
);
4739 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
4744 /***********************************************************************
4745 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
4749 CM_Get_Hardware_Profile_Info_ExA(
4751 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4753 _In_opt_ HMACHINE hMachine
)
4755 HWPROFILEINFO_W LocalProfileInfo
;
4758 TRACE("CM_Get_Hardware_Profile_Info_ExA(%lu %p %lx %p)\n",
4759 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4761 if (pHWProfileInfo
== NULL
)
4762 return CR_INVALID_POINTER
;
4764 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
4766 if (ret
== CR_SUCCESS
)
4768 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
4769 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
4771 if (WideCharToMultiByte(CP_ACP
,
4773 LocalProfileInfo
.HWPI_szFriendlyName
,
4774 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
4775 pHWProfileInfo
->HWPI_szFriendlyName
,
4786 /***********************************************************************
4787 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
4791 CM_Get_Hardware_Profile_Info_ExW(
4793 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4795 _In_opt_ HMACHINE hMachine
)
4797 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4800 TRACE("CM_Get_Hardware_Profile_Info_ExW(%lu %p %lx %p)\n",
4801 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4803 if (pHWProfileInfo
== NULL
)
4804 return CR_INVALID_POINTER
;
4807 return CR_INVALID_FLAG
;
4809 if (hMachine
!= NULL
)
4811 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4812 if (BindingHandle
== NULL
)
4817 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4823 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
4824 sizeof(HWPROFILEINFO_W
), 0);
4826 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4828 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4836 /***********************************************************************
4837 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
4841 CM_Get_Log_Conf_Priority(
4842 _In_ LOG_CONF lcLogConf
,
4843 _Out_ PPRIORITY pPriority
,
4846 TRACE("CM_Get_Log_Conf_Priority(%p %p %lx)\n",
4847 lcLogConf
, pPriority
, ulFlags
);
4849 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
4853 /***********************************************************************
4854 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
4858 CM_Get_Log_Conf_Priority_Ex(
4859 _In_ LOG_CONF lcLogConf
,
4860 _Out_ PPRIORITY pPriority
,
4862 _In_opt_ HMACHINE hMachine
)
4864 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4865 HSTRING_TABLE StringTable
= NULL
;
4866 PLOG_CONF_INFO pLogConfInfo
;
4870 FIXME("CM_Get_Log_Conf_Priority_Ex(%p %p %lx %p)\n",
4871 lcLogConf
, pPriority
, ulFlags
, hMachine
);
4873 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4874 if (!IsValidLogConf(pLogConfInfo
))
4875 return CR_INVALID_LOG_CONF
;
4877 if (pPriority
== NULL
)
4878 return CR_INVALID_POINTER
;
4881 return CR_INVALID_FLAG
;
4883 if (hMachine
!= NULL
)
4885 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4886 if (BindingHandle
== NULL
)
4889 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4890 if (StringTable
== 0)
4895 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4899 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4900 if (lpDevInst
== NULL
)
4901 return CR_INVALID_DEVNODE
;
4905 ret
= PNP_GetLogConfPriority(BindingHandle
,
4907 pLogConfInfo
->ulFlags
,
4908 pLogConfInfo
->ulTag
,
4912 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4914 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4922 /***********************************************************************
4923 * CM_Get_Next_Log_Conf [SETUPAPI.@]
4927 CM_Get_Next_Log_Conf(
4928 _Out_opt_ PLOG_CONF plcLogConf
,
4929 _In_ LOG_CONF lcLogConf
,
4932 TRACE("CM_Get_Next_Log_Conf(%p %p %lx)\n",
4933 plcLogConf
, lcLogConf
, ulFlags
);
4935 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
4939 /***********************************************************************
4940 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
4944 CM_Get_Next_Log_Conf_Ex(
4945 _Out_opt_ PLOG_CONF plcLogConf
,
4946 _In_ LOG_CONF lcLogConf
,
4948 _In_opt_ HMACHINE hMachine
)
4950 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4951 HSTRING_TABLE StringTable
= NULL
;
4952 PLOG_CONF_INFO pLogConfInfo
;
4953 PLOG_CONF_INFO pNewLogConfInfo
;
4958 FIXME("CM_Get_Next_Log_Conf_Ex(%p %p %lx %p)\n",
4959 plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
4964 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4965 if (!IsValidLogConf(pLogConfInfo
))
4966 return CR_INVALID_LOG_CONF
;
4969 return CR_INVALID_FLAG
;
4971 if (hMachine
!= NULL
)
4973 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4974 if (BindingHandle
== NULL
)
4977 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4978 if (StringTable
== 0)
4983 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4987 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4988 if (lpDevInst
== NULL
)
4989 return CR_INVALID_DEVNODE
;
4993 ret
= PNP_GetNextLogConf(BindingHandle
,
4995 pLogConfInfo
->ulFlags
,
4996 pLogConfInfo
->ulTag
,
5000 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5002 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5006 if (ret
!= CR_SUCCESS
)
5011 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
5012 if (pNewLogConfInfo
== NULL
)
5013 return CR_OUT_OF_MEMORY
;
5015 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
5016 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
5017 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
5018 pNewLogConfInfo
->ulTag
= ulNewTag
;
5020 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
5027 /***********************************************************************
5028 * CM_Get_Next_Re_Des [SETUPAPI.@]
5032 CM_Get_Next_Res_Des(
5033 _Out_ PRES_DES prdResDes
,
5034 _In_ RES_DES rdResDes
,
5035 _In_ RESOURCEID ForResource
,
5036 _Out_opt_ PRESOURCEID pResourceID
,
5039 TRACE("CM_Get_Next_Res_Des(%p %p %lu %p %lx)\n",
5040 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
);
5042 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
5043 pResourceID
, ulFlags
, NULL
);
5047 /***********************************************************************
5048 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
5052 CM_Get_Next_Res_Des_Ex(
5053 _Out_ PRES_DES prdResDes
,
5054 _In_ RES_DES rdResDes
,
5055 _In_ RESOURCEID ForResource
,
5056 _Out_opt_ PRESOURCEID pResourceID
,
5058 _In_opt_ HMACHINE hMachine
)
5060 FIXME("CM_Get_Next_Res_Des_Ex(%p %p %lu %p %lx %p)\n",
5061 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
, hMachine
);
5063 return CR_CALL_NOT_IMPLEMENTED
;
5067 /***********************************************************************
5068 * CM_Get_Parent [SETUPAPI.@]
5073 _Out_ PDEVINST pdnDevInst
,
5074 _In_ DEVINST dnDevInst
,
5077 TRACE("CM_Get_Parent(%p %p %lx)\n",
5078 pdnDevInst
, dnDevInst
, ulFlags
);
5080 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5084 /***********************************************************************
5085 * CM_Get_Parent_Ex [SETUPAPI.@]
5090 _Out_ PDEVINST pdnDevInst
,
5091 _In_ DEVINST dnDevInst
,
5093 _In_opt_ HMACHINE hMachine
)
5095 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5096 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5097 HSTRING_TABLE StringTable
= NULL
;
5099 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5102 TRACE("CM_Get_Parent_Ex(%p %lx %lx %p)\n",
5103 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5105 if (pdnDevInst
== NULL
)
5106 return CR_INVALID_POINTER
;
5109 return CR_INVALID_DEVINST
;
5112 return CR_INVALID_FLAG
;
5116 if (hMachine
!= NULL
)
5118 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5119 if (BindingHandle
== NULL
)
5122 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5123 if (StringTable
== 0)
5128 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5132 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5133 if (lpDevInst
== NULL
)
5134 return CR_INVALID_DEVNODE
;
5138 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5139 PNP_GET_PARENT_DEVICE_INSTANCE
,
5145 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5147 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5151 if (ret
!= CR_SUCCESS
)
5154 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5156 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5160 *pdnDevInst
= dwIndex
;
5166 /***********************************************************************
5167 * CM_Get_Res_Des_Data [SETUPAPI.@]
5171 CM_Get_Res_Des_Data(
5172 _In_ RES_DES rdResDes
,
5173 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5174 _In_ ULONG BufferLen
,
5177 TRACE("CM_Get_Res_Des_Data(%p %p %lu %lx)\n",
5178 rdResDes
, Buffer
, BufferLen
, ulFlags
);
5180 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
5184 /***********************************************************************
5185 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
5189 CM_Get_Res_Des_Data_Ex(
5190 _In_ RES_DES rdResDes
,
5191 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5192 _In_ ULONG BufferLen
,
5194 _In_opt_ HMACHINE hMachine
)
5196 FIXME("CM_Get_Res_Des_Data_Ex(%p %p %lu %lx %p)\n",
5197 rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
5199 return CR_CALL_NOT_IMPLEMENTED
;
5203 /***********************************************************************
5204 * CM_Get_Res_Des_Size [SETUPAPI.@]
5208 CM_Get_Res_Des_Data_Size(
5209 _Out_ PULONG pulSize
,
5210 _In_ RES_DES rdResDes
,
5213 TRACE("CM_Get_Res_Des_Data_Size(%p %p %lx)\n",
5214 pulSize
, rdResDes
, ulFlags
);
5216 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
5220 /***********************************************************************
5221 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
5225 CM_Get_Res_Des_Data_Size_Ex(
5226 _Out_ PULONG pulSize
,
5227 _In_ RES_DES rdResDes
,
5229 _In_opt_ HMACHINE hMachine
)
5231 TRACE("CM_Get_Res_Des_Data_Size_Ex(%p %p %lx %p)\n",
5232 pulSize
, rdResDes
, ulFlags
, hMachine
);
5234 return CR_CALL_NOT_IMPLEMENTED
;
5238 /***********************************************************************
5239 * CM_Get_Resource_Conflict_Count [SETUPAPI.@]
5243 CM_Get_Resource_Conflict_Count(
5244 _In_ CONFLICT_LIST clConflictList
,
5245 _Out_ PULONG pulCount
)
5247 PCONFLICT_DATA pConflictData
;
5249 FIXME("CM_Get_Resource_Conflict_Count(%p %p)\n",
5250 clConflictList
, pulCount
);
5252 pConflictData
= (PCONFLICT_DATA
)clConflictList
;
5253 if (!IsValidConflictData(pConflictData
))
5254 return CR_INVALID_CONFLICT_LIST
;
5256 if (pulCount
== NULL
)
5257 return CR_INVALID_POINTER
;
5259 *pulCount
= pConflictData
->pConflictList
->ConflictsListed
;
5265 /***********************************************************************
5266 * CM_Get_Resource_Conflict_DetailsA [SETUPAPI.@]
5270 CM_Get_Resource_Conflict_DetailsA(
5271 _In_ CONFLICT_LIST clConflictList
,
5273 _Inout_ PCONFLICT_DETAILS_A pConflictDetails
)
5275 FIXME("CM_Get_Resource_Conflict_CountA(%p %lu %p)\n",
5276 clConflictList
, ulIndex
, pConflictDetails
);
5278 return CR_CALL_NOT_IMPLEMENTED
;
5282 /***********************************************************************
5283 * CM_Get_Resource_Conflict_DetailsW [SETUPAPI.@]
5287 CM_Get_Resource_Conflict_DetailsW(
5288 _In_ CONFLICT_LIST clConflictList
,
5290 _Inout_ PCONFLICT_DETAILS_W pConflictDetails
)
5292 FIXME("CM_Get_Resource_Conflict_CountW(%p %lu %p)\n",
5293 clConflictList
, ulIndex
, pConflictDetails
);
5295 return CR_CALL_NOT_IMPLEMENTED
;
5299 /***********************************************************************
5300 * CM_Get_Sibling [SETUPAPI.@]
5305 _Out_ PDEVINST pdnDevInst
,
5306 _In_ DEVINST dnDevInst
,
5309 TRACE("CM_Get_Sibling(%p %p %lx)\n",
5310 pdnDevInst
, dnDevInst
, ulFlags
);
5312 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5316 /***********************************************************************
5317 * CM_Get_Sibling_Ex [SETUPAPI.@]
5322 _Out_ PDEVINST pdnDevInst
,
5323 _In_ DEVINST dnDevInst
,
5325 _In_opt_ HMACHINE hMachine
)
5327 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5328 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5329 HSTRING_TABLE StringTable
= NULL
;
5331 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5334 TRACE("CM_Get_Sibling_Ex(%p %lx %lx %p)\n",
5335 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5337 if (pdnDevInst
== NULL
)
5338 return CR_INVALID_POINTER
;
5341 return CR_INVALID_DEVINST
;
5344 return CR_INVALID_FLAG
;
5348 if (hMachine
!= NULL
)
5350 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5351 if (BindingHandle
== NULL
)
5354 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5355 if (StringTable
== 0)
5360 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5364 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5365 if (lpDevInst
== NULL
)
5366 return CR_INVALID_DEVNODE
;
5370 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5371 PNP_GET_SIBLING_DEVICE_INSTANCE
,
5377 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5379 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5383 if (ret
!= CR_SUCCESS
)
5386 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5388 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5392 *pdnDevInst
= dwIndex
;
5398 /***********************************************************************
5399 * CM_Get_Version [SETUPAPI.@]
5403 CM_Get_Version(VOID
)
5405 TRACE("CM_Get_Version()\n");
5407 return CM_Get_Version_Ex(NULL
);
5411 /***********************************************************************
5412 * CM_Get_Version_Ex [SETUPAPI.@]
5417 _In_opt_ HMACHINE hMachine
)
5419 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5423 TRACE("CM_Get_Version_Ex(%p)\n", hMachine
);
5425 if (hMachine
!= NULL
)
5427 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5428 if (BindingHandle
== NULL
)
5433 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5439 ret
= PNP_GetVersion(BindingHandle
, &Version
);
5441 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5443 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5447 if (ret
!= CR_SUCCESS
)
5454 /***********************************************************************
5455 * CM_Intersect_Range_List [SETUPAPI.@]
5459 CM_Intersect_Range_List(
5460 _In_ RANGE_LIST rlhOld1
,
5461 _In_ RANGE_LIST rlhOld2
,
5462 _In_ RANGE_LIST rlhNew
,
5465 FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
5466 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5468 return CR_CALL_NOT_IMPLEMENTED
;
5472 /***********************************************************************
5473 * CM_Invert_Range_List [SETUPAPI.@]
5477 CM_Invert_Range_List(
5478 _In_ RANGE_LIST rlhOld
,
5479 _In_ RANGE_LIST rlhNew
,
5480 _In_ DWORDLONG ullMaxValue
,
5483 FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
5484 rlhOld
, rlhNew
, ullMaxValue
, ulFlags
);
5486 return CR_CALL_NOT_IMPLEMENTED
;
5490 /***********************************************************************
5491 * CM_Is_Dock_Station_Present [SETUPAPI.@]
5495 CM_Is_Dock_Station_Present(
5496 _Out_ PBOOL pbPresent
)
5498 TRACE("CM_Is_Dock_Station_Present(%p)\n",
5501 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
5505 /***********************************************************************
5506 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
5510 CM_Is_Dock_Station_Present_Ex(
5511 _Out_ PBOOL pbPresent
,
5512 _In_opt_ HMACHINE hMachine
)
5514 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5517 TRACE("CM_Is_Dock_Station_Present_Ex(%p %p)\n",
5518 pbPresent
, hMachine
);
5520 if (pbPresent
== NULL
)
5521 return CR_INVALID_POINTER
;
5525 if (hMachine
!= NULL
)
5527 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5528 if (BindingHandle
== NULL
)
5533 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5539 ret
= PNP_IsDockStationPresent(BindingHandle
,
5542 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5544 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5552 /***********************************************************************
5553 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5557 CM_Is_Version_Available(
5560 TRACE("CM_Is_Version_Available(%hu)\n",
5563 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
5567 /***********************************************************************
5568 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5572 CM_Is_Version_Available_Ex(
5574 _In_opt_ HMACHINE hMachine
)
5576 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5577 WORD wServerVersion
;
5580 TRACE("CM_Is_Version_Available_Ex(%hu %p)\n",
5581 wVersion
, hMachine
);
5583 if (wVersion
<= 0x400)
5586 if (hMachine
!= NULL
)
5588 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5589 if (BindingHandle
== NULL
)
5594 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5600 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
5602 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5604 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5608 if (ret
!= CR_SUCCESS
)
5611 return (wServerVersion
>= wVersion
);
5615 /***********************************************************************
5616 * CM_Locate_DevNodeA [SETUPAPI.@]
5621 _Out_ PDEVINST pdnDevInst
,
5622 _In_opt_ DEVINSTID_A pDeviceID
,
5625 TRACE("CM_Locate_DevNodeA(%p %s %lx)\n",
5626 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
);
5628 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5632 /***********************************************************************
5633 * CM_Locate_DevNodeW [SETUPAPI.@]
5638 _Out_ PDEVINST pdnDevInst
,
5639 _In_opt_ DEVINSTID_W pDeviceID
,
5642 TRACE("CM_Locate_DevNodeW(%p %s %lx)\n",
5643 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
5645 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5649 /***********************************************************************
5650 * CM_Locate_DevNode_ExA [SETUPAPI.@]
5654 CM_Locate_DevNode_ExA(
5655 _Out_ PDEVINST pdnDevInst
,
5656 _In_opt_ DEVINSTID_A pDeviceID
,
5658 _In_opt_ HMACHINE hMachine
)
5660 DEVINSTID_W pDevIdW
= NULL
;
5661 CONFIGRET ret
= CR_SUCCESS
;
5663 TRACE("CM_Locate_DevNode_ExA(%p %s %lx %p)\n",
5664 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
5666 if (pDeviceID
!= NULL
)
5668 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
5669 return CR_INVALID_DEVICE_ID
;
5672 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
5674 if (pDevIdW
!= NULL
)
5681 /***********************************************************************
5682 * CM_Locate_DevNode_ExW [SETUPAPI.@]
5686 CM_Locate_DevNode_ExW(
5687 _Out_ PDEVINST pdnDevInst
,
5688 _In_opt_ DEVINSTID_W pDeviceID
,
5690 _In_opt_ HMACHINE hMachine
)
5692 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
5693 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5694 HSTRING_TABLE StringTable
= NULL
;
5695 CONFIGRET ret
= CR_SUCCESS
;
5697 TRACE("CM_Locate_DevNode_ExW(%p %s %lx %p)\n",
5698 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
5700 if (pdnDevInst
== NULL
)
5701 return CR_INVALID_POINTER
;
5703 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
5704 return CR_INVALID_FLAG
;
5706 if (hMachine
!= NULL
)
5708 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5709 if (BindingHandle
== NULL
)
5712 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5713 if (StringTable
== 0)
5718 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5722 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
5724 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
5730 /* Get the root device ID */
5731 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
5735 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5737 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5741 if (ret
!= CR_SUCCESS
)
5744 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
5748 /* Validate the device ID */
5749 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
5753 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5755 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5759 if (ret
== CR_SUCCESS
)
5761 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
5762 if (*pdnDevInst
== -1)
5770 /***********************************************************************
5771 * CM_Merge_Range_List [SETUPAPI.@]
5775 CM_Merge_Range_List(
5776 _In_ RANGE_LIST rlhOld1
,
5777 _In_ RANGE_LIST rlhOld2
,
5778 _In_ RANGE_LIST rlhNew
,
5781 FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
5782 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5784 return CR_CALL_NOT_IMPLEMENTED
;
5788 /***********************************************************************
5789 * CM_Modify_Res_Des [SETUPAPI.@]
5794 _Out_ PRES_DES prdResDes
,
5795 _In_ RES_DES rdResDes
,
5796 _In_ RESOURCEID ResourceID
,
5797 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5798 _In_ ULONG ResourceLen
,
5801 TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
5802 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5803 ResourceLen
, ulFlags
);
5805 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5806 ResourceLen
, ulFlags
, NULL
);
5810 /***********************************************************************
5811 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
5815 CM_Modify_Res_Des_Ex(
5816 _Out_ PRES_DES prdResDes
,
5817 _In_ RES_DES rdResDes
,
5818 _In_ RESOURCEID ResourceID
,
5819 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5820 _In_ ULONG ResourceLen
,
5822 _In_opt_ HMACHINE hMachine
)
5824 FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %p)\n",
5825 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5826 ResourceLen
, ulFlags
, hMachine
);
5828 return CR_CALL_NOT_IMPLEMENTED
;
5832 /***********************************************************************
5833 * CM_Move_DevNode [SETUPAPI.@]
5838 _In_ DEVINST dnFromDevInst
,
5839 _In_ DEVINST dnToDevInst
,
5842 TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
5843 dnFromDevInst
, dnToDevInst
, ulFlags
);
5845 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
5849 /***********************************************************************
5850 * CM_Move_DevNode_Ex [SETUPAPI.@]
5855 _In_ DEVINST dnFromDevInst
,
5856 _In_ DEVINST dnToDevInst
,
5858 _In_opt_ HMACHINE hMachine
)
5860 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5861 HSTRING_TABLE StringTable
= NULL
;
5862 LPWSTR lpFromDevInst
;
5866 FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %p)\n",
5867 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
5869 if (!pSetupIsUserAdmin())
5870 return CR_ACCESS_DENIED
;
5872 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
5873 return CR_INVALID_DEVNODE
;
5876 return CR_INVALID_FLAG
;
5878 if (hMachine
!= NULL
)
5880 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5881 if (BindingHandle
== NULL
)
5884 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5885 if (StringTable
== 0)
5890 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5894 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
5895 if (lpFromDevInst
== NULL
)
5896 return CR_INVALID_DEVNODE
;
5898 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
5899 if (lpToDevInst
== NULL
)
5900 return CR_INVALID_DEVNODE
;
5904 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5910 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5912 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5920 /***********************************************************************
5921 * CM_Next_Range [SETUPAPI.@]
5926 _Inout_ PRANGE_ELEMENT preElement
,
5927 _Out_ PDWORDLONG pullStart
,
5928 _Out_ PDWORDLONG pullEnd
,
5931 PINTERNAL_RANGE_LIST pRangeList
;
5932 PINTERNAL_RANGE pRange
;
5933 PLIST_ENTRY ListEntry
;
5934 CONFIGRET ret
= CR_SUCCESS
;
5936 FIXME("CM_Next_Range(%p %p %p %lx)\n",
5937 preElement
, pullStart
, pullEnd
, ulFlags
);
5939 pRange
= (PINTERNAL_RANGE
)preElement
;
5941 if (pRange
== NULL
|| pRange
->pRangeList
== NULL
)
5944 if (pullStart
== NULL
|| pullEnd
== NULL
)
5945 return CR_INVALID_POINTER
;
5948 return CR_INVALID_FLAG
;
5950 pRangeList
= pRange
->pRangeList
;
5952 /* Lock the range list */
5953 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
5955 /* Fail, if we reached the end of the list */
5956 if (pRange
->ListEntry
.Flink
== &pRangeList
->ListHead
)
5962 /* Get the next range */
5963 ListEntry
= pRangeList
->ListHead
.Flink
;
5964 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
5966 /* Return the range data */
5967 *pullStart
= pRange
->ullStart
;
5968 *pullEnd
= pRange
->ullEnd
;
5969 *preElement
= (RANGE_ELEMENT
)pRange
;
5972 /* Unlock the range list */
5973 ReleaseMutex(pRangeList
->hMutex
);
5979 /***********************************************************************
5980 * CM_Open_Class_KeyA [SETUPAPI.@]
5985 _In_opt_ LPGUID pClassGuid
,
5986 _In_opt_ LPCSTR pszClassName
,
5987 _In_ REGSAM samDesired
,
5988 _In_ REGDISPOSITION Disposition
,
5989 _Out_ PHKEY phkClass
,
5992 TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
5993 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
5994 samDesired
, Disposition
, phkClass
, ulFlags
);
5996 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
5997 Disposition
, phkClass
, ulFlags
, NULL
);
6001 /***********************************************************************
6002 * CM_Open_Class_KeyW [SETUPAPI.@]
6007 _In_opt_ LPGUID pClassGuid
,
6008 _In_opt_ LPCWSTR pszClassName
,
6009 _In_ REGSAM samDesired
,
6010 _In_ REGDISPOSITION Disposition
,
6011 _Out_ PHKEY phkClass
,
6014 TRACE("CM_Open_Class_KeyW%p %s %lx %lx %p %lx)\n",
6015 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
6016 samDesired
, Disposition
, phkClass
, ulFlags
);
6018 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
6019 Disposition
, phkClass
, ulFlags
, NULL
);
6023 /***********************************************************************
6024 * CM_Open_Class_Key_ExA [SETUPAPI.@]
6028 CM_Open_Class_Key_ExA(
6029 _In_opt_ LPGUID pClassGuid
,
6030 _In_opt_ LPCSTR pszClassName
,
6031 _In_ REGSAM samDesired
,
6032 _In_ REGDISPOSITION Disposition
,
6033 _Out_ PHKEY phkClass
,
6035 _In_opt_ HMACHINE hMachine
)
6037 LPWSTR pszClassNameW
= NULL
;
6040 TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %p)\n",
6041 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
6042 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
6044 if (pszClassName
!= NULL
)
6046 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
6047 return CR_INVALID_DATA
;
6050 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
6051 Disposition
, phkClass
, ulFlags
, hMachine
);
6053 if (pszClassNameW
!= NULL
)
6054 MyFree(pszClassNameW
);
6060 /***********************************************************************
6061 * CM_Open_Class_Key_ExW [SETUPAPI.@]
6065 CM_Open_Class_Key_ExW(
6066 _In_opt_ LPGUID pClassGuid
,
6067 _In_opt_ LPCWSTR pszClassName
,
6068 _In_ REGSAM samDesired
,
6069 _In_ REGDISPOSITION Disposition
,
6070 _Out_ PHKEY phkClass
,
6072 _In_opt_ HMACHINE hMachine
)
6074 WCHAR szKeyName
[MAX_PATH
];
6075 LPWSTR lpGuidString
;
6076 DWORD dwDisposition
;
6080 TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %p)\n",
6081 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
6082 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
6084 /* Check Disposition and ulFlags */
6085 if ((Disposition
& ~RegDisposition_Bits
) ||
6086 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
6087 return CR_INVALID_FLAG
;
6089 /* Check phkClass */
6090 if (phkClass
== NULL
)
6091 return CR_INVALID_POINTER
;
6095 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
6096 pszClassName
!= NULL
)
6097 return CR_INVALID_DATA
;
6099 if (hMachine
== NULL
)
6101 hKey
= HKEY_LOCAL_MACHINE
;
6105 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6108 return CR_REGISTRY_ERROR
;
6111 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
6113 lstrcpyW(szKeyName
, DeviceClasses
);
6117 lstrcpyW(szKeyName
, ControlClass
);
6120 if (pClassGuid
!= NULL
)
6122 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
6125 return CR_INVALID_DATA
;
6128 lstrcatW(szKeyName
, Backslash
);
6129 lstrcatW(szKeyName
, lpGuidString
);
6132 if (Disposition
== RegDisposition_OpenAlways
)
6134 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
6135 NULL
, phkClass
, &dwDisposition
);
6139 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
6144 if (pClassGuid
!= NULL
)
6145 RpcStringFreeW(&lpGuidString
);
6147 if (dwError
!= ERROR_SUCCESS
)
6150 return CR_NO_SUCH_REGISTRY_KEY
;
6153 if (pszClassName
!= NULL
)
6155 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
6156 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
6163 /***********************************************************************
6164 * CM_Open_DevNode_Key [SETUPAPI.@]
6168 CM_Open_DevNode_Key(
6169 _In_ DEVINST dnDevNode
,
6170 _In_ REGSAM samDesired
,
6171 _In_ ULONG ulHardwareProfile
,
6172 _In_ REGDISPOSITION Disposition
,
6173 _Out_ PHKEY phkDevice
,
6176 TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
6177 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
6179 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
6180 Disposition
, phkDevice
, ulFlags
, NULL
);
6184 /***********************************************************************
6185 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
6189 CM_Open_DevNode_Key_Ex(
6190 _In_ DEVINST dnDevNode
,
6191 _In_ REGSAM samDesired
,
6192 _In_ ULONG ulHardwareProfile
,
6193 _In_ REGDISPOSITION Disposition
,
6194 _Out_ PHKEY phkDevice
,
6196 _In_opt_ HMACHINE hMachine
)
6198 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6199 HSTRING_TABLE StringTable
= NULL
;
6200 LPWSTR pszDevInst
, pszKeyPath
= NULL
, pszInstancePath
= NULL
;
6202 DWORD dwDisposition
;
6203 HKEY hRootKey
= NULL
;
6204 CONFIGRET ret
= CR_CALL_NOT_IMPLEMENTED
;
6206 TRACE("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %p)\n",
6207 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
6209 if (phkDevice
== NULL
)
6210 return CR_INVALID_POINTER
;
6215 return CR_INVALID_DEVNODE
;
6217 if (ulFlags
& ~CM_REGISTRY_BITS
)
6218 return CR_INVALID_FLAG
;
6220 if (Disposition
& ~RegDisposition_Bits
)
6221 return CR_INVALID_DATA
;
6223 if (hMachine
!= NULL
)
6225 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6226 if (BindingHandle
== NULL
)
6229 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6230 if (StringTable
== 0)
6235 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6239 pszDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevNode
);
6240 if (pszDevInst
== NULL
)
6241 return CR_INVALID_DEVNODE
;
6243 TRACE("pszDevInst: %S\n", pszDevInst
);
6245 pszKeyPath
= MyMalloc(512 * sizeof(WCHAR
));
6246 if (pszKeyPath
== NULL
)
6248 ret
= CR_OUT_OF_MEMORY
;
6252 pszInstancePath
= MyMalloc(512 * sizeof(WCHAR
));
6253 if (pszInstancePath
== NULL
)
6255 ret
= CR_OUT_OF_MEMORY
;
6259 ret
= GetDeviceInstanceKeyPath(BindingHandle
,
6265 if (ret
!= CR_SUCCESS
)
6268 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6269 TRACE("pszInstancePath: %S\n", pszInstancePath
);
6271 wcscat(pszKeyPath
, L
"\\");
6272 wcscat(pszKeyPath
, pszInstancePath
);
6274 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6276 if (hMachine
== NULL
)
6278 hRootKey
= HKEY_LOCAL_MACHINE
;
6282 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6286 ret
= CR_REGISTRY_ERROR
;
6291 if (Disposition
== RegDisposition_OpenAlways
)
6293 lError
= RegCreateKeyExW(hRootKey
,
6305 lError
= RegOpenKeyExW(hRootKey
,
6312 if (lError
!= ERROR_SUCCESS
)
6315 ret
= CR_NO_SUCH_REGISTRY_KEY
;
6319 if ((hRootKey
!= NULL
) && (hRootKey
!= HKEY_LOCAL_MACHINE
))
6320 RegCloseKey(hRootKey
);
6322 if (pszInstancePath
!= NULL
)
6323 MyFree(pszInstancePath
);
6325 if (pszKeyPath
!= NULL
)
6332 /***********************************************************************
6333 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
6337 CM_Query_And_Remove_SubTreeA(
6338 _In_ DEVINST dnAncestor
,
6339 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6340 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6341 _In_ ULONG ulNameLength
,
6344 TRACE("CM_Query_And_Remove_SubTreeA(%lx %p %s %lu %lx)\n",
6345 dnAncestor
, pVetoType
, pszVetoName
, ulNameLength
, ulFlags
);
6347 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
6348 ulNameLength
, ulFlags
, NULL
);
6352 /***********************************************************************
6353 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
6357 CM_Query_And_Remove_SubTreeW(
6358 _In_ DEVINST dnAncestor
,
6359 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6360 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6361 _In_ ULONG ulNameLength
,
6364 TRACE("CM_Query_And_Remove_SubTreeW(%lx %p %s %lu %lx)\n",
6365 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
6367 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
6368 ulNameLength
, ulFlags
, NULL
);
6372 /***********************************************************************
6373 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
6377 CM_Query_And_Remove_SubTree_ExA(
6378 _In_ DEVINST dnAncestor
,
6379 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6380 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6381 _In_ ULONG ulNameLength
,
6383 _In_opt_ HMACHINE hMachine
)
6385 LPWSTR lpLocalVetoName
;
6388 TRACE("CM_Query_And_Remove_SubTree_ExA(%lx %p %s %lu %lx %p)\n",
6389 dnAncestor
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
,
6392 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6393 return CR_INVALID_POINTER
;
6395 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
6396 if (lpLocalVetoName
== NULL
)
6397 return CR_OUT_OF_MEMORY
;
6399 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
6400 ulNameLength
, ulFlags
, hMachine
);
6401 if (ret
== CR_REMOVE_VETOED
)
6403 if (WideCharToMultiByte(CP_ACP
,
6414 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
6420 /***********************************************************************
6421 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
6425 CM_Query_And_Remove_SubTree_ExW(
6426 _In_ DEVINST dnAncestor
,
6427 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6428 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6429 _In_ ULONG ulNameLength
,
6431 _In_opt_ HMACHINE hMachine
)
6433 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6434 HSTRING_TABLE StringTable
= NULL
;
6438 TRACE("CM_Query_And_Remove_SubTree_ExW(%lx %p %s %lu %lx %p)\n",
6439 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
,
6442 if (dnAncestor
== 0)
6443 return CR_INVALID_DEVNODE
;
6445 if (ulFlags
& ~CM_REMOVE_BITS
)
6446 return CR_INVALID_FLAG
;
6448 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6449 return CR_INVALID_POINTER
;
6451 if (hMachine
!= NULL
)
6453 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6454 if (BindingHandle
== NULL
)
6457 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6458 if (StringTable
== 0)
6463 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6467 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
6468 if (lpDevInst
== NULL
)
6469 return CR_INVALID_DEVNODE
;
6473 ret
= PNP_QueryRemove(BindingHandle
,
6480 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6482 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6490 /***********************************************************************
6491 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
6495 CM_Query_Arbitrator_Free_Data(
6496 _Out_writes_bytes_(DataLen
) PVOID pData
,
6498 _In_ DEVINST dnDevInst
,
6499 _In_ RESOURCEID ResourceID
,
6502 TRACE("CM_Query_Arbitrator_Free_Data(%p %lu %lx %lu 0x%08lx)\n",
6503 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
);
6505 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
6506 ResourceID
, ulFlags
, NULL
);
6510 /***********************************************************************
6511 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
6515 CM_Query_Arbitrator_Free_Data_Ex(
6516 _Out_writes_bytes_(DataLen
) PVOID pData
,
6518 _In_ DEVINST dnDevInst
,
6519 _In_ RESOURCEID ResourceID
,
6521 _In_opt_ HMACHINE hMachine
)
6523 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6524 HSTRING_TABLE StringTable
= NULL
;
6528 TRACE("CM_Query_Arbitrator_Free_Data_Ex(%p %lu %lx %lu 0x%08lx %p)\n",
6529 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
, hMachine
);
6531 if (pData
== NULL
|| DataLen
== 0)
6532 return CR_INVALID_POINTER
;
6535 return CR_INVALID_DEVINST
;
6537 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6538 return CR_INVALID_FLAG
;
6540 if (hMachine
!= NULL
)
6542 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6543 if (BindingHandle
== NULL
)
6546 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6547 if (StringTable
== 0)
6552 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6556 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6557 if (lpDevInst
== NULL
)
6558 return CR_INVALID_DEVNODE
;
6562 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
6569 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6571 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6579 /***********************************************************************
6580 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
6584 CM_Query_Arbitrator_Free_Size(
6585 _Out_ PULONG pulSize
,
6586 _In_ DEVINST dnDevInst
,
6587 _In_ RESOURCEID ResourceID
,
6590 TRACE("CM_Query_Arbitrator_Free_Size(%p %lu %lx 0x%08lx)\n",
6591 pulSize
, dnDevInst
,ResourceID
, ulFlags
);
6593 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
6598 /***********************************************************************
6599 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
6603 CM_Query_Arbitrator_Free_Size_Ex(
6604 _Out_ PULONG pulSize
,
6605 _In_ DEVINST dnDevInst
,
6606 _In_ RESOURCEID ResourceID
,
6608 _In_opt_ HMACHINE hMachine
)
6610 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6611 HSTRING_TABLE StringTable
= NULL
;
6615 TRACE("CM_Query_Arbitrator_Free_Size_Ex(%p %lu %lx 0x%08lx %p)\n",
6616 pulSize
, dnDevInst
,ResourceID
, ulFlags
, hMachine
);
6618 if (pulSize
== NULL
)
6619 return CR_INVALID_POINTER
;
6622 return CR_INVALID_DEVINST
;
6624 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6625 return CR_INVALID_FLAG
;
6627 if (hMachine
!= NULL
)
6629 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6630 if (BindingHandle
== NULL
)
6633 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6634 if (StringTable
== 0)
6639 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6643 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6644 if (lpDevInst
== NULL
)
6645 return CR_INVALID_DEVNODE
;
6649 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
6655 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6657 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6665 /***********************************************************************
6666 * CM_Query_Remove_SubTree [SETUPAPI.@]
6668 * This function is obsolete in Windows XP and above.
6672 CM_Query_Remove_SubTree(
6673 _In_ DEVINST dnAncestor
,
6676 TRACE("CM_Query_Remove_SubTree(%lx %lx)\n",
6677 dnAncestor
, ulFlags
);
6679 return CR_CALL_NOT_IMPLEMENTED
;
6683 /***********************************************************************
6684 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
6686 * This function is obsolete in Windows XP and above.
6690 CM_Query_Remove_SubTree_Ex(
6691 _In_ DEVINST dnAncestor
,
6693 _In_opt_ HMACHINE hMachine
)
6695 TRACE("CM_Query_Remove_SubTree_Ex(%lx %lx %p)\n",
6696 dnAncestor
, ulFlags
, hMachine
);
6698 return CR_CALL_NOT_IMPLEMENTED
;
6702 /***********************************************************************
6703 * CM_Query_Resource_Conflict_List [SETUPAPI.@]
6707 CM_Query_Resource_Conflict_List(
6708 _Out_ PCONFLICT_LIST pclConflictList
,
6709 _In_ DEVINST dnDevInst
,
6710 _In_ RESOURCEID ResourceID
,
6711 _In_ PCVOID ResourceData
,
6712 _In_ ULONG ResourceLen
,
6714 _In_opt_ HMACHINE hMachine
)
6716 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6717 HSTRING_TABLE StringTable
= NULL
;
6718 PPNP_CONFLICT_LIST pConflictBuffer
= NULL
;
6719 PCONFLICT_DATA pConflictData
= NULL
;
6720 ULONG ulBufferLength
;
6724 FIXME("CM_Query_Resource_Conflict_List(%p %lx %lu %p %lu %lx %p)\n",
6725 pclConflictList
, dnDevInst
, ResourceID
, ResourceData
,
6726 ResourceLen
, ulFlags
, hMachine
);
6729 return CR_INVALID_DEVNODE
;
6731 if (ulFlags
& ~CM_RESDES_WIDTH_BITS
)
6732 return CR_INVALID_FLAG
;
6734 if (pclConflictList
== NULL
||
6735 ResourceData
== NULL
||
6737 return CR_INVALID_POINTER
;
6739 if (ResourceID
== 0)
6740 return CR_INVALID_RESOURCEID
;
6742 *pclConflictList
= 0;
6744 if (hMachine
!= NULL
)
6746 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6747 if (BindingHandle
== NULL
)
6750 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6751 if (StringTable
== 0)
6756 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6760 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6761 if (lpDevInst
== NULL
)
6762 return CR_INVALID_DEVNODE
;
6764 pConflictData
= MyMalloc(sizeof(PCONFLICT_DATA
));
6765 if (pConflictData
== NULL
)
6767 ret
= CR_OUT_OF_MEMORY
;
6771 ulBufferLength
= sizeof(PNP_CONFLICT_LIST
) +
6772 sizeof(PNP_CONFLICT_STRINGS
) +
6773 (sizeof(wchar_t) * 200);
6774 pConflictBuffer
= MyMalloc(ulBufferLength
);
6775 if (pConflictBuffer
== NULL
)
6777 ret
= CR_OUT_OF_MEMORY
;
6783 ret
= PNP_QueryResConfList(BindingHandle
,
6786 (PBYTE
)ResourceData
,
6788 (PBYTE
)pConflictBuffer
,
6792 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6794 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6798 if (ret
!= CR_SUCCESS
)
6801 pConflictData
->ulMagic
= CONFLICT_MAGIC
;
6802 pConflictData
->pConflictList
= pConflictBuffer
;
6804 *pclConflictList
= (CONFLICT_LIST
)pConflictData
;
6807 if (ret
!= CR_SUCCESS
)
6809 if (pConflictBuffer
!= NULL
)
6810 MyFree(pConflictBuffer
);
6812 if (pConflictData
!= NULL
)
6813 MyFree(pConflictData
);
6820 /***********************************************************************
6821 * CM_Reenumerate_DevNode [SETUPAPI.@]
6825 CM_Reenumerate_DevNode(
6826 _In_ DEVINST dnDevInst
,
6829 TRACE("CM_Reenumerate_DevNode(%lx %lx)\n",
6830 dnDevInst
, ulFlags
);
6832 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
6836 /***********************************************************************
6837 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
6840 CM_Reenumerate_DevNode_Ex(
6841 _In_ DEVINST dnDevInst
,
6843 _In_opt_ HMACHINE hMachine
)
6845 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6846 HSTRING_TABLE StringTable
= NULL
;
6850 FIXME("CM_Reenumerate_DevNode_Ex(%lx %lx %p)\n",
6851 dnDevInst
, ulFlags
, hMachine
);
6854 return CR_INVALID_DEVNODE
;
6856 if (ulFlags
& ~CM_REENUMERATE_BITS
)
6857 return CR_INVALID_FLAG
;
6859 if (hMachine
!= NULL
)
6861 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6862 if (BindingHandle
== NULL
)
6865 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6866 if (StringTable
== 0)
6871 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6875 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6876 if (lpDevInst
== NULL
)
6877 return CR_INVALID_DEVNODE
;
6881 ret
= PNP_DeviceInstanceAction(BindingHandle
,
6882 PNP_DEVINST_REENUMERATE
,
6887 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6889 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6897 /***********************************************************************
6898 * CM_Register_Device_Driver [SETUPAPI.@]
6902 CM_Register_Device_Driver(
6903 _In_ DEVINST dnDevInst
,
6906 TRACE("CM_Register_Device_Driver(%lx 0x%08lx)\n",
6907 dnDevInst
, ulFlags
);
6909 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
6913 /***********************************************************************
6914 * CM_Register_Device_Driver_Ex [SETUPAPI.@]
6918 CM_Register_Device_Driver_Ex(
6919 _In_ DEVINST dnDevInst
,
6921 _In_opt_ HMACHINE hMachine
)
6923 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6924 HSTRING_TABLE StringTable
= NULL
;
6928 TRACE("CM_Register_Device_Driver_Ex(%lx 0x%08lx %p)\n",
6929 dnDevInst
, ulFlags
, hMachine
);
6932 return CR_INVALID_DEVNODE
;
6934 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
6935 return CR_INVALID_FLAG
;
6937 if (hMachine
!= NULL
)
6939 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6940 if (BindingHandle
== NULL
)
6943 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6944 if (StringTable
== 0)
6949 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6953 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6954 if (lpDevInst
== NULL
)
6955 return CR_INVALID_DEVNODE
;
6959 ret
= PNP_RegisterDriver(BindingHandle
,
6963 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6965 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6973 /***********************************************************************
6974 * CM_Register_Device_InterfaceA [SETUPAPI.@]
6978 CM_Register_Device_InterfaceA(
6979 _In_ DEVINST dnDevInst
,
6980 _In_ LPGUID InterfaceClassGuid
,
6981 _In_opt_ LPCSTR pszReference
,
6982 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
6983 _Inout_ PULONG pulLength
,
6986 TRACE("CM_Register_Device_InterfaceA(%lx %s %s %p %p %lx)\n",
6987 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
6988 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
6990 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
6991 pszReference
, pszDeviceInterface
,
6992 pulLength
, ulFlags
, NULL
);
6996 /***********************************************************************
6997 * CM_Register_Device_InterfaceW [SETUPAPI.@]
7001 CM_Register_Device_InterfaceW(
7002 _In_ DEVINST dnDevInst
,
7003 _In_ LPGUID InterfaceClassGuid
,
7004 _In_opt_ LPCWSTR pszReference
,
7005 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
7006 _Inout_ PULONG pulLength
,
7009 TRACE("CM_Register_Device_InterfaceW(%lx %s %s %p %p %lx)\n",
7010 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
7011 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
7013 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
7014 pszReference
, pszDeviceInterface
,
7015 pulLength
, ulFlags
, NULL
);
7019 /***********************************************************************
7020 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
7024 CM_Register_Device_Interface_ExA(
7025 _In_ DEVINST dnDevInst
,
7026 _In_ LPGUID InterfaceClassGuid
,
7027 _In_opt_ LPCSTR pszReference
,
7028 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
7029 _Inout_ PULONG pulLength
,
7031 _In_opt_ HMACHINE hMachine
)
7033 LPWSTR pszReferenceW
= NULL
;
7034 LPWSTR pszDeviceInterfaceW
= NULL
;
7038 TRACE("CM_Register_Device_Interface_ExA(%lx %s %s %p %p %lx %p)\n",
7039 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_a(pszReference
),
7040 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
7042 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
7043 return CR_INVALID_POINTER
;
7045 if (pszReference
!= NULL
)
7047 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
7048 return CR_INVALID_DATA
;
7051 ulLength
= *pulLength
;
7053 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
7054 if (pszDeviceInterfaceW
== NULL
)
7056 ret
= CR_OUT_OF_MEMORY
;
7060 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
7063 pszDeviceInterfaceW
,
7067 if (ret
== CR_SUCCESS
)
7069 if (WideCharToMultiByte(CP_ACP
,
7071 pszDeviceInterfaceW
,
7080 *pulLength
= ulLength
;
7083 if (pszDeviceInterfaceW
!= NULL
)
7084 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
7086 if (pszReferenceW
!= NULL
)
7087 MyFree(pszReferenceW
);
7093 /***********************************************************************
7094 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
7098 CM_Register_Device_Interface_ExW(
7099 _In_ DEVINST dnDevInst
,
7100 _In_ LPGUID InterfaceClassGuid
,
7101 _In_opt_ LPCWSTR pszReference
,
7102 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
7103 _Inout_ PULONG pulLength
,
7105 _In_opt_ HMACHINE hMachine
)
7107 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7108 HSTRING_TABLE StringTable
= NULL
;
7110 ULONG ulTransferLength
;
7113 TRACE("CM_Register_Device_Interface_ExW(%lx %s %s %p %p %lx %p)\n",
7114 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_w(pszReference
),
7115 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
7118 return CR_INVALID_DEVNODE
;
7120 if (InterfaceClassGuid
== NULL
||
7121 pszDeviceInterface
== NULL
||
7123 return CR_INVALID_POINTER
;
7126 return CR_INVALID_FLAG
;
7128 if (hMachine
!= NULL
)
7130 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7131 if (BindingHandle
== NULL
)
7134 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7135 if (StringTable
== 0)
7140 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7144 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7145 if (lpDevInst
== NULL
)
7146 return CR_INVALID_DEVNODE
;
7148 ulTransferLength
= *pulLength
;
7152 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
7155 (LPWSTR
)pszReference
,
7161 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7163 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7171 /***********************************************************************
7172 * CM_Remove_SubTree [SETUPAPI.@]
7174 * This function is obsolete in Windows XP and above.
7179 _In_ DEVINST dnAncestor
,
7182 TRACE("CM_Remove_SubTree(%lx %lx)\n",
7183 dnAncestor
, ulFlags
);
7185 return CR_CALL_NOT_IMPLEMENTED
;
7189 /***********************************************************************
7190 * CM_Remove_SubTree_Ex [SETUPAPI.@]
7192 * This function is obsolete in Windows XP and above.
7196 CM_Remove_SubTree_Ex(
7197 _In_ DEVINST dnAncestor
,
7199 _In_opt_ HMACHINE hMachine
)
7201 TRACE("CM_Remove_SubTree_Ex(%lx %lx %p)\n",
7202 dnAncestor
, ulFlags
, hMachine
);
7204 return CR_CALL_NOT_IMPLEMENTED
;
7208 /***********************************************************************
7209 * CM_Request_Device_EjectA [SETUPAPI.@]
7213 CM_Request_Device_EjectA(
7214 _In_ DEVINST dnDevInst
,
7215 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7216 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7217 _In_ ULONG ulNameLength
,
7220 TRACE("CM_Request_Device_EjectA(%lx %p %s %lu %lx)\n",
7221 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
);
7223 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
7224 ulNameLength
, ulFlags
, NULL
);
7228 /***********************************************************************
7229 * CM_Request_Device_EjectW [SETUPAPI.@]
7233 CM_Request_Device_EjectW(
7234 _In_ DEVINST dnDevInst
,
7235 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7236 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7237 _In_ ULONG ulNameLength
,
7240 TRACE("CM_Request_Device_EjectW(%lx %p %s %lu %lx)\n",
7241 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
7243 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
7244 ulNameLength
, ulFlags
, NULL
);
7248 /***********************************************************************
7249 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
7253 CM_Request_Device_Eject_ExA(
7254 _In_ DEVINST dnDevInst
,
7255 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7256 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7257 _In_ ULONG ulNameLength
,
7259 _In_opt_ HMACHINE hMachine
)
7261 LPWSTR lpLocalVetoName
;
7264 TRACE("CM_Request_Device_Eject_ExA(%lx %p %s %lu %lx %p)\n",
7265 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7267 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7268 return CR_INVALID_POINTER
;
7270 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
7271 if (lpLocalVetoName
== NULL
)
7272 return CR_OUT_OF_MEMORY
;
7274 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
7275 ulNameLength
, ulFlags
, hMachine
);
7276 if (ret
== CR_REMOVE_VETOED
)
7278 if (WideCharToMultiByte(CP_ACP
,
7289 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
7295 /***********************************************************************
7296 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
7300 CM_Request_Device_Eject_ExW(
7301 _In_ DEVINST dnDevInst
,
7302 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7303 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7304 _In_ ULONG ulNameLength
,
7306 _In_opt_ HMACHINE hMachine
)
7308 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7309 HSTRING_TABLE StringTable
= NULL
;
7313 TRACE("CM_Request_Device_Eject_ExW(%lx %p %s %lu %lx %p)\n",
7314 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7317 return CR_INVALID_DEVNODE
;
7320 return CR_INVALID_FLAG
;
7322 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7323 return CR_INVALID_POINTER
;
7325 if (hMachine
!= NULL
)
7327 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7328 if (BindingHandle
== NULL
)
7331 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7332 if (StringTable
== 0)
7337 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7341 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7342 if (lpDevInst
== NULL
)
7343 return CR_INVALID_DEVNODE
;
7347 ret
= PNP_RequestDeviceEject(BindingHandle
,
7354 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7356 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7364 /***********************************************************************
7365 * CM_Request_Eject_PC [SETUPAPI.@]
7369 CM_Request_Eject_PC(VOID
)
7371 TRACE("CM_Request_Eject_PC()\n");
7373 return CM_Request_Eject_PC_Ex(NULL
);
7377 /***********************************************************************
7378 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
7382 CM_Request_Eject_PC_Ex(
7383 _In_opt_ HMACHINE hMachine
)
7385 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7388 TRACE("CM_Request_Eject_PC_Ex(%p)\n", hMachine
);
7390 if (hMachine
!= NULL
)
7392 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7393 if (BindingHandle
== NULL
)
7398 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7404 ret
= PNP_RequestEjectPC(BindingHandle
);
7406 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7408 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7416 /***********************************************************************
7417 * CM_Run_Detection [SETUPAPI.@]
7424 TRACE("CM_Run_Detection(%lx)\n", ulFlags
);
7426 return CM_Run_Detection_Ex(ulFlags
, NULL
);
7430 /***********************************************************************
7431 * CM_Run_Detection_Ex [SETUPAPI.@]
7435 CM_Run_Detection_Ex(
7437 _In_opt_ HMACHINE hMachine
)
7439 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7442 TRACE("CM_Run_Detection_Ex(%lx %p)\n",
7445 if (!pSetupIsUserAdmin())
7446 return CR_ACCESS_DENIED
;
7448 if (ulFlags
& ~CM_DETECT_BITS
)
7449 return CR_INVALID_FLAG
;
7451 if (hMachine
!= NULL
)
7453 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7454 if (BindingHandle
== NULL
)
7459 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7465 ret
= PNP_RunDetection(BindingHandle
,
7468 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7470 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7478 /***********************************************************************
7479 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
7483 CM_Set_Class_Registry_PropertyA(
7484 _In_ LPGUID ClassGuid
,
7485 _In_ ULONG ulProperty
,
7486 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7487 _In_ ULONG ulLength
,
7489 _In_opt_ HMACHINE hMachine
)
7491 FIXME("CM_Set_Class_Registry_PropertyA(%p %lx %p %lu %lx %p)\n",
7492 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7494 return CR_CALL_NOT_IMPLEMENTED
;
7498 /***********************************************************************
7499 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
7503 CM_Set_Class_Registry_PropertyW(
7504 _In_ LPGUID ClassGuid
,
7505 _In_ ULONG ulProperty
,
7506 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7507 _In_ ULONG ulLength
,
7509 _In_opt_ HMACHINE hMachine
)
7511 FIXME("CM_Set_Class_Registry_PropertyW(%p %lx %p %lu %lx %p)\n",
7512 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7514 return CR_CALL_NOT_IMPLEMENTED
;
7518 /***********************************************************************
7519 * CM_Set_DevNode_Problem [SETUPAPI.@]
7523 CM_Set_DevNode_Problem(
7524 _In_ DEVINST dnDevInst
,
7525 _In_ ULONG ulProblem
,
7528 TRACE("CM_Set_DevNode_Problem(%lx %lx %lx)\n",
7529 dnDevInst
, ulProblem
, ulFlags
);
7531 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
7535 /***********************************************************************
7536 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
7540 CM_Set_DevNode_Problem_Ex(
7541 _In_ DEVINST dnDevInst
,
7542 _In_ ULONG ulProblem
,
7544 _In_opt_ HMACHINE hMachine
)
7546 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7547 HSTRING_TABLE StringTable
= NULL
;
7551 TRACE("CM_Set_DevNode_Problem_Ex(%lx %lx %lx %p)\n",
7552 dnDevInst
, ulProblem
, ulFlags
, hMachine
);
7555 return CR_INVALID_DEVNODE
;
7557 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
7558 return CR_INVALID_FLAG
;
7560 if (hMachine
!= NULL
)
7562 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7563 if (BindingHandle
== NULL
)
7566 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7567 if (StringTable
== 0)
7572 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7576 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7577 if (lpDevInst
== NULL
)
7578 return CR_INVALID_DEVNODE
;
7582 ret
= PNP_SetDeviceProblem(BindingHandle
,
7587 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7589 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7597 /***********************************************************************
7598 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
7602 CM_Set_DevNode_Registry_PropertyA(
7603 _In_ DEVINST dnDevInst
,
7604 _In_ ULONG ulProperty
,
7605 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7606 _In_ ULONG ulLength
,
7609 TRACE("CM_Set_DevNode_Registry_PropertyA(%lx %lu %p %lx %lx)\n",
7610 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7612 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
7618 /***********************************************************************
7619 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
7623 CM_Set_DevNode_Registry_PropertyW(
7624 _In_ DEVINST dnDevInst
,
7625 _In_ ULONG ulProperty
,
7626 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7627 _In_ ULONG ulLength
,
7630 TRACE("CM_Set_DevNode_Registry_PropertyW(%lx %lu %p %lx %lx)\n",
7631 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7633 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
7639 /***********************************************************************
7640 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
7644 CM_Set_DevNode_Registry_Property_ExA(
7645 _In_ DEVINST dnDevInst
,
7646 _In_ ULONG ulProperty
,
7647 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7648 _In_ ULONG ulLength
,
7650 _In_opt_ HMACHINE hMachine
)
7652 CONFIGRET ret
= CR_SUCCESS
;
7656 FIXME("CM_Set_DevNode_Registry_Property_ExA(%lx %lu %p %lx %lx %p)\n",
7657 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7659 if (Buffer
== NULL
&& ulLength
!= 0)
7660 return CR_INVALID_POINTER
;
7662 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7663 return CR_INVALID_PROPERTY
;
7667 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7676 /* Get property type */
7677 ulType
= GetRegistryPropertyType(ulProperty
);
7679 /* Allocate buffer if needed */
7680 if (ulType
== REG_SZ
||
7681 ulType
== REG_MULTI_SZ
)
7683 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
7684 if (lpBuffer
== NULL
)
7686 ret
= CR_OUT_OF_MEMORY
;
7690 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
7691 ulLength
, lpBuffer
, ulLength
))
7698 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7701 ulLength
* sizeof(WCHAR
),
7710 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7718 ret
= CR_CALL_NOT_IMPLEMENTED
;
7725 /***********************************************************************
7726 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
7730 CM_Set_DevNode_Registry_Property_ExW(
7731 _In_ DEVINST dnDevInst
,
7732 _In_ ULONG ulProperty
,
7733 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7734 _In_ ULONG ulLength
,
7736 _In_opt_ HMACHINE hMachine
)
7738 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7739 HSTRING_TABLE StringTable
= NULL
;
7744 TRACE("CM_Set_DevNode_Registry_Property_ExW(%lx %lu %p %lx %lx %p)\n",
7745 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7748 return CR_INVALID_DEVNODE
;
7750 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7751 return CR_INVALID_PROPERTY
;
7753 if (Buffer
!= NULL
&& ulLength
== 0)
7754 return CR_INVALID_POINTER
;
7757 return CR_INVALID_FLAG
;
7759 if (hMachine
!= NULL
)
7761 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7762 if (BindingHandle
== NULL
)
7765 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7766 if (StringTable
== 0)
7771 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7775 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7776 if (lpDevInst
== NULL
)
7777 return CR_INVALID_DEVNODE
;
7779 /* Get property type */
7780 ulType
= GetRegistryPropertyType(ulProperty
);
7784 ret
= PNP_SetDeviceRegProp(BindingHandle
,
7792 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7794 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7802 /***********************************************************************
7803 * CM_Set_HW_Prof [SETUPAPI.@]
7808 _In_ ULONG ulHardwareProfile
,
7811 TRACE("CM_Set_HW_Prof(%lu %lx)\n",
7812 ulHardwareProfile
, ulFlags
);
7814 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
7818 /***********************************************************************
7819 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
7824 _In_ ULONG ulHardwareProfile
,
7826 _In_opt_ HMACHINE hMachine
)
7828 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7831 TRACE("CM_Set_HW_Prof_Ex(%lu %lx %p)\n",
7832 ulHardwareProfile
, ulFlags
, hMachine
);
7834 if (!pSetupIsUserAdmin())
7835 return CR_ACCESS_DENIED
;
7838 return CR_INVALID_FLAG
;
7840 if (hMachine
!= NULL
)
7842 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7843 if (BindingHandle
== NULL
)
7848 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7854 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
7856 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7858 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7866 /***********************************************************************
7867 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
7871 CM_Set_HW_Prof_FlagsA(
7872 _In_ DEVINSTID_A szDevInstName
,
7873 _In_ ULONG ulConfig
,
7877 TRACE("CM_Set_HW_Prof_FlagsA(%s %lu %lu %lx)\n",
7878 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7880 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
7885 /***********************************************************************
7886 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
7890 CM_Set_HW_Prof_FlagsW(
7891 _In_ DEVINSTID_W szDevInstName
,
7892 _In_ ULONG ulConfig
,
7896 TRACE("CM_Set_HW_Prof_FlagsW(%s %lu %lu %lx)\n",
7897 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7899 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
7904 /***********************************************************************
7905 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
7909 CM_Set_HW_Prof_Flags_ExA(
7910 _In_ DEVINSTID_A szDevInstName
,
7911 _In_ ULONG ulConfig
,
7914 _In_opt_ HMACHINE hMachine
)
7916 DEVINSTID_W pszDevIdW
= NULL
;
7917 CONFIGRET ret
= CR_SUCCESS
;
7919 TRACE("CM_Set_HW_Prof_Flags_ExA(%s %lu %lu %lx %p)\n",
7920 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7922 if (szDevInstName
!= NULL
)
7924 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
7925 return CR_INVALID_DEVICE_ID
;
7928 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
7931 if (pszDevIdW
!= NULL
)
7938 /***********************************************************************
7939 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
7943 CM_Set_HW_Prof_Flags_ExW(
7944 _In_ DEVINSTID_W szDevInstName
,
7945 _In_ ULONG ulConfig
,
7948 _In_opt_ HMACHINE hMachine
)
7950 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7953 FIXME("CM_Set_HW_Prof_Flags_ExW(%s %lu %lu %lx %p)\n",
7954 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7956 if (szDevInstName
== NULL
)
7957 return CR_INVALID_POINTER
;
7959 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
7960 return CR_INVALID_FLAG
;
7962 /* FIXME: Check whether szDevInstName is valid */
7964 if (hMachine
!= NULL
)
7966 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7967 if (BindingHandle
== NULL
)
7972 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7978 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
7979 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
7981 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7983 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7991 /***********************************************************************
7992 * CM_Setup_DevNode [SETUPAPI.@]
7997 _In_ DEVINST dnDevInst
,
8000 TRACE("CM_Setup_DevNode(%lx %lx)\n",
8001 dnDevInst
, ulFlags
);
8003 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
8007 /***********************************************************************
8008 * CM_Setup_DevNode_Ex [SETUPAPI.@]
8012 CM_Setup_DevNode_Ex(
8013 _In_ DEVINST dnDevInst
,
8015 _In_opt_ HMACHINE hMachine
)
8017 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8018 HSTRING_TABLE StringTable
= NULL
;
8022 FIXME("CM_Setup_DevNode_Ex(%lx %lx %p)\n",
8023 dnDevInst
, ulFlags
, hMachine
);
8025 if (!pSetupIsUserAdmin())
8026 return CR_ACCESS_DENIED
;
8029 return CR_INVALID_DEVNODE
;
8031 if (ulFlags
& ~CM_SETUP_BITS
)
8032 return CR_INVALID_FLAG
;
8034 if (hMachine
!= NULL
)
8036 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8037 if (BindingHandle
== NULL
)
8040 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
8041 if (StringTable
== 0)
8046 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
8050 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
8051 if (lpDevInst
== NULL
)
8052 return CR_INVALID_DEVNODE
;
8056 ret
= PNP_DeviceInstanceAction(BindingHandle
,
8062 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8064 ret
= RpcStatusToCmStatus(RpcExceptionCode());
8072 /***********************************************************************
8073 * CM_Test_Range_Available [SETUPAPI.@]
8077 CM_Test_Range_Available(
8078 _In_ DWORDLONG ullStartValue
,
8079 _In_ DWORDLONG ullEndValue
,
8080 _In_ RANGE_LIST rlh
,
8083 FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
8084 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
8085 return CR_CALL_NOT_IMPLEMENTED
;
8089 /***********************************************************************
8090 * CM_Uninstall_DevNode [SETUPAPI.@]
8094 CM_Uninstall_DevNode(
8095 _In_ DEVINST dnPhantom
,
8098 TRACE("CM_Uninstall_DevNode(%lx %lx)\n",
8099 dnPhantom
, ulFlags
);
8101 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
8105 /***********************************************************************
8106 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
8110 CM_Uninstall_DevNode_Ex(
8111 _In_ DEVINST dnPhantom
,
8113 _In_opt_ HMACHINE hMachine
)
8115 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8116 HSTRING_TABLE StringTable
= NULL
;
8120 TRACE("CM_Uninstall_DevNode_Ex(%lx %lx %p)\n",
8121 dnPhantom
, ulFlags
, hMachine
);
8124 return CR_INVALID_DEVNODE
;
8127 return CR_INVALID_FLAG
;
8129 if (hMachine
!= NULL
)
8131 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8132 if (BindingHandle
== NULL
)
8135 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
8136 if (StringTable
== 0)
8141 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
8145 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
8146 if (lpDevInst
== NULL
)
8147 return CR_INVALID_DEVNODE
;
8151 ret
= PNP_UninstallDevInst(BindingHandle
,
8155 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8157 ret
= RpcStatusToCmStatus(RpcExceptionCode());
8165 /***********************************************************************
8166 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
8170 CM_Unregister_Device_InterfaceA(
8171 _In_ LPCSTR pszDeviceInterface
,
8174 TRACE("CM_Unregister_Device_InterfaceA(%s %lx)\n",
8175 debugstr_a(pszDeviceInterface
), ulFlags
);
8177 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
8182 /***********************************************************************
8183 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
8187 CM_Unregister_Device_InterfaceW(
8188 _In_ LPCWSTR pszDeviceInterface
,
8191 TRACE("CM_Unregister_Device_InterfaceW(%s %lx)\n",
8192 debugstr_w(pszDeviceInterface
), ulFlags
);
8194 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
8199 /***********************************************************************
8200 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
8204 CM_Unregister_Device_Interface_ExA(
8205 _In_ LPCSTR pszDeviceInterface
,
8207 _In_opt_ HMACHINE hMachine
)
8209 LPWSTR pszDeviceInterfaceW
= NULL
;
8212 TRACE("CM_Unregister_Device_Interface_ExA(%s %lx %p)\n",
8213 debugstr_a(pszDeviceInterface
), ulFlags
, hMachine
);
8215 if (pszDeviceInterface
== NULL
)
8216 return CR_INVALID_POINTER
;
8218 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
8219 return CR_INVALID_DATA
;
8221 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
8224 if (pszDeviceInterfaceW
!= NULL
)
8225 MyFree(pszDeviceInterfaceW
);
8231 /***********************************************************************
8232 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
8236 CM_Unregister_Device_Interface_ExW(
8237 _In_ LPCWSTR pszDeviceInterface
,
8239 _In_opt_ HMACHINE hMachine
)
8241 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8244 TRACE("CM_Unregister_Device_Interface_ExW(%s %lx %p)\n",
8245 debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
8247 if (pszDeviceInterface
== NULL
)
8248 return CR_INVALID_POINTER
;
8251 return CR_INVALID_FLAG
;
8253 if (hMachine
!= NULL
)
8255 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8256 if (BindingHandle
== NULL
)
8261 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
8267 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
8268 (LPWSTR
)pszDeviceInterface
,
8271 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8273 ret
= RpcStatusToCmStatus(RpcExceptionCode());