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_Sibling [SETUPAPI.@]
5166 _Out_ PDEVINST pdnDevInst
,
5167 _In_ DEVINST dnDevInst
,
5170 TRACE("CM_Get_Sibling(%p %p %lx)\n",
5171 pdnDevInst
, dnDevInst
, ulFlags
);
5173 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5177 /***********************************************************************
5178 * CM_Get_Sibling_Ex [SETUPAPI.@]
5183 _Out_ PDEVINST pdnDevInst
,
5184 _In_ DEVINST dnDevInst
,
5186 _In_opt_ HMACHINE hMachine
)
5188 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5189 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5190 HSTRING_TABLE StringTable
= NULL
;
5192 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5195 TRACE("CM_Get_Sibling_Ex(%p %lx %lx %p)\n",
5196 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5198 if (pdnDevInst
== NULL
)
5199 return CR_INVALID_POINTER
;
5202 return CR_INVALID_DEVINST
;
5205 return CR_INVALID_FLAG
;
5209 if (hMachine
!= NULL
)
5211 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5212 if (BindingHandle
== NULL
)
5215 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5216 if (StringTable
== 0)
5221 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5225 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5226 if (lpDevInst
== NULL
)
5227 return CR_INVALID_DEVNODE
;
5231 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5232 PNP_GET_SIBLING_DEVICE_INSTANCE
,
5238 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5240 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5244 if (ret
!= CR_SUCCESS
)
5247 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5249 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5253 *pdnDevInst
= dwIndex
;
5259 /***********************************************************************
5260 * CM_Get_Version [SETUPAPI.@]
5264 CM_Get_Version(VOID
)
5266 TRACE("CM_Get_Version()\n");
5268 return CM_Get_Version_Ex(NULL
);
5272 /***********************************************************************
5273 * CM_Get_Version_Ex [SETUPAPI.@]
5278 _In_opt_ HMACHINE hMachine
)
5280 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5284 TRACE("CM_Get_Version_Ex(%p)\n", hMachine
);
5286 if (hMachine
!= NULL
)
5288 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5289 if (BindingHandle
== NULL
)
5294 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5300 ret
= PNP_GetVersion(BindingHandle
, &Version
);
5302 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5304 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5308 if (ret
!= CR_SUCCESS
)
5315 /***********************************************************************
5316 * CM_Intersect_Range_List [SETUPAPI.@]
5320 CM_Intersect_Range_List(
5321 _In_ RANGE_LIST rlhOld1
,
5322 _In_ RANGE_LIST rlhOld2
,
5323 _In_ RANGE_LIST rlhNew
,
5326 FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
5327 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5329 return CR_CALL_NOT_IMPLEMENTED
;
5333 /***********************************************************************
5334 * CM_Invert_Range_List [SETUPAPI.@]
5338 CM_Invert_Range_List(
5339 _In_ RANGE_LIST rlhOld
,
5340 _In_ RANGE_LIST rlhNew
,
5341 _In_ DWORDLONG ullMaxValue
,
5344 FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
5345 rlhOld
, rlhNew
, ullMaxValue
, ulFlags
);
5347 return CR_CALL_NOT_IMPLEMENTED
;
5351 /***********************************************************************
5352 * CM_Is_Dock_Station_Present [SETUPAPI.@]
5356 CM_Is_Dock_Station_Present(
5357 _Out_ PBOOL pbPresent
)
5359 TRACE("CM_Is_Dock_Station_Present(%p)\n",
5362 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
5366 /***********************************************************************
5367 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
5371 CM_Is_Dock_Station_Present_Ex(
5372 _Out_ PBOOL pbPresent
,
5373 _In_opt_ HMACHINE hMachine
)
5375 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5378 TRACE("CM_Is_Dock_Station_Present_Ex(%p %p)\n",
5379 pbPresent
, hMachine
);
5381 if (pbPresent
== NULL
)
5382 return CR_INVALID_POINTER
;
5386 if (hMachine
!= NULL
)
5388 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5389 if (BindingHandle
== NULL
)
5394 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5400 ret
= PNP_IsDockStationPresent(BindingHandle
,
5403 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5405 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5413 /***********************************************************************
5414 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5418 CM_Is_Version_Available(
5421 TRACE("CM_Is_Version_Available(%hu)\n",
5424 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
5428 /***********************************************************************
5429 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5433 CM_Is_Version_Available_Ex(
5435 _In_opt_ HMACHINE hMachine
)
5437 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5438 WORD wServerVersion
;
5441 TRACE("CM_Is_Version_Available_Ex(%hu %p)\n",
5442 wVersion
, hMachine
);
5444 if (wVersion
<= 0x400)
5447 if (hMachine
!= NULL
)
5449 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5450 if (BindingHandle
== NULL
)
5455 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5461 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
5463 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5465 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5469 if (ret
!= CR_SUCCESS
)
5472 return (wServerVersion
>= wVersion
);
5476 /***********************************************************************
5477 * CM_Locate_DevNodeA [SETUPAPI.@]
5482 _Out_ PDEVINST pdnDevInst
,
5483 _In_opt_ DEVINSTID_A pDeviceID
,
5486 TRACE("CM_Locate_DevNodeA(%p %s %lx)\n",
5487 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
);
5489 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5493 /***********************************************************************
5494 * CM_Locate_DevNodeW [SETUPAPI.@]
5499 _Out_ PDEVINST pdnDevInst
,
5500 _In_opt_ DEVINSTID_W pDeviceID
,
5503 TRACE("CM_Locate_DevNodeW(%p %s %lx)\n",
5504 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
5506 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5510 /***********************************************************************
5511 * CM_Locate_DevNode_ExA [SETUPAPI.@]
5515 CM_Locate_DevNode_ExA(
5516 _Out_ PDEVINST pdnDevInst
,
5517 _In_opt_ DEVINSTID_A pDeviceID
,
5519 _In_opt_ HMACHINE hMachine
)
5521 DEVINSTID_W pDevIdW
= NULL
;
5522 CONFIGRET ret
= CR_SUCCESS
;
5524 TRACE("CM_Locate_DevNode_ExA(%p %s %lx %p)\n",
5525 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
5527 if (pDeviceID
!= NULL
)
5529 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
5530 return CR_INVALID_DEVICE_ID
;
5533 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
5535 if (pDevIdW
!= NULL
)
5542 /***********************************************************************
5543 * CM_Locate_DevNode_ExW [SETUPAPI.@]
5547 CM_Locate_DevNode_ExW(
5548 _Out_ PDEVINST pdnDevInst
,
5549 _In_opt_ DEVINSTID_W pDeviceID
,
5551 _In_opt_ HMACHINE hMachine
)
5553 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
5554 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5555 HSTRING_TABLE StringTable
= NULL
;
5556 CONFIGRET ret
= CR_SUCCESS
;
5558 TRACE("CM_Locate_DevNode_ExW(%p %s %lx %p)\n",
5559 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
5561 if (pdnDevInst
== NULL
)
5562 return CR_INVALID_POINTER
;
5564 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
5565 return CR_INVALID_FLAG
;
5567 if (hMachine
!= NULL
)
5569 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5570 if (BindingHandle
== NULL
)
5573 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5574 if (StringTable
== 0)
5579 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5583 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
5585 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
5591 /* Get the root device ID */
5592 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
5596 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5598 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5602 if (ret
!= CR_SUCCESS
)
5605 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
5609 /* Validate the device ID */
5610 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
5614 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5616 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5620 if (ret
== CR_SUCCESS
)
5622 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
5623 if (*pdnDevInst
== -1)
5631 /***********************************************************************
5632 * CM_Merge_Range_List [SETUPAPI.@]
5636 CM_Merge_Range_List(
5637 _In_ RANGE_LIST rlhOld1
,
5638 _In_ RANGE_LIST rlhOld2
,
5639 _In_ RANGE_LIST rlhNew
,
5642 FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
5643 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5645 return CR_CALL_NOT_IMPLEMENTED
;
5649 /***********************************************************************
5650 * CM_Modify_Res_Des [SETUPAPI.@]
5655 _Out_ PRES_DES prdResDes
,
5656 _In_ RES_DES rdResDes
,
5657 _In_ RESOURCEID ResourceID
,
5658 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5659 _In_ ULONG ResourceLen
,
5662 TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
5663 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5664 ResourceLen
, ulFlags
);
5666 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5667 ResourceLen
, ulFlags
, NULL
);
5671 /***********************************************************************
5672 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
5676 CM_Modify_Res_Des_Ex(
5677 _Out_ PRES_DES prdResDes
,
5678 _In_ RES_DES rdResDes
,
5679 _In_ RESOURCEID ResourceID
,
5680 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5681 _In_ ULONG ResourceLen
,
5683 _In_opt_ HMACHINE hMachine
)
5685 FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %p)\n",
5686 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5687 ResourceLen
, ulFlags
, hMachine
);
5689 return CR_CALL_NOT_IMPLEMENTED
;
5693 /***********************************************************************
5694 * CM_Move_DevNode [SETUPAPI.@]
5699 _In_ DEVINST dnFromDevInst
,
5700 _In_ DEVINST dnToDevInst
,
5703 TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
5704 dnFromDevInst
, dnToDevInst
, ulFlags
);
5706 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
5710 /***********************************************************************
5711 * CM_Move_DevNode_Ex [SETUPAPI.@]
5716 _In_ DEVINST dnFromDevInst
,
5717 _In_ DEVINST dnToDevInst
,
5719 _In_opt_ HMACHINE hMachine
)
5721 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5722 HSTRING_TABLE StringTable
= NULL
;
5723 LPWSTR lpFromDevInst
;
5727 FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %p)\n",
5728 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
5730 if (!pSetupIsUserAdmin())
5731 return CR_ACCESS_DENIED
;
5733 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
5734 return CR_INVALID_DEVNODE
;
5737 return CR_INVALID_FLAG
;
5739 if (hMachine
!= NULL
)
5741 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5742 if (BindingHandle
== NULL
)
5745 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5746 if (StringTable
== 0)
5751 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5755 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
5756 if (lpFromDevInst
== NULL
)
5757 return CR_INVALID_DEVNODE
;
5759 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
5760 if (lpToDevInst
== NULL
)
5761 return CR_INVALID_DEVNODE
;
5765 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5771 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5773 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5781 /***********************************************************************
5782 * CM_Next_Range [SETUPAPI.@]
5787 _Inout_ PRANGE_ELEMENT preElement
,
5788 _Out_ PDWORDLONG pullStart
,
5789 _Out_ PDWORDLONG pullEnd
,
5792 FIXME("CM_Next_Range(%p %p %p %lx)\n",
5793 preElement
, pullStart
, pullEnd
, ulFlags
);
5795 return CR_CALL_NOT_IMPLEMENTED
;
5799 /***********************************************************************
5800 * CM_Open_Class_KeyA [SETUPAPI.@]
5805 _In_opt_ LPGUID pClassGuid
,
5806 _In_opt_ LPCSTR pszClassName
,
5807 _In_ REGSAM samDesired
,
5808 _In_ REGDISPOSITION Disposition
,
5809 _Out_ PHKEY phkClass
,
5812 TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
5813 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
5814 samDesired
, Disposition
, phkClass
, ulFlags
);
5816 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
5817 Disposition
, phkClass
, ulFlags
, NULL
);
5821 /***********************************************************************
5822 * CM_Open_Class_KeyW [SETUPAPI.@]
5827 _In_opt_ LPGUID pClassGuid
,
5828 _In_opt_ LPCWSTR pszClassName
,
5829 _In_ REGSAM samDesired
,
5830 _In_ REGDISPOSITION Disposition
,
5831 _Out_ PHKEY phkClass
,
5834 TRACE("CM_Open_Class_KeyW%p %s %lx %lx %p %lx)\n",
5835 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
5836 samDesired
, Disposition
, phkClass
, ulFlags
);
5838 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
5839 Disposition
, phkClass
, ulFlags
, NULL
);
5843 /***********************************************************************
5844 * CM_Open_Class_Key_ExA [SETUPAPI.@]
5848 CM_Open_Class_Key_ExA(
5849 _In_opt_ LPGUID pClassGuid
,
5850 _In_opt_ LPCSTR pszClassName
,
5851 _In_ REGSAM samDesired
,
5852 _In_ REGDISPOSITION Disposition
,
5853 _Out_ PHKEY phkClass
,
5855 _In_opt_ HMACHINE hMachine
)
5857 LPWSTR pszClassNameW
= NULL
;
5860 TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %p)\n",
5861 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
5862 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
5864 if (pszClassName
!= NULL
)
5866 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
5867 return CR_INVALID_DATA
;
5870 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
5871 Disposition
, phkClass
, ulFlags
, hMachine
);
5873 if (pszClassNameW
!= NULL
)
5874 MyFree(pszClassNameW
);
5880 /***********************************************************************
5881 * CM_Open_Class_Key_ExW [SETUPAPI.@]
5885 CM_Open_Class_Key_ExW(
5886 _In_opt_ LPGUID pClassGuid
,
5887 _In_opt_ LPCWSTR pszClassName
,
5888 _In_ REGSAM samDesired
,
5889 _In_ REGDISPOSITION Disposition
,
5890 _Out_ PHKEY phkClass
,
5892 _In_opt_ HMACHINE hMachine
)
5894 WCHAR szKeyName
[MAX_PATH
];
5895 LPWSTR lpGuidString
;
5896 DWORD dwDisposition
;
5900 TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %p)\n",
5901 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
5902 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
5904 /* Check Disposition and ulFlags */
5905 if ((Disposition
& ~RegDisposition_Bits
) ||
5906 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
5907 return CR_INVALID_FLAG
;
5909 /* Check phkClass */
5910 if (phkClass
== NULL
)
5911 return CR_INVALID_POINTER
;
5915 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
5916 pszClassName
!= NULL
)
5917 return CR_INVALID_DATA
;
5919 if (hMachine
== NULL
)
5921 hKey
= HKEY_LOCAL_MACHINE
;
5925 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
5928 return CR_REGISTRY_ERROR
;
5931 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
5933 lstrcpyW(szKeyName
, DeviceClasses
);
5937 lstrcpyW(szKeyName
, ControlClass
);
5940 if (pClassGuid
!= NULL
)
5942 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
5945 return CR_INVALID_DATA
;
5948 lstrcatW(szKeyName
, Backslash
);
5949 lstrcatW(szKeyName
, lpGuidString
);
5952 if (Disposition
== RegDisposition_OpenAlways
)
5954 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
5955 NULL
, phkClass
, &dwDisposition
);
5959 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
5964 if (pClassGuid
!= NULL
)
5965 RpcStringFreeW(&lpGuidString
);
5967 if (dwError
!= ERROR_SUCCESS
)
5970 return CR_NO_SUCH_REGISTRY_KEY
;
5973 if (pszClassName
!= NULL
)
5975 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
5976 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
5983 /***********************************************************************
5984 * CM_Open_DevNode_Key [SETUPAPI.@]
5988 CM_Open_DevNode_Key(
5989 _In_ DEVINST dnDevNode
,
5990 _In_ REGSAM samDesired
,
5991 _In_ ULONG ulHardwareProfile
,
5992 _In_ REGDISPOSITION Disposition
,
5993 _Out_ PHKEY phkDevice
,
5996 TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
5997 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
5999 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
6000 Disposition
, phkDevice
, ulFlags
, NULL
);
6004 /***********************************************************************
6005 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
6009 CM_Open_DevNode_Key_Ex(
6010 _In_ DEVINST dnDevNode
,
6011 _In_ REGSAM samDesired
,
6012 _In_ ULONG ulHardwareProfile
,
6013 _In_ REGDISPOSITION Disposition
,
6014 _Out_ PHKEY phkDevice
,
6016 _In_opt_ HMACHINE hMachine
)
6018 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6019 HSTRING_TABLE StringTable
= NULL
;
6020 LPWSTR pszDevInst
, pszKeyPath
= NULL
, pszInstancePath
= NULL
;
6022 DWORD dwDisposition
;
6023 HKEY hRootKey
= NULL
;
6024 CONFIGRET ret
= CR_CALL_NOT_IMPLEMENTED
;
6026 TRACE("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %p)\n",
6027 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
6029 if (phkDevice
== NULL
)
6030 return CR_INVALID_POINTER
;
6035 return CR_INVALID_DEVNODE
;
6037 if (ulFlags
& ~CM_REGISTRY_BITS
)
6038 return CR_INVALID_FLAG
;
6040 if (Disposition
& ~RegDisposition_Bits
)
6041 return CR_INVALID_DATA
;
6043 if (hMachine
!= NULL
)
6045 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6046 if (BindingHandle
== NULL
)
6049 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6050 if (StringTable
== 0)
6055 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6059 pszDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevNode
);
6060 if (pszDevInst
== NULL
)
6061 return CR_INVALID_DEVNODE
;
6063 TRACE("pszDevInst: %S\n", pszDevInst
);
6065 pszKeyPath
= MyMalloc(512 * sizeof(WCHAR
));
6066 if (pszKeyPath
== NULL
)
6068 ret
= CR_OUT_OF_MEMORY
;
6072 pszInstancePath
= MyMalloc(512 * sizeof(WCHAR
));
6073 if (pszInstancePath
== NULL
)
6075 ret
= CR_OUT_OF_MEMORY
;
6079 ret
= GetDeviceInstanceKeyPath(BindingHandle
,
6085 if (ret
!= CR_SUCCESS
)
6088 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6089 TRACE("pszInstancePath: %S\n", pszInstancePath
);
6091 wcscat(pszKeyPath
, L
"\\");
6092 wcscat(pszKeyPath
, pszInstancePath
);
6094 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6096 if (hMachine
== NULL
)
6098 hRootKey
= HKEY_LOCAL_MACHINE
;
6102 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6106 ret
= CR_REGISTRY_ERROR
;
6111 if (Disposition
== RegDisposition_OpenAlways
)
6113 lError
= RegCreateKeyExW(hRootKey
,
6125 lError
= RegOpenKeyExW(hRootKey
,
6132 if (lError
!= ERROR_SUCCESS
)
6135 ret
= CR_NO_SUCH_REGISTRY_KEY
;
6139 if ((hRootKey
!= NULL
) && (hRootKey
!= HKEY_LOCAL_MACHINE
))
6140 RegCloseKey(hRootKey
);
6142 if (pszInstancePath
!= NULL
)
6143 MyFree(pszInstancePath
);
6145 if (pszKeyPath
!= NULL
)
6152 /***********************************************************************
6153 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
6157 CM_Query_And_Remove_SubTreeA(
6158 _In_ DEVINST dnAncestor
,
6159 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6160 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6161 _In_ ULONG ulNameLength
,
6164 TRACE("CM_Query_And_Remove_SubTreeA(%lx %p %s %lu %lx)\n",
6165 dnAncestor
, pVetoType
, pszVetoName
, ulNameLength
, ulFlags
);
6167 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
6168 ulNameLength
, ulFlags
, NULL
);
6172 /***********************************************************************
6173 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
6177 CM_Query_And_Remove_SubTreeW(
6178 _In_ DEVINST dnAncestor
,
6179 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6180 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6181 _In_ ULONG ulNameLength
,
6184 TRACE("CM_Query_And_Remove_SubTreeW(%lx %p %s %lu %lx)\n",
6185 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
6187 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
6188 ulNameLength
, ulFlags
, NULL
);
6192 /***********************************************************************
6193 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
6197 CM_Query_And_Remove_SubTree_ExA(
6198 _In_ DEVINST dnAncestor
,
6199 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6200 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6201 _In_ ULONG ulNameLength
,
6203 _In_opt_ HMACHINE hMachine
)
6205 LPWSTR lpLocalVetoName
;
6208 TRACE("CM_Query_And_Remove_SubTree_ExA(%lx %p %s %lu %lx %p)\n",
6209 dnAncestor
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
,
6212 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6213 return CR_INVALID_POINTER
;
6215 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
6216 if (lpLocalVetoName
== NULL
)
6217 return CR_OUT_OF_MEMORY
;
6219 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
6220 ulNameLength
, ulFlags
, hMachine
);
6221 if (ret
== CR_REMOVE_VETOED
)
6223 if (WideCharToMultiByte(CP_ACP
,
6234 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
6240 /***********************************************************************
6241 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
6245 CM_Query_And_Remove_SubTree_ExW(
6246 _In_ DEVINST dnAncestor
,
6247 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6248 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6249 _In_ ULONG ulNameLength
,
6251 _In_opt_ HMACHINE hMachine
)
6253 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6254 HSTRING_TABLE StringTable
= NULL
;
6258 TRACE("CM_Query_And_Remove_SubTree_ExW(%lx %p %s %lu %lx %p)\n",
6259 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
,
6262 if (dnAncestor
== 0)
6263 return CR_INVALID_DEVNODE
;
6265 if (ulFlags
& ~CM_REMOVE_BITS
)
6266 return CR_INVALID_FLAG
;
6268 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6269 return CR_INVALID_POINTER
;
6271 if (hMachine
!= NULL
)
6273 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6274 if (BindingHandle
== NULL
)
6277 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6278 if (StringTable
== 0)
6283 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6287 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
6288 if (lpDevInst
== NULL
)
6289 return CR_INVALID_DEVNODE
;
6293 ret
= PNP_QueryRemove(BindingHandle
,
6300 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6302 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6310 /***********************************************************************
6311 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
6315 CM_Query_Arbitrator_Free_Data(
6316 _Out_writes_bytes_(DataLen
) PVOID pData
,
6318 _In_ DEVINST dnDevInst
,
6319 _In_ RESOURCEID ResourceID
,
6322 TRACE("CM_Query_Arbitrator_Free_Data(%p %lu %lx %lu 0x%08lx)\n",
6323 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
);
6325 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
6326 ResourceID
, ulFlags
, NULL
);
6330 /***********************************************************************
6331 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
6335 CM_Query_Arbitrator_Free_Data_Ex(
6336 _Out_writes_bytes_(DataLen
) PVOID pData
,
6338 _In_ DEVINST dnDevInst
,
6339 _In_ RESOURCEID ResourceID
,
6341 _In_opt_ HMACHINE hMachine
)
6343 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6344 HSTRING_TABLE StringTable
= NULL
;
6348 TRACE("CM_Query_Arbitrator_Free_Data_Ex(%p %lu %lx %lu 0x%08lx %p)\n",
6349 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
, hMachine
);
6351 if (pData
== NULL
|| DataLen
== 0)
6352 return CR_INVALID_POINTER
;
6355 return CR_INVALID_DEVINST
;
6357 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6358 return CR_INVALID_FLAG
;
6360 if (hMachine
!= NULL
)
6362 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6363 if (BindingHandle
== NULL
)
6366 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6367 if (StringTable
== 0)
6372 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6376 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6377 if (lpDevInst
== NULL
)
6378 return CR_INVALID_DEVNODE
;
6382 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
6389 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6391 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6399 /***********************************************************************
6400 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
6404 CM_Query_Arbitrator_Free_Size(
6405 _Out_ PULONG pulSize
,
6406 _In_ DEVINST dnDevInst
,
6407 _In_ RESOURCEID ResourceID
,
6410 TRACE("CM_Query_Arbitrator_Free_Size(%p %lu %lx 0x%08lx)\n",
6411 pulSize
, dnDevInst
,ResourceID
, ulFlags
);
6413 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
6418 /***********************************************************************
6419 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
6423 CM_Query_Arbitrator_Free_Size_Ex(
6424 _Out_ PULONG pulSize
,
6425 _In_ DEVINST dnDevInst
,
6426 _In_ RESOURCEID ResourceID
,
6428 _In_opt_ HMACHINE hMachine
)
6430 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6431 HSTRING_TABLE StringTable
= NULL
;
6435 TRACE("CM_Query_Arbitrator_Free_Size_Ex(%p %lu %lx 0x%08lx %p)\n",
6436 pulSize
, dnDevInst
,ResourceID
, ulFlags
, hMachine
);
6438 if (pulSize
== NULL
)
6439 return CR_INVALID_POINTER
;
6442 return CR_INVALID_DEVINST
;
6444 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6445 return CR_INVALID_FLAG
;
6447 if (hMachine
!= NULL
)
6449 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6450 if (BindingHandle
== NULL
)
6453 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6454 if (StringTable
== 0)
6459 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6463 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6464 if (lpDevInst
== NULL
)
6465 return CR_INVALID_DEVNODE
;
6469 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
6475 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6477 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6485 /***********************************************************************
6486 * CM_Query_Remove_SubTree [SETUPAPI.@]
6488 * This function is obsolete in Windows XP and above.
6492 CM_Query_Remove_SubTree(
6493 _In_ DEVINST dnAncestor
,
6496 TRACE("CM_Query_Remove_SubTree(%lx %lx)\n",
6497 dnAncestor
, ulFlags
);
6499 return CR_CALL_NOT_IMPLEMENTED
;
6503 /***********************************************************************
6504 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
6506 * This function is obsolete in Windows XP and above.
6510 CM_Query_Remove_SubTree_Ex(
6511 _In_ DEVINST dnAncestor
,
6513 _In_opt_ HMACHINE hMachine
)
6515 TRACE("CM_Query_Remove_SubTree_Ex(%lx %lx %p)\n",
6516 dnAncestor
, ulFlags
, hMachine
);
6518 return CR_CALL_NOT_IMPLEMENTED
;
6522 /***********************************************************************
6523 * CM_Query_Resource_Conflict_List [SETUPAPI.@]
6527 CM_Query_Resource_Conflict_List(
6528 _Out_ PCONFLICT_LIST pclConflictList
,
6529 _In_ DEVINST dnDevInst
,
6530 _In_ RESOURCEID ResourceID
,
6531 _In_ PCVOID ResourceData
,
6532 _In_ ULONG ResourceLen
,
6534 _In_opt_ HMACHINE hMachine
)
6536 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6537 HSTRING_TABLE StringTable
= NULL
;
6538 PPNP_CONFLICT_LIST pConflictBuffer
= NULL
;
6539 PCONFLICT_DATA pConflictData
= NULL
;
6540 ULONG ulBufferLength
;
6544 FIXME("CM_Query_Resource_Conflict_List(%p %lx %lu %p %lu %lx %p)\n",
6545 pclConflictList
, dnDevInst
, ResourceID
, ResourceData
,
6546 ResourceLen
, ulFlags
, hMachine
);
6549 return CR_INVALID_DEVNODE
;
6551 if (ulFlags
& ~CM_RESDES_WIDTH_BITS
)
6552 return CR_INVALID_FLAG
;
6554 if (pclConflictList
== NULL
||
6555 ResourceData
== NULL
||
6557 return CR_INVALID_POINTER
;
6559 if (ResourceID
== 0)
6560 return CR_INVALID_RESOURCEID
;
6562 *pclConflictList
= 0;
6564 if (hMachine
!= NULL
)
6566 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6567 if (BindingHandle
== NULL
)
6570 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6571 if (StringTable
== 0)
6576 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6580 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6581 if (lpDevInst
== NULL
)
6582 return CR_INVALID_DEVNODE
;
6584 pConflictData
= MyMalloc(sizeof(PCONFLICT_DATA
));
6585 if (pConflictData
== NULL
)
6587 ret
= CR_OUT_OF_MEMORY
;
6591 ulBufferLength
= sizeof(PNP_CONFLICT_LIST
) +
6592 sizeof(PNP_CONFLICT_STRINGS
) +
6593 (sizeof(wchar_t) * 200);
6594 pConflictBuffer
= MyMalloc(ulBufferLength
);
6595 if (pConflictBuffer
== NULL
)
6597 ret
= CR_OUT_OF_MEMORY
;
6603 ret
= PNP_QueryResConfList(BindingHandle
,
6606 (PBYTE
)ResourceData
,
6608 (PBYTE
)pConflictBuffer
,
6612 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6614 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6618 if (ret
!= CR_SUCCESS
)
6621 pConflictData
->ulMagic
= CONFLICT_MAGIC
;
6622 pConflictData
->pConflictList
= pConflictBuffer
;
6624 *pclConflictList
= (CONFLICT_LIST
)pConflictData
;
6627 if (ret
!= CR_SUCCESS
)
6629 if (pConflictBuffer
!= NULL
)
6630 MyFree(pConflictBuffer
);
6632 if (pConflictData
!= NULL
)
6633 MyFree(pConflictData
);
6640 /***********************************************************************
6641 * CM_Reenumerate_DevNode [SETUPAPI.@]
6645 CM_Reenumerate_DevNode(
6646 _In_ DEVINST dnDevInst
,
6649 TRACE("CM_Reenumerate_DevNode(%lx %lx)\n",
6650 dnDevInst
, ulFlags
);
6652 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
6656 /***********************************************************************
6657 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
6660 CM_Reenumerate_DevNode_Ex(
6661 _In_ DEVINST dnDevInst
,
6663 _In_opt_ HMACHINE hMachine
)
6665 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6666 HSTRING_TABLE StringTable
= NULL
;
6670 FIXME("CM_Reenumerate_DevNode_Ex(%lx %lx %p)\n",
6671 dnDevInst
, ulFlags
, hMachine
);
6674 return CR_INVALID_DEVNODE
;
6676 if (ulFlags
& ~CM_REENUMERATE_BITS
)
6677 return CR_INVALID_FLAG
;
6679 if (hMachine
!= NULL
)
6681 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6682 if (BindingHandle
== NULL
)
6685 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6686 if (StringTable
== 0)
6691 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6695 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6696 if (lpDevInst
== NULL
)
6697 return CR_INVALID_DEVNODE
;
6701 ret
= PNP_DeviceInstanceAction(BindingHandle
,
6702 PNP_DEVINST_REENUMERATE
,
6707 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6709 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6717 /***********************************************************************
6718 * CM_Register_Device_Driver [SETUPAPI.@]
6722 CM_Register_Device_Driver(
6723 _In_ DEVINST dnDevInst
,
6726 TRACE("CM_Register_Device_Driver(%lx 0x%08lx)\n",
6727 dnDevInst
, ulFlags
);
6729 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
6733 /***********************************************************************
6734 * CM_Register_Device_Driver_Ex [SETUPAPI.@]
6738 CM_Register_Device_Driver_Ex(
6739 _In_ DEVINST dnDevInst
,
6741 _In_opt_ HMACHINE hMachine
)
6743 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6744 HSTRING_TABLE StringTable
= NULL
;
6748 TRACE("CM_Register_Device_Driver_Ex(%lx 0x%08lx %p)\n",
6749 dnDevInst
, ulFlags
, hMachine
);
6752 return CR_INVALID_DEVNODE
;
6754 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
6755 return CR_INVALID_FLAG
;
6757 if (hMachine
!= NULL
)
6759 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6760 if (BindingHandle
== NULL
)
6763 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6764 if (StringTable
== 0)
6769 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6773 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6774 if (lpDevInst
== NULL
)
6775 return CR_INVALID_DEVNODE
;
6779 ret
= PNP_RegisterDriver(BindingHandle
,
6783 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6785 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6793 /***********************************************************************
6794 * CM_Register_Device_InterfaceA [SETUPAPI.@]
6798 CM_Register_Device_InterfaceA(
6799 _In_ DEVINST dnDevInst
,
6800 _In_ LPGUID InterfaceClassGuid
,
6801 _In_opt_ LPCSTR pszReference
,
6802 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
6803 _Inout_ PULONG pulLength
,
6806 TRACE("CM_Register_Device_InterfaceA(%lx %s %s %p %p %lx)\n",
6807 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
6808 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
6810 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
6811 pszReference
, pszDeviceInterface
,
6812 pulLength
, ulFlags
, NULL
);
6816 /***********************************************************************
6817 * CM_Register_Device_InterfaceW [SETUPAPI.@]
6821 CM_Register_Device_InterfaceW(
6822 _In_ DEVINST dnDevInst
,
6823 _In_ LPGUID InterfaceClassGuid
,
6824 _In_opt_ LPCWSTR pszReference
,
6825 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
6826 _Inout_ PULONG pulLength
,
6829 TRACE("CM_Register_Device_InterfaceW(%lx %s %s %p %p %lx)\n",
6830 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
6831 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
6833 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
6834 pszReference
, pszDeviceInterface
,
6835 pulLength
, ulFlags
, NULL
);
6839 /***********************************************************************
6840 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
6844 CM_Register_Device_Interface_ExA(
6845 _In_ DEVINST dnDevInst
,
6846 _In_ LPGUID InterfaceClassGuid
,
6847 _In_opt_ LPCSTR pszReference
,
6848 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
6849 _Inout_ PULONG pulLength
,
6851 _In_opt_ HMACHINE hMachine
)
6853 LPWSTR pszReferenceW
= NULL
;
6854 LPWSTR pszDeviceInterfaceW
= NULL
;
6858 TRACE("CM_Register_Device_Interface_ExA(%lx %s %s %p %p %lx %p)\n",
6859 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_a(pszReference
),
6860 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
6862 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
6863 return CR_INVALID_POINTER
;
6865 if (pszReference
!= NULL
)
6867 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
6868 return CR_INVALID_DATA
;
6871 ulLength
= *pulLength
;
6873 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
6874 if (pszDeviceInterfaceW
== NULL
)
6876 ret
= CR_OUT_OF_MEMORY
;
6880 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
6883 pszDeviceInterfaceW
,
6887 if (ret
== CR_SUCCESS
)
6889 if (WideCharToMultiByte(CP_ACP
,
6891 pszDeviceInterfaceW
,
6900 *pulLength
= ulLength
;
6903 if (pszDeviceInterfaceW
!= NULL
)
6904 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
6906 if (pszReferenceW
!= NULL
)
6907 MyFree(pszReferenceW
);
6913 /***********************************************************************
6914 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
6918 CM_Register_Device_Interface_ExW(
6919 _In_ DEVINST dnDevInst
,
6920 _In_ LPGUID InterfaceClassGuid
,
6921 _In_opt_ LPCWSTR pszReference
,
6922 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
6923 _Inout_ PULONG pulLength
,
6925 _In_opt_ HMACHINE hMachine
)
6927 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6928 HSTRING_TABLE StringTable
= NULL
;
6930 ULONG ulTransferLength
;
6933 TRACE("CM_Register_Device_Interface_ExW(%lx %s %s %p %p %lx %p)\n",
6934 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_w(pszReference
),
6935 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
6938 return CR_INVALID_DEVNODE
;
6940 if (InterfaceClassGuid
== NULL
||
6941 pszDeviceInterface
== NULL
||
6943 return CR_INVALID_POINTER
;
6946 return CR_INVALID_FLAG
;
6948 if (hMachine
!= NULL
)
6950 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6951 if (BindingHandle
== NULL
)
6954 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6955 if (StringTable
== 0)
6960 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6964 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6965 if (lpDevInst
== NULL
)
6966 return CR_INVALID_DEVNODE
;
6968 ulTransferLength
= *pulLength
;
6972 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
6975 (LPWSTR
)pszReference
,
6981 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6983 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6991 /***********************************************************************
6992 * CM_Remove_SubTree [SETUPAPI.@]
6994 * This function is obsolete in Windows XP and above.
6999 _In_ DEVINST dnAncestor
,
7002 TRACE("CM_Remove_SubTree(%lx %lx)\n",
7003 dnAncestor
, ulFlags
);
7005 return CR_CALL_NOT_IMPLEMENTED
;
7009 /***********************************************************************
7010 * CM_Remove_SubTree_Ex [SETUPAPI.@]
7012 * This function is obsolete in Windows XP and above.
7016 CM_Remove_SubTree_Ex(
7017 _In_ DEVINST dnAncestor
,
7019 _In_opt_ HMACHINE hMachine
)
7021 TRACE("CM_Remove_SubTree_Ex(%lx %lx %p)\n",
7022 dnAncestor
, ulFlags
, hMachine
);
7024 return CR_CALL_NOT_IMPLEMENTED
;
7028 /***********************************************************************
7029 * CM_Request_Device_EjectA [SETUPAPI.@]
7033 CM_Request_Device_EjectA(
7034 _In_ DEVINST dnDevInst
,
7035 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7036 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7037 _In_ ULONG ulNameLength
,
7040 TRACE("CM_Request_Device_EjectA(%lx %p %s %lu %lx)\n",
7041 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
);
7043 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
7044 ulNameLength
, ulFlags
, NULL
);
7048 /***********************************************************************
7049 * CM_Request_Device_EjectW [SETUPAPI.@]
7053 CM_Request_Device_EjectW(
7054 _In_ DEVINST dnDevInst
,
7055 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7056 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7057 _In_ ULONG ulNameLength
,
7060 TRACE("CM_Request_Device_EjectW(%lx %p %s %lu %lx)\n",
7061 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
7063 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
7064 ulNameLength
, ulFlags
, NULL
);
7068 /***********************************************************************
7069 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
7073 CM_Request_Device_Eject_ExA(
7074 _In_ DEVINST dnDevInst
,
7075 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7076 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7077 _In_ ULONG ulNameLength
,
7079 _In_opt_ HMACHINE hMachine
)
7081 LPWSTR lpLocalVetoName
;
7084 TRACE("CM_Request_Device_Eject_ExA(%lx %p %s %lu %lx %p)\n",
7085 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7087 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7088 return CR_INVALID_POINTER
;
7090 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
7091 if (lpLocalVetoName
== NULL
)
7092 return CR_OUT_OF_MEMORY
;
7094 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
7095 ulNameLength
, ulFlags
, hMachine
);
7096 if (ret
== CR_REMOVE_VETOED
)
7098 if (WideCharToMultiByte(CP_ACP
,
7109 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
7115 /***********************************************************************
7116 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
7120 CM_Request_Device_Eject_ExW(
7121 _In_ DEVINST dnDevInst
,
7122 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7123 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7124 _In_ ULONG ulNameLength
,
7126 _In_opt_ HMACHINE hMachine
)
7128 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7129 HSTRING_TABLE StringTable
= NULL
;
7133 TRACE("CM_Request_Device_Eject_ExW(%lx %p %s %lu %lx %p)\n",
7134 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7137 return CR_INVALID_DEVNODE
;
7140 return CR_INVALID_FLAG
;
7142 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7143 return CR_INVALID_POINTER
;
7145 if (hMachine
!= NULL
)
7147 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7148 if (BindingHandle
== NULL
)
7151 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7152 if (StringTable
== 0)
7157 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7161 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7162 if (lpDevInst
== NULL
)
7163 return CR_INVALID_DEVNODE
;
7167 ret
= PNP_RequestDeviceEject(BindingHandle
,
7174 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7176 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7184 /***********************************************************************
7185 * CM_Request_Eject_PC [SETUPAPI.@]
7189 CM_Request_Eject_PC(VOID
)
7191 TRACE("CM_Request_Eject_PC()\n");
7193 return CM_Request_Eject_PC_Ex(NULL
);
7197 /***********************************************************************
7198 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
7202 CM_Request_Eject_PC_Ex(
7203 _In_opt_ HMACHINE hMachine
)
7205 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7208 TRACE("CM_Request_Eject_PC_Ex(%p)\n", hMachine
);
7210 if (hMachine
!= NULL
)
7212 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7213 if (BindingHandle
== NULL
)
7218 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7224 ret
= PNP_RequestEjectPC(BindingHandle
);
7226 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7228 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7236 /***********************************************************************
7237 * CM_Run_Detection [SETUPAPI.@]
7244 TRACE("CM_Run_Detection(%lx)\n", ulFlags
);
7246 return CM_Run_Detection_Ex(ulFlags
, NULL
);
7250 /***********************************************************************
7251 * CM_Run_Detection_Ex [SETUPAPI.@]
7255 CM_Run_Detection_Ex(
7257 _In_opt_ HMACHINE hMachine
)
7259 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7262 TRACE("CM_Run_Detection_Ex(%lx %p)\n",
7265 if (!pSetupIsUserAdmin())
7266 return CR_ACCESS_DENIED
;
7268 if (ulFlags
& ~CM_DETECT_BITS
)
7269 return CR_INVALID_FLAG
;
7271 if (hMachine
!= NULL
)
7273 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7274 if (BindingHandle
== NULL
)
7279 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7285 ret
= PNP_RunDetection(BindingHandle
,
7288 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7290 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7298 /***********************************************************************
7299 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
7303 CM_Set_Class_Registry_PropertyA(
7304 _In_ LPGUID ClassGuid
,
7305 _In_ ULONG ulProperty
,
7306 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7307 _In_ ULONG ulLength
,
7309 _In_opt_ HMACHINE hMachine
)
7311 FIXME("CM_Set_Class_Registry_PropertyA(%p %lx %p %lu %lx %p)\n",
7312 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7314 return CR_CALL_NOT_IMPLEMENTED
;
7318 /***********************************************************************
7319 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
7323 CM_Set_Class_Registry_PropertyW(
7324 _In_ LPGUID ClassGuid
,
7325 _In_ ULONG ulProperty
,
7326 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7327 _In_ ULONG ulLength
,
7329 _In_opt_ HMACHINE hMachine
)
7331 FIXME("CM_Set_Class_Registry_PropertyW(%p %lx %p %lu %lx %p)\n",
7332 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7334 return CR_CALL_NOT_IMPLEMENTED
;
7338 /***********************************************************************
7339 * CM_Set_DevNode_Problem [SETUPAPI.@]
7343 CM_Set_DevNode_Problem(
7344 _In_ DEVINST dnDevInst
,
7345 _In_ ULONG ulProblem
,
7348 TRACE("CM_Set_DevNode_Problem(%lx %lx %lx)\n",
7349 dnDevInst
, ulProblem
, ulFlags
);
7351 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
7355 /***********************************************************************
7356 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
7360 CM_Set_DevNode_Problem_Ex(
7361 _In_ DEVINST dnDevInst
,
7362 _In_ ULONG ulProblem
,
7364 _In_opt_ HMACHINE hMachine
)
7366 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7367 HSTRING_TABLE StringTable
= NULL
;
7371 TRACE("CM_Set_DevNode_Problem_Ex(%lx %lx %lx %p)\n",
7372 dnDevInst
, ulProblem
, ulFlags
, hMachine
);
7375 return CR_INVALID_DEVNODE
;
7377 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
7378 return CR_INVALID_FLAG
;
7380 if (hMachine
!= NULL
)
7382 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7383 if (BindingHandle
== NULL
)
7386 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7387 if (StringTable
== 0)
7392 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7396 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7397 if (lpDevInst
== NULL
)
7398 return CR_INVALID_DEVNODE
;
7402 ret
= PNP_SetDeviceProblem(BindingHandle
,
7407 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7409 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7417 /***********************************************************************
7418 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
7422 CM_Set_DevNode_Registry_PropertyA(
7423 _In_ DEVINST dnDevInst
,
7424 _In_ ULONG ulProperty
,
7425 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7426 _In_ ULONG ulLength
,
7429 TRACE("CM_Set_DevNode_Registry_PropertyA(%lx %lu %p %lx %lx)\n",
7430 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7432 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
7438 /***********************************************************************
7439 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
7443 CM_Set_DevNode_Registry_PropertyW(
7444 _In_ DEVINST dnDevInst
,
7445 _In_ ULONG ulProperty
,
7446 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7447 _In_ ULONG ulLength
,
7450 TRACE("CM_Set_DevNode_Registry_PropertyW(%lx %lu %p %lx %lx)\n",
7451 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7453 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
7459 /***********************************************************************
7460 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
7464 CM_Set_DevNode_Registry_Property_ExA(
7465 _In_ DEVINST dnDevInst
,
7466 _In_ ULONG ulProperty
,
7467 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7468 _In_ ULONG ulLength
,
7470 _In_opt_ HMACHINE hMachine
)
7472 CONFIGRET ret
= CR_SUCCESS
;
7476 FIXME("CM_Set_DevNode_Registry_Property_ExA(%lx %lu %p %lx %lx %p)\n",
7477 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7479 if (Buffer
== NULL
&& ulLength
!= 0)
7480 return CR_INVALID_POINTER
;
7482 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7483 return CR_INVALID_PROPERTY
;
7487 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7496 /* Get property type */
7497 ulType
= GetRegistryPropertyType(ulProperty
);
7499 /* Allocate buffer if needed */
7500 if (ulType
== REG_SZ
||
7501 ulType
== REG_MULTI_SZ
)
7503 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
7504 if (lpBuffer
== NULL
)
7506 ret
= CR_OUT_OF_MEMORY
;
7510 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
7511 ulLength
, lpBuffer
, ulLength
))
7518 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7521 ulLength
* sizeof(WCHAR
),
7530 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7538 ret
= CR_CALL_NOT_IMPLEMENTED
;
7545 /***********************************************************************
7546 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
7550 CM_Set_DevNode_Registry_Property_ExW(
7551 _In_ DEVINST dnDevInst
,
7552 _In_ ULONG ulProperty
,
7553 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7554 _In_ ULONG ulLength
,
7556 _In_opt_ HMACHINE hMachine
)
7558 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7559 HSTRING_TABLE StringTable
= NULL
;
7564 TRACE("CM_Set_DevNode_Registry_Property_ExW(%lx %lu %p %lx %lx %p)\n",
7565 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7568 return CR_INVALID_DEVNODE
;
7570 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7571 return CR_INVALID_PROPERTY
;
7573 if (Buffer
!= NULL
&& ulLength
== 0)
7574 return CR_INVALID_POINTER
;
7577 return CR_INVALID_FLAG
;
7579 if (hMachine
!= NULL
)
7581 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7582 if (BindingHandle
== NULL
)
7585 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7586 if (StringTable
== 0)
7591 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7595 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7596 if (lpDevInst
== NULL
)
7597 return CR_INVALID_DEVNODE
;
7599 /* Get property type */
7600 ulType
= GetRegistryPropertyType(ulProperty
);
7604 ret
= PNP_SetDeviceRegProp(BindingHandle
,
7612 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7614 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7622 /***********************************************************************
7623 * CM_Set_HW_Prof [SETUPAPI.@]
7628 _In_ ULONG ulHardwareProfile
,
7631 TRACE("CM_Set_HW_Prof(%lu %lx)\n",
7632 ulHardwareProfile
, ulFlags
);
7634 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
7638 /***********************************************************************
7639 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
7644 _In_ ULONG ulHardwareProfile
,
7646 _In_opt_ HMACHINE hMachine
)
7648 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7651 TRACE("CM_Set_HW_Prof_Ex(%lu %lx %p)\n",
7652 ulHardwareProfile
, ulFlags
, hMachine
);
7654 if (!pSetupIsUserAdmin())
7655 return CR_ACCESS_DENIED
;
7658 return CR_INVALID_FLAG
;
7660 if (hMachine
!= NULL
)
7662 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7663 if (BindingHandle
== NULL
)
7668 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7674 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
7676 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7678 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7686 /***********************************************************************
7687 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
7691 CM_Set_HW_Prof_FlagsA(
7692 _In_ DEVINSTID_A szDevInstName
,
7693 _In_ ULONG ulConfig
,
7697 TRACE("CM_Set_HW_Prof_FlagsA(%s %lu %lu %lx)\n",
7698 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7700 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
7705 /***********************************************************************
7706 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
7710 CM_Set_HW_Prof_FlagsW(
7711 _In_ DEVINSTID_W szDevInstName
,
7712 _In_ ULONG ulConfig
,
7716 TRACE("CM_Set_HW_Prof_FlagsW(%s %lu %lu %lx)\n",
7717 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7719 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
7724 /***********************************************************************
7725 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
7729 CM_Set_HW_Prof_Flags_ExA(
7730 _In_ DEVINSTID_A szDevInstName
,
7731 _In_ ULONG ulConfig
,
7734 _In_opt_ HMACHINE hMachine
)
7736 DEVINSTID_W pszDevIdW
= NULL
;
7737 CONFIGRET ret
= CR_SUCCESS
;
7739 TRACE("CM_Set_HW_Prof_Flags_ExA(%s %lu %lu %lx %p)\n",
7740 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7742 if (szDevInstName
!= NULL
)
7744 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
7745 return CR_INVALID_DEVICE_ID
;
7748 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
7751 if (pszDevIdW
!= NULL
)
7758 /***********************************************************************
7759 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
7763 CM_Set_HW_Prof_Flags_ExW(
7764 _In_ DEVINSTID_W szDevInstName
,
7765 _In_ ULONG ulConfig
,
7768 _In_opt_ HMACHINE hMachine
)
7770 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7773 FIXME("CM_Set_HW_Prof_Flags_ExW(%s %lu %lu %lx %p)\n",
7774 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7776 if (szDevInstName
== NULL
)
7777 return CR_INVALID_POINTER
;
7779 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
7780 return CR_INVALID_FLAG
;
7782 /* FIXME: Check whether szDevInstName is valid */
7784 if (hMachine
!= NULL
)
7786 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7787 if (BindingHandle
== NULL
)
7792 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7798 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
7799 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
7801 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7803 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7811 /***********************************************************************
7812 * CM_Setup_DevNode [SETUPAPI.@]
7817 _In_ DEVINST dnDevInst
,
7820 TRACE("CM_Setup_DevNode(%lx %lx)\n",
7821 dnDevInst
, ulFlags
);
7823 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
7827 /***********************************************************************
7828 * CM_Setup_DevNode_Ex [SETUPAPI.@]
7832 CM_Setup_DevNode_Ex(
7833 _In_ DEVINST dnDevInst
,
7835 _In_opt_ HMACHINE hMachine
)
7837 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7838 HSTRING_TABLE StringTable
= NULL
;
7842 FIXME("CM_Setup_DevNode_Ex(%lx %lx %p)\n",
7843 dnDevInst
, ulFlags
, hMachine
);
7845 if (!pSetupIsUserAdmin())
7846 return CR_ACCESS_DENIED
;
7849 return CR_INVALID_DEVNODE
;
7851 if (ulFlags
& ~CM_SETUP_BITS
)
7852 return CR_INVALID_FLAG
;
7854 if (hMachine
!= NULL
)
7856 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7857 if (BindingHandle
== NULL
)
7860 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7861 if (StringTable
== 0)
7866 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7870 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7871 if (lpDevInst
== NULL
)
7872 return CR_INVALID_DEVNODE
;
7876 ret
= PNP_DeviceInstanceAction(BindingHandle
,
7882 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7884 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7892 /***********************************************************************
7893 * CM_Test_Range_Available [SETUPAPI.@]
7897 CM_Test_Range_Available(
7898 _In_ DWORDLONG ullStartValue
,
7899 _In_ DWORDLONG ullEndValue
,
7900 _In_ RANGE_LIST rlh
,
7903 FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
7904 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
7905 return CR_CALL_NOT_IMPLEMENTED
;
7909 /***********************************************************************
7910 * CM_Uninstall_DevNode [SETUPAPI.@]
7914 CM_Uninstall_DevNode(
7915 _In_ DEVINST dnPhantom
,
7918 TRACE("CM_Uninstall_DevNode(%lx %lx)\n",
7919 dnPhantom
, ulFlags
);
7921 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
7925 /***********************************************************************
7926 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
7930 CM_Uninstall_DevNode_Ex(
7931 _In_ DEVINST dnPhantom
,
7933 _In_opt_ HMACHINE hMachine
)
7935 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7936 HSTRING_TABLE StringTable
= NULL
;
7940 TRACE("CM_Uninstall_DevNode_Ex(%lx %lx %p)\n",
7941 dnPhantom
, ulFlags
, hMachine
);
7944 return CR_INVALID_DEVNODE
;
7947 return CR_INVALID_FLAG
;
7949 if (hMachine
!= NULL
)
7951 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7952 if (BindingHandle
== NULL
)
7955 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7956 if (StringTable
== 0)
7961 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7965 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
7966 if (lpDevInst
== NULL
)
7967 return CR_INVALID_DEVNODE
;
7971 ret
= PNP_UninstallDevInst(BindingHandle
,
7975 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7977 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7985 /***********************************************************************
7986 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
7990 CM_Unregister_Device_InterfaceA(
7991 _In_ LPCSTR pszDeviceInterface
,
7994 TRACE("CM_Unregister_Device_InterfaceA(%s %lx)\n",
7995 debugstr_a(pszDeviceInterface
), ulFlags
);
7997 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
8002 /***********************************************************************
8003 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
8007 CM_Unregister_Device_InterfaceW(
8008 _In_ LPCWSTR pszDeviceInterface
,
8011 TRACE("CM_Unregister_Device_InterfaceW(%s %lx)\n",
8012 debugstr_w(pszDeviceInterface
), ulFlags
);
8014 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
8019 /***********************************************************************
8020 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
8024 CM_Unregister_Device_Interface_ExA(
8025 _In_ LPCSTR pszDeviceInterface
,
8027 _In_opt_ HMACHINE hMachine
)
8029 LPWSTR pszDeviceInterfaceW
= NULL
;
8032 TRACE("CM_Unregister_Device_Interface_ExA(%s %lx %p)\n",
8033 debugstr_a(pszDeviceInterface
), ulFlags
, hMachine
);
8035 if (pszDeviceInterface
== NULL
)
8036 return CR_INVALID_POINTER
;
8038 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
8039 return CR_INVALID_DATA
;
8041 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
8044 if (pszDeviceInterfaceW
!= NULL
)
8045 MyFree(pszDeviceInterfaceW
);
8051 /***********************************************************************
8052 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
8056 CM_Unregister_Device_Interface_ExW(
8057 _In_ LPCWSTR pszDeviceInterface
,
8059 _In_opt_ HMACHINE hMachine
)
8061 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8064 TRACE("CM_Unregister_Device_Interface_ExW(%s %lx %p)\n",
8065 debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
8067 if (pszDeviceInterface
== NULL
)
8068 return CR_INVALID_POINTER
;
8071 return CR_INVALID_FLAG
;
8073 if (hMachine
!= NULL
)
8075 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8076 if (BindingHandle
== NULL
)
8081 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
8087 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
8088 (LPWSTR
)pszDeviceInterface
,
8091 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8093 ret
= RpcStatusToCmStatus(RpcExceptionCode());