2 * Configuration manager functions
4 * Copyright 2000 James Hatheway
5 * Copyright 2005, 2006 Eric Kohl
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "setupapi_private.h"
27 #include "rpc_private.h"
29 /* Registry key and value names */
30 static const WCHAR Backslash
[] = {'\\', 0};
31 static const WCHAR Class
[] = {'C','l','a','s','s',0};
33 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
34 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
35 'C','o','n','t','r','o','l','\\',
36 'C','l','a','s','s',0};
38 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
39 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
40 'C','o','n','t','r','o','l','\\',
41 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
43 typedef struct _MACHINE_INFO
45 WCHAR szMachineName
[SP_MAX_MACHINENAME_LENGTH
];
46 RPC_BINDING_HANDLE BindingHandle
;
47 HSTRING_TABLE StringTable
;
49 } MACHINE_INFO
, *PMACHINE_INFO
;
52 typedef struct _LOG_CONF_INFO
58 } LOG_CONF_INFO
, *PLOG_CONF_INFO
;
60 #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */
63 typedef struct _NOTIFY_DATA
67 } NOTIFY_DATA
, *PNOTIFY_DATA
;
69 #define NOTIFY_MAGIC 0x44556677
72 typedef struct _INTERNAL_RANGE
77 } INTERNAL_RANGE
, *PINTERNAL_RANGE
;
79 typedef struct _INTERNAL_RANGE_LIST
84 } INTERNAL_RANGE_LIST
, *PINTERNAL_RANGE_LIST
;
86 #define RANGE_LIST_MAGIC 0x33445566
88 typedef struct _CONFLICT_DATA
91 PPNP_CONFLICT_LIST pConflictList
;
92 } CONFLICT_DATA
, *PCONFLICT_DATA
;
94 #define CONFLICT_MAGIC 0x11225588
97 /* FUNCTIONS ****************************************************************/
107 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
110 lstrcpyW(&String
[1], lpString
);
113 String
[MAX_GUID_STRING_LEN
- 2] = '}';
114 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
116 RpcStringFreeW(&lpString
);
125 _In_ RPC_STATUS Status
)
133 GetRegistryPropertyType(
134 _In_ ULONG ulProperty
)
138 case CM_DRP_DEVICEDESC
:
141 case CM_DRP_CLASSGUID
:
144 case CM_DRP_FRIENDLYNAME
:
145 case CM_DRP_LOCATION_INFORMATION
:
146 case CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME
:
147 case CM_DRP_ENUMERATOR_NAME
:
148 case CM_DRP_SECURITY_SDS
:
149 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
152 case CM_DRP_HARDWAREID
:
153 case CM_DRP_COMPATIBLEIDS
:
154 case CM_DRP_UPPERFILTERS
:
155 case CM_DRP_LOWERFILTERS
:
158 case CM_DRP_CONFIGFLAGS
:
159 case CM_DRP_CAPABILITIES
:
160 case CM_DRP_UI_NUMBER
:
161 case CM_DRP_LEGACYBUSTYPE
:
162 case CM_DRP_BUSNUMBER
:
164 case CM_DRP_EXCLUSIVE
:
165 case CM_DRP_CHARACTERISTICS
:
167 case CM_DRP_REMOVAL_POLICY
:
168 case CM_DRP_REMOVAL_POLICY_HW_DEFAULT
:
169 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
170 case CM_DRP_INSTALL_STATE
:
173 case CM_DRP_BUSTYPEGUID
:
174 case CM_DRP_SECURITY
:
175 case CM_DRP_DEVICE_POWER_DATA
:
186 SplitDeviceInstanceId(
187 _In_ PWSTR pszDeviceInstanceId
,
188 _Out_ PWSTR pszDeviceId
,
189 _Out_ PWSTR pszInstanceId
)
193 wcscpy(pszDeviceId
, pszDeviceInstanceId
);
195 ptr
= wcschr(pszDeviceId
, L
'\\');
201 wcscpy(pszInstanceId
, ptr
);
205 *pszInstanceId
= UNICODE_NULL
;
212 GetDeviceInstanceKeyPath(
213 _In_ RPC_BINDING_HANDLE BindingHandle
,
214 _In_ PWSTR pszDeviceInst
,
215 _Out_ PWSTR pszKeyPath
,
216 _Out_ PWSTR pszInstancePath
,
217 _In_ ULONG ulHardwareProfile
,
220 PWSTR pszBuffer
= NULL
;
222 ULONG ulTransferLength
, ulLength
;
223 CONFIGRET ret
= CR_SUCCESS
;
225 TRACE("GetDeviceInstanceKeyPath()\n");
227 /* Allocate a buffer for the device id */
228 pszBuffer
= MyMalloc(300 * sizeof(WCHAR
));
229 if (pszBuffer
== NULL
)
231 ERR("MyMalloc() failed\n");
232 return CR_OUT_OF_MEMORY
;
235 if (ulFlags
& CM_REGISTRY_SOFTWARE
)
237 /* Software Key Path */
239 if (ulFlags
& CM_REGISTRY_CONFIG
)
241 SplitDeviceInstanceId(pszDeviceInst
,
245 if (ulHardwareProfile
== 0)
247 wsprintfW(pszKeyPath
,
249 L
"System\\CurrentControlSet\\Hardware Profiles",
251 L
"System\\CurrentControlSet\\Enum",
256 wsprintfW(pszKeyPath
,
257 L
"%s\\%04lu\\%s\\%s",
258 L
"System\\CurrentControlSet\\Hardware Profiles",
260 L
"System\\CurrentControlSet\\Enum",
264 else if (ulFlags
& CM_REGISTRY_USER
)
266 wsprintfW(pszKeyPath
,
268 L
"System\\CurrentControlSet\\Enum",
271 wcscpy(pszInstancePath
,
272 L
"Device Parameters");
276 SplitDeviceInstanceId(pszDeviceInst
,
280 wsprintfW(pszKeyPath
,
282 L
"System\\CurrentControlSet\\Enum",
288 /* Hardware Key Path */
290 ulTransferLength
= 300 * sizeof(WCHAR
);
291 ulLength
= 300 * sizeof(WCHAR
);
292 ret
= PNP_GetDeviceRegProp(BindingHandle
,
300 if (ret
!= CR_SUCCESS
)
302 ERR("PNP_GetDeviceRegProp() failed (Error %lu)\n", ret
);
306 TRACE("szBuffer: %S\n", pszBuffer
);
308 SplitDeviceInstanceId(pszBuffer
,
312 TRACE("szBuffer: %S\n", pszBuffer
);
314 if (ulFlags
& CM_REGISTRY_CONFIG
)
316 if (ulHardwareProfile
== 0)
318 wsprintfW(pszKeyPath
,
320 L
"System\\CurrentControlSet\\Hardware Profiles",
322 L
"System\\CurrentControlSet\\Control\\Class",
327 wsprintfW(pszKeyPath
,
328 L
"%s\\%04lu\\%s\\%s",
329 L
"System\\CurrentControlSet\\Hardware Profiles",
331 L
"System\\CurrentControlSet\\Control\\Class",
337 wsprintfW(pszKeyPath
,
339 L
"System\\CurrentControlSet\\Control\\Class",
345 if (pszBuffer
!= NULL
)
354 _In_opt_ PINTERNAL_RANGE_LIST pRangeList
)
358 if (pRangeList
== NULL
)
363 if (pRangeList
->ulMagic
!= RANGE_LIST_MAGIC
)
366 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
378 _In_opt_ PLOG_CONF_INFO pLogConfInfo
)
382 if (pLogConfInfo
== NULL
)
387 if (pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
390 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
402 _In_opt_ PCONFLICT_DATA pConflictData
)
406 if (pConflictData
== NULL
)
411 if (pConflictData
->ulMagic
!= CONFLICT_MAGIC
)
414 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
424 /***********************************************************************
425 * CMP_GetBlockedDriverInfo [SETUPAPI.@]
429 CMP_GetBlockedDriverInfo(
430 _Out_opt_ LPWSTR pszNames
,
431 _Inout_ PULONG pulLength
,
433 _In_opt_ HMACHINE hMachine
)
435 RPC_BINDING_HANDLE BindingHandle
= NULL
;
436 ULONG ulTransferLength
;
439 TRACE("CMP_GetBlockedDriverInfo(%p %p %lx %p)\n",
440 pszNames
, pulLength
, ulFlags
, hMachine
);
442 if (hMachine
!= NULL
)
444 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
445 if (BindingHandle
== NULL
)
450 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
454 ulTransferLength
= *pulLength
;
458 ret
= PNP_GetBlockedDriverInfo(BindingHandle
,
464 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
466 ret
= RpcStatusToCmStatus(RpcExceptionCode());
474 /***********************************************************************
475 * CMP_GetServerSideDeviceInstallFlags [SETUPAPI.@]
479 CMP_GetServerSideDeviceInstallFlags(
480 _Out_ PULONG pulSSDIFlags
,
482 _In_opt_ HMACHINE hMachine
)
484 RPC_BINDING_HANDLE BindingHandle
= NULL
;
487 TRACE("CMP_GetServerSideDeviceInstallFlags(%p %lx %p)\n",
488 pulSSDIFlags
, ulFlags
, hMachine
);
490 if (pulSSDIFlags
== NULL
)
491 return CR_INVALID_POINTER
;
494 return CR_INVALID_FLAG
;
496 if (hMachine
!= NULL
)
498 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
499 if (BindingHandle
== NULL
)
504 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
510 ret
= PNP_GetServerSideDeviceInstallFlags(BindingHandle
,
514 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
516 ret
= RpcStatusToCmStatus(RpcExceptionCode());
524 /***********************************************************************
525 * CMP_Init_Detection [SETUPAPI.@]
532 RPC_BINDING_HANDLE BindingHandle
= NULL
;
535 TRACE("CMP_Init_Detection(%lu)\n", ulMagic
);
537 if (ulMagic
!= CMP_MAGIC
)
538 return CR_INVALID_DATA
;
540 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
545 ret
= PNP_InitDetection(BindingHandle
);
547 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
549 ret
= RpcStatusToCmStatus(RpcExceptionCode());
557 /***********************************************************************
558 * CMP_RegisterNotification [SETUPAPI.@]
562 CMP_RegisterNotification(
563 _In_ HANDLE hRecipient
,
564 _In_ LPVOID lpvNotificationFilter
,
566 _Out_ PHDEVNOTIFY phDevNotify
)
568 RPC_BINDING_HANDLE BindingHandle
= NULL
;
569 PNOTIFY_DATA pNotifyData
= NULL
;
570 CONFIGRET ret
= CR_SUCCESS
;
572 TRACE("CMP_RegisterNotification(%p %p %lu %p)\n",
573 hRecipient
, lpvNotificationFilter
, ulFlags
, phDevNotify
);
575 if ((hRecipient
== NULL
) ||
576 (lpvNotificationFilter
== NULL
) ||
577 (phDevNotify
== NULL
))
578 return CR_INVALID_POINTER
;
581 return CR_INVALID_FLAG
;
583 if (((PDEV_BROADCAST_HDR
)lpvNotificationFilter
)->dbch_size
< sizeof(DEV_BROADCAST_HDR
))
584 return CR_INVALID_DATA
;
586 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
589 pNotifyData
= HeapAlloc(GetProcessHeap(),
591 sizeof(NOTIFY_DATA
));
592 if (pNotifyData
== NULL
)
593 return CR_OUT_OF_MEMORY
;
595 pNotifyData
->ulMagic
= NOTIFY_MAGIC
;
598 if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_WINDOW_HANDLE)
602 else if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_SERVICE_HANDLE)
610 ret
= PNP_RegisterNotification(BindingHandle
,
612 &pNotifyData
->ulNotifyData
);
614 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
616 ret
= RpcStatusToCmStatus(RpcExceptionCode());
620 if (ret
== CR_SUCCESS
)
622 *phDevNotify
= (HDEVNOTIFY
)pNotifyData
;
626 if (pNotifyData
!= NULL
)
627 HeapFree(GetProcessHeap(), 0, pNotifyData
);
629 *phDevNotify
= (HDEVNOTIFY
)NULL
;
636 /***********************************************************************
637 * CMP_Report_LogOn [SETUPAPI.@]
643 _In_ DWORD dwProcessId
)
645 RPC_BINDING_HANDLE BindingHandle
= NULL
;
646 CONFIGRET ret
= CR_SUCCESS
;
650 TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic
, dwProcessId
);
652 if (dwMagic
!= CMP_MAGIC
)
653 return CR_INVALID_DATA
;
655 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
658 bAdmin
= pSetupIsUserAdmin();
660 for (i
= 0; i
< 30; i
++)
664 ret
= PNP_ReportLogOn(BindingHandle
,
668 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
670 ret
= RpcStatusToCmStatus(RpcExceptionCode());
674 if (ret
== CR_SUCCESS
)
684 /***********************************************************************
685 * CMP_UnregisterNotification [SETUPAPI.@]
689 CMP_UnregisterNotification(
690 _In_ HDEVNOTIFY hDevNotify
)
692 RPC_BINDING_HANDLE BindingHandle
= NULL
;
693 PNOTIFY_DATA pNotifyData
;
694 CONFIGRET ret
= CR_SUCCESS
;
696 TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify
);
698 pNotifyData
= (PNOTIFY_DATA
)hDevNotify
;
700 if ((pNotifyData
== NULL
) ||
701 (pNotifyData
->ulMagic
!= NOTIFY_MAGIC
))
702 return CR_INVALID_POINTER
;
704 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
709 ret
= PNP_UnregisterNotification(BindingHandle
,
710 pNotifyData
->ulNotifyData
);
712 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
714 ret
= RpcStatusToCmStatus(RpcExceptionCode());
718 if (ret
== CR_SUCCESS
)
719 HeapFree(GetProcessHeap(), 0, pNotifyData
);
725 /***********************************************************************
726 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
730 CMP_WaitNoPendingInstallEvents(
731 _In_ DWORD dwTimeout
)
736 TRACE("CMP_WaitNoPendingInstallEvents(%lu)\n", dwTimeout
);
738 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
742 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
748 /***********************************************************************
749 * CMP_WaitServicesAvailable [SETUPAPI.@]
753 CMP_WaitServicesAvailable(
754 _In_opt_ HMACHINE hMachine
)
756 RPC_BINDING_HANDLE BindingHandle
= NULL
;
757 CONFIGRET ret
= CR_SUCCESS
;
760 TRACE("CMP_WaitServicesAvailable(%p)\n", hMachine
);
762 if (hMachine
!= NULL
)
764 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
765 if (BindingHandle
== NULL
)
770 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
776 ret
= PNP_GetVersion(BindingHandle
, &Version
);
778 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
780 ret
= RpcStatusToCmStatus(RpcExceptionCode());
788 /***********************************************************************
789 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
793 CM_Add_Empty_Log_Conf(
794 _Out_ PLOG_CONF plcLogConf
,
795 _In_ DEVINST dnDevInst
,
796 _In_ PRIORITY Priority
,
799 TRACE("CM_Add_Empty_Log_Conf(%p %p %lu %lx)\n",
800 plcLogConf
, dnDevInst
, Priority
, ulFlags
);
802 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
807 /***********************************************************************
808 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
811 WINAPI
CM_Add_Empty_Log_Conf_Ex(
812 _Out_ PLOG_CONF plcLogConf
,
813 _In_ DEVINST dnDevInst
,
814 _In_ PRIORITY Priority
,
816 _In_opt_ HMACHINE hMachine
)
818 RPC_BINDING_HANDLE BindingHandle
= NULL
;
819 HSTRING_TABLE StringTable
= NULL
;
820 ULONG ulLogConfTag
= 0;
822 PLOG_CONF_INFO pLogConfInfo
;
823 CONFIGRET ret
= CR_SUCCESS
;
825 FIXME("CM_Add_Empty_Log_Conf_Ex(%p %p %lu %lx %p)\n",
826 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
828 if (!pSetupIsUserAdmin())
829 return CR_ACCESS_DENIED
;
831 if (plcLogConf
== NULL
)
832 return CR_INVALID_POINTER
;
835 return CR_INVALID_DEVINST
;
837 if (Priority
> 0xFFFF)
838 return CR_INVALID_PRIORITY
;
840 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
841 return CR_INVALID_FLAG
;
843 if (hMachine
!= NULL
)
845 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
846 if (BindingHandle
== NULL
)
849 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
850 if (StringTable
== 0)
855 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
859 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
860 if (lpDevInst
== NULL
)
861 return CR_INVALID_DEVNODE
;
865 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
866 &ulLogConfTag
, ulFlags
);
868 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
870 ret
= RpcStatusToCmStatus(RpcExceptionCode());
874 if (ret
== CR_SUCCESS
)
876 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
877 if (pLogConfInfo
== NULL
)
879 ret
= CR_OUT_OF_MEMORY
;
883 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
884 pLogConfInfo
->dnDevInst
= dnDevInst
;
885 pLogConfInfo
->ulFlags
= ulFlags
;
886 pLogConfInfo
->ulTag
= ulLogConfTag
;
888 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
898 /***********************************************************************
899 * CM_Add_IDA [SETUPAPI.@]
904 _In_ DEVINST dnDevInst
,
908 TRACE("CM_Add_IDA(%p %s %lx)\n",
909 dnDevInst
, debugstr_a(pszID
), ulFlags
);
911 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
915 /***********************************************************************
916 * CM_Add_IDW [SETUPAPI.@]
921 _In_ DEVINST dnDevInst
,
925 TRACE("CM_Add_IDW(%p %s %lx)\n",
926 dnDevInst
, debugstr_w(pszID
), ulFlags
);
928 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
932 /***********************************************************************
933 * CM_Add_ID_ExA [SETUPAPI.@]
938 _In_ DEVINST dnDevInst
,
941 _In_opt_ HMACHINE hMachine
)
946 TRACE("CM_Add_ID_ExA(%p %s %lx %p)\n",
947 dnDevInst
, debugstr_a(pszID
), ulFlags
, hMachine
);
949 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
950 return CR_INVALID_DATA
;
952 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
960 /***********************************************************************
961 * CM_Add_ID_ExW [SETUPAPI.@]
966 _In_ DEVINST dnDevInst
,
969 _In_opt_ HMACHINE hMachine
)
971 RPC_BINDING_HANDLE BindingHandle
= NULL
;
972 HSTRING_TABLE StringTable
= NULL
;
976 TRACE("CM_Add_ID_ExW(%p %s %lx %p)\n",
977 dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
979 if (!pSetupIsUserAdmin())
980 return CR_ACCESS_DENIED
;
983 return CR_INVALID_DEVINST
;
986 return CR_INVALID_POINTER
;
988 if (ulFlags
& ~CM_ADD_ID_BITS
)
989 return CR_INVALID_FLAG
;
991 if (hMachine
!= NULL
)
993 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
994 if (BindingHandle
== NULL
)
997 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
998 if (StringTable
== 0)
1003 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1007 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1008 if (lpDevInst
== NULL
)
1009 return CR_INVALID_DEVNODE
;
1013 ret
= PNP_AddID(BindingHandle
,
1018 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1020 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1028 /***********************************************************************
1029 * CM_Add_Range [SETUPAPI.@]
1034 _In_ DWORDLONG ullStartValue
,
1035 _In_ DWORDLONG ullEndValue
,
1036 _In_ RANGE_LIST rlh
,
1039 PINTERNAL_RANGE_LIST pRangeList
;
1040 PINTERNAL_RANGE pRange
;
1041 CONFIGRET ret
= CR_SUCCESS
;
1043 FIXME("CM_Add_Range(%I64u %I64u %p %lx)\n",
1044 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1046 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
1048 if (!IsValidRangeList(pRangeList
))
1049 return CR_INVALID_RANGE_LIST
;
1051 if (ulFlags
& ~CM_ADD_RANGE_BITS
)
1052 return CR_INVALID_FLAG
;
1054 if (ullEndValue
< ullStartValue
)
1055 return CR_INVALID_RANGE
;
1057 /* Lock the range list */
1058 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
1060 /* Allocate the new range */
1061 pRange
= HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNAL_RANGE
));
1064 ret
= CR_OUT_OF_MEMORY
;
1068 pRange
->ullStart
= ullStartValue
;
1069 pRange
->ullEnd
= ullEndValue
;
1071 /* Insert the range */
1072 if (IsListEmpty(&pRangeList
->ListHead
))
1074 InsertTailList(&pRangeList
->ListHead
, &pRange
->ListEntry
);
1082 /* Unlock the range list */
1083 ReleaseMutex(pRangeList
->hMutex
);
1089 /***********************************************************************
1090 * CM_Add_Res_Des [SETUPAPI.@]
1095 _Out_opt_ PRES_DES prdResDes
,
1096 _In_ LOG_CONF lcLogConf
,
1097 _In_ RESOURCEID ResourceID
,
1098 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1099 _In_ ULONG ResourceLen
,
1102 TRACE("CM_Add_Res_Des(%p %p %lu %p %lu %lx)\n",
1103 prdResDes
, lcLogConf
, ResourceID
, ResourceData
, ResourceLen
, ulFlags
);
1105 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
1106 ResourceLen
, ulFlags
, NULL
);
1110 /***********************************************************************
1111 * CM_Add_Res_Des_Ex [SETUPAPI.@]
1116 _Out_opt_ PRES_DES prdResDes
,
1117 _In_ LOG_CONF lcLogConf
,
1118 _In_ RESOURCEID ResourceID
,
1119 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1120 _In_ ULONG ResourceLen
,
1122 _In_opt_ HMACHINE hMachine
)
1124 FIXME("CM_Add_Res_Des_Ex(%p %p %lu %p %lu %lx %p)\n",
1125 prdResDes
, lcLogConf
, ResourceID
,
1126 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
1128 return CR_CALL_NOT_IMPLEMENTED
;
1132 /***********************************************************************
1133 * CM_Connect_MachineA [SETUPAPI.@]
1137 CM_Connect_MachineA(
1138 _In_opt_ PCSTR UNCServerName
,
1139 _Out_ PHMACHINE phMachine
)
1144 TRACE("CM_Connect_MachineA(%s %p)\n",
1145 debugstr_a(UNCServerName
), phMachine
);
1147 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1148 return CM_Connect_MachineW(NULL
, phMachine
);
1150 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
1151 return CR_INVALID_DATA
;
1153 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
1155 MyFree(pServerNameW
);
1161 /***********************************************************************
1162 * CM_Connect_MachineW [SETUPAPI.@]
1166 CM_Connect_MachineW(
1167 _In_opt_ PCWSTR UNCServerName
,
1168 _Out_ PHMACHINE phMachine
)
1170 PMACHINE_INFO pMachine
;
1172 TRACE("CM_Connect_MachineW(%s %p)\n",
1173 debugstr_w(UNCServerName
), phMachine
);
1175 if (phMachine
== NULL
)
1176 return CR_INVALID_POINTER
;
1180 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
1181 if (pMachine
== NULL
)
1182 return CR_OUT_OF_MEMORY
;
1184 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1186 pMachine
->bLocal
= TRUE
;
1188 /* FIXME: store the computers name in pMachine->szMachineName */
1190 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
1191 &pMachine
->StringTable
))
1193 HeapFree(GetProcessHeap(), 0, pMachine
);
1199 pMachine
->bLocal
= FALSE
;
1200 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
1202 HeapFree(GetProcessHeap(), 0, pMachine
);
1203 return CR_INVALID_MACHINENAME
;
1205 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
1207 pMachine
->StringTable
= pSetupStringTableInitialize();
1208 if (pMachine
->StringTable
== NULL
)
1210 HeapFree(GetProcessHeap(), 0, pMachine
);
1214 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
1216 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
1218 pSetupStringTableDestroy(pMachine
->StringTable
);
1219 HeapFree(GetProcessHeap(), 0, pMachine
);
1220 return CR_INVALID_MACHINENAME
;
1224 *phMachine
= (PHMACHINE
)pMachine
;
1230 /***********************************************************************
1231 * CM_Create_DevNodeA [SETUPAPI.@]
1236 _Out_ PDEVINST pdnDevInst
,
1237 _In_ DEVINSTID_A pDeviceID
,
1238 _In_ DEVINST dnParent
,
1241 TRACE("CM_Create_DevNodeA(%p %s %p %lx)\n",
1242 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
1244 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
1249 /***********************************************************************
1250 * CM_Create_DevNodeW [SETUPAPI.@]
1255 _Out_ PDEVINST pdnDevInst
,
1256 _In_ DEVINSTID_W pDeviceID
,
1257 _In_ DEVINST dnParent
,
1260 TRACE("CM_Create_DevNodeW(%p %s %p %lx)\n",
1261 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
1263 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
1268 /***********************************************************************
1269 * CM_Create_DevNode_ExA [SETUPAPI.@]
1273 CM_Create_DevNode_ExA(
1274 _Out_ PDEVINST pdnDevInst
,
1275 _In_ DEVINSTID_A pDeviceID
,
1276 _In_ DEVINST dnParent
,
1278 _In_opt_ HANDLE hMachine
)
1280 DEVINSTID_W pDeviceIDW
;
1283 TRACE("CM_Create_DevNode_ExA(%p %s %p %lx %p)\n",
1284 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1286 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
1287 return CR_INVALID_DATA
;
1289 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
1298 /***********************************************************************
1299 * CM_Create_DevNode_ExW [SETUPAPI.@]
1303 CM_Create_DevNode_ExW(
1304 _Out_ PDEVINST pdnDevInst
,
1305 _In_ DEVINSTID_W pDeviceID
,
1306 _In_ DEVINST dnParent
,
1308 _In_opt_ HANDLE hMachine
)
1310 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1311 HSTRING_TABLE StringTable
= NULL
;
1312 LPWSTR lpParentDevInst
;
1313 CONFIGRET ret
= CR_SUCCESS
;
1314 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
1316 TRACE("CM_Create_DevNode_ExW(%p %s %p %lx %p)\n",
1317 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1319 if (!pSetupIsUserAdmin())
1320 return CR_ACCESS_DENIED
;
1322 if (pdnDevInst
== NULL
)
1323 return CR_INVALID_POINTER
;
1325 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
1326 return CR_INVALID_DEVICE_ID
;
1329 return CR_INVALID_DEVNODE
;
1331 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
1332 return CR_INVALID_FLAG
;
1334 if (hMachine
!= NULL
)
1336 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1337 if (BindingHandle
== NULL
)
1340 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1341 if (StringTable
== 0)
1346 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1350 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
1351 if (lpParentDevInst
== NULL
)
1352 return CR_INVALID_DEVNODE
;
1354 wcscpy(szLocalDeviceID
, pDeviceID
);
1358 ret
= PNP_CreateDevInst(BindingHandle
,
1364 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1366 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1370 if (ret
== CR_SUCCESS
)
1372 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
1373 * will return the generated device ID in szLocalDeviceID */
1374 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
1375 if (*pdnDevInst
== 0)
1376 ret
= CR_NO_SUCH_DEVNODE
;
1383 /***********************************************************************
1384 * CM_Create_Range_List [SETUPAPI.@]
1388 CM_Create_Range_List(
1389 _Out_ PRANGE_LIST prlh
,
1392 PINTERNAL_RANGE_LIST pRangeList
= NULL
;
1394 FIXME("CM_Create_Range_List(%p %lx)\n",
1398 return CR_INVALID_FLAG
;
1401 return CR_INVALID_POINTER
;
1403 /* Allocate the range list */
1404 pRangeList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(INTERNAL_RANGE_LIST
));
1405 if (pRangeList
== NULL
)
1406 return CR_OUT_OF_MEMORY
;
1408 /* Set the magic value */
1409 pRangeList
->ulMagic
= RANGE_LIST_MAGIC
;
1411 /* Initialize the mutex for synchonized access */
1412 pRangeList
->hMutex
= CreateMutex(NULL
, FALSE
, NULL
);
1413 if (pRangeList
->hMutex
== NULL
)
1415 HeapFree(GetProcessHeap(), 0, pRangeList
);
1419 InitializeListHead(&pRangeList
->ListHead
);
1421 *prlh
= (RANGE_LIST
)pRangeList
;
1427 /***********************************************************************
1428 * CM_Delete_Class_Key [SETUPAPI.@]
1432 CM_Delete_Class_Key(
1433 _In_ LPGUID ClassGuid
,
1436 TRACE("CM_Delete_Class_Key(%p %lx)\n",
1437 ClassGuid
, ulFlags
);
1439 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
1443 /***********************************************************************
1444 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
1448 CM_Delete_Class_Key_Ex(
1449 _In_ LPGUID ClassGuid
,
1451 _In_opt_ HANDLE hMachine
)
1453 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1454 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1457 TRACE("CM_Delete_Class_Key_Ex(%p %lx %p)\n",
1458 ClassGuid
, ulFlags
, hMachine
);
1460 if (ClassGuid
== NULL
)
1461 return CR_INVALID_POINTER
;
1463 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
1464 return CR_INVALID_FLAG
;
1466 if (!GuidToString(ClassGuid
, szGuidString
))
1467 return CR_INVALID_DATA
;
1469 if (hMachine
!= NULL
)
1471 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1472 if (BindingHandle
== NULL
)
1477 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1483 ret
= PNP_DeleteClassKey(BindingHandle
,
1487 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1489 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1497 /***********************************************************************
1498 * CM_Delete_DevNode_Key [SETUPAPI.@]
1502 CM_Delete_DevNode_Key(
1503 _In_ DEVNODE dnDevNode
,
1504 _In_ ULONG ulHardwareProfile
,
1507 TRACE("CM_Delete_DevNode_Key(%p %lu %lx)\n",
1508 dnDevNode
, ulHardwareProfile
, ulFlags
);
1510 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
1515 /***********************************************************************
1516 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
1520 CM_Delete_DevNode_Key_Ex(
1521 _In_ DEVNODE dnDevNode
,
1522 _In_ ULONG ulHardwareProfile
,
1524 _In_opt_ HANDLE hMachine
)
1526 FIXME("CM_Delete_DevNode_Key_Ex(%p %lu %lx %p)\n",
1527 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
1529 return CR_CALL_NOT_IMPLEMENTED
;
1533 /***********************************************************************
1534 * CM_Delete_Range [SETUPAPI.@]
1539 _In_ DWORDLONG ullStartValue
,
1540 _In_ DWORDLONG ullEndValue
,
1541 _In_ RANGE_LIST rlh
,
1544 FIXME("CM_Delete_Range(%I64u %I64u %p %lx)\n",
1545 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1547 return CR_CALL_NOT_IMPLEMENTED
;
1551 /***********************************************************************
1552 * CM_Disable_DevNode [SETUPAPI.@]
1557 _In_ DEVINST dnDevInst
,
1560 TRACE("CM_Disable_DevNode(%p %lx)\n",
1561 dnDevInst
, ulFlags
);
1563 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1567 /***********************************************************************
1568 * CM_Disable_DevNode_Ex [SETUPAPI.@]
1572 CM_Disable_DevNode_Ex(
1573 _In_ DEVINST dnDevInst
,
1575 _In_opt_ HMACHINE hMachine
)
1577 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1578 HSTRING_TABLE StringTable
= NULL
;
1582 FIXME("CM_Disable_DevNode_Ex(%p %lx %p)\n",
1583 dnDevInst
, ulFlags
, hMachine
);
1585 if (!pSetupIsUserAdmin())
1586 return CR_ACCESS_DENIED
;
1589 return CR_INVALID_DEVINST
;
1592 return CR_INVALID_FLAG
;
1594 if (hMachine
!= NULL
)
1596 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1597 if (BindingHandle
== NULL
)
1600 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1601 if (StringTable
== 0)
1606 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1610 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1611 if (lpDevInst
== NULL
)
1612 return CR_INVALID_DEVNODE
;
1616 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1617 PNP_DEVINST_DISABLE
,
1622 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1624 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1632 /***********************************************************************
1633 * CM_Disconnect_Machine [SETUPAPI.@]
1637 CM_Disconnect_Machine(
1638 _In_opt_ HMACHINE hMachine
)
1640 PMACHINE_INFO pMachine
;
1642 TRACE("CM_Disconnect_Machine(%p)\n", hMachine
);
1644 pMachine
= (PMACHINE_INFO
)hMachine
;
1645 if (pMachine
== NULL
)
1648 if (pMachine
->bLocal
== FALSE
)
1650 if (pMachine
->StringTable
!= NULL
)
1651 pSetupStringTableDestroy(pMachine
->StringTable
);
1653 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
1654 return CR_ACCESS_DENIED
;
1657 HeapFree(GetProcessHeap(), 0, pMachine
);
1663 /***********************************************************************
1664 * CM_Dup_Range_List [SETUPAPI.@]
1669 _In_ RANGE_LIST rlhOld
,
1670 _In_ RANGE_LIST rlhNew
,
1673 FIXME("CM_Dup_Range_List(%p %p %lx)\n",
1674 rlhOld
, rlhNew
, ulFlags
);
1676 return CR_CALL_NOT_IMPLEMENTED
;
1680 /***********************************************************************
1681 * CM_Enable_DevNode [SETUPAPI.@]
1686 _In_ DEVINST dnDevInst
,
1689 TRACE("CM_Enable_DevNode(%p %lx)\n",
1690 dnDevInst
, ulFlags
);
1692 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1696 /***********************************************************************
1697 * CM_Enable_DevNode_Ex [SETUPAPI.@]
1701 CM_Enable_DevNode_Ex(
1702 _In_ DEVINST dnDevInst
,
1704 _In_opt_ HMACHINE hMachine
)
1706 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1707 HSTRING_TABLE StringTable
= NULL
;
1711 TRACE("CM_Enable_DevNode_Ex(%p %lx %p)\n",
1712 dnDevInst
, ulFlags
, hMachine
);
1714 if (!pSetupIsUserAdmin())
1715 return CR_ACCESS_DENIED
;
1718 return CR_INVALID_DEVINST
;
1721 return CR_INVALID_FLAG
;
1723 if (hMachine
!= NULL
)
1725 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1726 if (BindingHandle
== NULL
)
1729 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1730 if (StringTable
== 0)
1735 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1739 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1740 if (lpDevInst
== NULL
)
1741 return CR_INVALID_DEVNODE
;
1745 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1751 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1753 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1761 /***********************************************************************
1762 * CM_Enumerate_Classes [SETUPAPI.@]
1766 CM_Enumerate_Classes(
1767 _In_ ULONG ulClassIndex
,
1768 _Out_ LPGUID ClassGuid
,
1771 TRACE("CM_Enumerate_Classes(%lx %p %lx)\n",
1772 ulClassIndex
, ClassGuid
, ulFlags
);
1774 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
1778 /***********************************************************************
1779 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
1783 CM_Enumerate_Classes_Ex(
1784 _In_ ULONG ulClassIndex
,
1785 _Out_ LPGUID ClassGuid
,
1787 _In_opt_ HMACHINE hMachine
)
1789 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1790 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1791 CONFIGRET ret
= CR_SUCCESS
;
1792 ULONG ulLength
= MAX_GUID_STRING_LEN
;
1794 TRACE("CM_Enumerate_Classes_Ex(%lx %p %lx %p)\n",
1795 ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
1797 if (ClassGuid
== NULL
)
1798 return CR_INVALID_POINTER
;
1801 return CR_INVALID_FLAG
;
1803 if (hMachine
!= NULL
)
1805 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1806 if (BindingHandle
== NULL
)
1811 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1817 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1821 MAX_GUID_STRING_LEN
,
1825 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1827 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1831 if (ret
== CR_SUCCESS
)
1834 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1836 /* Convert the buffer to a GUID */
1837 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1845 /***********************************************************************
1846 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1850 CM_Enumerate_EnumeratorsA(
1851 _In_ ULONG ulEnumIndex
,
1852 _Out_writes_(*pulLength
) PCHAR Buffer
,
1853 _Inout_ PULONG pulLength
,
1856 TRACE("CM_Enumerate_EnumeratorsA(%lu %p %p %lx)\n",
1857 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1859 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1864 /***********************************************************************
1865 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1869 CM_Enumerate_EnumeratorsW(
1870 _In_ ULONG ulEnumIndex
,
1871 _Out_writes_(*pulLength
) PWCHAR Buffer
,
1872 _Inout_ PULONG pulLength
,
1875 TRACE("CM_Enumerate_EnumeratorsW(%lu %p %p %lx)\n",
1876 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1878 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1883 /***********************************************************************
1884 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1888 CM_Enumerate_Enumerators_ExA(
1889 _In_ ULONG ulEnumIndex
,
1890 _Out_writes_(*pulLength
) PCHAR Buffer
,
1891 _Inout_ PULONG pulLength
,
1893 _In_opt_ HMACHINE hMachine
)
1895 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1898 CONFIGRET ret
= CR_SUCCESS
;
1900 TRACE("CM_Enumerate_Enumerators_ExA(%lu %p %p %lx %p)\n",
1901 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
1903 if (Buffer
== NULL
|| pulLength
== NULL
)
1904 return CR_INVALID_POINTER
;
1907 return CR_INVALID_FLAG
;
1909 ulOrigLength
= *pulLength
;
1912 ulLength
= MAX_DEVICE_ID_LEN
;
1913 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1915 if (ret
== CR_SUCCESS
)
1917 if (WideCharToMultiByte(CP_ACP
,
1927 *pulLength
= lstrlenA(Buffer
) + 1;
1934 /***********************************************************************
1935 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1939 CM_Enumerate_Enumerators_ExW(
1940 _In_ ULONG ulEnumIndex
,
1941 _Out_writes_(*pulLength
) PWCHAR Buffer
,
1942 _Inout_ PULONG pulLength
,
1944 _In_opt_ HMACHINE hMachine
)
1946 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1949 TRACE("CM_Enumerate_Enumerators_ExW(%lu %p %p %lx %p)\n",
1950 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
1952 if (Buffer
== NULL
|| pulLength
== NULL
)
1953 return CR_INVALID_POINTER
;
1956 return CR_INVALID_FLAG
;
1958 *Buffer
= UNICODE_NULL
;
1960 if (hMachine
!= NULL
)
1962 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1963 if (BindingHandle
== NULL
)
1968 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1974 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1975 PNP_ENUMERATOR_SUBKEYS
,
1982 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1984 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1992 /***********************************************************************
1993 * CM_Find_Range [SETUPAPI.@]
1998 _Out_ PDWORDLONG pullStart
,
1999 _In_ DWORDLONG ullStart
,
2000 _In_ ULONG ulLength
,
2001 _In_ DWORDLONG ullAlignment
,
2002 _In_ DWORDLONG ullEnd
,
2003 _In_ RANGE_LIST rlh
,
2006 FIXME("CM_Find_Range(%p %I64u %lu %I64u %I64u %p %lx)\n",
2007 pullStart
, ullStart
, ulLength
, ullAlignment
, ullEnd
, rlh
, ulFlags
);
2009 return CR_CALL_NOT_IMPLEMENTED
;
2013 /***********************************************************************
2014 * CM_First_Range [SETUPAPI.@]
2019 _In_ RANGE_LIST rlh
,
2020 _Out_ PDWORDLONG pullStart
,
2021 _Out_ PDWORDLONG pullEnd
,
2022 _Out_ PRANGE_ELEMENT preElement
,
2025 PINTERNAL_RANGE_LIST pRangeList
;
2026 PINTERNAL_RANGE pRange
;
2027 PLIST_ENTRY ListEntry
;
2028 CONFIGRET ret
= CR_SUCCESS
;
2030 FIXME("CM_First_Range(%p %p %p %p %lx)\n",
2031 rlh
, pullStart
, pullEnd
, preElement
, ulFlags
);
2033 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
2035 if (!IsValidRangeList(pRangeList
))
2036 return CR_INVALID_RANGE_LIST
;
2038 if (pullStart
== NULL
|| pullEnd
== NULL
|| preElement
== NULL
)
2039 return CR_INVALID_POINTER
;
2042 return CR_INVALID_FLAG
;
2044 /* Lock the range list */
2045 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2047 /* Fail, if the list is empty */
2048 if (IsListEmpty(&pRangeList
->ListHead
))
2054 /* Get the first range */
2055 ListEntry
= pRangeList
->ListHead
.Flink
;
2056 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2058 /* Return the range data */
2059 *pullStart
= pRange
->ullStart
;
2060 *pullEnd
= pRange
->ullEnd
;
2061 *preElement
= (RANGE_ELEMENT
)pRange
;
2064 /* Unlock the range list */
2065 ReleaseMutex(pRangeList
->hMutex
);
2071 /***********************************************************************
2072 * CM_Free_Log_Conf [SETUPAPI.@]
2077 _In_ LOG_CONF lcLogConfToBeFreed
,
2080 TRACE("CM_Free_Log_Conf(%lx %lx)\n",
2081 lcLogConfToBeFreed
, ulFlags
);
2083 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
2087 /***********************************************************************
2088 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
2092 CM_Free_Log_Conf_Ex(
2093 _In_ LOG_CONF lcLogConfToBeFreed
,
2095 _In_opt_ HMACHINE hMachine
)
2097 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2098 HSTRING_TABLE StringTable
= NULL
;
2100 PLOG_CONF_INFO pLogConfInfo
;
2103 TRACE("CM_Free_Log_Conf_Ex(%lx %lx %p)\n",
2104 lcLogConfToBeFreed
, ulFlags
, hMachine
);
2106 if (!pSetupIsUserAdmin())
2107 return CR_ACCESS_DENIED
;
2109 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
2110 if (!IsValidLogConf(pLogConfInfo
))
2111 return CR_INVALID_LOG_CONF
;
2114 return CR_INVALID_FLAG
;
2116 if (hMachine
!= NULL
)
2118 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2119 if (BindingHandle
== NULL
)
2122 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2123 if (StringTable
== 0)
2128 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2132 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2133 if (lpDevInst
== NULL
)
2134 return CR_INVALID_DEVNODE
;
2138 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
2139 pLogConfInfo
->ulTag
, 0);
2141 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2143 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2151 /***********************************************************************
2152 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
2156 CM_Free_Log_Conf_Handle(
2157 _In_ LOG_CONF lcLogConf
)
2159 PLOG_CONF_INFO pLogConfInfo
;
2161 TRACE("CM_Free_Log_Conf_Handle(%lx)\n", lcLogConf
);
2163 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2164 if (!IsValidLogConf(pLogConfInfo
))
2165 return CR_INVALID_LOG_CONF
;
2167 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
2173 /***********************************************************************
2174 * CM_Free_Range_List [SETUPAPI.@]
2179 _In_ RANGE_LIST RangeList
,
2182 PINTERNAL_RANGE_LIST pRangeList
;
2183 PINTERNAL_RANGE pRange
;
2184 PLIST_ENTRY ListEntry
;
2186 FIXME("CM_Free_Range_List(%p %lx)\n",
2187 RangeList
, ulFlags
);
2189 pRangeList
= (PINTERNAL_RANGE_LIST
)RangeList
;
2191 if (!IsValidRangeList(pRangeList
))
2192 return CR_INVALID_RANGE_LIST
;
2195 return CR_INVALID_FLAG
;
2197 /* Lock the range list */
2198 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2200 /* Free the list of ranges */
2201 while (!IsListEmpty(&pRangeList
->ListHead
))
2203 ListEntry
= RemoveHeadList(&pRangeList
->ListHead
);
2204 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2205 HeapFree(GetProcessHeap(), 0, pRange
);
2208 /* Unlock the range list */
2209 ReleaseMutex(pRangeList
->hMutex
);
2211 /* Close the mutex */
2212 CloseHandle(pRangeList
->hMutex
);
2214 /* Free the range list */
2215 HeapFree(GetProcessHeap(), 0, pRangeList
);
2221 /***********************************************************************
2222 * CM_Free_Res_Des [SETUPAPI.@]
2227 _Out_ PRES_DES prdResDes
,
2228 _In_ RES_DES rdResDes
,
2231 TRACE("CM_Free_Res_Des(%p %p %lx)\n",
2232 prdResDes
, rdResDes
, ulFlags
);
2234 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
2238 /***********************************************************************
2239 * CM_Free_Res_Des_Ex [SETUPAPI.@]
2244 _Out_ PRES_DES prdResDes
,
2245 _In_ RES_DES rdResDes
,
2247 _In_opt_ HMACHINE hMachine
)
2249 FIXME("CM_Free_Res_Des_Ex(%p %p %lx %p)\n",
2250 prdResDes
, rdResDes
, ulFlags
, hMachine
);
2252 return CR_CALL_NOT_IMPLEMENTED
;
2256 /***********************************************************************
2257 * CM_Free_Res_Des_Handle [SETUPAPI.@]
2261 CM_Free_Res_Des_Handle(
2262 _In_ RES_DES rdResDes
)
2264 FIXME("CM_Free_Res_Des_Handle(%p)\n", rdResDes
);
2266 return CR_CALL_NOT_IMPLEMENTED
;
2270 /***********************************************************************
2271 * CM_Free_Resource_Conflict_Handle [SETUPAPI.@]
2275 CM_Free_Resource_Conflict_Handle(
2276 _In_ CONFLICT_LIST clConflictList
)
2278 PCONFLICT_DATA pConflictData
;
2280 FIXME("CM_Free_Resource_Conflict_Handle(%p)\n",
2283 pConflictData
= (PCONFLICT_DATA
)clConflictList
;
2284 if (!IsValidConflictData(pConflictData
))
2285 return CR_INVALID_CONFLICT_LIST
;
2287 if (pConflictData
->pConflictList
!= NULL
)
2288 MyFree(pConflictData
->pConflictList
);
2290 MyFree(pConflictData
);
2296 /***********************************************************************
2297 * CM_Get_Child [SETUPAPI.@]
2302 _Out_ PDEVINST pdnDevInst
,
2303 _In_ DEVINST dnDevInst
,
2306 TRACE("CM_Get_Child(%p %p %lx)\n",
2307 pdnDevInst
, dnDevInst
, ulFlags
);
2309 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2313 /***********************************************************************
2314 * CM_Get_Child_Ex [SETUPAPI.@]
2319 _Out_ PDEVINST pdnDevInst
,
2320 _In_ DEVINST dnDevInst
,
2322 _In_opt_ HMACHINE hMachine
)
2324 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2325 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2326 HSTRING_TABLE StringTable
= NULL
;
2328 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
2331 TRACE("CM_Get_Child_Ex(%p %lx %lx %p)\n",
2332 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2334 if (pdnDevInst
== NULL
)
2335 return CR_INVALID_POINTER
;
2338 return CR_INVALID_DEVINST
;
2341 return CR_INVALID_FLAG
;
2345 if (hMachine
!= NULL
)
2347 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2348 if (BindingHandle
== NULL
)
2351 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2352 if (StringTable
== 0)
2357 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2361 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2362 if (lpDevInst
== NULL
)
2363 return CR_INVALID_DEVNODE
;
2367 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2368 PNP_GET_CHILD_DEVICE_INSTANCE
,
2374 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2376 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2380 if (ret
!= CR_SUCCESS
)
2383 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2385 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
2389 *pdnDevInst
= dwIndex
;
2395 /***********************************************************************
2396 * CM_Get_Class_Key_NameA [SETUPAPI.@]
2400 CM_Get_Class_Key_NameA(
2401 _In_ LPGUID ClassGuid
,
2402 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2403 _Inout_ PULONG pulLength
,
2406 TRACE("CM_Get_Class_Key_NameA(%p %p %p %lx)\n",
2407 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2409 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
2414 /***********************************************************************
2415 * CM_Get_Class_Key_NameW [SETUPAPI.@]
2419 CM_Get_Class_Key_NameW(
2420 _In_ LPGUID ClassGuid
,
2421 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2422 _Inout_ PULONG pulLength
,
2425 TRACE("CM_Get_Class_Key_NameW(%p %p %p %lx)\n",
2426 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2428 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
2433 /***********************************************************************
2434 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
2438 CM_Get_Class_Key_Name_ExA(
2439 _In_ LPGUID ClassGuid
,
2440 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2441 _Inout_ PULONG pulLength
,
2443 _In_opt_ HMACHINE hMachine
)
2445 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
2446 CONFIGRET ret
= CR_SUCCESS
;
2450 TRACE("CM_Get_Class_Key_Name_ExA(%p %p %p %lx %p)\n",
2451 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2453 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2454 return CR_INVALID_POINTER
;
2456 ulOrigLength
= *pulLength
;
2459 ulLength
= MAX_GUID_STRING_LEN
;
2460 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2462 if (ret
== CR_SUCCESS
)
2464 if (WideCharToMultiByte(CP_ACP
,
2474 *pulLength
= lstrlenA(pszKeyName
) + 1;
2481 /***********************************************************************
2482 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
2486 CM_Get_Class_Key_Name_ExW(
2487 _In_ LPGUID ClassGuid
,
2488 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2489 _Inout_ PULONG pulLength
,
2491 _In_opt_ HMACHINE hMachine
)
2493 TRACE("CM_Get_Class_Key_Name_ExW(%p %p %p %lx %p)\n",
2494 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2496 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2497 return CR_INVALID_POINTER
;
2500 return CR_INVALID_FLAG
;
2502 if (*pulLength
< MAX_GUID_STRING_LEN
)
2505 return CR_BUFFER_SMALL
;
2508 if (!GuidToString(ClassGuid
, pszKeyName
))
2509 return CR_INVALID_DATA
;
2511 *pulLength
= MAX_GUID_STRING_LEN
;
2517 /***********************************************************************
2518 * CM_Get_Class_NameA [SETUPAPI.@]
2523 _In_ LPGUID ClassGuid
,
2524 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2525 _Inout_ PULONG pulLength
,
2528 TRACE("CM_Get_Class_NameA(%p %p %p %lx)\n",
2529 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2531 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2536 /***********************************************************************
2537 * CM_Get_Class_NameW [SETUPAPI.@]
2542 _In_ LPGUID ClassGuid
,
2543 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2544 _Inout_ PULONG pulLength
,
2547 TRACE("CM_Get_Class_NameW(%p %p %p %lx)\n",
2548 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2550 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2555 /***********************************************************************
2556 * CM_Get_Class_Name_ExA [SETUPAPI.@]
2560 CM_Get_Class_Name_ExA(
2561 _In_ LPGUID ClassGuid
,
2562 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2563 _Inout_ PULONG pulLength
,
2565 _In_opt_ HMACHINE hMachine
)
2567 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
2568 CONFIGRET ret
= CR_SUCCESS
;
2572 TRACE("CM_Get_Class_Name_ExA(%p %p %p %lx %p)\n",
2573 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2575 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2576 return CR_INVALID_POINTER
;
2578 ulOrigLength
= *pulLength
;
2581 ulLength
= MAX_CLASS_NAME_LEN
;
2582 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2584 if (ret
== CR_SUCCESS
)
2586 if (WideCharToMultiByte(CP_ACP
,
2596 *pulLength
= lstrlenA(Buffer
) + 1;
2603 /***********************************************************************
2604 * CM_Get_Class_Name_ExW [SETUPAPI.@]
2608 CM_Get_Class_Name_ExW(
2609 _In_ LPGUID ClassGuid
,
2610 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2611 _Inout_ PULONG pulLength
,
2613 _In_opt_ HMACHINE hMachine
)
2615 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
2616 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2619 TRACE("CM_Get_Class_Name_ExW(%p %p %p %lx %p\n",
2620 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2622 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2623 return CR_INVALID_POINTER
;
2626 return CR_INVALID_FLAG
;
2628 if (!GuidToString(ClassGuid
, szGuidString
))
2629 return CR_INVALID_DATA
;
2631 TRACE("Guid %s\n", debugstr_w(szGuidString
));
2633 if (hMachine
!= NULL
)
2635 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2636 if (BindingHandle
== NULL
)
2641 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2647 ret
= PNP_GetClassName(BindingHandle
,
2653 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2655 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2663 /***********************************************************************
2664 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
2668 CM_Get_Class_Registry_PropertyA(
2671 PULONG pulRegDataType
,
2677 PWSTR BufferW
= NULL
;
2682 TRACE("CM_Get_Class_Registry_PropertyA(%p %lu %p %p %p %lx %p)\n",
2683 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2686 if (pulLength
== NULL
)
2687 return CR_INVALID_POINTER
;
2689 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2690 return CR_INVALID_PROPERTY
;
2692 ulType
= GetRegistryPropertyType(ulProperty
);
2693 if (ulType
== REG_SZ
|| ulType
== REG_MULTI_SZ
)
2695 /* Get the required buffer size */
2696 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2697 NULL
, &ulLength
, ulFlags
, hMachine
);
2698 if (ret
!= CR_BUFFER_SMALL
)
2701 /* Allocate the unicode buffer */
2702 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLength
);
2703 if (BufferW
== NULL
)
2704 return CR_OUT_OF_MEMORY
;
2706 /* Get the property */
2707 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2708 BufferW
, &ulLength
, ulFlags
, hMachine
);
2709 if (ret
!= CR_SUCCESS
)
2711 HeapFree(GetProcessHeap(), 0, BufferW
);
2715 /* Do W->A conversion */
2716 *pulLength
= WideCharToMultiByte(CP_ACP
,
2719 lstrlenW(BufferW
) + 1,
2725 /* Release the unicode buffer */
2726 HeapFree(GetProcessHeap(), 0, BufferW
);
2728 if (*pulLength
== 0)
2733 /* Get the property */
2734 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2735 Buffer
, pulLength
, ulFlags
, hMachine
);
2742 /***********************************************************************
2743 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
2747 CM_Get_Class_Registry_PropertyW(
2750 PULONG pulRegDataType
,
2756 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2757 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
2759 ULONG ulTransferLength
= 0;
2762 TRACE("CM_Get_Class_Registry_PropertyW(%p %lu %p %p %p %lx %p)\n",
2763 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2766 if (ClassGuid
== NULL
|| pulLength
== NULL
)
2767 return CR_INVALID_POINTER
;
2770 return CR_INVALID_FLAG
;
2772 if (pSetupStringFromGuid(ClassGuid
,
2774 PNP_MAX_GUID_STRING_LEN
) != 0)
2775 return CR_INVALID_DATA
;
2777 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2778 return CR_INVALID_PROPERTY
;
2780 if (hMachine
!= NULL
)
2782 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2783 if (BindingHandle
== NULL
)
2788 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2792 ulTransferLength
= *pulLength
;
2796 ret
= PNP_GetClassRegProp(BindingHandle
,
2805 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2807 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2811 if (ret
== CR_SUCCESS
)
2813 if (pulRegDataType
!= NULL
)
2814 *pulRegDataType
= ulType
;
2821 /***********************************************************************
2822 * CM_Get_Depth [SETUPAPI.@]
2827 _Out_ PULONG pulDepth
,
2828 _In_ DEVINST dnDevInst
,
2831 TRACE("CM_Get_Depth(%p %lx %lx)\n",
2832 pulDepth
, dnDevInst
, ulFlags
);
2834 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
2838 /***********************************************************************
2839 * CM_Get_Depth_Ex [SETUPAPI.@]
2844 _Out_ PULONG pulDepth
,
2845 _In_ DEVINST dnDevInst
,
2847 _In_opt_ HMACHINE hMachine
)
2849 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2850 HSTRING_TABLE StringTable
= NULL
;
2854 TRACE("CM_Get_Depth_Ex(%p %lx %lx %p)\n",
2855 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
2857 if (pulDepth
== NULL
)
2858 return CR_INVALID_POINTER
;
2861 return CR_INVALID_DEVINST
;
2864 return CR_INVALID_FLAG
;
2866 if (hMachine
!= NULL
)
2868 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2869 if (BindingHandle
== NULL
)
2872 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2873 if (StringTable
== 0)
2878 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2882 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2883 if (lpDevInst
== NULL
)
2884 return CR_INVALID_DEVNODE
;
2888 ret
= PNP_GetDepth(BindingHandle
,
2893 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2895 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2903 /***********************************************************************
2904 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
2908 CM_Get_DevNode_Custom_PropertyA(
2909 _In_ DEVINST dnDevInst
,
2910 _In_ PCSTR pszCustomPropertyName
,
2911 _Out_opt_ PULONG pulRegDataType
,
2912 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
2913 _Inout_ PULONG pulLength
,
2916 TRACE("CM_Get_DevNode_Custom_PropertyA(%lx %s %p %p %p %lx)\n",
2917 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
2918 Buffer
, pulLength
, ulFlags
);
2920 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
2921 pulRegDataType
, Buffer
,
2922 pulLength
, ulFlags
, NULL
);
2926 /***********************************************************************
2927 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
2931 CM_Get_DevNode_Custom_PropertyW(
2932 _In_ DEVINST dnDevInst
,
2933 _In_ PCWSTR pszCustomPropertyName
,
2934 _Out_opt_ PULONG pulRegDataType
,
2935 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
2936 _Inout_ PULONG pulLength
,
2939 TRACE("CM_Get_DevNode_Custom_PropertyW(%lx %s %p %p %p %lx)\n",
2940 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
2941 Buffer
, pulLength
, ulFlags
);
2943 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
2944 pulRegDataType
, Buffer
,
2945 pulLength
, ulFlags
, NULL
);
2949 /***********************************************************************
2950 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
2954 CM_Get_DevNode_Custom_Property_ExA(
2955 _In_ DEVINST dnDevInst
,
2956 _In_ PCSTR pszCustomPropertyName
,
2957 _Out_opt_ PULONG pulRegDataType
,
2958 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
2959 _Inout_ PULONG pulLength
,
2961 _In_opt_ HMACHINE hMachine
)
2963 LPWSTR pszPropertyNameW
= NULL
;
2966 ULONG ulDataType
= REG_NONE
;
2969 TRACE("CM_Get_DevNode_Custom_Property_ExA(%lx %s %p %p %p %lx %p)\n",
2970 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
2971 Buffer
, pulLength
, ulFlags
, hMachine
);
2974 return CR_INVALID_POINTER
;
2976 ulLengthW
= *pulLength
* sizeof(WCHAR
);
2977 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
2979 return CR_OUT_OF_MEMORY
;
2981 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
2983 if (pszPropertyNameW
== NULL
)
2985 HeapFree(GetProcessHeap(), 0, BufferW
);
2986 return CR_OUT_OF_MEMORY
;
2989 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
2996 if (ret
== CR_SUCCESS
)
2998 if (ulDataType
== REG_SZ
||
2999 ulDataType
== REG_EXPAND_SZ
||
3000 ulDataType
== REG_MULTI_SZ
)
3002 /* Do W->A conversion */
3003 *pulLength
= WideCharToMultiByte(CP_ACP
,
3006 lstrlenW(BufferW
) + 1,
3011 if (*pulLength
== 0)
3016 /* Directly copy the value */
3017 if (ulLengthW
<= *pulLength
)
3018 memcpy(Buffer
, BufferW
, ulLengthW
);
3021 *pulLength
= ulLengthW
;
3022 ret
= CR_BUFFER_SMALL
;
3028 *pulRegDataType
= ulDataType
;
3030 HeapFree(GetProcessHeap(), 0, BufferW
);
3031 MyFree(pszPropertyNameW
);
3037 /***********************************************************************
3038 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
3042 CM_Get_DevNode_Custom_Property_ExW(
3043 _In_ DEVINST dnDevInst
,
3044 _In_ PCWSTR pszCustomPropertyName
,
3045 _Out_opt_ PULONG pulRegDataType
,
3046 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3047 _Inout_ PULONG pulLength
,
3049 _In_opt_ HMACHINE hMachine
)
3051 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3052 HSTRING_TABLE StringTable
= NULL
;
3054 ULONG ulDataType
= REG_NONE
;
3055 ULONG ulTransferLength
;
3056 CONFIGRET ret
= CR_SUCCESS
;
3058 TRACE("CM_Get_DevNode_Custom_Property_ExW(%lx %s %p %p %p %lx %p)\n",
3059 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
3060 Buffer
, pulLength
, ulFlags
, hMachine
);
3063 return CR_INVALID_DEVNODE
;
3065 if (pszCustomPropertyName
== NULL
||
3066 pulLength
== NULL
||
3068 return CR_INVALID_POINTER
;
3070 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
3071 return CR_INVALID_FLAG
;
3073 if (hMachine
!= NULL
)
3075 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3076 if (BindingHandle
== NULL
)
3079 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3080 if (StringTable
== 0)
3085 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3089 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3090 if (lpDevInst
== NULL
)
3091 return CR_INVALID_DEVNODE
;
3093 ulTransferLength
= *pulLength
;
3097 ret
= PNP_GetCustomDevProp(BindingHandle
,
3099 (LPWSTR
)pszCustomPropertyName
,
3106 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3108 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3112 if (ret
== CR_SUCCESS
)
3114 if (pulRegDataType
!= NULL
)
3115 *pulRegDataType
= ulDataType
;
3122 /***********************************************************************
3123 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
3127 CM_Get_DevNode_Registry_PropertyA(
3128 _In_ DEVINST dnDevInst
,
3129 _In_ ULONG ulProperty
,
3130 _Out_opt_ PULONG pulRegDataType
,
3131 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3132 _Inout_ PULONG pulLength
,
3135 TRACE("CM_Get_DevNode_Registry_PropertyA(%lx %lu %p %p %p %lx)\n",
3136 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3138 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
3139 pulRegDataType
, Buffer
,
3140 pulLength
, ulFlags
, NULL
);
3144 /***********************************************************************
3145 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
3149 CM_Get_DevNode_Registry_PropertyW(
3150 _In_ DEVINST dnDevInst
,
3151 _In_ ULONG ulProperty
,
3152 _Out_opt_ PULONG pulRegDataType
,
3153 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3154 _Inout_ PULONG pulLength
,
3157 TRACE("CM_Get_DevNode_Registry_PropertyW(%lx %lu %p %p %p %lx)\n",
3158 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3160 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
3161 pulRegDataType
, Buffer
,
3162 pulLength
, ulFlags
, NULL
);
3166 /***********************************************************************
3167 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
3171 CM_Get_DevNode_Registry_Property_ExA(
3172 _In_ DEVINST dnDevInst
,
3173 _In_ ULONG ulProperty
,
3174 _Out_opt_ PULONG pulRegDataType
,
3175 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3176 _Inout_ PULONG pulLength
,
3178 _In_opt_ HMACHINE hMachine
)
3182 ULONG ulDataType
= REG_NONE
;
3185 TRACE("CM_Get_DevNode_Registry_Property_ExA(%lx %lu %p %p %p %lx %p)\n",
3186 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3190 return CR_INVALID_POINTER
;
3192 LengthW
= *pulLength
* sizeof(WCHAR
);
3193 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
3196 return CR_OUT_OF_MEMORY
;
3198 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
3206 if (ret
== CR_SUCCESS
)
3208 if (ulDataType
== REG_SZ
||
3209 ulDataType
== REG_EXPAND_SZ
||
3210 ulDataType
== REG_MULTI_SZ
)
3212 /* Do W->A conversion */
3213 *pulLength
= WideCharToMultiByte(CP_ACP
,
3216 lstrlenW(BufferW
) + 1,
3221 if (*pulLength
== 0)
3226 /* Directly copy the value */
3227 if (LengthW
<= *pulLength
)
3228 memcpy(Buffer
, BufferW
, LengthW
);
3231 *pulLength
= LengthW
;
3232 ret
= CR_BUFFER_SMALL
;
3238 *pulRegDataType
= ulDataType
;
3240 HeapFree(GetProcessHeap(), 0, BufferW
);
3246 /***********************************************************************
3247 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
3251 CM_Get_DevNode_Registry_Property_ExW(
3252 _In_ DEVINST dnDevInst
,
3253 _In_ ULONG ulProperty
,
3254 _Out_opt_ PULONG pulRegDataType
,
3255 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3256 _Inout_ PULONG pulLength
,
3258 _In_opt_ HMACHINE hMachine
)
3260 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3261 HSTRING_TABLE StringTable
= NULL
;
3262 CONFIGRET ret
= CR_SUCCESS
;
3264 ULONG ulDataType
= REG_NONE
;
3265 ULONG ulTransferLength
= 0;
3267 TRACE("CM_Get_DevNode_Registry_Property_ExW(%lx %lu %p %p %p %lx %p)\n",
3268 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3272 return CR_INVALID_DEVNODE
;
3274 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
3275 return CR_INVALID_PROPERTY
;
3277 /* pulRegDataType is optional */
3279 /* Buffer is optional */
3281 if (pulLength
== NULL
)
3282 return CR_INVALID_POINTER
;
3284 if (*pulLength
== 0)
3285 return CR_INVALID_POINTER
;
3288 return CR_INVALID_FLAG
;
3290 if (hMachine
!= NULL
)
3292 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3293 if (BindingHandle
== NULL
)
3296 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3297 if (StringTable
== 0)
3302 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3306 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3307 if (lpDevInst
== NULL
)
3308 return CR_INVALID_DEVNODE
;
3310 ulTransferLength
= *pulLength
;
3314 ret
= PNP_GetDeviceRegProp(BindingHandle
,
3323 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3325 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3329 if (ret
== CR_SUCCESS
)
3331 if (pulRegDataType
!= NULL
)
3332 *pulRegDataType
= ulDataType
;
3339 /***********************************************************************
3340 * CM_Get_DevNode_Status [SETUPAPI.@]
3344 CM_Get_DevNode_Status(
3345 _Out_ PULONG pulStatus
,
3346 _Out_ PULONG pulProblemNumber
,
3347 _In_ DEVINST dnDevInst
,
3350 TRACE("CM_Get_DevNode_Status(%p %p %lx %lx)\n",
3351 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
3353 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
3358 /***********************************************************************
3359 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
3363 CM_Get_DevNode_Status_Ex(
3364 _Out_ PULONG pulStatus
,
3365 _Out_ PULONG pulProblemNumber
,
3366 _In_ DEVINST dnDevInst
,
3368 _In_opt_ HMACHINE hMachine
)
3370 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3371 HSTRING_TABLE StringTable
= NULL
;
3375 TRACE("CM_Get_DevNode_Status_Ex(%p %p %lx %lx %p)\n",
3376 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
3378 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
3379 return CR_INVALID_POINTER
;
3382 return CR_INVALID_DEVINST
;
3385 return CR_INVALID_FLAG
;
3387 if (hMachine
!= NULL
)
3389 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3390 if (BindingHandle
== NULL
)
3393 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3394 if (StringTable
== 0)
3399 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3403 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3404 if (lpDevInst
== NULL
)
3405 return CR_INVALID_DEVNODE
;
3409 ret
= PNP_GetDeviceStatus(BindingHandle
,
3415 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3417 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3425 /***********************************************************************
3426 * CM_Get_Device_IDA [SETUPAPI.@]
3431 _In_ DEVINST dnDevInst
,
3432 _Out_writes_(BufferLen
) PCHAR Buffer
,
3433 _In_ ULONG BufferLen
,
3436 TRACE("CM_Get_Device_IDA(%lx %p %lu %lx)\n",
3437 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3439 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3443 /***********************************************************************
3444 * CM_Get_Device_IDW [SETUPAPI.@]
3449 _In_ DEVINST dnDevInst
,
3450 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3451 _In_ ULONG BufferLen
,
3454 TRACE("CM_Get_Device_IDW(%lx %p %lu %lx)\n",
3455 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3457 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3461 /***********************************************************************
3462 * CM_Get_Device_ID_ExA [SETUPAPI.@]
3466 CM_Get_Device_ID_ExA(
3467 _In_ DEVINST dnDevInst
,
3468 _Out_writes_(BufferLen
) PCHAR Buffer
,
3469 _In_ ULONG BufferLen
,
3471 _In_opt_ HMACHINE hMachine
)
3473 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
3474 CONFIGRET ret
= CR_SUCCESS
;
3476 TRACE("CM_Get_Device_ID_ExA(%lx %p %lu %lx %p)\n",
3477 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3480 return CR_INVALID_POINTER
;
3482 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
3487 if (ret
== CR_SUCCESS
)
3489 if (WideCharToMultiByte(CP_ACP
,
3492 lstrlenW(szBufferW
) + 1,
3504 /***********************************************************************
3505 * CM_Get_Device_ID_ExW [SETUPAPI.@]
3509 CM_Get_Device_ID_ExW(
3510 _In_ DEVINST dnDevInst
,
3511 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3512 _In_ ULONG BufferLen
,
3514 _In_opt_ HMACHINE hMachine
)
3516 HSTRING_TABLE StringTable
= NULL
;
3518 TRACE("CM_Get_Device_ID_ExW(%lx %p %lu %lx %p)\n",
3519 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3522 return CR_INVALID_DEVINST
;
3525 return CR_INVALID_POINTER
;
3528 return CR_INVALID_FLAG
;
3530 if (hMachine
!= NULL
)
3532 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3533 if (StringTable
== NULL
)
3538 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3542 if (!pSetupStringTableStringFromIdEx(StringTable
,
3552 /***********************************************************************
3553 * CM_Get_Device_ID_ListA [SETUPAPI.@]
3557 CM_Get_Device_ID_ListA(
3558 _In_ PCSTR pszFilter
,
3559 _Out_writes_(BufferLen
) PCHAR Buffer
,
3560 _In_ ULONG BufferLen
,
3563 TRACE("CM_Get_Device_ID_ListA(%p %p %lu %lx)\n",
3564 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3566 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
3571 /***********************************************************************
3572 * CM_Get_Device_ID_ListW [SETUPAPI.@]
3576 CM_Get_Device_ID_ListW(
3577 _In_ PCWSTR pszFilter
,
3578 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3579 _In_ ULONG BufferLen
,
3582 TRACE("CM_Get_Device_ID_ListW(%p %p %lu %lx)\n",
3583 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3585 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
3590 /***********************************************************************
3591 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
3595 CM_Get_Device_ID_List_ExA(
3596 _In_ PCSTR pszFilter
,
3597 _Out_writes_(BufferLen
) PCHAR Buffer
,
3598 _In_ ULONG BufferLen
,
3600 _In_opt_ HMACHINE hMachine
)
3602 LPWSTR BufferW
= NULL
;
3603 LPWSTR pszFilterW
= NULL
;
3604 CONFIGRET ret
= CR_SUCCESS
;
3606 TRACE("CM_Get_Device_ID_List_ExA(%p %p %lu %lx %p)\n",
3607 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3609 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
3610 if (BufferW
== NULL
)
3611 return CR_OUT_OF_MEMORY
;
3613 if (pszFilter
== NULL
)
3615 ret
= CM_Get_Device_ID_List_ExW(NULL
,
3623 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3625 ret
= CR_INVALID_DEVICE_ID
;
3629 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
3638 if (WideCharToMultiByte(CP_ACP
,
3641 lstrlenW(BufferW
) + 1,
3655 /***********************************************************************
3656 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
3660 CM_Get_Device_ID_List_ExW(
3661 _In_ PCWSTR pszFilter
,
3662 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3663 _In_ ULONG BufferLen
,
3665 _In_opt_ HMACHINE hMachine
)
3667 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3670 TRACE("CM_Get_Device_ID_List_ExW(%p %p %lu %lx %p)\n",
3671 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3673 if (Buffer
== NULL
|| BufferLen
== 0)
3674 return CR_INVALID_POINTER
;
3676 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3677 return CR_INVALID_FLAG
;
3679 if (hMachine
!= NULL
)
3681 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3682 if (BindingHandle
== NULL
)
3687 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3695 ret
= PNP_GetDeviceList(BindingHandle
,
3701 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3703 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3711 /***********************************************************************
3712 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
3716 CM_Get_Device_ID_List_SizeA(
3717 _Out_ PULONG pulLen
,
3718 _In_opt_ PCSTR pszFilter
,
3721 TRACE("CM_Get_Device_ID_List_SizeA(%p %s %lx)\n",
3722 pulLen
, debugstr_a(pszFilter
), ulFlags
);
3724 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
3728 /***********************************************************************
3729 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
3733 CM_Get_Device_ID_List_SizeW(
3734 _Out_ PULONG pulLen
,
3735 _In_opt_ PCWSTR pszFilter
,
3738 TRACE("CM_Get_Device_ID_List_SizeW(%p %s %lx)\n",
3739 pulLen
, debugstr_w(pszFilter
), ulFlags
);
3741 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
3745 /***********************************************************************
3746 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
3750 CM_Get_Device_ID_List_Size_ExA(
3751 _Out_ PULONG pulLen
,
3752 _In_opt_ PCSTR pszFilter
,
3754 _In_opt_ HMACHINE hMachine
)
3756 LPWSTR pszFilterW
= NULL
;
3757 CONFIGRET ret
= CR_SUCCESS
;
3759 FIXME("CM_Get_Device_ID_List_Size_ExA(%p %s %lx %p)\n",
3760 pulLen
, debugstr_a(pszFilter
), ulFlags
, hMachine
);
3762 if (pszFilter
== NULL
)
3764 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3771 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3772 return CR_INVALID_DEVICE_ID
;
3774 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3786 /***********************************************************************
3787 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
3791 CM_Get_Device_ID_List_Size_ExW(
3792 _Out_ PULONG pulLen
,
3793 _In_opt_ PCWSTR pszFilter
,
3795 _In_opt_ HMACHINE hMachine
)
3797 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3800 FIXME("CM_Get_Device_ID_List_Size_ExW(%p %s %lx %p)\n",
3801 pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
3804 return CR_INVALID_POINTER
;
3806 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3807 return CR_INVALID_FLAG
;
3809 if (hMachine
!= NULL
)
3811 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3812 if (BindingHandle
== NULL
)
3817 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3825 ret
= PNP_GetDeviceListSize(BindingHandle
,
3830 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3832 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3840 /***********************************************************************
3841 * CM_Get_Device_ID_Size [SETUPAPI.@]
3845 CM_Get_Device_ID_Size(
3846 _Out_ PULONG pulLen
,
3847 _In_ DEVINST dnDevInst
,
3850 TRACE("CM_Get_Device_ID_Size(%p %lx %lx)\n",
3851 pulLen
, dnDevInst
, ulFlags
);
3853 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
3857 /***********************************************************************
3858 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
3862 CM_Get_Device_ID_Size_Ex(
3863 _Out_ PULONG pulLen
,
3864 _In_ DEVINST dnDevInst
,
3866 _In_opt_ HMACHINE hMachine
)
3868 HSTRING_TABLE StringTable
= NULL
;
3871 TRACE("CM_Get_Device_ID_Size_Ex(%p %lx %lx %p)\n",
3872 pulLen
, dnDevInst
, ulFlags
, hMachine
);
3875 return CR_INVALID_POINTER
;
3878 return CR_INVALID_DEVINST
;
3881 return CR_INVALID_FLAG
;
3883 if (hMachine
!= NULL
)
3885 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3886 if (StringTable
== NULL
)
3891 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3895 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3896 if (DeviceId
== NULL
)
3902 *pulLen
= lstrlenW(DeviceId
);
3908 /***********************************************************************
3909 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
3913 CM_Get_Device_Interface_AliasA(
3914 _In_ LPCSTR pszDeviceInterface
,
3915 _In_ LPGUID AliasInterfaceGuid
,
3916 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
3917 _Inout_ PULONG pulLength
,
3920 TRACE("CM_Get_Device_Interface_AliasA(%p %p %p %p %lx)\n",
3921 pszDeviceInterface
, AliasInterfaceGuid
,
3922 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3924 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
3925 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3930 /***********************************************************************
3931 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
3935 CM_Get_Device_Interface_AliasW(
3936 _In_ LPCWSTR pszDeviceInterface
,
3937 _In_ LPGUID AliasInterfaceGuid
,
3938 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
3939 _Inout_ PULONG pulLength
,
3942 TRACE("CM_Get_Device_Interface_AliasW(%p %p %p %p %lx)\n",
3943 pszDeviceInterface
, AliasInterfaceGuid
,
3944 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3946 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
3947 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3952 /***********************************************************************
3953 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
3957 CM_Get_Device_Interface_Alias_ExA(
3958 _In_ LPCSTR pszDeviceInterface
,
3959 _In_ LPGUID AliasInterfaceGuid
,
3960 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
3961 _Inout_ PULONG pulLength
,
3963 _In_opt_ HMACHINE hMachine
)
3965 FIXME("CM_Get_Device_Interface_Alias_ExA(%p %p %p %p %lx %p)\n",
3966 pszDeviceInterface
, AliasInterfaceGuid
,
3967 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
3969 return CR_CALL_NOT_IMPLEMENTED
;
3973 /***********************************************************************
3974 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
3978 CM_Get_Device_Interface_Alias_ExW(
3979 _In_ LPCWSTR pszDeviceInterface
,
3980 _In_ LPGUID AliasInterfaceGuid
,
3981 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
3982 _Inout_ PULONG pulLength
,
3984 _In_opt_ HMACHINE hMachine
)
3986 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3987 ULONG ulTransferLength
;
3988 CONFIGRET ret
= CR_SUCCESS
;
3990 TRACE("CM_Get_Device_Interface_Alias_ExW(%p %p %p %p %lx %p)\n",
3991 pszDeviceInterface
, AliasInterfaceGuid
,
3992 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
3994 if (pszDeviceInterface
== NULL
||
3995 AliasInterfaceGuid
== NULL
||
3996 pszAliasDeviceInterface
== NULL
||
3998 return CR_INVALID_POINTER
;
4001 return CR_INVALID_FLAG
;
4003 if (hMachine
!= NULL
)
4005 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4006 if (BindingHandle
== NULL
)
4011 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4015 ulTransferLength
= *pulLength
;
4019 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
4020 (LPWSTR
)pszDeviceInterface
,
4022 pszAliasDeviceInterface
,
4027 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4029 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4037 /***********************************************************************
4038 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
4042 CM_Get_Device_Interface_ListA(
4043 _In_ LPGUID InterfaceClassGuid
,
4044 _In_opt_ DEVINSTID_A pDeviceID
,
4045 _Out_writes_(BufferLen
) PCHAR Buffer
,
4046 _In_ ULONG BufferLen
,
4049 TRACE("CM_Get_Device_Interface_ListA(%s %s %p %lu 0x%08lx)\n",
4050 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4051 Buffer
, BufferLen
, ulFlags
);
4053 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
4054 Buffer
, BufferLen
, ulFlags
, NULL
);
4058 /***********************************************************************
4059 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
4063 CM_Get_Device_Interface_ListW(
4064 _In_ LPGUID InterfaceClassGuid
,
4065 _In_opt_ DEVINSTID_W pDeviceID
,
4066 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4067 _In_ ULONG BufferLen
,
4070 TRACE("CM_Get_Device_Interface_ListW(%s %s %p %lu 0x%08lx)\n",
4071 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4072 Buffer
, BufferLen
, ulFlags
);
4074 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
4075 Buffer
, BufferLen
, ulFlags
, NULL
);
4079 /***********************************************************************
4080 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
4084 CM_Get_Device_Interface_List_ExA(
4085 _In_ LPGUID InterfaceClassGuid
,
4086 _In_opt_ DEVINSTID_A pDeviceID
,
4087 _Out_writes_(BufferLen
) PCHAR Buffer
,
4088 _In_ ULONG BufferLen
,
4090 _In_opt_ HMACHINE hMachine
)
4092 DEVINSTID_W pDeviceIdW
= NULL
;
4093 PWCHAR BufferW
= NULL
;
4094 CONFIGRET ret
= CR_SUCCESS
;
4096 TRACE("CM_Get_Device_Interface_List_ExA(%s %s %p %lu 0x%08lx %p)\n",
4097 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4098 Buffer
, BufferLen
, ulFlags
, hMachine
);
4100 if (Buffer
== NULL
||
4102 return CR_INVALID_POINTER
;
4104 if (pDeviceID
!= NULL
)
4106 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4107 return CR_INVALID_DEVICE_ID
;
4110 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
4111 if (BufferW
== NULL
)
4113 ret
= CR_OUT_OF_MEMORY
;
4117 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
4118 BufferW
, BufferLen
, ulFlags
,
4120 if (ret
!= CR_SUCCESS
)
4123 if (WideCharToMultiByte(CP_ACP
,
4126 lstrlenW(BufferW
) + 1,
4134 if (BufferW
!= NULL
)
4137 if (pDeviceIdW
!= NULL
)
4144 /***********************************************************************
4145 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
4149 CM_Get_Device_Interface_List_ExW(
4150 _In_ LPGUID InterfaceClassGuid
,
4151 _In_opt_ DEVINSTID_W pDeviceID
,
4152 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4153 _In_ ULONG BufferLen
,
4155 _In_opt_ HMACHINE hMachine
)
4157 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4158 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
4159 CONFIGRET ret
= CR_SUCCESS
;
4161 TRACE("CM_Get_Device_Interface_List_ExW(%s %s %p %lu 0x%08lx %p)\n",
4162 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4163 Buffer
, BufferLen
, ulFlags
, hMachine
);
4165 if (Buffer
== NULL
||
4167 return CR_INVALID_POINTER
;
4169 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4170 return CR_INVALID_FLAG
;
4172 if (hMachine
!= NULL
)
4174 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4175 if (BindingHandle
== NULL
)
4180 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4185 BufferSize
= BufferLen
;
4189 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
4196 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4198 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4206 /***********************************************************************
4207 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
4211 CM_Get_Device_Interface_List_SizeA(
4212 _Out_ PULONG pulLen
,
4213 _In_ LPGUID InterfaceClassGuid
,
4214 _In_opt_ DEVINSTID_A pDeviceID
,
4217 TRACE("CM_Get_Device_Interface_List_SizeA(%p %p %s 0x%08lx)\n",
4218 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
);
4220 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
4221 pDeviceID
, ulFlags
, NULL
);
4225 /***********************************************************************
4226 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
4230 CM_Get_Device_Interface_List_SizeW(
4231 _Out_ PULONG pulLen
,
4232 _In_ LPGUID InterfaceClassGuid
,
4233 _In_opt_ DEVINSTID_W pDeviceID
,
4236 TRACE("CM_Get_Device_Interface_List_SizeW(%p %p %s 0x%08lx)\n",
4237 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
);
4239 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4240 pDeviceID
, ulFlags
, NULL
);
4244 /***********************************************************************
4245 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
4249 CM_Get_Device_Interface_List_Size_ExA(
4250 _Out_ PULONG pulLen
,
4251 _In_ LPGUID InterfaceClassGuid
,
4252 _In_opt_ DEVINSTID_A pDeviceID
,
4254 _In_opt_ HMACHINE hMachine
)
4256 DEVINSTID_W pDeviceIdW
= NULL
;
4257 CONFIGRET ret
= CR_SUCCESS
;
4259 TRACE("CM_Get_Device_Interface_List_Size_ExA(%p %p %s 0x%08lx %p)\n",
4260 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
4263 return CR_INVALID_POINTER
;
4265 if (pDeviceID
!= NULL
)
4267 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4268 return CR_INVALID_DEVICE_ID
;
4273 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4274 pDeviceIdW
, ulFlags
, hMachine
);
4276 if (pDeviceIdW
!= NULL
)
4283 /***********************************************************************
4284 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
4288 CM_Get_Device_Interface_List_Size_ExW(
4289 _Out_ PULONG pulLen
,
4290 _In_ LPGUID InterfaceClassGuid
,
4291 _In_opt_ DEVINSTID_W pDeviceID
,
4293 _In_opt_ HMACHINE hMachine
)
4295 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4296 CONFIGRET ret
= CR_SUCCESS
;
4298 TRACE("CM_Get_Device_Interface_List_Size_ExW(%p %p %s 0x%08lx %p)\n",
4299 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
4302 return CR_INVALID_POINTER
;
4304 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4305 return CR_INVALID_FLAG
;
4307 if (hMachine
!= NULL
)
4309 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4310 if (BindingHandle
== NULL
)
4315 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4323 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
4329 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4331 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4339 /***********************************************************************
4340 * CM_Get_First_Log_Conf [SETUPAPI.@]
4344 CM_Get_First_Log_Conf(
4345 _Out_opt_ PLOG_CONF plcLogConf
,
4346 _In_ DEVINST dnDevInst
,
4349 TRACE("CM_Get_First_Log_Conf(%p %lx %lx)\n",
4350 plcLogConf
, dnDevInst
, ulFlags
);
4352 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
4356 /***********************************************************************
4357 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
4361 CM_Get_First_Log_Conf_Ex(
4362 _Out_opt_ PLOG_CONF plcLogConf
,
4363 _In_ DEVINST dnDevInst
,
4365 _In_opt_ HMACHINE hMachine
)
4367 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4368 HSTRING_TABLE StringTable
= NULL
;
4369 LPWSTR lpDevInst
= NULL
;
4370 CONFIGRET ret
= CR_SUCCESS
;
4372 PLOG_CONF_INFO pLogConfInfo
;
4374 FIXME("CM_Get_First_Log_Conf_Ex(%p %lx %lx %p)\n",
4375 plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
4378 return CR_INVALID_DEVINST
;
4380 if (ulFlags
& ~LOG_CONF_BITS
)
4381 return CR_INVALID_FLAG
;
4386 if (hMachine
!= NULL
)
4388 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4389 if (BindingHandle
== NULL
)
4392 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4393 if (StringTable
== 0)
4398 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4402 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4403 if (lpDevInst
== NULL
)
4404 return CR_INVALID_DEVNODE
;
4408 ret
= PNP_GetFirstLogConf(BindingHandle
,
4414 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4416 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4420 if (ret
!= CR_SUCCESS
)
4425 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4426 if (pLogConfInfo
== NULL
)
4427 return CR_OUT_OF_MEMORY
;
4429 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4430 pLogConfInfo
->dnDevInst
= dnDevInst
;
4431 pLogConfInfo
->ulFlags
= ulFlags
;
4432 pLogConfInfo
->ulTag
= ulTag
;
4434 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
4441 /***********************************************************************
4442 * CM_Get_Global_State [SETUPAPI.@]
4446 CM_Get_Global_State(
4447 _Out_ PULONG pulState
,
4450 TRACE("CM_Get_Global_State(%p %lx)\n",
4453 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
4457 /***********************************************************************
4458 * CM_Get_Global_State_Ex [SETUPAPI.@]
4462 CM_Get_Global_State_Ex(
4463 _Out_ PULONG pulState
,
4465 _In_opt_ HMACHINE hMachine
)
4467 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4470 TRACE("CM_Get_Global_State_Ex(%p %lx %p)\n",
4471 pulState
, ulFlags
, hMachine
);
4473 if (pulState
== NULL
)
4474 return CR_INVALID_POINTER
;
4477 return CR_INVALID_FLAG
;
4479 if (hMachine
!= NULL
)
4481 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4482 if (BindingHandle
== NULL
)
4487 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4493 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
4495 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4497 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4505 /***********************************************************************
4506 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
4510 CM_Get_HW_Prof_FlagsA(
4511 _In_ DEVINSTID_A szDevInstName
,
4512 _In_ ULONG ulHardwareProfile
,
4513 _Out_ PULONG pulValue
,
4516 TRACE("CM_Get_HW_Prof_FlagsA(%s %lu %p %lx)\n",
4517 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4519 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
4520 pulValue
, ulFlags
, NULL
);
4524 /***********************************************************************
4525 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
4529 CM_Get_HW_Prof_FlagsW(
4530 _In_ DEVINSTID_W szDevInstName
,
4531 _In_ ULONG ulHardwareProfile
,
4532 _Out_ PULONG pulValue
,
4535 TRACE("CM_Get_HW_Prof_FlagsW(%s %lu %p %lx)\n",
4536 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4538 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
4539 pulValue
, ulFlags
, NULL
);
4543 /***********************************************************************
4544 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
4548 CM_Get_HW_Prof_Flags_ExA(
4549 _In_ DEVINSTID_A szDevInstName
,
4550 _In_ ULONG ulHardwareProfile
,
4551 _Out_ PULONG pulValue
,
4553 _In_opt_ HMACHINE hMachine
)
4555 DEVINSTID_W pszDevIdW
= NULL
;
4556 CONFIGRET ret
= CR_SUCCESS
;
4558 TRACE("CM_Get_HW_Prof_Flags_ExA(%s %lu %p %lx %p)\n",
4559 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4561 if (szDevInstName
!= NULL
)
4563 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
4564 return CR_INVALID_DEVICE_ID
;
4567 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
4568 pulValue
, ulFlags
, hMachine
);
4570 if (pszDevIdW
!= NULL
)
4577 /***********************************************************************
4578 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
4582 CM_Get_HW_Prof_Flags_ExW(
4583 _In_ DEVINSTID_W szDevInstName
,
4584 _In_ ULONG ulHardwareProfile
,
4585 _Out_ PULONG pulValue
,
4587 _In_opt_ HMACHINE hMachine
)
4589 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4592 FIXME("CM_Get_HW_Prof_Flags_ExW(%s %lu %p %lx %p)\n",
4593 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4595 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
4596 return CR_INVALID_POINTER
;
4599 return CR_INVALID_FLAG
;
4601 /* FIXME: Check whether szDevInstName is valid */
4603 if (hMachine
!= NULL
)
4605 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4606 if (BindingHandle
== NULL
)
4611 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4617 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
4618 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
4620 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4622 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4630 /***********************************************************************
4631 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
4635 CM_Get_Hardware_Profile_InfoA(
4637 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4640 TRACE("CM_Get_Hardware_Profile_InfoA(%lu %p %lx)\n",
4641 ulIndex
, pHWProfileInfo
, ulFlags
);
4643 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
4648 /***********************************************************************
4649 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
4653 CM_Get_Hardware_Profile_InfoW(
4655 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4658 TRACE("CM_Get_Hardware_Profile_InfoW(%lu %p %lx)\n",
4659 ulIndex
, pHWProfileInfo
, ulFlags
);
4661 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
4666 /***********************************************************************
4667 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
4671 CM_Get_Hardware_Profile_Info_ExA(
4673 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4675 _In_opt_ HMACHINE hMachine
)
4677 HWPROFILEINFO_W LocalProfileInfo
;
4680 TRACE("CM_Get_Hardware_Profile_Info_ExA(%lu %p %lx %p)\n",
4681 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4683 if (pHWProfileInfo
== NULL
)
4684 return CR_INVALID_POINTER
;
4686 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
4688 if (ret
== CR_SUCCESS
)
4690 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
4691 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
4693 if (WideCharToMultiByte(CP_ACP
,
4695 LocalProfileInfo
.HWPI_szFriendlyName
,
4696 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
4697 pHWProfileInfo
->HWPI_szFriendlyName
,
4708 /***********************************************************************
4709 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
4713 CM_Get_Hardware_Profile_Info_ExW(
4715 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4717 _In_opt_ HMACHINE hMachine
)
4719 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4722 TRACE("CM_Get_Hardware_Profile_Info_ExW(%lu %p %lx %p)\n",
4723 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4725 if (pHWProfileInfo
== NULL
)
4726 return CR_INVALID_POINTER
;
4729 return CR_INVALID_FLAG
;
4731 if (hMachine
!= NULL
)
4733 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4734 if (BindingHandle
== NULL
)
4739 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4745 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
4746 sizeof(HWPROFILEINFO_W
), 0);
4748 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4750 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4758 /***********************************************************************
4759 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
4763 CM_Get_Log_Conf_Priority(
4764 _In_ LOG_CONF lcLogConf
,
4765 _Out_ PPRIORITY pPriority
,
4768 TRACE("CM_Get_Log_Conf_Priority(%p %p %lx)\n",
4769 lcLogConf
, pPriority
, ulFlags
);
4771 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
4775 /***********************************************************************
4776 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
4780 CM_Get_Log_Conf_Priority_Ex(
4781 _In_ LOG_CONF lcLogConf
,
4782 _Out_ PPRIORITY pPriority
,
4784 _In_opt_ HMACHINE hMachine
)
4786 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4787 HSTRING_TABLE StringTable
= NULL
;
4788 PLOG_CONF_INFO pLogConfInfo
;
4792 FIXME("CM_Get_Log_Conf_Priority_Ex(%p %p %lx %p)\n",
4793 lcLogConf
, pPriority
, ulFlags
, hMachine
);
4795 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4796 if (!IsValidLogConf(pLogConfInfo
))
4797 return CR_INVALID_LOG_CONF
;
4799 if (pPriority
== NULL
)
4800 return CR_INVALID_POINTER
;
4803 return CR_INVALID_FLAG
;
4805 if (hMachine
!= NULL
)
4807 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4808 if (BindingHandle
== NULL
)
4811 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4812 if (StringTable
== 0)
4817 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4821 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4822 if (lpDevInst
== NULL
)
4823 return CR_INVALID_DEVNODE
;
4827 ret
= PNP_GetLogConfPriority(BindingHandle
,
4829 pLogConfInfo
->ulFlags
,
4830 pLogConfInfo
->ulTag
,
4834 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4836 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4844 /***********************************************************************
4845 * CM_Get_Next_Log_Conf [SETUPAPI.@]
4849 CM_Get_Next_Log_Conf(
4850 _Out_opt_ PLOG_CONF plcLogConf
,
4851 _In_ LOG_CONF lcLogConf
,
4854 TRACE("CM_Get_Next_Log_Conf(%p %p %lx)\n",
4855 plcLogConf
, lcLogConf
, ulFlags
);
4857 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
4861 /***********************************************************************
4862 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
4866 CM_Get_Next_Log_Conf_Ex(
4867 _Out_opt_ PLOG_CONF plcLogConf
,
4868 _In_ LOG_CONF lcLogConf
,
4870 _In_opt_ HMACHINE hMachine
)
4872 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4873 HSTRING_TABLE StringTable
= NULL
;
4874 PLOG_CONF_INFO pLogConfInfo
;
4875 PLOG_CONF_INFO pNewLogConfInfo
;
4880 FIXME("CM_Get_Next_Log_Conf_Ex(%p %p %lx %p)\n",
4881 plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
4886 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4887 if (!IsValidLogConf(pLogConfInfo
))
4888 return CR_INVALID_LOG_CONF
;
4891 return CR_INVALID_FLAG
;
4893 if (hMachine
!= NULL
)
4895 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4896 if (BindingHandle
== NULL
)
4899 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4900 if (StringTable
== 0)
4905 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4909 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4910 if (lpDevInst
== NULL
)
4911 return CR_INVALID_DEVNODE
;
4915 ret
= PNP_GetNextLogConf(BindingHandle
,
4917 pLogConfInfo
->ulFlags
,
4918 pLogConfInfo
->ulTag
,
4922 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4924 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4928 if (ret
!= CR_SUCCESS
)
4933 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4934 if (pNewLogConfInfo
== NULL
)
4935 return CR_OUT_OF_MEMORY
;
4937 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4938 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
4939 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
4940 pNewLogConfInfo
->ulTag
= ulNewTag
;
4942 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
4949 /***********************************************************************
4950 * CM_Get_Next_Re_Des [SETUPAPI.@]
4954 CM_Get_Next_Res_Des(
4955 _Out_ PRES_DES prdResDes
,
4956 _In_ RES_DES rdResDes
,
4957 _In_ RESOURCEID ForResource
,
4958 _Out_opt_ PRESOURCEID pResourceID
,
4961 TRACE("CM_Get_Next_Res_Des(%p %p %lu %p %lx)\n",
4962 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
);
4964 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
4965 pResourceID
, ulFlags
, NULL
);
4969 /***********************************************************************
4970 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
4974 CM_Get_Next_Res_Des_Ex(
4975 _Out_ PRES_DES prdResDes
,
4976 _In_ RES_DES rdResDes
,
4977 _In_ RESOURCEID ForResource
,
4978 _Out_opt_ PRESOURCEID pResourceID
,
4980 _In_opt_ HMACHINE hMachine
)
4982 FIXME("CM_Get_Next_Res_Des_Ex(%p %p %lu %p %lx %p)\n",
4983 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
, hMachine
);
4985 return CR_CALL_NOT_IMPLEMENTED
;
4989 /***********************************************************************
4990 * CM_Get_Parent [SETUPAPI.@]
4995 _Out_ PDEVINST pdnDevInst
,
4996 _In_ DEVINST dnDevInst
,
4999 TRACE("CM_Get_Parent(%p %p %lx)\n",
5000 pdnDevInst
, dnDevInst
, ulFlags
);
5002 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5006 /***********************************************************************
5007 * CM_Get_Parent_Ex [SETUPAPI.@]
5012 _Out_ PDEVINST pdnDevInst
,
5013 _In_ DEVINST dnDevInst
,
5015 _In_opt_ HMACHINE hMachine
)
5017 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5018 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5019 HSTRING_TABLE StringTable
= NULL
;
5021 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5024 TRACE("CM_Get_Parent_Ex(%p %lx %lx %p)\n",
5025 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5027 if (pdnDevInst
== NULL
)
5028 return CR_INVALID_POINTER
;
5031 return CR_INVALID_DEVINST
;
5034 return CR_INVALID_FLAG
;
5038 if (hMachine
!= NULL
)
5040 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5041 if (BindingHandle
== NULL
)
5044 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5045 if (StringTable
== 0)
5050 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5054 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5055 if (lpDevInst
== NULL
)
5056 return CR_INVALID_DEVNODE
;
5060 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5061 PNP_GET_PARENT_DEVICE_INSTANCE
,
5067 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5069 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5073 if (ret
!= CR_SUCCESS
)
5076 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5078 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5082 *pdnDevInst
= dwIndex
;
5088 /***********************************************************************
5089 * CM_Get_Res_Des_Data [SETUPAPI.@]
5093 CM_Get_Res_Des_Data(
5094 _In_ RES_DES rdResDes
,
5095 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5096 _In_ ULONG BufferLen
,
5099 TRACE("CM_Get_Res_Des_Data(%p %p %lu %lx)\n",
5100 rdResDes
, Buffer
, BufferLen
, ulFlags
);
5102 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
5106 /***********************************************************************
5107 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
5111 CM_Get_Res_Des_Data_Ex(
5112 _In_ RES_DES rdResDes
,
5113 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5114 _In_ ULONG BufferLen
,
5116 _In_opt_ HMACHINE hMachine
)
5118 FIXME("CM_Get_Res_Des_Data_Ex(%p %p %lu %lx %p)\n",
5119 rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
5121 return CR_CALL_NOT_IMPLEMENTED
;
5125 /***********************************************************************
5126 * CM_Get_Res_Des_Size [SETUPAPI.@]
5130 CM_Get_Res_Des_Data_Size(
5131 _Out_ PULONG pulSize
,
5132 _In_ RES_DES rdResDes
,
5135 TRACE("CM_Get_Res_Des_Data_Size(%p %p %lx)\n",
5136 pulSize
, rdResDes
, ulFlags
);
5138 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
5142 /***********************************************************************
5143 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
5147 CM_Get_Res_Des_Data_Size_Ex(
5148 _Out_ PULONG pulSize
,
5149 _In_ RES_DES rdResDes
,
5151 _In_opt_ HMACHINE hMachine
)
5153 TRACE("CM_Get_Res_Des_Data_Size_Ex(%p %p %lx %p)\n",
5154 pulSize
, rdResDes
, ulFlags
, hMachine
);
5156 return CR_CALL_NOT_IMPLEMENTED
;
5160 /***********************************************************************
5161 * CM_Get_Resource_Conflict_Count [SETUPAPI.@]
5165 CM_Get_Resource_Conflict_Count(
5166 _In_ CONFLICT_LIST clConflictList
,
5167 _Out_ PULONG pulCount
)
5169 PCONFLICT_DATA pConflictData
;
5171 FIXME("CM_Get_Resource_Conflict_Count(%p %p)\n",
5172 clConflictList
, pulCount
);
5174 pConflictData
= (PCONFLICT_DATA
)clConflictList
;
5175 if (!IsValidConflictData(pConflictData
))
5176 return CR_INVALID_CONFLICT_LIST
;
5178 if (pulCount
== NULL
)
5179 return CR_INVALID_POINTER
;
5181 *pulCount
= pConflictData
->pConflictList
->ConflictsListed
;
5187 /***********************************************************************
5188 * CM_Get_Resource_Conflict_DetailsA [SETUPAPI.@]
5192 CM_Get_Resource_Conflict_DetailsA(
5193 _In_ CONFLICT_LIST clConflictList
,
5195 _Inout_ PCONFLICT_DETAILS_A pConflictDetails
)
5197 FIXME("CM_Get_Resource_Conflict_CountA(%p %lu %p)\n",
5198 clConflictList
, ulIndex
, pConflictDetails
);
5200 return CR_CALL_NOT_IMPLEMENTED
;
5204 /***********************************************************************
5205 * CM_Get_Resource_Conflict_DetailsW [SETUPAPI.@]
5209 CM_Get_Resource_Conflict_DetailsW(
5210 _In_ CONFLICT_LIST clConflictList
,
5212 _Inout_ PCONFLICT_DETAILS_W pConflictDetails
)
5214 FIXME("CM_Get_Resource_Conflict_CountW(%p %lu %p)\n",
5215 clConflictList
, ulIndex
, pConflictDetails
);
5217 return CR_CALL_NOT_IMPLEMENTED
;
5221 /***********************************************************************
5222 * CM_Get_Sibling [SETUPAPI.@]
5227 _Out_ PDEVINST pdnDevInst
,
5228 _In_ DEVINST dnDevInst
,
5231 TRACE("CM_Get_Sibling(%p %p %lx)\n",
5232 pdnDevInst
, dnDevInst
, ulFlags
);
5234 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5238 /***********************************************************************
5239 * CM_Get_Sibling_Ex [SETUPAPI.@]
5244 _Out_ PDEVINST pdnDevInst
,
5245 _In_ DEVINST dnDevInst
,
5247 _In_opt_ HMACHINE hMachine
)
5249 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5250 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5251 HSTRING_TABLE StringTable
= NULL
;
5253 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5256 TRACE("CM_Get_Sibling_Ex(%p %lx %lx %p)\n",
5257 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5259 if (pdnDevInst
== NULL
)
5260 return CR_INVALID_POINTER
;
5263 return CR_INVALID_DEVINST
;
5266 return CR_INVALID_FLAG
;
5270 if (hMachine
!= NULL
)
5272 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5273 if (BindingHandle
== NULL
)
5276 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5277 if (StringTable
== 0)
5282 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5286 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5287 if (lpDevInst
== NULL
)
5288 return CR_INVALID_DEVNODE
;
5292 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5293 PNP_GET_SIBLING_DEVICE_INSTANCE
,
5299 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5301 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5305 if (ret
!= CR_SUCCESS
)
5308 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5310 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5314 *pdnDevInst
= dwIndex
;
5320 /***********************************************************************
5321 * CM_Get_Version [SETUPAPI.@]
5325 CM_Get_Version(VOID
)
5327 TRACE("CM_Get_Version()\n");
5329 return CM_Get_Version_Ex(NULL
);
5333 /***********************************************************************
5334 * CM_Get_Version_Ex [SETUPAPI.@]
5339 _In_opt_ HMACHINE hMachine
)
5341 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5345 TRACE("CM_Get_Version_Ex(%p)\n", hMachine
);
5347 if (hMachine
!= NULL
)
5349 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5350 if (BindingHandle
== NULL
)
5355 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5361 ret
= PNP_GetVersion(BindingHandle
, &Version
);
5363 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5365 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5369 if (ret
!= CR_SUCCESS
)
5376 /***********************************************************************
5377 * CM_Intersect_Range_List [SETUPAPI.@]
5381 CM_Intersect_Range_List(
5382 _In_ RANGE_LIST rlhOld1
,
5383 _In_ RANGE_LIST rlhOld2
,
5384 _In_ RANGE_LIST rlhNew
,
5387 FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
5388 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5390 return CR_CALL_NOT_IMPLEMENTED
;
5394 /***********************************************************************
5395 * CM_Invert_Range_List [SETUPAPI.@]
5399 CM_Invert_Range_List(
5400 _In_ RANGE_LIST rlhOld
,
5401 _In_ RANGE_LIST rlhNew
,
5402 _In_ DWORDLONG ullMaxValue
,
5405 FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
5406 rlhOld
, rlhNew
, ullMaxValue
, ulFlags
);
5408 return CR_CALL_NOT_IMPLEMENTED
;
5412 /***********************************************************************
5413 * CM_Is_Dock_Station_Present [SETUPAPI.@]
5417 CM_Is_Dock_Station_Present(
5418 _Out_ PBOOL pbPresent
)
5420 TRACE("CM_Is_Dock_Station_Present(%p)\n",
5423 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
5427 /***********************************************************************
5428 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
5432 CM_Is_Dock_Station_Present_Ex(
5433 _Out_ PBOOL pbPresent
,
5434 _In_opt_ HMACHINE hMachine
)
5436 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5439 TRACE("CM_Is_Dock_Station_Present_Ex(%p %p)\n",
5440 pbPresent
, hMachine
);
5442 if (pbPresent
== NULL
)
5443 return CR_INVALID_POINTER
;
5447 if (hMachine
!= NULL
)
5449 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5450 if (BindingHandle
== NULL
)
5455 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5461 ret
= PNP_IsDockStationPresent(BindingHandle
,
5464 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5466 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5474 /***********************************************************************
5475 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5479 CM_Is_Version_Available(
5482 TRACE("CM_Is_Version_Available(%hu)\n",
5485 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
5489 /***********************************************************************
5490 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5494 CM_Is_Version_Available_Ex(
5496 _In_opt_ HMACHINE hMachine
)
5498 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5499 WORD wServerVersion
;
5502 TRACE("CM_Is_Version_Available_Ex(%hu %p)\n",
5503 wVersion
, hMachine
);
5505 if (wVersion
<= 0x400)
5508 if (hMachine
!= NULL
)
5510 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5511 if (BindingHandle
== NULL
)
5516 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5522 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
5524 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5526 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5530 if (ret
!= CR_SUCCESS
)
5533 return (wServerVersion
>= wVersion
);
5537 /***********************************************************************
5538 * CM_Locate_DevNodeA [SETUPAPI.@]
5543 _Out_ PDEVINST pdnDevInst
,
5544 _In_opt_ DEVINSTID_A pDeviceID
,
5547 TRACE("CM_Locate_DevNodeA(%p %s %lx)\n",
5548 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
);
5550 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5554 /***********************************************************************
5555 * CM_Locate_DevNodeW [SETUPAPI.@]
5560 _Out_ PDEVINST pdnDevInst
,
5561 _In_opt_ DEVINSTID_W pDeviceID
,
5564 TRACE("CM_Locate_DevNodeW(%p %s %lx)\n",
5565 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
5567 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5571 /***********************************************************************
5572 * CM_Locate_DevNode_ExA [SETUPAPI.@]
5576 CM_Locate_DevNode_ExA(
5577 _Out_ PDEVINST pdnDevInst
,
5578 _In_opt_ DEVINSTID_A pDeviceID
,
5580 _In_opt_ HMACHINE hMachine
)
5582 DEVINSTID_W pDevIdW
= NULL
;
5583 CONFIGRET ret
= CR_SUCCESS
;
5585 TRACE("CM_Locate_DevNode_ExA(%p %s %lx %p)\n",
5586 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
5588 if (pDeviceID
!= NULL
)
5590 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
5591 return CR_INVALID_DEVICE_ID
;
5594 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
5596 if (pDevIdW
!= NULL
)
5603 /***********************************************************************
5604 * CM_Locate_DevNode_ExW [SETUPAPI.@]
5608 CM_Locate_DevNode_ExW(
5609 _Out_ PDEVINST pdnDevInst
,
5610 _In_opt_ DEVINSTID_W pDeviceID
,
5612 _In_opt_ HMACHINE hMachine
)
5614 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
5615 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5616 HSTRING_TABLE StringTable
= NULL
;
5617 CONFIGRET ret
= CR_SUCCESS
;
5619 TRACE("CM_Locate_DevNode_ExW(%p %s %lx %p)\n",
5620 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
5622 if (pdnDevInst
== NULL
)
5623 return CR_INVALID_POINTER
;
5625 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
5626 return CR_INVALID_FLAG
;
5628 if (hMachine
!= NULL
)
5630 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5631 if (BindingHandle
== NULL
)
5634 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5635 if (StringTable
== 0)
5640 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5644 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
5646 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
5652 /* Get the root device ID */
5653 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
5657 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5659 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5663 if (ret
!= CR_SUCCESS
)
5666 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
5670 /* Validate the device ID */
5671 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
5675 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5677 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5681 if (ret
== CR_SUCCESS
)
5683 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
5684 if (*pdnDevInst
== -1)
5692 /***********************************************************************
5693 * CM_Merge_Range_List [SETUPAPI.@]
5697 CM_Merge_Range_List(
5698 _In_ RANGE_LIST rlhOld1
,
5699 _In_ RANGE_LIST rlhOld2
,
5700 _In_ RANGE_LIST rlhNew
,
5703 FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
5704 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5706 return CR_CALL_NOT_IMPLEMENTED
;
5710 /***********************************************************************
5711 * CM_Modify_Res_Des [SETUPAPI.@]
5716 _Out_ PRES_DES prdResDes
,
5717 _In_ RES_DES rdResDes
,
5718 _In_ RESOURCEID ResourceID
,
5719 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5720 _In_ ULONG ResourceLen
,
5723 TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
5724 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5725 ResourceLen
, ulFlags
);
5727 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5728 ResourceLen
, ulFlags
, NULL
);
5732 /***********************************************************************
5733 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
5737 CM_Modify_Res_Des_Ex(
5738 _Out_ PRES_DES prdResDes
,
5739 _In_ RES_DES rdResDes
,
5740 _In_ RESOURCEID ResourceID
,
5741 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5742 _In_ ULONG ResourceLen
,
5744 _In_opt_ HMACHINE hMachine
)
5746 FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %p)\n",
5747 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5748 ResourceLen
, ulFlags
, hMachine
);
5750 return CR_CALL_NOT_IMPLEMENTED
;
5754 /***********************************************************************
5755 * CM_Move_DevNode [SETUPAPI.@]
5760 _In_ DEVINST dnFromDevInst
,
5761 _In_ DEVINST dnToDevInst
,
5764 TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
5765 dnFromDevInst
, dnToDevInst
, ulFlags
);
5767 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
5771 /***********************************************************************
5772 * CM_Move_DevNode_Ex [SETUPAPI.@]
5777 _In_ DEVINST dnFromDevInst
,
5778 _In_ DEVINST dnToDevInst
,
5780 _In_opt_ HMACHINE hMachine
)
5782 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5783 HSTRING_TABLE StringTable
= NULL
;
5784 LPWSTR lpFromDevInst
;
5788 FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %p)\n",
5789 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
5791 if (!pSetupIsUserAdmin())
5792 return CR_ACCESS_DENIED
;
5794 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
5795 return CR_INVALID_DEVNODE
;
5798 return CR_INVALID_FLAG
;
5800 if (hMachine
!= NULL
)
5802 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5803 if (BindingHandle
== NULL
)
5806 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5807 if (StringTable
== 0)
5812 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5816 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
5817 if (lpFromDevInst
== NULL
)
5818 return CR_INVALID_DEVNODE
;
5820 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
5821 if (lpToDevInst
== NULL
)
5822 return CR_INVALID_DEVNODE
;
5826 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5832 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5834 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5842 /***********************************************************************
5843 * CM_Next_Range [SETUPAPI.@]
5848 _Inout_ PRANGE_ELEMENT preElement
,
5849 _Out_ PDWORDLONG pullStart
,
5850 _Out_ PDWORDLONG pullEnd
,
5853 FIXME("CM_Next_Range(%p %p %p %lx)\n",
5854 preElement
, pullStart
, pullEnd
, ulFlags
);
5856 return CR_CALL_NOT_IMPLEMENTED
;
5860 /***********************************************************************
5861 * CM_Open_Class_KeyA [SETUPAPI.@]
5866 _In_opt_ LPGUID pClassGuid
,
5867 _In_opt_ LPCSTR pszClassName
,
5868 _In_ REGSAM samDesired
,
5869 _In_ REGDISPOSITION Disposition
,
5870 _Out_ PHKEY phkClass
,
5873 TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
5874 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
5875 samDesired
, Disposition
, phkClass
, ulFlags
);
5877 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
5878 Disposition
, phkClass
, ulFlags
, NULL
);
5882 /***********************************************************************
5883 * CM_Open_Class_KeyW [SETUPAPI.@]
5888 _In_opt_ LPGUID pClassGuid
,
5889 _In_opt_ LPCWSTR pszClassName
,
5890 _In_ REGSAM samDesired
,
5891 _In_ REGDISPOSITION Disposition
,
5892 _Out_ PHKEY phkClass
,
5895 TRACE("CM_Open_Class_KeyW%p %s %lx %lx %p %lx)\n",
5896 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
5897 samDesired
, Disposition
, phkClass
, ulFlags
);
5899 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
5900 Disposition
, phkClass
, ulFlags
, NULL
);
5904 /***********************************************************************
5905 * CM_Open_Class_Key_ExA [SETUPAPI.@]
5909 CM_Open_Class_Key_ExA(
5910 _In_opt_ LPGUID pClassGuid
,
5911 _In_opt_ LPCSTR pszClassName
,
5912 _In_ REGSAM samDesired
,
5913 _In_ REGDISPOSITION Disposition
,
5914 _Out_ PHKEY phkClass
,
5916 _In_opt_ HMACHINE hMachine
)
5918 LPWSTR pszClassNameW
= NULL
;
5921 TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %p)\n",
5922 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
5923 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
5925 if (pszClassName
!= NULL
)
5927 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
5928 return CR_INVALID_DATA
;
5931 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
5932 Disposition
, phkClass
, ulFlags
, hMachine
);
5934 if (pszClassNameW
!= NULL
)
5935 MyFree(pszClassNameW
);
5941 /***********************************************************************
5942 * CM_Open_Class_Key_ExW [SETUPAPI.@]
5946 CM_Open_Class_Key_ExW(
5947 _In_opt_ LPGUID pClassGuid
,
5948 _In_opt_ LPCWSTR pszClassName
,
5949 _In_ REGSAM samDesired
,
5950 _In_ REGDISPOSITION Disposition
,
5951 _Out_ PHKEY phkClass
,
5953 _In_opt_ HMACHINE hMachine
)
5955 WCHAR szKeyName
[MAX_PATH
];
5956 LPWSTR lpGuidString
;
5957 DWORD dwDisposition
;
5961 TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %p)\n",
5962 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
5963 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
5965 /* Check Disposition and ulFlags */
5966 if ((Disposition
& ~RegDisposition_Bits
) ||
5967 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
5968 return CR_INVALID_FLAG
;
5970 /* Check phkClass */
5971 if (phkClass
== NULL
)
5972 return CR_INVALID_POINTER
;
5976 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
5977 pszClassName
!= NULL
)
5978 return CR_INVALID_DATA
;
5980 if (hMachine
== NULL
)
5982 hKey
= HKEY_LOCAL_MACHINE
;
5986 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
5989 return CR_REGISTRY_ERROR
;
5992 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
5994 lstrcpyW(szKeyName
, DeviceClasses
);
5998 lstrcpyW(szKeyName
, ControlClass
);
6001 if (pClassGuid
!= NULL
)
6003 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
6006 return CR_INVALID_DATA
;
6009 lstrcatW(szKeyName
, Backslash
);
6010 lstrcatW(szKeyName
, lpGuidString
);
6013 if (Disposition
== RegDisposition_OpenAlways
)
6015 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
6016 NULL
, phkClass
, &dwDisposition
);
6020 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
6025 if (pClassGuid
!= NULL
)
6026 RpcStringFreeW(&lpGuidString
);
6028 if (dwError
!= ERROR_SUCCESS
)
6031 return CR_NO_SUCH_REGISTRY_KEY
;
6034 if (pszClassName
!= NULL
)
6036 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
6037 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
6044 /***********************************************************************
6045 * CM_Open_DevNode_Key [SETUPAPI.@]
6049 CM_Open_DevNode_Key(
6050 _In_ DEVINST dnDevNode
,
6051 _In_ REGSAM samDesired
,
6052 _In_ ULONG ulHardwareProfile
,
6053 _In_ REGDISPOSITION Disposition
,
6054 _Out_ PHKEY phkDevice
,
6057 TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
6058 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
6060 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
6061 Disposition
, phkDevice
, ulFlags
, NULL
);
6065 /***********************************************************************
6066 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
6070 CM_Open_DevNode_Key_Ex(
6071 _In_ DEVINST dnDevNode
,
6072 _In_ REGSAM samDesired
,
6073 _In_ ULONG ulHardwareProfile
,
6074 _In_ REGDISPOSITION Disposition
,
6075 _Out_ PHKEY phkDevice
,
6077 _In_opt_ HMACHINE hMachine
)
6079 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6080 HSTRING_TABLE StringTable
= NULL
;
6081 LPWSTR pszDevInst
, pszKeyPath
= NULL
, pszInstancePath
= NULL
;
6083 DWORD dwDisposition
;
6084 HKEY hRootKey
= NULL
;
6085 CONFIGRET ret
= CR_CALL_NOT_IMPLEMENTED
;
6087 TRACE("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %p)\n",
6088 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
6090 if (phkDevice
== NULL
)
6091 return CR_INVALID_POINTER
;
6096 return CR_INVALID_DEVNODE
;
6098 if (ulFlags
& ~CM_REGISTRY_BITS
)
6099 return CR_INVALID_FLAG
;
6101 if (Disposition
& ~RegDisposition_Bits
)
6102 return CR_INVALID_DATA
;
6104 if (hMachine
!= NULL
)
6106 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6107 if (BindingHandle
== NULL
)
6110 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6111 if (StringTable
== 0)
6116 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6120 pszDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevNode
);
6121 if (pszDevInst
== NULL
)
6122 return CR_INVALID_DEVNODE
;
6124 TRACE("pszDevInst: %S\n", pszDevInst
);
6126 pszKeyPath
= MyMalloc(512 * sizeof(WCHAR
));
6127 if (pszKeyPath
== NULL
)
6129 ret
= CR_OUT_OF_MEMORY
;
6133 pszInstancePath
= MyMalloc(512 * sizeof(WCHAR
));
6134 if (pszInstancePath
== NULL
)
6136 ret
= CR_OUT_OF_MEMORY
;
6140 ret
= GetDeviceInstanceKeyPath(BindingHandle
,
6146 if (ret
!= CR_SUCCESS
)
6149 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6150 TRACE("pszInstancePath: %S\n", pszInstancePath
);
6152 wcscat(pszKeyPath
, L
"\\");
6153 wcscat(pszKeyPath
, pszInstancePath
);
6155 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6157 if (hMachine
== NULL
)
6159 hRootKey
= HKEY_LOCAL_MACHINE
;
6163 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6167 ret
= CR_REGISTRY_ERROR
;
6172 if (Disposition
== RegDisposition_OpenAlways
)
6174 lError
= RegCreateKeyExW(hRootKey
,
6186 lError
= RegOpenKeyExW(hRootKey
,
6193 if (lError
!= ERROR_SUCCESS
)
6196 ret
= CR_NO_SUCH_REGISTRY_KEY
;
6200 if ((hRootKey
!= NULL
) && (hRootKey
!= HKEY_LOCAL_MACHINE
))
6201 RegCloseKey(hRootKey
);
6203 if (pszInstancePath
!= NULL
)
6204 MyFree(pszInstancePath
);
6206 if (pszKeyPath
!= NULL
)
6213 /***********************************************************************
6214 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
6218 CM_Query_And_Remove_SubTreeA(
6219 _In_ DEVINST dnAncestor
,
6220 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6221 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6222 _In_ ULONG ulNameLength
,
6225 TRACE("CM_Query_And_Remove_SubTreeA(%lx %p %s %lu %lx)\n",
6226 dnAncestor
, pVetoType
, pszVetoName
, ulNameLength
, ulFlags
);
6228 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
6229 ulNameLength
, ulFlags
, NULL
);
6233 /***********************************************************************
6234 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
6238 CM_Query_And_Remove_SubTreeW(
6239 _In_ DEVINST dnAncestor
,
6240 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6241 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6242 _In_ ULONG ulNameLength
,
6245 TRACE("CM_Query_And_Remove_SubTreeW(%lx %p %s %lu %lx)\n",
6246 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
6248 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
6249 ulNameLength
, ulFlags
, NULL
);
6253 /***********************************************************************
6254 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
6258 CM_Query_And_Remove_SubTree_ExA(
6259 _In_ DEVINST dnAncestor
,
6260 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6261 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6262 _In_ ULONG ulNameLength
,
6264 _In_opt_ HMACHINE hMachine
)
6266 LPWSTR lpLocalVetoName
;
6269 TRACE("CM_Query_And_Remove_SubTree_ExA(%lx %p %s %lu %lx %p)\n",
6270 dnAncestor
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
,
6273 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6274 return CR_INVALID_POINTER
;
6276 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
6277 if (lpLocalVetoName
== NULL
)
6278 return CR_OUT_OF_MEMORY
;
6280 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
6281 ulNameLength
, ulFlags
, hMachine
);
6282 if (ret
== CR_REMOVE_VETOED
)
6284 if (WideCharToMultiByte(CP_ACP
,
6295 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
6301 /***********************************************************************
6302 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
6306 CM_Query_And_Remove_SubTree_ExW(
6307 _In_ DEVINST dnAncestor
,
6308 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6309 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6310 _In_ ULONG ulNameLength
,
6312 _In_opt_ HMACHINE hMachine
)
6314 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6315 HSTRING_TABLE StringTable
= NULL
;
6319 TRACE("CM_Query_And_Remove_SubTree_ExW(%lx %p %s %lu %lx %p)\n",
6320 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
,
6323 if (dnAncestor
== 0)
6324 return CR_INVALID_DEVNODE
;
6326 if (ulFlags
& ~CM_REMOVE_BITS
)
6327 return CR_INVALID_FLAG
;
6329 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6330 return CR_INVALID_POINTER
;
6332 if (hMachine
!= NULL
)
6334 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6335 if (BindingHandle
== NULL
)
6338 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6339 if (StringTable
== 0)
6344 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6348 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
6349 if (lpDevInst
== NULL
)
6350 return CR_INVALID_DEVNODE
;
6354 ret
= PNP_QueryRemove(BindingHandle
,
6361 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6363 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6371 /***********************************************************************
6372 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
6376 CM_Query_Arbitrator_Free_Data(
6377 _Out_writes_bytes_(DataLen
) PVOID pData
,
6379 _In_ DEVINST dnDevInst
,
6380 _In_ RESOURCEID ResourceID
,
6383 TRACE("CM_Query_Arbitrator_Free_Data(%p %lu %lx %lu 0x%08lx)\n",
6384 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
);
6386 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
6387 ResourceID
, ulFlags
, NULL
);
6391 /***********************************************************************
6392 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
6396 CM_Query_Arbitrator_Free_Data_Ex(
6397 _Out_writes_bytes_(DataLen
) PVOID pData
,
6399 _In_ DEVINST dnDevInst
,
6400 _In_ RESOURCEID ResourceID
,
6402 _In_opt_ HMACHINE hMachine
)
6404 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6405 HSTRING_TABLE StringTable
= NULL
;
6409 TRACE("CM_Query_Arbitrator_Free_Data_Ex(%p %lu %lx %lu 0x%08lx %p)\n",
6410 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
, hMachine
);
6412 if (pData
== NULL
|| DataLen
== 0)
6413 return CR_INVALID_POINTER
;
6416 return CR_INVALID_DEVINST
;
6418 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6419 return CR_INVALID_FLAG
;
6421 if (hMachine
!= NULL
)
6423 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6424 if (BindingHandle
== NULL
)
6427 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6428 if (StringTable
== 0)
6433 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6437 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6438 if (lpDevInst
== NULL
)
6439 return CR_INVALID_DEVNODE
;
6443 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
6450 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6452 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6460 /***********************************************************************
6461 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
6465 CM_Query_Arbitrator_Free_Size(
6466 _Out_ PULONG pulSize
,
6467 _In_ DEVINST dnDevInst
,
6468 _In_ RESOURCEID ResourceID
,
6471 TRACE("CM_Query_Arbitrator_Free_Size(%p %lu %lx 0x%08lx)\n",
6472 pulSize
, dnDevInst
,ResourceID
, ulFlags
);
6474 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
6479 /***********************************************************************
6480 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
6484 CM_Query_Arbitrator_Free_Size_Ex(
6485 _Out_ PULONG pulSize
,
6486 _In_ DEVINST dnDevInst
,
6487 _In_ RESOURCEID ResourceID
,
6489 _In_opt_ HMACHINE hMachine
)
6491 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6492 HSTRING_TABLE StringTable
= NULL
;
6496 TRACE("CM_Query_Arbitrator_Free_Size_Ex(%p %lu %lx 0x%08lx %p)\n",
6497 pulSize
, dnDevInst
,ResourceID
, ulFlags
, hMachine
);
6499 if (pulSize
== NULL
)
6500 return CR_INVALID_POINTER
;
6503 return CR_INVALID_DEVINST
;
6505 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6506 return CR_INVALID_FLAG
;
6508 if (hMachine
!= NULL
)
6510 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6511 if (BindingHandle
== NULL
)
6514 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6515 if (StringTable
== 0)
6520 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6524 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6525 if (lpDevInst
== NULL
)
6526 return CR_INVALID_DEVNODE
;
6530 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
6536 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6538 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6546 /***********************************************************************
6547 * CM_Query_Remove_SubTree [SETUPAPI.@]
6549 * This function is obsolete in Windows XP and above.
6553 CM_Query_Remove_SubTree(
6554 _In_ DEVINST dnAncestor
,
6557 TRACE("CM_Query_Remove_SubTree(%lx %lx)\n",
6558 dnAncestor
, ulFlags
);
6560 return CR_CALL_NOT_IMPLEMENTED
;
6564 /***********************************************************************
6565 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
6567 * This function is obsolete in Windows XP and above.
6571 CM_Query_Remove_SubTree_Ex(
6572 _In_ DEVINST dnAncestor
,
6574 _In_opt_ HMACHINE hMachine
)
6576 TRACE("CM_Query_Remove_SubTree_Ex(%lx %lx %p)\n",
6577 dnAncestor
, ulFlags
, hMachine
);
6579 return CR_CALL_NOT_IMPLEMENTED
;
6583 /***********************************************************************
6584 * CM_Query_Resource_Conflict_List [SETUPAPI.@]
6588 CM_Query_Resource_Conflict_List(
6589 _Out_ PCONFLICT_LIST pclConflictList
,
6590 _In_ DEVINST dnDevInst
,
6591 _In_ RESOURCEID ResourceID
,
6592 _In_ PCVOID ResourceData
,
6593 _In_ ULONG ResourceLen
,
6595 _In_opt_ HMACHINE hMachine
)
6597 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6598 HSTRING_TABLE StringTable
= NULL
;
6599 PPNP_CONFLICT_LIST pConflictBuffer
= NULL
;
6600 PCONFLICT_DATA pConflictData
= NULL
;
6601 ULONG ulBufferLength
;
6605 FIXME("CM_Query_Resource_Conflict_List(%p %lx %lu %p %lu %lx %p)\n",
6606 pclConflictList
, dnDevInst
, ResourceID
, ResourceData
,
6607 ResourceLen
, ulFlags
, hMachine
);
6610 return CR_INVALID_DEVNODE
;
6612 if (ulFlags
& ~CM_RESDES_WIDTH_BITS
)
6613 return CR_INVALID_FLAG
;
6615 if (pclConflictList
== NULL
||
6616 ResourceData
== NULL
||
6618 return CR_INVALID_POINTER
;
6620 if (ResourceID
== 0)
6621 return CR_INVALID_RESOURCEID
;
6623 *pclConflictList
= 0;
6625 if (hMachine
!= NULL
)
6627 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6628 if (BindingHandle
== NULL
)
6631 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6632 if (StringTable
== 0)
6637 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6641 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6642 if (lpDevInst
== NULL
)
6643 return CR_INVALID_DEVNODE
;
6645 pConflictData
= MyMalloc(sizeof(PCONFLICT_DATA
));
6646 if (pConflictData
== NULL
)
6648 ret
= CR_OUT_OF_MEMORY
;
6652 ulBufferLength
= sizeof(PNP_CONFLICT_LIST
) +
6653 sizeof(PNP_CONFLICT_STRINGS
) +
6654 (sizeof(wchar_t) * 200);
6655 pConflictBuffer
= MyMalloc(ulBufferLength
);
6656 if (pConflictBuffer
== NULL
)
6658 ret
= CR_OUT_OF_MEMORY
;
6664 ret
= PNP_QueryResConfList(BindingHandle
,
6667 (PBYTE
)ResourceData
,
6669 (PBYTE
)pConflictBuffer
,
6673 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6675 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6679 if (ret
!= CR_SUCCESS
)
6682 pConflictData
->ulMagic
= CONFLICT_MAGIC
;
6683 pConflictData
->pConflictList
= pConflictBuffer
;
6685 *pclConflictList
= (CONFLICT_LIST
)pConflictData
;
6688 if (ret
!= CR_SUCCESS
)
6690 if (pConflictBuffer
!= NULL
)
6691 MyFree(pConflictBuffer
);
6693 if (pConflictData
!= NULL
)
6694 MyFree(pConflictData
);
6701 /***********************************************************************
6702 * CM_Reenumerate_DevNode [SETUPAPI.@]
6706 CM_Reenumerate_DevNode(
6707 _In_ DEVINST dnDevInst
,
6710 TRACE("CM_Reenumerate_DevNode(%lx %lx)\n",
6711 dnDevInst
, ulFlags
);
6713 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
6717 /***********************************************************************
6718 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
6721 CM_Reenumerate_DevNode_Ex(
6722 _In_ DEVINST dnDevInst
,
6724 _In_opt_ HMACHINE hMachine
)
6726 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6727 HSTRING_TABLE StringTable
= NULL
;
6731 FIXME("CM_Reenumerate_DevNode_Ex(%lx %lx %p)\n",
6732 dnDevInst
, ulFlags
, hMachine
);
6735 return CR_INVALID_DEVNODE
;
6737 if (ulFlags
& ~CM_REENUMERATE_BITS
)
6738 return CR_INVALID_FLAG
;
6740 if (hMachine
!= NULL
)
6742 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6743 if (BindingHandle
== NULL
)
6746 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6747 if (StringTable
== 0)
6752 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6756 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6757 if (lpDevInst
== NULL
)
6758 return CR_INVALID_DEVNODE
;
6762 ret
= PNP_DeviceInstanceAction(BindingHandle
,
6763 PNP_DEVINST_REENUMERATE
,
6768 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6770 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6778 /***********************************************************************
6779 * CM_Register_Device_Driver [SETUPAPI.@]
6783 CM_Register_Device_Driver(
6784 _In_ DEVINST dnDevInst
,
6787 TRACE("CM_Register_Device_Driver(%lx 0x%08lx)\n",
6788 dnDevInst
, ulFlags
);
6790 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
6794 /***********************************************************************
6795 * CM_Register_Device_Driver_Ex [SETUPAPI.@]
6799 CM_Register_Device_Driver_Ex(
6800 _In_ DEVINST dnDevInst
,
6802 _In_opt_ HMACHINE hMachine
)
6804 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6805 HSTRING_TABLE StringTable
= NULL
;
6809 TRACE("CM_Register_Device_Driver_Ex(%lx 0x%08lx %p)\n",
6810 dnDevInst
, ulFlags
, hMachine
);
6813 return CR_INVALID_DEVNODE
;
6815 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
6816 return CR_INVALID_FLAG
;
6818 if (hMachine
!= NULL
)
6820 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6821 if (BindingHandle
== NULL
)
6824 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6825 if (StringTable
== 0)
6830 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6834 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6835 if (lpDevInst
== NULL
)
6836 return CR_INVALID_DEVNODE
;
6840 ret
= PNP_RegisterDriver(BindingHandle
,
6844 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6846 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6854 /***********************************************************************
6855 * CM_Register_Device_InterfaceA [SETUPAPI.@]
6859 CM_Register_Device_InterfaceA(
6860 _In_ DEVINST dnDevInst
,
6861 _In_ LPGUID InterfaceClassGuid
,
6862 _In_opt_ LPCSTR pszReference
,
6863 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
6864 _Inout_ PULONG pulLength
,
6867 TRACE("CM_Register_Device_InterfaceA(%lx %s %s %p %p %lx)\n",
6868 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
6869 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
6871 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
6872 pszReference
, pszDeviceInterface
,
6873 pulLength
, ulFlags
, NULL
);
6877 /***********************************************************************
6878 * CM_Register_Device_InterfaceW [SETUPAPI.@]
6882 CM_Register_Device_InterfaceW(
6883 _In_ DEVINST dnDevInst
,
6884 _In_ LPGUID InterfaceClassGuid
,
6885 _In_opt_ LPCWSTR pszReference
,
6886 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
6887 _Inout_ PULONG pulLength
,
6890 TRACE("CM_Register_Device_InterfaceW(%lx %s %s %p %p %lx)\n",
6891 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
6892 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
6894 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
6895 pszReference
, pszDeviceInterface
,
6896 pulLength
, ulFlags
, NULL
);
6900 /***********************************************************************
6901 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
6905 CM_Register_Device_Interface_ExA(
6906 _In_ DEVINST dnDevInst
,
6907 _In_ LPGUID InterfaceClassGuid
,
6908 _In_opt_ LPCSTR pszReference
,
6909 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
6910 _Inout_ PULONG pulLength
,
6912 _In_opt_ HMACHINE hMachine
)
6914 LPWSTR pszReferenceW
= NULL
;
6915 LPWSTR pszDeviceInterfaceW
= NULL
;
6919 TRACE("CM_Register_Device_Interface_ExA(%lx %s %s %p %p %lx %p)\n",
6920 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_a(pszReference
),
6921 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
6923 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
6924 return CR_INVALID_POINTER
;
6926 if (pszReference
!= NULL
)
6928 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
6929 return CR_INVALID_DATA
;
6932 ulLength
= *pulLength
;
6934 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
6935 if (pszDeviceInterfaceW
== NULL
)
6937 ret
= CR_OUT_OF_MEMORY
;
6941 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
6944 pszDeviceInterfaceW
,
6948 if (ret
== CR_SUCCESS
)
6950 if (WideCharToMultiByte(CP_ACP
,
6952 pszDeviceInterfaceW
,
6961 *pulLength
= ulLength
;
6964 if (pszDeviceInterfaceW
!= NULL
)
6965 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
6967 if (pszReferenceW
!= NULL
)
6968 MyFree(pszReferenceW
);
6974 /***********************************************************************
6975 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
6979 CM_Register_Device_Interface_ExW(
6980 _In_ DEVINST dnDevInst
,
6981 _In_ LPGUID InterfaceClassGuid
,
6982 _In_opt_ LPCWSTR pszReference
,
6983 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
6984 _Inout_ PULONG pulLength
,
6986 _In_opt_ HMACHINE hMachine
)
6988 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6989 HSTRING_TABLE StringTable
= NULL
;
6991 ULONG ulTransferLength
;
6994 TRACE("CM_Register_Device_Interface_ExW(%lx %s %s %p %p %lx %p)\n",
6995 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_w(pszReference
),
6996 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
6999 return CR_INVALID_DEVNODE
;
7001 if (InterfaceClassGuid
== NULL
||
7002 pszDeviceInterface
== NULL
||
7004 return CR_INVALID_POINTER
;
7007 return CR_INVALID_FLAG
;
7009 if (hMachine
!= NULL
)
7011 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7012 if (BindingHandle
== NULL
)
7015 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7016 if (StringTable
== 0)
7021 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7025 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7026 if (lpDevInst
== NULL
)
7027 return CR_INVALID_DEVNODE
;
7029 ulTransferLength
= *pulLength
;
7033 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
7036 (LPWSTR
)pszReference
,
7042 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7044 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7052 /***********************************************************************
7053 * CM_Remove_SubTree [SETUPAPI.@]
7055 * This function is obsolete in Windows XP and above.
7060 _In_ DEVINST dnAncestor
,
7063 TRACE("CM_Remove_SubTree(%lx %lx)\n",
7064 dnAncestor
, ulFlags
);
7066 return CR_CALL_NOT_IMPLEMENTED
;
7070 /***********************************************************************
7071 * CM_Remove_SubTree_Ex [SETUPAPI.@]
7073 * This function is obsolete in Windows XP and above.
7077 CM_Remove_SubTree_Ex(
7078 _In_ DEVINST dnAncestor
,
7080 _In_opt_ HMACHINE hMachine
)
7082 TRACE("CM_Remove_SubTree_Ex(%lx %lx %p)\n",
7083 dnAncestor
, ulFlags
, hMachine
);
7085 return CR_CALL_NOT_IMPLEMENTED
;
7089 /***********************************************************************
7090 * CM_Request_Device_EjectA [SETUPAPI.@]
7094 CM_Request_Device_EjectA(
7095 _In_ DEVINST dnDevInst
,
7096 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7097 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7098 _In_ ULONG ulNameLength
,
7101 TRACE("CM_Request_Device_EjectA(%lx %p %s %lu %lx)\n",
7102 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
);
7104 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
7105 ulNameLength
, ulFlags
, NULL
);
7109 /***********************************************************************
7110 * CM_Request_Device_EjectW [SETUPAPI.@]
7114 CM_Request_Device_EjectW(
7115 _In_ DEVINST dnDevInst
,
7116 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7117 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7118 _In_ ULONG ulNameLength
,
7121 TRACE("CM_Request_Device_EjectW(%lx %p %s %lu %lx)\n",
7122 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
7124 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
7125 ulNameLength
, ulFlags
, NULL
);
7129 /***********************************************************************
7130 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
7134 CM_Request_Device_Eject_ExA(
7135 _In_ DEVINST dnDevInst
,
7136 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7137 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7138 _In_ ULONG ulNameLength
,
7140 _In_opt_ HMACHINE hMachine
)
7142 LPWSTR lpLocalVetoName
;
7145 TRACE("CM_Request_Device_Eject_ExA(%lx %p %s %lu %lx %p)\n",
7146 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7148 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7149 return CR_INVALID_POINTER
;
7151 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
7152 if (lpLocalVetoName
== NULL
)
7153 return CR_OUT_OF_MEMORY
;
7155 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
7156 ulNameLength
, ulFlags
, hMachine
);
7157 if (ret
== CR_REMOVE_VETOED
)
7159 if (WideCharToMultiByte(CP_ACP
,
7170 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
7176 /***********************************************************************
7177 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
7181 CM_Request_Device_Eject_ExW(
7182 _In_ DEVINST dnDevInst
,
7183 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7184 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7185 _In_ ULONG ulNameLength
,
7187 _In_opt_ HMACHINE hMachine
)
7189 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7190 HSTRING_TABLE StringTable
= NULL
;
7194 TRACE("CM_Request_Device_Eject_ExW(%lx %p %s %lu %lx %p)\n",
7195 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7198 return CR_INVALID_DEVNODE
;
7201 return CR_INVALID_FLAG
;
7203 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7204 return CR_INVALID_POINTER
;
7206 if (hMachine
!= NULL
)
7208 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7209 if (BindingHandle
== NULL
)
7212 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7213 if (StringTable
== 0)
7218 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7222 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7223 if (lpDevInst
== NULL
)
7224 return CR_INVALID_DEVNODE
;
7228 ret
= PNP_RequestDeviceEject(BindingHandle
,
7235 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7237 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7245 /***********************************************************************
7246 * CM_Request_Eject_PC [SETUPAPI.@]
7250 CM_Request_Eject_PC(VOID
)
7252 TRACE("CM_Request_Eject_PC()\n");
7254 return CM_Request_Eject_PC_Ex(NULL
);
7258 /***********************************************************************
7259 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
7263 CM_Request_Eject_PC_Ex(
7264 _In_opt_ HMACHINE hMachine
)
7266 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7269 TRACE("CM_Request_Eject_PC_Ex(%p)\n", hMachine
);
7271 if (hMachine
!= NULL
)
7273 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7274 if (BindingHandle
== NULL
)
7279 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7285 ret
= PNP_RequestEjectPC(BindingHandle
);
7287 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7289 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7297 /***********************************************************************
7298 * CM_Run_Detection [SETUPAPI.@]
7305 TRACE("CM_Run_Detection(%lx)\n", ulFlags
);
7307 return CM_Run_Detection_Ex(ulFlags
, NULL
);
7311 /***********************************************************************
7312 * CM_Run_Detection_Ex [SETUPAPI.@]
7316 CM_Run_Detection_Ex(
7318 _In_opt_ HMACHINE hMachine
)
7320 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7323 TRACE("CM_Run_Detection_Ex(%lx %p)\n",
7326 if (!pSetupIsUserAdmin())
7327 return CR_ACCESS_DENIED
;
7329 if (ulFlags
& ~CM_DETECT_BITS
)
7330 return CR_INVALID_FLAG
;
7332 if (hMachine
!= NULL
)
7334 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7335 if (BindingHandle
== NULL
)
7340 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7346 ret
= PNP_RunDetection(BindingHandle
,
7349 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7351 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7359 /***********************************************************************
7360 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
7364 CM_Set_Class_Registry_PropertyA(
7365 _In_ LPGUID ClassGuid
,
7366 _In_ ULONG ulProperty
,
7367 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7368 _In_ ULONG ulLength
,
7370 _In_opt_ HMACHINE hMachine
)
7372 FIXME("CM_Set_Class_Registry_PropertyA(%p %lx %p %lu %lx %p)\n",
7373 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7375 return CR_CALL_NOT_IMPLEMENTED
;
7379 /***********************************************************************
7380 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
7384 CM_Set_Class_Registry_PropertyW(
7385 _In_ LPGUID ClassGuid
,
7386 _In_ ULONG ulProperty
,
7387 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7388 _In_ ULONG ulLength
,
7390 _In_opt_ HMACHINE hMachine
)
7392 FIXME("CM_Set_Class_Registry_PropertyW(%p %lx %p %lu %lx %p)\n",
7393 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7395 return CR_CALL_NOT_IMPLEMENTED
;
7399 /***********************************************************************
7400 * CM_Set_DevNode_Problem [SETUPAPI.@]
7404 CM_Set_DevNode_Problem(
7405 _In_ DEVINST dnDevInst
,
7406 _In_ ULONG ulProblem
,
7409 TRACE("CM_Set_DevNode_Problem(%lx %lx %lx)\n",
7410 dnDevInst
, ulProblem
, ulFlags
);
7412 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
7416 /***********************************************************************
7417 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
7421 CM_Set_DevNode_Problem_Ex(
7422 _In_ DEVINST dnDevInst
,
7423 _In_ ULONG ulProblem
,
7425 _In_opt_ HMACHINE hMachine
)
7427 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7428 HSTRING_TABLE StringTable
= NULL
;
7432 TRACE("CM_Set_DevNode_Problem_Ex(%lx %lx %lx %p)\n",
7433 dnDevInst
, ulProblem
, ulFlags
, hMachine
);
7436 return CR_INVALID_DEVNODE
;
7438 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
7439 return CR_INVALID_FLAG
;
7441 if (hMachine
!= NULL
)
7443 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7444 if (BindingHandle
== NULL
)
7447 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7448 if (StringTable
== 0)
7453 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7457 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7458 if (lpDevInst
== NULL
)
7459 return CR_INVALID_DEVNODE
;
7463 ret
= PNP_SetDeviceProblem(BindingHandle
,
7468 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7470 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7478 /***********************************************************************
7479 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
7483 CM_Set_DevNode_Registry_PropertyA(
7484 _In_ DEVINST dnDevInst
,
7485 _In_ ULONG ulProperty
,
7486 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7487 _In_ ULONG ulLength
,
7490 TRACE("CM_Set_DevNode_Registry_PropertyA(%lx %lu %p %lx %lx)\n",
7491 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7493 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
7499 /***********************************************************************
7500 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
7504 CM_Set_DevNode_Registry_PropertyW(
7505 _In_ DEVINST dnDevInst
,
7506 _In_ ULONG ulProperty
,
7507 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7508 _In_ ULONG ulLength
,
7511 TRACE("CM_Set_DevNode_Registry_PropertyW(%lx %lu %p %lx %lx)\n",
7512 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7514 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
7520 /***********************************************************************
7521 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
7525 CM_Set_DevNode_Registry_Property_ExA(
7526 _In_ DEVINST dnDevInst
,
7527 _In_ ULONG ulProperty
,
7528 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7529 _In_ ULONG ulLength
,
7531 _In_opt_ HMACHINE hMachine
)
7533 CONFIGRET ret
= CR_SUCCESS
;
7537 FIXME("CM_Set_DevNode_Registry_Property_ExA(%lx %lu %p %lx %lx %p)\n",
7538 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7540 if (Buffer
== NULL
&& ulLength
!= 0)
7541 return CR_INVALID_POINTER
;
7543 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7544 return CR_INVALID_PROPERTY
;
7548 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7557 /* Get property type */
7558 ulType
= GetRegistryPropertyType(ulProperty
);
7560 /* Allocate buffer if needed */
7561 if (ulType
== REG_SZ
||
7562 ulType
== REG_MULTI_SZ
)
7564 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
7565 if (lpBuffer
== NULL
)
7567 ret
= CR_OUT_OF_MEMORY
;
7571 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
7572 ulLength
, lpBuffer
, ulLength
))
7579 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7582 ulLength
* sizeof(WCHAR
),
7591 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7599 ret
= CR_CALL_NOT_IMPLEMENTED
;
7606 /***********************************************************************
7607 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
7611 CM_Set_DevNode_Registry_Property_ExW(
7612 _In_ DEVINST dnDevInst
,
7613 _In_ ULONG ulProperty
,
7614 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7615 _In_ ULONG ulLength
,
7617 _In_opt_ HMACHINE hMachine
)
7619 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7620 HSTRING_TABLE StringTable
= NULL
;
7625 TRACE("CM_Set_DevNode_Registry_Property_ExW(%lx %lu %p %lx %lx %p)\n",
7626 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7629 return CR_INVALID_DEVNODE
;
7631 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7632 return CR_INVALID_PROPERTY
;
7634 if (Buffer
!= NULL
&& ulLength
== 0)
7635 return CR_INVALID_POINTER
;
7638 return CR_INVALID_FLAG
;
7640 if (hMachine
!= NULL
)
7642 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7643 if (BindingHandle
== NULL
)
7646 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7647 if (StringTable
== 0)
7652 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7656 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7657 if (lpDevInst
== NULL
)
7658 return CR_INVALID_DEVNODE
;
7660 /* Get property type */
7661 ulType
= GetRegistryPropertyType(ulProperty
);
7665 ret
= PNP_SetDeviceRegProp(BindingHandle
,
7673 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7675 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7683 /***********************************************************************
7684 * CM_Set_HW_Prof [SETUPAPI.@]
7689 _In_ ULONG ulHardwareProfile
,
7692 TRACE("CM_Set_HW_Prof(%lu %lx)\n",
7693 ulHardwareProfile
, ulFlags
);
7695 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
7699 /***********************************************************************
7700 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
7705 _In_ ULONG ulHardwareProfile
,
7707 _In_opt_ HMACHINE hMachine
)
7709 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7712 TRACE("CM_Set_HW_Prof_Ex(%lu %lx %p)\n",
7713 ulHardwareProfile
, ulFlags
, hMachine
);
7715 if (!pSetupIsUserAdmin())
7716 return CR_ACCESS_DENIED
;
7719 return CR_INVALID_FLAG
;
7721 if (hMachine
!= NULL
)
7723 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7724 if (BindingHandle
== NULL
)
7729 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7735 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
7737 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7739 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7747 /***********************************************************************
7748 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
7752 CM_Set_HW_Prof_FlagsA(
7753 _In_ DEVINSTID_A szDevInstName
,
7754 _In_ ULONG ulConfig
,
7758 TRACE("CM_Set_HW_Prof_FlagsA(%s %lu %lu %lx)\n",
7759 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7761 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
7766 /***********************************************************************
7767 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
7771 CM_Set_HW_Prof_FlagsW(
7772 _In_ DEVINSTID_W szDevInstName
,
7773 _In_ ULONG ulConfig
,
7777 TRACE("CM_Set_HW_Prof_FlagsW(%s %lu %lu %lx)\n",
7778 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7780 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
7785 /***********************************************************************
7786 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
7790 CM_Set_HW_Prof_Flags_ExA(
7791 _In_ DEVINSTID_A szDevInstName
,
7792 _In_ ULONG ulConfig
,
7795 _In_opt_ HMACHINE hMachine
)
7797 DEVINSTID_W pszDevIdW
= NULL
;
7798 CONFIGRET ret
= CR_SUCCESS
;
7800 TRACE("CM_Set_HW_Prof_Flags_ExA(%s %lu %lu %lx %p)\n",
7801 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7803 if (szDevInstName
!= NULL
)
7805 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
7806 return CR_INVALID_DEVICE_ID
;
7809 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
7812 if (pszDevIdW
!= NULL
)
7819 /***********************************************************************
7820 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
7824 CM_Set_HW_Prof_Flags_ExW(
7825 _In_ DEVINSTID_W szDevInstName
,
7826 _In_ ULONG ulConfig
,
7829 _In_opt_ HMACHINE hMachine
)
7831 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7834 FIXME("CM_Set_HW_Prof_Flags_ExW(%s %lu %lu %lx %p)\n",
7835 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7837 if (szDevInstName
== NULL
)
7838 return CR_INVALID_POINTER
;
7840 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
7841 return CR_INVALID_FLAG
;
7843 /* FIXME: Check whether szDevInstName is valid */
7845 if (hMachine
!= NULL
)
7847 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7848 if (BindingHandle
== NULL
)
7853 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7859 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
7860 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
7862 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7864 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7872 /***********************************************************************
7873 * CM_Setup_DevNode [SETUPAPI.@]
7878 _In_ DEVINST dnDevInst
,
7881 TRACE("CM_Setup_DevNode(%lx %lx)\n",
7882 dnDevInst
, ulFlags
);
7884 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
7888 /***********************************************************************
7889 * CM_Setup_DevNode_Ex [SETUPAPI.@]
7893 CM_Setup_DevNode_Ex(
7894 _In_ DEVINST dnDevInst
,
7896 _In_opt_ HMACHINE hMachine
)
7898 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7899 HSTRING_TABLE StringTable
= NULL
;
7903 FIXME("CM_Setup_DevNode_Ex(%lx %lx %p)\n",
7904 dnDevInst
, ulFlags
, hMachine
);
7906 if (!pSetupIsUserAdmin())
7907 return CR_ACCESS_DENIED
;
7910 return CR_INVALID_DEVNODE
;
7912 if (ulFlags
& ~CM_SETUP_BITS
)
7913 return CR_INVALID_FLAG
;
7915 if (hMachine
!= NULL
)
7917 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7918 if (BindingHandle
== NULL
)
7921 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7922 if (StringTable
== 0)
7927 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7931 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7932 if (lpDevInst
== NULL
)
7933 return CR_INVALID_DEVNODE
;
7937 ret
= PNP_DeviceInstanceAction(BindingHandle
,
7943 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7945 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7953 /***********************************************************************
7954 * CM_Test_Range_Available [SETUPAPI.@]
7958 CM_Test_Range_Available(
7959 _In_ DWORDLONG ullStartValue
,
7960 _In_ DWORDLONG ullEndValue
,
7961 _In_ RANGE_LIST rlh
,
7964 FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
7965 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
7966 return CR_CALL_NOT_IMPLEMENTED
;
7970 /***********************************************************************
7971 * CM_Uninstall_DevNode [SETUPAPI.@]
7975 CM_Uninstall_DevNode(
7976 _In_ DEVINST dnPhantom
,
7979 TRACE("CM_Uninstall_DevNode(%lx %lx)\n",
7980 dnPhantom
, ulFlags
);
7982 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
7986 /***********************************************************************
7987 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
7991 CM_Uninstall_DevNode_Ex(
7992 _In_ DEVINST dnPhantom
,
7994 _In_opt_ HMACHINE hMachine
)
7996 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7997 HSTRING_TABLE StringTable
= NULL
;
8001 TRACE("CM_Uninstall_DevNode_Ex(%lx %lx %p)\n",
8002 dnPhantom
, ulFlags
, hMachine
);
8005 return CR_INVALID_DEVNODE
;
8008 return CR_INVALID_FLAG
;
8010 if (hMachine
!= NULL
)
8012 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8013 if (BindingHandle
== NULL
)
8016 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
8017 if (StringTable
== 0)
8022 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
8026 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
8027 if (lpDevInst
== NULL
)
8028 return CR_INVALID_DEVNODE
;
8032 ret
= PNP_UninstallDevInst(BindingHandle
,
8036 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8038 ret
= RpcStatusToCmStatus(RpcExceptionCode());
8046 /***********************************************************************
8047 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
8051 CM_Unregister_Device_InterfaceA(
8052 _In_ LPCSTR pszDeviceInterface
,
8055 TRACE("CM_Unregister_Device_InterfaceA(%s %lx)\n",
8056 debugstr_a(pszDeviceInterface
), ulFlags
);
8058 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
8063 /***********************************************************************
8064 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
8068 CM_Unregister_Device_InterfaceW(
8069 _In_ LPCWSTR pszDeviceInterface
,
8072 TRACE("CM_Unregister_Device_InterfaceW(%s %lx)\n",
8073 debugstr_w(pszDeviceInterface
), ulFlags
);
8075 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
8080 /***********************************************************************
8081 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
8085 CM_Unregister_Device_Interface_ExA(
8086 _In_ LPCSTR pszDeviceInterface
,
8088 _In_opt_ HMACHINE hMachine
)
8090 LPWSTR pszDeviceInterfaceW
= NULL
;
8093 TRACE("CM_Unregister_Device_Interface_ExA(%s %lx %p)\n",
8094 debugstr_a(pszDeviceInterface
), ulFlags
, hMachine
);
8096 if (pszDeviceInterface
== NULL
)
8097 return CR_INVALID_POINTER
;
8099 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
8100 return CR_INVALID_DATA
;
8102 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
8105 if (pszDeviceInterfaceW
!= NULL
)
8106 MyFree(pszDeviceInterfaceW
);
8112 /***********************************************************************
8113 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
8117 CM_Unregister_Device_Interface_ExW(
8118 _In_ LPCWSTR pszDeviceInterface
,
8120 _In_opt_ HMACHINE hMachine
)
8122 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8125 TRACE("CM_Unregister_Device_Interface_ExW(%s %lx %p)\n",
8126 debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
8128 if (pszDeviceInterface
== NULL
)
8129 return CR_INVALID_POINTER
;
8132 return CR_INVALID_FLAG
;
8134 if (hMachine
!= NULL
)
8136 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8137 if (BindingHandle
== NULL
)
8142 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
8148 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
8149 (LPWSTR
)pszDeviceInterface
,
8152 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8154 ret
= RpcStatusToCmStatus(RpcExceptionCode());