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"
28 #include "rpc_private.h"
32 I_ScPnPGetServiceName(IN SERVICE_STATUS_HANDLE hServiceStatus
,
33 OUT LPWSTR lpServiceName
,
34 IN DWORD cchServiceName
);
37 /* Registry key and value names */
38 static const WCHAR Backslash
[] = {'\\', 0};
39 static const WCHAR Class
[] = {'C','l','a','s','s',0};
41 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
42 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
43 'C','o','n','t','r','o','l','\\',
44 'C','l','a','s','s',0};
46 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
47 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
48 'C','o','n','t','r','o','l','\\',
49 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
51 typedef struct _MACHINE_INFO
53 WCHAR szMachineName
[SP_MAX_MACHINENAME_LENGTH
];
54 RPC_BINDING_HANDLE BindingHandle
;
55 HSTRING_TABLE StringTable
;
57 } MACHINE_INFO
, *PMACHINE_INFO
;
60 typedef struct _LOG_CONF_INFO
66 } LOG_CONF_INFO
, *PLOG_CONF_INFO
;
68 #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */
71 typedef struct _NOTIFY_DATA
75 } NOTIFY_DATA
, *PNOTIFY_DATA
;
77 #define NOTIFY_MAGIC 0x44556677
80 typedef struct _INTERNAL_RANGE
83 struct _INTERNAL_RANGE_LIST
*pRangeList
;
86 } INTERNAL_RANGE
, *PINTERNAL_RANGE
;
88 typedef struct _INTERNAL_RANGE_LIST
93 } INTERNAL_RANGE_LIST
, *PINTERNAL_RANGE_LIST
;
95 #define RANGE_LIST_MAGIC 0x33445566
97 typedef struct _CONFLICT_DATA
100 PPNP_CONFLICT_LIST pConflictList
;
101 } CONFLICT_DATA
, *PCONFLICT_DATA
;
103 #define CONFLICT_MAGIC 0x11225588
106 /* FUNCTIONS ****************************************************************/
116 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
119 lstrcpyW(&String
[1], lpString
);
122 String
[MAX_GUID_STRING_LEN
- 2] = '}';
123 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
125 RpcStringFreeW(&lpString
);
134 _In_ RPC_STATUS Status
)
142 GetRegistryPropertyType(
143 _In_ ULONG ulProperty
)
147 case CM_DRP_DEVICEDESC
:
150 case CM_DRP_CLASSGUID
:
153 case CM_DRP_FRIENDLYNAME
:
154 case CM_DRP_LOCATION_INFORMATION
:
155 case CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME
:
156 case CM_DRP_ENUMERATOR_NAME
:
157 case CM_DRP_SECURITY_SDS
:
158 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
161 case CM_DRP_HARDWAREID
:
162 case CM_DRP_COMPATIBLEIDS
:
163 case CM_DRP_UPPERFILTERS
:
164 case CM_DRP_LOWERFILTERS
:
167 case CM_DRP_CONFIGFLAGS
:
168 case CM_DRP_CAPABILITIES
:
169 case CM_DRP_UI_NUMBER
:
170 case CM_DRP_LEGACYBUSTYPE
:
171 case CM_DRP_BUSNUMBER
:
173 case CM_DRP_EXCLUSIVE
:
174 case CM_DRP_CHARACTERISTICS
:
176 case CM_DRP_REMOVAL_POLICY
:
177 case CM_DRP_REMOVAL_POLICY_HW_DEFAULT
:
178 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
179 case CM_DRP_INSTALL_STATE
:
182 case CM_DRP_BUSTYPEGUID
:
183 case CM_DRP_SECURITY
:
184 case CM_DRP_DEVICE_POWER_DATA
:
195 SplitDeviceInstanceId(
196 _In_ PWSTR pszDeviceInstanceId
,
197 _Out_ PWSTR pszDeviceId
,
198 _Out_ PWSTR pszInstanceId
)
202 wcscpy(pszDeviceId
, pszDeviceInstanceId
);
204 ptr
= wcschr(pszDeviceId
, L
'\\');
210 wcscpy(pszInstanceId
, ptr
);
214 *pszInstanceId
= UNICODE_NULL
;
221 GetDeviceInstanceKeyPath(
222 _In_ RPC_BINDING_HANDLE BindingHandle
,
223 _In_ PWSTR pszDeviceInst
,
224 _Out_ PWSTR pszKeyPath
,
225 _Out_ PWSTR pszInstancePath
,
226 _In_ ULONG ulHardwareProfile
,
229 PWSTR pszBuffer
= NULL
;
231 ULONG ulTransferLength
, ulLength
;
232 CONFIGRET ret
= CR_SUCCESS
;
234 TRACE("GetDeviceInstanceKeyPath()\n");
236 /* Allocate a buffer for the device id */
237 pszBuffer
= MyMalloc(300 * sizeof(WCHAR
));
238 if (pszBuffer
== NULL
)
240 ERR("MyMalloc() failed\n");
241 return CR_OUT_OF_MEMORY
;
244 if (ulFlags
& CM_REGISTRY_SOFTWARE
)
246 /* Software Key Path */
248 ulTransferLength
= 300 * sizeof(WCHAR
);
249 ulLength
= 300 * sizeof(WCHAR
);
253 ret
= PNP_GetDeviceRegProp(BindingHandle
,
262 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
264 ret
= RpcStatusToCmStatus(RpcExceptionCode());
268 if (ret
!= CR_SUCCESS
)
272 ret
= PNP_GetClassInstance(BindingHandle
,
277 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
279 ret
= RpcStatusToCmStatus(RpcExceptionCode());
283 if (ret
!= CR_SUCCESS
)
289 TRACE("szBuffer: %S\n", pszBuffer
);
291 SplitDeviceInstanceId(pszBuffer
,
295 TRACE("szBuffer: %S\n", pszBuffer
);
297 if (ulFlags
& CM_REGISTRY_CONFIG
)
299 if (ulHardwareProfile
== 0)
301 wsprintfW(pszKeyPath
,
303 L
"System\\CurrentControlSet\\Hardware Profiles",
305 L
"System\\CurrentControlSet\\Control\\Class",
310 wsprintfW(pszKeyPath
,
311 L
"%s\\%04lu\\%s\\%s",
312 L
"System\\CurrentControlSet\\Hardware Profiles",
314 L
"System\\CurrentControlSet\\Control\\Class",
320 wsprintfW(pszKeyPath
,
322 L
"System\\CurrentControlSet\\Control\\Class",
328 /* Hardware Key Path */
330 if (ulFlags
& CM_REGISTRY_CONFIG
)
332 SplitDeviceInstanceId(pszDeviceInst
,
336 if (ulHardwareProfile
== 0)
338 wsprintfW(pszKeyPath
,
340 L
"System\\CurrentControlSet\\Hardware Profiles",
342 L
"System\\CurrentControlSet\\Enum",
347 wsprintfW(pszKeyPath
,
348 L
"%s\\%04lu\\%s\\%s",
349 L
"System\\CurrentControlSet\\Hardware Profiles",
351 L
"System\\CurrentControlSet\\Enum",
355 else if (ulFlags
& CM_REGISTRY_USER
)
357 wsprintfW(pszKeyPath
,
359 L
"System\\CurrentControlSet\\Enum",
362 wcscpy(pszInstancePath
,
363 L
"Device Parameters");
367 SplitDeviceInstanceId(pszDeviceInst
,
371 wsprintfW(pszKeyPath
,
373 L
"System\\CurrentControlSet\\Enum",
379 if (pszBuffer
!= NULL
)
388 _In_opt_ PINTERNAL_RANGE_LIST pRangeList
)
392 if (pRangeList
== NULL
)
397 if (pRangeList
->ulMagic
!= RANGE_LIST_MAGIC
)
400 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
412 _In_opt_ PLOG_CONF_INFO pLogConfInfo
)
416 if (pLogConfInfo
== NULL
)
421 if (pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
424 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
436 _In_opt_ PCONFLICT_DATA pConflictData
)
440 if (pConflictData
== NULL
)
445 if (pConflictData
->ulMagic
!= CONFLICT_MAGIC
)
448 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
458 /***********************************************************************
459 * CMP_GetBlockedDriverInfo [SETUPAPI.@]
463 CMP_GetBlockedDriverInfo(
464 _Out_opt_ LPWSTR pszNames
,
465 _Inout_ PULONG pulLength
,
467 _In_opt_ HMACHINE hMachine
)
469 RPC_BINDING_HANDLE BindingHandle
= NULL
;
470 ULONG ulTransferLength
;
473 TRACE("CMP_GetBlockedDriverInfo(%p %p %lx %p)\n",
474 pszNames
, pulLength
, ulFlags
, hMachine
);
476 if (hMachine
!= NULL
)
478 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
479 if (BindingHandle
== NULL
)
484 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
488 ulTransferLength
= *pulLength
;
492 ret
= PNP_GetBlockedDriverInfo(BindingHandle
,
498 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
500 ret
= RpcStatusToCmStatus(RpcExceptionCode());
508 /***********************************************************************
509 * CMP_GetServerSideDeviceInstallFlags [SETUPAPI.@]
513 CMP_GetServerSideDeviceInstallFlags(
514 _Out_ PULONG pulSSDIFlags
,
516 _In_opt_ HMACHINE hMachine
)
518 RPC_BINDING_HANDLE BindingHandle
= NULL
;
521 TRACE("CMP_GetServerSideDeviceInstallFlags(%p %lx %p)\n",
522 pulSSDIFlags
, ulFlags
, hMachine
);
524 if (pulSSDIFlags
== NULL
)
525 return CR_INVALID_POINTER
;
528 return CR_INVALID_FLAG
;
530 if (hMachine
!= NULL
)
532 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
533 if (BindingHandle
== NULL
)
538 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
544 ret
= PNP_GetServerSideDeviceInstallFlags(BindingHandle
,
548 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
550 ret
= RpcStatusToCmStatus(RpcExceptionCode());
558 /***********************************************************************
559 * CMP_Init_Detection [SETUPAPI.@]
566 RPC_BINDING_HANDLE BindingHandle
= NULL
;
569 TRACE("CMP_Init_Detection(%lu)\n", ulMagic
);
571 if (ulMagic
!= CMP_MAGIC
)
572 return CR_INVALID_DATA
;
574 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
579 ret
= PNP_InitDetection(BindingHandle
);
581 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
583 ret
= RpcStatusToCmStatus(RpcExceptionCode());
591 /***********************************************************************
592 * CMP_RegisterNotification [SETUPAPI.@]
596 CMP_RegisterNotification(
597 _In_ HANDLE hRecipient
,
598 _In_ LPVOID lpvNotificationFilter
,
600 _Out_ PHDEVNOTIFY phDevNotify
)
602 RPC_BINDING_HANDLE BindingHandle
= NULL
;
603 PNOTIFY_DATA pNotifyData
= NULL
;
604 WCHAR szNameBuffer
[256];
606 DWORD ulUnknown9
= 0;
607 CONFIGRET ret
= CR_SUCCESS
;
609 FIXME("CMP_RegisterNotification(%p %p %lu %p)\n",
610 hRecipient
, lpvNotificationFilter
, ulFlags
, phDevNotify
);
612 if ((hRecipient
== NULL
) ||
613 (lpvNotificationFilter
== NULL
) ||
614 (phDevNotify
== NULL
))
615 return CR_INVALID_POINTER
;
618 return CR_INVALID_FLAG
;
620 if (((PDEV_BROADCAST_HDR
)lpvNotificationFilter
)->dbch_size
< sizeof(DEV_BROADCAST_HDR
))
621 return CR_INVALID_DATA
;
623 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
626 pNotifyData
= HeapAlloc(GetProcessHeap(),
628 sizeof(NOTIFY_DATA
));
629 if (pNotifyData
== NULL
)
630 return CR_OUT_OF_MEMORY
;
632 pNotifyData
->ulMagic
= NOTIFY_MAGIC
;
634 if ((ulFlags
& DEVICE_NOTIFY_SERVICE_HANDLE
) == DEVICE_NOTIFY_WINDOW_HANDLE
)
636 FIXME("Register a window\n");
639 szNameBuffer
[0] = UNICODE_NULL
;
641 else if ((ulFlags
& DEVICE_NOTIFY_SERVICE_HANDLE
) == DEVICE_NOTIFY_SERVICE_HANDLE
)
643 FIXME("Register a service\n");
645 dwError
= I_ScPnPGetServiceName((SERVICE_STATUS_HANDLE
)hRecipient
,
647 ARRAYSIZE(szNameBuffer
));
648 if (dwError
!= ERROR_SUCCESS
)
650 HeapFree(GetProcessHeap(), 0, pNotifyData
);
651 return CR_INVALID_DATA
;
654 FIXME("Register service: %S\n", szNameBuffer
);
659 ret
= PNP_RegisterNotification(BindingHandle
,
662 (BYTE
*)lpvNotificationFilter
,
663 ((DEV_BROADCAST_HDR
*)lpvNotificationFilter
)->dbch_size
,
665 &pNotifyData
->ulNotifyData
,
667 &ulUnknown9
); /* ??? */
669 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
671 ret
= RpcStatusToCmStatus(RpcExceptionCode());
675 if (ret
== CR_SUCCESS
)
677 *phDevNotify
= (HDEVNOTIFY
)pNotifyData
;
681 if (pNotifyData
!= NULL
)
682 HeapFree(GetProcessHeap(), 0, pNotifyData
);
684 *phDevNotify
= (HDEVNOTIFY
)NULL
;
691 /***********************************************************************
692 * CMP_Report_LogOn [SETUPAPI.@]
698 _In_ DWORD dwProcessId
)
700 RPC_BINDING_HANDLE BindingHandle
= NULL
;
701 CONFIGRET ret
= CR_SUCCESS
;
705 TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic
, dwProcessId
);
707 if (dwMagic
!= CMP_MAGIC
)
708 return CR_INVALID_DATA
;
710 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
713 bAdmin
= pSetupIsUserAdmin();
715 for (i
= 0; i
< 30; i
++)
719 ret
= PNP_ReportLogOn(BindingHandle
,
723 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
725 ret
= RpcStatusToCmStatus(RpcExceptionCode());
729 if (ret
== CR_SUCCESS
)
739 /***********************************************************************
740 * CMP_UnregisterNotification [SETUPAPI.@]
744 CMP_UnregisterNotification(
745 _In_ HDEVNOTIFY hDevNotify
)
747 RPC_BINDING_HANDLE BindingHandle
= NULL
;
748 PNOTIFY_DATA pNotifyData
;
749 CONFIGRET ret
= CR_SUCCESS
;
751 TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify
);
753 pNotifyData
= (PNOTIFY_DATA
)hDevNotify
;
755 if ((pNotifyData
== NULL
) ||
756 (pNotifyData
->ulMagic
!= NOTIFY_MAGIC
))
757 return CR_INVALID_POINTER
;
759 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
764 ret
= PNP_UnregisterNotification(BindingHandle
,
765 pNotifyData
->ulNotifyData
);
767 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
769 ret
= RpcStatusToCmStatus(RpcExceptionCode());
773 if (ret
== CR_SUCCESS
)
774 HeapFree(GetProcessHeap(), 0, pNotifyData
);
780 /***********************************************************************
781 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
785 CMP_WaitNoPendingInstallEvents(
786 _In_ DWORD dwTimeout
)
791 TRACE("CMP_WaitNoPendingInstallEvents(%lu)\n", dwTimeout
);
793 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
797 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
803 /***********************************************************************
804 * CMP_WaitServicesAvailable [SETUPAPI.@]
808 CMP_WaitServicesAvailable(
809 _In_opt_ HMACHINE hMachine
)
811 RPC_BINDING_HANDLE BindingHandle
= NULL
;
812 CONFIGRET ret
= CR_SUCCESS
;
815 TRACE("CMP_WaitServicesAvailable(%p)\n", hMachine
);
817 if (hMachine
!= NULL
)
819 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
820 if (BindingHandle
== NULL
)
825 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
831 ret
= PNP_GetVersion(BindingHandle
, &Version
);
833 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
835 ret
= RpcStatusToCmStatus(RpcExceptionCode());
843 /***********************************************************************
844 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
848 CM_Add_Empty_Log_Conf(
849 _Out_ PLOG_CONF plcLogConf
,
850 _In_ DEVINST dnDevInst
,
851 _In_ PRIORITY Priority
,
854 TRACE("CM_Add_Empty_Log_Conf(%p %p %lu %lx)\n",
855 plcLogConf
, dnDevInst
, Priority
, ulFlags
);
857 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
862 /***********************************************************************
863 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
867 CM_Add_Empty_Log_Conf_Ex(
868 _Out_ PLOG_CONF plcLogConf
,
869 _In_ DEVINST dnDevInst
,
870 _In_ PRIORITY Priority
,
872 _In_opt_ HMACHINE hMachine
)
874 RPC_BINDING_HANDLE BindingHandle
= NULL
;
875 HSTRING_TABLE StringTable
= NULL
;
876 ULONG ulLogConfTag
= 0;
878 PLOG_CONF_INFO pLogConfInfo
;
879 CONFIGRET ret
= CR_SUCCESS
;
881 FIXME("CM_Add_Empty_Log_Conf_Ex(%p %p %lu %lx %p)\n",
882 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
884 if (!pSetupIsUserAdmin())
885 return CR_ACCESS_DENIED
;
887 if (plcLogConf
== NULL
)
888 return CR_INVALID_POINTER
;
891 return CR_INVALID_DEVINST
;
893 if (Priority
> 0xFFFF)
894 return CR_INVALID_PRIORITY
;
896 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
897 return CR_INVALID_FLAG
;
899 if (hMachine
!= NULL
)
901 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
902 if (BindingHandle
== NULL
)
905 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
906 if (StringTable
== 0)
911 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
915 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
916 if (lpDevInst
== NULL
)
917 return CR_INVALID_DEVNODE
;
921 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
922 &ulLogConfTag
, ulFlags
);
924 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
926 ret
= RpcStatusToCmStatus(RpcExceptionCode());
930 if (ret
== CR_SUCCESS
)
932 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
933 if (pLogConfInfo
== NULL
)
935 ret
= CR_OUT_OF_MEMORY
;
939 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
940 pLogConfInfo
->dnDevInst
= dnDevInst
;
941 pLogConfInfo
->ulFlags
= ulFlags
;
942 pLogConfInfo
->ulTag
= ulLogConfTag
;
944 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
954 /***********************************************************************
955 * CM_Add_IDA [SETUPAPI.@]
960 _In_ DEVINST dnDevInst
,
964 TRACE("CM_Add_IDA(%p %s %lx)\n",
965 dnDevInst
, debugstr_a(pszID
), ulFlags
);
967 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
971 /***********************************************************************
972 * CM_Add_IDW [SETUPAPI.@]
977 _In_ DEVINST dnDevInst
,
981 TRACE("CM_Add_IDW(%p %s %lx)\n",
982 dnDevInst
, debugstr_w(pszID
), ulFlags
);
984 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
988 /***********************************************************************
989 * CM_Add_ID_ExA [SETUPAPI.@]
994 _In_ DEVINST dnDevInst
,
997 _In_opt_ HMACHINE hMachine
)
1002 TRACE("CM_Add_ID_ExA(%p %s %lx %p)\n",
1003 dnDevInst
, debugstr_a(pszID
), ulFlags
, hMachine
);
1005 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
1006 return CR_INVALID_DATA
;
1008 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
1016 /***********************************************************************
1017 * CM_Add_ID_ExW [SETUPAPI.@]
1022 _In_ DEVINST dnDevInst
,
1025 _In_opt_ HMACHINE hMachine
)
1027 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1028 HSTRING_TABLE StringTable
= NULL
;
1032 TRACE("CM_Add_ID_ExW(%p %s %lx %p)\n",
1033 dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
1035 if (!pSetupIsUserAdmin())
1036 return CR_ACCESS_DENIED
;
1039 return CR_INVALID_DEVINST
;
1042 return CR_INVALID_POINTER
;
1044 if (ulFlags
& ~CM_ADD_ID_BITS
)
1045 return CR_INVALID_FLAG
;
1047 if (hMachine
!= NULL
)
1049 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1050 if (BindingHandle
== NULL
)
1053 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1054 if (StringTable
== 0)
1059 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1063 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1064 if (lpDevInst
== NULL
)
1065 return CR_INVALID_DEVNODE
;
1069 ret
= PNP_AddID(BindingHandle
,
1074 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1076 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1084 /***********************************************************************
1085 * CM_Add_Range [SETUPAPI.@]
1090 _In_ DWORDLONG ullStartValue
,
1091 _In_ DWORDLONG ullEndValue
,
1092 _In_ RANGE_LIST rlh
,
1095 PINTERNAL_RANGE_LIST pRangeList
;
1096 PINTERNAL_RANGE pRange
;
1097 CONFIGRET ret
= CR_SUCCESS
;
1099 FIXME("CM_Add_Range(%I64u %I64u %p %lx)\n",
1100 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1102 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
1104 if (!IsValidRangeList(pRangeList
))
1105 return CR_INVALID_RANGE_LIST
;
1107 if (ulFlags
& ~CM_ADD_RANGE_BITS
)
1108 return CR_INVALID_FLAG
;
1110 if (ullEndValue
< ullStartValue
)
1111 return CR_INVALID_RANGE
;
1113 /* Lock the range list */
1114 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
1116 /* Allocate the new range */
1117 pRange
= HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNAL_RANGE
));
1120 ret
= CR_OUT_OF_MEMORY
;
1124 pRange
->pRangeList
= pRangeList
;
1125 pRange
->ullStart
= ullStartValue
;
1126 pRange
->ullEnd
= ullEndValue
;
1128 /* Insert the range */
1129 if (IsListEmpty(&pRangeList
->ListHead
))
1131 InsertTailList(&pRangeList
->ListHead
, &pRange
->ListEntry
);
1135 HeapFree(GetProcessHeap(), 0, pRange
);
1140 /* Unlock the range list */
1141 ReleaseMutex(pRangeList
->hMutex
);
1147 /***********************************************************************
1148 * CM_Add_Res_Des [SETUPAPI.@]
1153 _Out_opt_ PRES_DES prdResDes
,
1154 _In_ LOG_CONF lcLogConf
,
1155 _In_ RESOURCEID ResourceID
,
1156 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1157 _In_ ULONG ResourceLen
,
1160 TRACE("CM_Add_Res_Des(%p %p %lu %p %lu %lx)\n",
1161 prdResDes
, lcLogConf
, ResourceID
, ResourceData
, ResourceLen
, ulFlags
);
1163 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
1164 ResourceLen
, ulFlags
, NULL
);
1168 /***********************************************************************
1169 * CM_Add_Res_Des_Ex [SETUPAPI.@]
1174 _Out_opt_ PRES_DES prdResDes
,
1175 _In_ LOG_CONF lcLogConf
,
1176 _In_ RESOURCEID ResourceID
,
1177 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1178 _In_ ULONG ResourceLen
,
1180 _In_opt_ HMACHINE hMachine
)
1182 FIXME("CM_Add_Res_Des_Ex(%p %p %lu %p %lu %lx %p)\n",
1183 prdResDes
, lcLogConf
, ResourceID
,
1184 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
1186 return CR_CALL_NOT_IMPLEMENTED
;
1190 /***********************************************************************
1191 * CM_Connect_MachineA [SETUPAPI.@]
1195 CM_Connect_MachineA(
1196 _In_opt_ PCSTR UNCServerName
,
1197 _Out_ PHMACHINE phMachine
)
1202 TRACE("CM_Connect_MachineA(%s %p)\n",
1203 debugstr_a(UNCServerName
), phMachine
);
1205 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1206 return CM_Connect_MachineW(NULL
, phMachine
);
1208 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
1209 return CR_INVALID_DATA
;
1211 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
1213 MyFree(pServerNameW
);
1219 /***********************************************************************
1220 * CM_Connect_MachineW [SETUPAPI.@]
1224 CM_Connect_MachineW(
1225 _In_opt_ PCWSTR UNCServerName
,
1226 _Out_ PHMACHINE phMachine
)
1228 PMACHINE_INFO pMachine
;
1230 TRACE("CM_Connect_MachineW(%s %p)\n",
1231 debugstr_w(UNCServerName
), phMachine
);
1233 if (phMachine
== NULL
)
1234 return CR_INVALID_POINTER
;
1238 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
1239 if (pMachine
== NULL
)
1240 return CR_OUT_OF_MEMORY
;
1242 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1244 pMachine
->bLocal
= TRUE
;
1246 /* FIXME: store the computers name in pMachine->szMachineName */
1248 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
1249 &pMachine
->StringTable
))
1251 HeapFree(GetProcessHeap(), 0, pMachine
);
1257 pMachine
->bLocal
= FALSE
;
1258 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
1260 HeapFree(GetProcessHeap(), 0, pMachine
);
1261 return CR_INVALID_MACHINENAME
;
1263 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
1265 pMachine
->StringTable
= pSetupStringTableInitialize();
1266 if (pMachine
->StringTable
== NULL
)
1268 HeapFree(GetProcessHeap(), 0, pMachine
);
1272 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
1274 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
1276 pSetupStringTableDestroy(pMachine
->StringTable
);
1277 HeapFree(GetProcessHeap(), 0, pMachine
);
1278 return CR_INVALID_MACHINENAME
;
1282 *phMachine
= (PHMACHINE
)pMachine
;
1288 /***********************************************************************
1289 * CM_Create_DevNodeA [SETUPAPI.@]
1294 _Out_ PDEVINST pdnDevInst
,
1295 _In_ DEVINSTID_A pDeviceID
,
1296 _In_ DEVINST dnParent
,
1299 TRACE("CM_Create_DevNodeA(%p %s %p %lx)\n",
1300 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
1302 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
1307 /***********************************************************************
1308 * CM_Create_DevNodeW [SETUPAPI.@]
1313 _Out_ PDEVINST pdnDevInst
,
1314 _In_ DEVINSTID_W pDeviceID
,
1315 _In_ DEVINST dnParent
,
1318 TRACE("CM_Create_DevNodeW(%p %s %p %lx)\n",
1319 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
1321 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
1326 /***********************************************************************
1327 * CM_Create_DevNode_ExA [SETUPAPI.@]
1331 CM_Create_DevNode_ExA(
1332 _Out_ PDEVINST pdnDevInst
,
1333 _In_ DEVINSTID_A pDeviceID
,
1334 _In_ DEVINST dnParent
,
1336 _In_opt_ HANDLE hMachine
)
1338 DEVINSTID_W pDeviceIDW
;
1341 TRACE("CM_Create_DevNode_ExA(%p %s %p %lx %p)\n",
1342 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1344 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
1345 return CR_INVALID_DATA
;
1347 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
1356 /***********************************************************************
1357 * CM_Create_DevNode_ExW [SETUPAPI.@]
1361 CM_Create_DevNode_ExW(
1362 _Out_ PDEVINST pdnDevInst
,
1363 _In_ DEVINSTID_W pDeviceID
,
1364 _In_ DEVINST dnParent
,
1366 _In_opt_ HANDLE hMachine
)
1368 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1369 HSTRING_TABLE StringTable
= NULL
;
1370 LPWSTR lpParentDevInst
;
1371 CONFIGRET ret
= CR_SUCCESS
;
1372 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
1374 TRACE("CM_Create_DevNode_ExW(%p %s %p %lx %p)\n",
1375 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1377 if (!pSetupIsUserAdmin())
1378 return CR_ACCESS_DENIED
;
1380 if (pdnDevInst
== NULL
)
1381 return CR_INVALID_POINTER
;
1383 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
1384 return CR_INVALID_DEVICE_ID
;
1387 return CR_INVALID_DEVNODE
;
1389 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
1390 return CR_INVALID_FLAG
;
1392 if (hMachine
!= NULL
)
1394 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1395 if (BindingHandle
== NULL
)
1398 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1399 if (StringTable
== 0)
1404 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1408 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
1409 if (lpParentDevInst
== NULL
)
1410 return CR_INVALID_DEVNODE
;
1412 wcscpy(szLocalDeviceID
, pDeviceID
);
1416 ret
= PNP_CreateDevInst(BindingHandle
,
1422 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1424 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1428 if (ret
== CR_SUCCESS
)
1430 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
1431 * will return the generated device ID in szLocalDeviceID */
1432 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
1433 if (*pdnDevInst
== 0)
1434 ret
= CR_NO_SUCH_DEVNODE
;
1441 /***********************************************************************
1442 * CM_Create_Range_List [SETUPAPI.@]
1446 CM_Create_Range_List(
1447 _Out_ PRANGE_LIST prlh
,
1450 PINTERNAL_RANGE_LIST pRangeList
= NULL
;
1452 FIXME("CM_Create_Range_List(%p %lx)\n",
1456 return CR_INVALID_FLAG
;
1459 return CR_INVALID_POINTER
;
1461 /* Allocate the range list */
1462 pRangeList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(INTERNAL_RANGE_LIST
));
1463 if (pRangeList
== NULL
)
1464 return CR_OUT_OF_MEMORY
;
1466 /* Set the magic value */
1467 pRangeList
->ulMagic
= RANGE_LIST_MAGIC
;
1469 /* Initialize the mutex for synchonized access */
1470 pRangeList
->hMutex
= CreateMutex(NULL
, FALSE
, NULL
);
1471 if (pRangeList
->hMutex
== NULL
)
1473 HeapFree(GetProcessHeap(), 0, pRangeList
);
1477 InitializeListHead(&pRangeList
->ListHead
);
1479 *prlh
= (RANGE_LIST
)pRangeList
;
1485 /***********************************************************************
1486 * CM_Delete_Class_Key [SETUPAPI.@]
1490 CM_Delete_Class_Key(
1491 _In_ LPGUID ClassGuid
,
1494 TRACE("CM_Delete_Class_Key(%p %lx)\n",
1495 ClassGuid
, ulFlags
);
1497 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
1501 /***********************************************************************
1502 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
1506 CM_Delete_Class_Key_Ex(
1507 _In_ LPGUID ClassGuid
,
1509 _In_opt_ HANDLE hMachine
)
1511 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1512 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1515 TRACE("CM_Delete_Class_Key_Ex(%p %lx %p)\n",
1516 ClassGuid
, ulFlags
, hMachine
);
1518 if (ClassGuid
== NULL
)
1519 return CR_INVALID_POINTER
;
1521 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
1522 return CR_INVALID_FLAG
;
1524 if (!GuidToString(ClassGuid
, szGuidString
))
1525 return CR_INVALID_DATA
;
1527 if (hMachine
!= NULL
)
1529 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1530 if (BindingHandle
== NULL
)
1535 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1541 ret
= PNP_DeleteClassKey(BindingHandle
,
1545 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1547 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1555 /***********************************************************************
1556 * CM_Delete_DevNode_Key [SETUPAPI.@]
1560 CM_Delete_DevNode_Key(
1561 _In_ DEVNODE dnDevNode
,
1562 _In_ ULONG ulHardwareProfile
,
1565 TRACE("CM_Delete_DevNode_Key(%p %lu %lx)\n",
1566 dnDevNode
, ulHardwareProfile
, ulFlags
);
1568 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
1573 /***********************************************************************
1574 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
1578 CM_Delete_DevNode_Key_Ex(
1579 _In_ DEVNODE dnDevNode
,
1580 _In_ ULONG ulHardwareProfile
,
1582 _In_opt_ HANDLE hMachine
)
1584 FIXME("CM_Delete_DevNode_Key_Ex(%p %lu %lx %p)\n",
1585 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
1587 return CR_CALL_NOT_IMPLEMENTED
;
1591 /***********************************************************************
1592 * CM_Delete_Range [SETUPAPI.@]
1597 _In_ DWORDLONG ullStartValue
,
1598 _In_ DWORDLONG ullEndValue
,
1599 _In_ RANGE_LIST rlh
,
1602 FIXME("CM_Delete_Range(%I64u %I64u %p %lx)\n",
1603 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1605 return CR_CALL_NOT_IMPLEMENTED
;
1609 /***********************************************************************
1610 * CM_Detect_Resource_Conflict [SETUPAPI.@]
1614 CM_Detect_Resource_Conflict(
1615 _In_ DEVINST dnDevInst
,
1616 _In_ RESOURCEID ResourceID
,
1617 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1618 _In_ ULONG ResourceLen
,
1619 _Out_ PBOOL pbConflictDetected
,
1622 TRACE("CM_Detect_Resource_Conflict(%p %lu %p %lu %p 0x%lx)\n",
1623 dnDevInst
, ResourceID
, ResourceData
, ResourceLen
,
1624 pbConflictDetected
, ulFlags
);
1626 return CM_Detect_Resource_Conflict_Ex(dnDevInst
,
1636 /***********************************************************************
1637 * CM_Detect_Resource_Conflict_Ex [SETUPAPI.@]
1641 CM_Detect_Resource_Conflict_Ex(
1642 _In_ DEVINST dnDevInst
,
1643 _In_ RESOURCEID ResourceID
,
1644 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
1645 _In_ ULONG ResourceLen
,
1646 _Out_ PBOOL pbConflictDetected
,
1648 _In_opt_ HMACHINE hMachine
)
1650 FIXME("CM_Detect_Resource_Conflict_Ex(%p %lu %p %lu %p 0x%lx %p)\n",
1651 dnDevInst
, ResourceID
, ResourceData
, ResourceLen
,
1652 pbConflictDetected
, ulFlags
, hMachine
);
1654 return CR_CALL_NOT_IMPLEMENTED
;
1658 /***********************************************************************
1659 * CM_Disable_DevNode [SETUPAPI.@]
1664 _In_ DEVINST dnDevInst
,
1667 TRACE("CM_Disable_DevNode(%p %lx)\n",
1668 dnDevInst
, ulFlags
);
1670 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1674 /***********************************************************************
1675 * CM_Disable_DevNode_Ex [SETUPAPI.@]
1679 CM_Disable_DevNode_Ex(
1680 _In_ DEVINST dnDevInst
,
1682 _In_opt_ HMACHINE hMachine
)
1684 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1685 HSTRING_TABLE StringTable
= NULL
;
1689 FIXME("CM_Disable_DevNode_Ex(%p %lx %p)\n",
1690 dnDevInst
, ulFlags
, hMachine
);
1692 if (!pSetupIsUserAdmin())
1693 return CR_ACCESS_DENIED
;
1696 return CR_INVALID_DEVINST
;
1699 return CR_INVALID_FLAG
;
1701 if (hMachine
!= NULL
)
1703 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1704 if (BindingHandle
== NULL
)
1707 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1708 if (StringTable
== 0)
1713 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1717 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1718 if (lpDevInst
== NULL
)
1719 return CR_INVALID_DEVNODE
;
1723 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1724 PNP_DEVINST_DISABLE
,
1729 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1731 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1739 /***********************************************************************
1740 * CM_Disconnect_Machine [SETUPAPI.@]
1744 CM_Disconnect_Machine(
1745 _In_opt_ HMACHINE hMachine
)
1747 PMACHINE_INFO pMachine
;
1749 TRACE("CM_Disconnect_Machine(%p)\n", hMachine
);
1751 pMachine
= (PMACHINE_INFO
)hMachine
;
1752 if (pMachine
== NULL
)
1755 if (pMachine
->bLocal
== FALSE
)
1757 if (pMachine
->StringTable
!= NULL
)
1758 pSetupStringTableDestroy(pMachine
->StringTable
);
1760 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
1761 return CR_ACCESS_DENIED
;
1764 HeapFree(GetProcessHeap(), 0, pMachine
);
1770 /***********************************************************************
1771 * CM_Dup_Range_List [SETUPAPI.@]
1776 _In_ RANGE_LIST rlhOld
,
1777 _In_ RANGE_LIST rlhNew
,
1780 FIXME("CM_Dup_Range_List(%p %p %lx)\n",
1781 rlhOld
, rlhNew
, ulFlags
);
1783 return CR_CALL_NOT_IMPLEMENTED
;
1787 /***********************************************************************
1788 * CM_Enable_DevNode [SETUPAPI.@]
1793 _In_ DEVINST dnDevInst
,
1796 TRACE("CM_Enable_DevNode(%p %lx)\n",
1797 dnDevInst
, ulFlags
);
1799 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1803 /***********************************************************************
1804 * CM_Enable_DevNode_Ex [SETUPAPI.@]
1808 CM_Enable_DevNode_Ex(
1809 _In_ DEVINST dnDevInst
,
1811 _In_opt_ HMACHINE hMachine
)
1813 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1814 HSTRING_TABLE StringTable
= NULL
;
1818 TRACE("CM_Enable_DevNode_Ex(%p %lx %p)\n",
1819 dnDevInst
, ulFlags
, hMachine
);
1821 if (!pSetupIsUserAdmin())
1822 return CR_ACCESS_DENIED
;
1825 return CR_INVALID_DEVINST
;
1828 return CR_INVALID_FLAG
;
1830 if (hMachine
!= NULL
)
1832 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1833 if (BindingHandle
== NULL
)
1836 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1837 if (StringTable
== 0)
1842 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1846 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1847 if (lpDevInst
== NULL
)
1848 return CR_INVALID_DEVNODE
;
1852 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1858 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1860 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1868 /***********************************************************************
1869 * CM_Enumerate_Classes [SETUPAPI.@]
1873 CM_Enumerate_Classes(
1874 _In_ ULONG ulClassIndex
,
1875 _Out_ LPGUID ClassGuid
,
1878 TRACE("CM_Enumerate_Classes(%lx %p %lx)\n",
1879 ulClassIndex
, ClassGuid
, ulFlags
);
1881 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
1885 /***********************************************************************
1886 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
1890 CM_Enumerate_Classes_Ex(
1891 _In_ ULONG ulClassIndex
,
1892 _Out_ LPGUID ClassGuid
,
1894 _In_opt_ HMACHINE hMachine
)
1896 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1897 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1898 CONFIGRET ret
= CR_SUCCESS
;
1899 ULONG ulLength
= MAX_GUID_STRING_LEN
;
1901 TRACE("CM_Enumerate_Classes_Ex(%lx %p %lx %p)\n",
1902 ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
1904 if (ClassGuid
== NULL
)
1905 return CR_INVALID_POINTER
;
1908 return CR_INVALID_FLAG
;
1910 if (hMachine
!= NULL
)
1912 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1913 if (BindingHandle
== NULL
)
1918 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1924 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1928 MAX_GUID_STRING_LEN
,
1932 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1934 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1938 if (ret
== CR_SUCCESS
)
1941 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1943 /* Convert the buffer to a GUID */
1944 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1952 /***********************************************************************
1953 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1957 CM_Enumerate_EnumeratorsA(
1958 _In_ ULONG ulEnumIndex
,
1959 _Out_writes_(*pulLength
) PCHAR Buffer
,
1960 _Inout_ PULONG pulLength
,
1963 TRACE("CM_Enumerate_EnumeratorsA(%lu %p %p %lx)\n",
1964 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1966 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1971 /***********************************************************************
1972 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1976 CM_Enumerate_EnumeratorsW(
1977 _In_ ULONG ulEnumIndex
,
1978 _Out_writes_(*pulLength
) PWCHAR Buffer
,
1979 _Inout_ PULONG pulLength
,
1982 TRACE("CM_Enumerate_EnumeratorsW(%lu %p %p %lx)\n",
1983 ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1985 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1990 /***********************************************************************
1991 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1995 CM_Enumerate_Enumerators_ExA(
1996 _In_ ULONG ulEnumIndex
,
1997 _Out_writes_(*pulLength
) PCHAR Buffer
,
1998 _Inout_ PULONG pulLength
,
2000 _In_opt_ HMACHINE hMachine
)
2002 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
2005 CONFIGRET ret
= CR_SUCCESS
;
2007 TRACE("CM_Enumerate_Enumerators_ExA(%lu %p %p %lx %p)\n",
2008 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
2010 if (Buffer
== NULL
|| pulLength
== NULL
)
2011 return CR_INVALID_POINTER
;
2014 return CR_INVALID_FLAG
;
2016 ulOrigLength
= *pulLength
;
2019 ulLength
= MAX_DEVICE_ID_LEN
;
2020 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
2022 if (ret
== CR_SUCCESS
)
2024 if (WideCharToMultiByte(CP_ACP
,
2034 *pulLength
= lstrlenA(Buffer
) + 1;
2041 /***********************************************************************
2042 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
2046 CM_Enumerate_Enumerators_ExW(
2047 _In_ ULONG ulEnumIndex
,
2048 _Out_writes_(*pulLength
) PWCHAR Buffer
,
2049 _Inout_ PULONG pulLength
,
2051 _In_opt_ HMACHINE hMachine
)
2053 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2056 TRACE("CM_Enumerate_Enumerators_ExW(%lu %p %p %lx %p)\n",
2057 ulEnumIndex
, Buffer
, pulLength
, ulFlags
, hMachine
);
2059 if (Buffer
== NULL
|| pulLength
== NULL
)
2060 return CR_INVALID_POINTER
;
2063 return CR_INVALID_FLAG
;
2065 *Buffer
= UNICODE_NULL
;
2067 if (hMachine
!= NULL
)
2069 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2070 if (BindingHandle
== NULL
)
2075 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2081 ret
= PNP_EnumerateSubKeys(BindingHandle
,
2082 PNP_ENUMERATOR_SUBKEYS
,
2089 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2091 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2099 /***********************************************************************
2100 * CM_Find_Range [SETUPAPI.@]
2105 _Out_ PDWORDLONG pullStart
,
2106 _In_ DWORDLONG ullStart
,
2107 _In_ ULONG ulLength
,
2108 _In_ DWORDLONG ullAlignment
,
2109 _In_ DWORDLONG ullEnd
,
2110 _In_ RANGE_LIST rlh
,
2113 FIXME("CM_Find_Range(%p %I64u %lu %I64u %I64u %p %lx)\n",
2114 pullStart
, ullStart
, ulLength
, ullAlignment
, ullEnd
, rlh
, ulFlags
);
2116 return CR_CALL_NOT_IMPLEMENTED
;
2120 /***********************************************************************
2121 * CM_First_Range [SETUPAPI.@]
2126 _In_ RANGE_LIST rlh
,
2127 _Out_ PDWORDLONG pullStart
,
2128 _Out_ PDWORDLONG pullEnd
,
2129 _Out_ PRANGE_ELEMENT preElement
,
2132 PINTERNAL_RANGE_LIST pRangeList
;
2133 PINTERNAL_RANGE pRange
;
2134 PLIST_ENTRY ListEntry
;
2135 CONFIGRET ret
= CR_SUCCESS
;
2137 FIXME("CM_First_Range(%p %p %p %p %lx)\n",
2138 rlh
, pullStart
, pullEnd
, preElement
, ulFlags
);
2140 pRangeList
= (PINTERNAL_RANGE_LIST
)rlh
;
2142 if (!IsValidRangeList(pRangeList
))
2143 return CR_INVALID_RANGE_LIST
;
2145 if (pullStart
== NULL
|| pullEnd
== NULL
|| preElement
== NULL
)
2146 return CR_INVALID_POINTER
;
2149 return CR_INVALID_FLAG
;
2151 /* Lock the range list */
2152 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2154 /* Fail, if the list is empty */
2155 if (IsListEmpty(&pRangeList
->ListHead
))
2161 /* Get the first range */
2162 ListEntry
= pRangeList
->ListHead
.Flink
;
2163 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2165 /* Return the range data */
2166 *pullStart
= pRange
->ullStart
;
2167 *pullEnd
= pRange
->ullEnd
;
2168 *preElement
= (RANGE_ELEMENT
)pRange
;
2171 /* Unlock the range list */
2172 ReleaseMutex(pRangeList
->hMutex
);
2178 /***********************************************************************
2179 * CM_Free_Log_Conf [SETUPAPI.@]
2184 _In_ LOG_CONF lcLogConfToBeFreed
,
2187 TRACE("CM_Free_Log_Conf(%lx %lx)\n",
2188 lcLogConfToBeFreed
, ulFlags
);
2190 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
2194 /***********************************************************************
2195 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
2199 CM_Free_Log_Conf_Ex(
2200 _In_ LOG_CONF lcLogConfToBeFreed
,
2202 _In_opt_ HMACHINE hMachine
)
2204 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2205 HSTRING_TABLE StringTable
= NULL
;
2207 PLOG_CONF_INFO pLogConfInfo
;
2210 TRACE("CM_Free_Log_Conf_Ex(%lx %lx %p)\n",
2211 lcLogConfToBeFreed
, ulFlags
, hMachine
);
2213 if (!pSetupIsUserAdmin())
2214 return CR_ACCESS_DENIED
;
2216 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
2217 if (!IsValidLogConf(pLogConfInfo
))
2218 return CR_INVALID_LOG_CONF
;
2221 return CR_INVALID_FLAG
;
2223 if (hMachine
!= NULL
)
2225 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2226 if (BindingHandle
== NULL
)
2229 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2230 if (StringTable
== 0)
2235 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2239 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
2240 if (lpDevInst
== NULL
)
2241 return CR_INVALID_DEVNODE
;
2245 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
2246 pLogConfInfo
->ulTag
, 0);
2248 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2250 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2258 /***********************************************************************
2259 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
2263 CM_Free_Log_Conf_Handle(
2264 _In_ LOG_CONF lcLogConf
)
2266 PLOG_CONF_INFO pLogConfInfo
;
2268 TRACE("CM_Free_Log_Conf_Handle(%lx)\n", lcLogConf
);
2270 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
2271 if (!IsValidLogConf(pLogConfInfo
))
2272 return CR_INVALID_LOG_CONF
;
2274 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
2280 /***********************************************************************
2281 * CM_Free_Range_List [SETUPAPI.@]
2286 _In_ RANGE_LIST RangeList
,
2289 PINTERNAL_RANGE_LIST pRangeList
;
2290 PINTERNAL_RANGE pRange
;
2291 PLIST_ENTRY ListEntry
;
2293 FIXME("CM_Free_Range_List(%p %lx)\n",
2294 RangeList
, ulFlags
);
2296 pRangeList
= (PINTERNAL_RANGE_LIST
)RangeList
;
2298 if (!IsValidRangeList(pRangeList
))
2299 return CR_INVALID_RANGE_LIST
;
2302 return CR_INVALID_FLAG
;
2304 /* Lock the range list */
2305 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
2307 /* Free the list of ranges */
2308 while (!IsListEmpty(&pRangeList
->ListHead
))
2310 ListEntry
= RemoveHeadList(&pRangeList
->ListHead
);
2311 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
2312 HeapFree(GetProcessHeap(), 0, pRange
);
2315 /* Unlock the range list */
2316 ReleaseMutex(pRangeList
->hMutex
);
2318 /* Close the mutex */
2319 CloseHandle(pRangeList
->hMutex
);
2321 /* Free the range list */
2322 HeapFree(GetProcessHeap(), 0, pRangeList
);
2328 /***********************************************************************
2329 * CM_Free_Res_Des [SETUPAPI.@]
2334 _Out_ PRES_DES prdResDes
,
2335 _In_ RES_DES rdResDes
,
2338 TRACE("CM_Free_Res_Des(%p %p %lx)\n",
2339 prdResDes
, rdResDes
, ulFlags
);
2341 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
2345 /***********************************************************************
2346 * CM_Free_Res_Des_Ex [SETUPAPI.@]
2351 _Out_ PRES_DES prdResDes
,
2352 _In_ RES_DES rdResDes
,
2354 _In_opt_ HMACHINE hMachine
)
2356 FIXME("CM_Free_Res_Des_Ex(%p %p %lx %p)\n",
2357 prdResDes
, rdResDes
, ulFlags
, hMachine
);
2359 return CR_CALL_NOT_IMPLEMENTED
;
2363 /***********************************************************************
2364 * CM_Free_Res_Des_Handle [SETUPAPI.@]
2368 CM_Free_Res_Des_Handle(
2369 _In_ RES_DES rdResDes
)
2371 FIXME("CM_Free_Res_Des_Handle(%p)\n", rdResDes
);
2373 return CR_CALL_NOT_IMPLEMENTED
;
2377 /***********************************************************************
2378 * CM_Free_Resource_Conflict_Handle [SETUPAPI.@]
2382 CM_Free_Resource_Conflict_Handle(
2383 _In_ CONFLICT_LIST clConflictList
)
2385 PCONFLICT_DATA pConflictData
;
2387 FIXME("CM_Free_Resource_Conflict_Handle(%p)\n",
2390 pConflictData
= (PCONFLICT_DATA
)clConflictList
;
2391 if (!IsValidConflictData(pConflictData
))
2392 return CR_INVALID_CONFLICT_LIST
;
2394 if (pConflictData
->pConflictList
!= NULL
)
2395 MyFree(pConflictData
->pConflictList
);
2397 MyFree(pConflictData
);
2403 /***********************************************************************
2404 * CM_Get_Child [SETUPAPI.@]
2409 _Out_ PDEVINST pdnDevInst
,
2410 _In_ DEVINST dnDevInst
,
2413 TRACE("CM_Get_Child(%p %p %lx)\n",
2414 pdnDevInst
, dnDevInst
, ulFlags
);
2416 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
2420 /***********************************************************************
2421 * CM_Get_Child_Ex [SETUPAPI.@]
2426 _Out_ PDEVINST pdnDevInst
,
2427 _In_ DEVINST dnDevInst
,
2429 _In_opt_ HMACHINE hMachine
)
2431 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
2432 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2433 HSTRING_TABLE StringTable
= NULL
;
2435 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
2438 TRACE("CM_Get_Child_Ex(%p %lx %lx %p)\n",
2439 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
2441 if (pdnDevInst
== NULL
)
2442 return CR_INVALID_POINTER
;
2445 return CR_INVALID_DEVINST
;
2448 return CR_INVALID_FLAG
;
2452 if (hMachine
!= NULL
)
2454 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2455 if (BindingHandle
== NULL
)
2458 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2459 if (StringTable
== 0)
2464 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2468 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2469 if (lpDevInst
== NULL
)
2470 return CR_INVALID_DEVNODE
;
2474 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2475 PNP_GET_CHILD_DEVICE_INSTANCE
,
2481 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2483 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2487 if (ret
!= CR_SUCCESS
)
2490 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2492 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
2496 *pdnDevInst
= dwIndex
;
2502 /***********************************************************************
2503 * CM_Get_Class_Key_NameA [SETUPAPI.@]
2507 CM_Get_Class_Key_NameA(
2508 _In_ LPGUID ClassGuid
,
2509 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2510 _Inout_ PULONG pulLength
,
2513 TRACE("CM_Get_Class_Key_NameA(%p %p %p %lx)\n",
2514 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2516 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
2521 /***********************************************************************
2522 * CM_Get_Class_Key_NameW [SETUPAPI.@]
2526 CM_Get_Class_Key_NameW(
2527 _In_ LPGUID ClassGuid
,
2528 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2529 _Inout_ PULONG pulLength
,
2532 TRACE("CM_Get_Class_Key_NameW(%p %p %p %lx)\n",
2533 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2535 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
2540 /***********************************************************************
2541 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
2545 CM_Get_Class_Key_Name_ExA(
2546 _In_ LPGUID ClassGuid
,
2547 _Out_writes_opt_(*pulLength
) LPSTR pszKeyName
,
2548 _Inout_ PULONG pulLength
,
2550 _In_opt_ HMACHINE hMachine
)
2552 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
2553 CONFIGRET ret
= CR_SUCCESS
;
2557 TRACE("CM_Get_Class_Key_Name_ExA(%p %p %p %lx %p)\n",
2558 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2560 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2561 return CR_INVALID_POINTER
;
2563 ulOrigLength
= *pulLength
;
2566 ulLength
= MAX_GUID_STRING_LEN
;
2567 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2569 if (ret
== CR_SUCCESS
)
2571 if (WideCharToMultiByte(CP_ACP
,
2581 *pulLength
= lstrlenA(pszKeyName
) + 1;
2588 /***********************************************************************
2589 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
2593 CM_Get_Class_Key_Name_ExW(
2594 _In_ LPGUID ClassGuid
,
2595 _Out_writes_opt_(*pulLength
) LPWSTR pszKeyName
,
2596 _Inout_ PULONG pulLength
,
2598 _In_opt_ HMACHINE hMachine
)
2600 TRACE("CM_Get_Class_Key_Name_ExW(%p %p %p %lx %p)\n",
2601 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2603 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2604 return CR_INVALID_POINTER
;
2607 return CR_INVALID_FLAG
;
2609 if (*pulLength
< MAX_GUID_STRING_LEN
)
2612 return CR_BUFFER_SMALL
;
2615 if (!GuidToString(ClassGuid
, pszKeyName
))
2616 return CR_INVALID_DATA
;
2618 *pulLength
= MAX_GUID_STRING_LEN
;
2624 /***********************************************************************
2625 * CM_Get_Class_NameA [SETUPAPI.@]
2630 _In_ LPGUID ClassGuid
,
2631 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2632 _Inout_ PULONG pulLength
,
2635 TRACE("CM_Get_Class_NameA(%p %p %p %lx)\n",
2636 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2638 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2643 /***********************************************************************
2644 * CM_Get_Class_NameW [SETUPAPI.@]
2649 _In_ LPGUID ClassGuid
,
2650 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2651 _Inout_ PULONG pulLength
,
2654 TRACE("CM_Get_Class_NameW(%p %p %p %lx)\n",
2655 ClassGuid
, Buffer
, pulLength
, ulFlags
);
2657 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2662 /***********************************************************************
2663 * CM_Get_Class_Name_ExA [SETUPAPI.@]
2667 CM_Get_Class_Name_ExA(
2668 _In_ LPGUID ClassGuid
,
2669 _Out_writes_opt_(*pulLength
) PCHAR Buffer
,
2670 _Inout_ PULONG pulLength
,
2672 _In_opt_ HMACHINE hMachine
)
2674 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
2675 CONFIGRET ret
= CR_SUCCESS
;
2679 TRACE("CM_Get_Class_Name_ExA(%p %p %p %lx %p)\n",
2680 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2682 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2683 return CR_INVALID_POINTER
;
2685 ulOrigLength
= *pulLength
;
2688 ulLength
= MAX_CLASS_NAME_LEN
;
2689 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2691 if (ret
== CR_SUCCESS
)
2693 if (WideCharToMultiByte(CP_ACP
,
2703 *pulLength
= lstrlenA(Buffer
) + 1;
2710 /***********************************************************************
2711 * CM_Get_Class_Name_ExW [SETUPAPI.@]
2715 CM_Get_Class_Name_ExW(
2716 _In_ LPGUID ClassGuid
,
2717 _Out_writes_opt_(*pulLength
) PWCHAR Buffer
,
2718 _Inout_ PULONG pulLength
,
2720 _In_opt_ HMACHINE hMachine
)
2722 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
2723 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2726 TRACE("CM_Get_Class_Name_ExW(%p %p %p %lx %p\n",
2727 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2729 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2730 return CR_INVALID_POINTER
;
2733 return CR_INVALID_FLAG
;
2735 if (!GuidToString(ClassGuid
, szGuidString
))
2736 return CR_INVALID_DATA
;
2738 TRACE("Guid %s\n", debugstr_w(szGuidString
));
2740 if (hMachine
!= NULL
)
2742 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2743 if (BindingHandle
== NULL
)
2748 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2754 ret
= PNP_GetClassName(BindingHandle
,
2760 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2762 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2770 /***********************************************************************
2771 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
2775 CM_Get_Class_Registry_PropertyA(
2778 PULONG pulRegDataType
,
2784 PWSTR BufferW
= NULL
;
2789 TRACE("CM_Get_Class_Registry_PropertyA(%p %lu %p %p %p %lx %p)\n",
2790 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2793 if (pulLength
== NULL
)
2794 return CR_INVALID_POINTER
;
2796 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2797 return CR_INVALID_PROPERTY
;
2799 ulType
= GetRegistryPropertyType(ulProperty
);
2800 if (ulType
== REG_SZ
|| ulType
== REG_MULTI_SZ
)
2802 /* Get the required buffer size */
2803 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2804 NULL
, &ulLength
, ulFlags
, hMachine
);
2805 if (ret
!= CR_BUFFER_SMALL
)
2808 /* Allocate the unicode buffer */
2809 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLength
);
2810 if (BufferW
== NULL
)
2811 return CR_OUT_OF_MEMORY
;
2813 /* Get the property */
2814 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2815 BufferW
, &ulLength
, ulFlags
, hMachine
);
2816 if (ret
!= CR_SUCCESS
)
2818 HeapFree(GetProcessHeap(), 0, BufferW
);
2822 /* Do W->A conversion */
2823 *pulLength
= WideCharToMultiByte(CP_ACP
,
2826 lstrlenW(BufferW
) + 1,
2832 /* Release the unicode buffer */
2833 HeapFree(GetProcessHeap(), 0, BufferW
);
2835 if (*pulLength
== 0)
2840 /* Get the property */
2841 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2842 Buffer
, pulLength
, ulFlags
, hMachine
);
2849 /***********************************************************************
2850 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
2854 CM_Get_Class_Registry_PropertyW(
2857 PULONG pulRegDataType
,
2863 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2864 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
2866 ULONG ulTransferLength
= 0;
2869 TRACE("CM_Get_Class_Registry_PropertyW(%p %lu %p %p %p %lx %p)\n",
2870 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2873 if (ClassGuid
== NULL
|| pulLength
== NULL
)
2874 return CR_INVALID_POINTER
;
2877 return CR_INVALID_FLAG
;
2879 if (pSetupStringFromGuid(ClassGuid
,
2881 PNP_MAX_GUID_STRING_LEN
) != 0)
2882 return CR_INVALID_DATA
;
2884 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2885 return CR_INVALID_PROPERTY
;
2887 if (hMachine
!= NULL
)
2889 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2890 if (BindingHandle
== NULL
)
2895 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2899 ulTransferLength
= *pulLength
;
2903 ret
= PNP_GetClassRegProp(BindingHandle
,
2912 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2914 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2918 if (ret
== CR_SUCCESS
)
2920 if (pulRegDataType
!= NULL
)
2921 *pulRegDataType
= ulType
;
2928 /***********************************************************************
2929 * CM_Get_Depth [SETUPAPI.@]
2934 _Out_ PULONG pulDepth
,
2935 _In_ DEVINST dnDevInst
,
2938 TRACE("CM_Get_Depth(%p %lx %lx)\n",
2939 pulDepth
, dnDevInst
, ulFlags
);
2941 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
2945 /***********************************************************************
2946 * CM_Get_Depth_Ex [SETUPAPI.@]
2951 _Out_ PULONG pulDepth
,
2952 _In_ DEVINST dnDevInst
,
2954 _In_opt_ HMACHINE hMachine
)
2956 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2957 HSTRING_TABLE StringTable
= NULL
;
2961 TRACE("CM_Get_Depth_Ex(%p %lx %lx %p)\n",
2962 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
2964 if (pulDepth
== NULL
)
2965 return CR_INVALID_POINTER
;
2968 return CR_INVALID_DEVINST
;
2971 return CR_INVALID_FLAG
;
2973 if (hMachine
!= NULL
)
2975 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2976 if (BindingHandle
== NULL
)
2979 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2980 if (StringTable
== 0)
2985 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2989 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2990 if (lpDevInst
== NULL
)
2991 return CR_INVALID_DEVNODE
;
2995 ret
= PNP_GetDepth(BindingHandle
,
3000 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3002 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3010 /***********************************************************************
3011 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
3015 CM_Get_DevNode_Custom_PropertyA(
3016 _In_ DEVINST dnDevInst
,
3017 _In_ PCSTR pszCustomPropertyName
,
3018 _Out_opt_ PULONG pulRegDataType
,
3019 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3020 _Inout_ PULONG pulLength
,
3023 TRACE("CM_Get_DevNode_Custom_PropertyA(%lx %s %p %p %p %lx)\n",
3024 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
3025 Buffer
, pulLength
, ulFlags
);
3027 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
3028 pulRegDataType
, Buffer
,
3029 pulLength
, ulFlags
, NULL
);
3033 /***********************************************************************
3034 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
3038 CM_Get_DevNode_Custom_PropertyW(
3039 _In_ DEVINST dnDevInst
,
3040 _In_ PCWSTR pszCustomPropertyName
,
3041 _Out_opt_ PULONG pulRegDataType
,
3042 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3043 _Inout_ PULONG pulLength
,
3046 TRACE("CM_Get_DevNode_Custom_PropertyW(%lx %s %p %p %p %lx)\n",
3047 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
3048 Buffer
, pulLength
, ulFlags
);
3050 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
3051 pulRegDataType
, Buffer
,
3052 pulLength
, ulFlags
, NULL
);
3056 /***********************************************************************
3057 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
3061 CM_Get_DevNode_Custom_Property_ExA(
3062 _In_ DEVINST dnDevInst
,
3063 _In_ PCSTR pszCustomPropertyName
,
3064 _Out_opt_ PULONG pulRegDataType
,
3065 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3066 _Inout_ PULONG pulLength
,
3068 _In_opt_ HMACHINE hMachine
)
3070 LPWSTR pszPropertyNameW
= NULL
;
3073 ULONG ulDataType
= REG_NONE
;
3076 TRACE("CM_Get_DevNode_Custom_Property_ExA(%lx %s %p %p %p %lx %p)\n",
3077 dnDevInst
, pszCustomPropertyName
, pulRegDataType
,
3078 Buffer
, pulLength
, ulFlags
, hMachine
);
3081 return CR_INVALID_POINTER
;
3083 ulLengthW
= *pulLength
* sizeof(WCHAR
);
3084 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
3086 return CR_OUT_OF_MEMORY
;
3088 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
3090 if (pszPropertyNameW
== NULL
)
3092 HeapFree(GetProcessHeap(), 0, BufferW
);
3093 return CR_OUT_OF_MEMORY
;
3096 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
3103 if (ret
== CR_SUCCESS
)
3105 if (ulDataType
== REG_SZ
||
3106 ulDataType
== REG_EXPAND_SZ
||
3107 ulDataType
== REG_MULTI_SZ
)
3109 /* Do W->A conversion */
3110 *pulLength
= WideCharToMultiByte(CP_ACP
,
3113 lstrlenW(BufferW
) + 1,
3118 if (*pulLength
== 0)
3123 /* Directly copy the value */
3124 if (ulLengthW
<= *pulLength
)
3125 memcpy(Buffer
, BufferW
, ulLengthW
);
3128 *pulLength
= ulLengthW
;
3129 ret
= CR_BUFFER_SMALL
;
3135 *pulRegDataType
= ulDataType
;
3137 HeapFree(GetProcessHeap(), 0, BufferW
);
3138 MyFree(pszPropertyNameW
);
3144 /***********************************************************************
3145 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
3149 CM_Get_DevNode_Custom_Property_ExW(
3150 _In_ DEVINST dnDevInst
,
3151 _In_ PCWSTR pszCustomPropertyName
,
3152 _Out_opt_ PULONG pulRegDataType
,
3153 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3154 _Inout_ PULONG pulLength
,
3156 _In_opt_ HMACHINE hMachine
)
3158 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3159 HSTRING_TABLE StringTable
= NULL
;
3161 ULONG ulDataType
= REG_NONE
;
3162 ULONG ulTransferLength
;
3163 CONFIGRET ret
= CR_SUCCESS
;
3165 TRACE("CM_Get_DevNode_Custom_Property_ExW(%lx %s %p %p %p %lx %p)\n",
3166 dnDevInst
, debugstr_w(pszCustomPropertyName
), pulRegDataType
,
3167 Buffer
, pulLength
, ulFlags
, hMachine
);
3170 return CR_INVALID_DEVNODE
;
3172 if (pszCustomPropertyName
== NULL
||
3173 pulLength
== NULL
||
3175 return CR_INVALID_POINTER
;
3177 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
3178 return CR_INVALID_FLAG
;
3180 if (hMachine
!= NULL
)
3182 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3183 if (BindingHandle
== NULL
)
3186 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3187 if (StringTable
== 0)
3192 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3196 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3197 if (lpDevInst
== NULL
)
3198 return CR_INVALID_DEVNODE
;
3200 ulTransferLength
= *pulLength
;
3204 ret
= PNP_GetCustomDevProp(BindingHandle
,
3206 (LPWSTR
)pszCustomPropertyName
,
3213 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3215 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3219 if (ret
== CR_SUCCESS
)
3221 if (pulRegDataType
!= NULL
)
3222 *pulRegDataType
= ulDataType
;
3229 /***********************************************************************
3230 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
3234 CM_Get_DevNode_Registry_PropertyA(
3235 _In_ DEVINST dnDevInst
,
3236 _In_ ULONG ulProperty
,
3237 _Out_opt_ PULONG pulRegDataType
,
3238 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3239 _Inout_ PULONG pulLength
,
3242 TRACE("CM_Get_DevNode_Registry_PropertyA(%lx %lu %p %p %p %lx)\n",
3243 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3245 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
3246 pulRegDataType
, Buffer
,
3247 pulLength
, ulFlags
, NULL
);
3251 /***********************************************************************
3252 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
3256 CM_Get_DevNode_Registry_PropertyW(
3257 _In_ DEVINST dnDevInst
,
3258 _In_ ULONG ulProperty
,
3259 _Out_opt_ PULONG pulRegDataType
,
3260 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3261 _Inout_ PULONG pulLength
,
3264 TRACE("CM_Get_DevNode_Registry_PropertyW(%lx %lu %p %p %p %lx)\n",
3265 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
3267 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
3268 pulRegDataType
, Buffer
,
3269 pulLength
, ulFlags
, NULL
);
3273 /***********************************************************************
3274 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
3278 CM_Get_DevNode_Registry_Property_ExA(
3279 _In_ DEVINST dnDevInst
,
3280 _In_ ULONG ulProperty
,
3281 _Out_opt_ PULONG pulRegDataType
,
3282 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3283 _Inout_ PULONG pulLength
,
3285 _In_opt_ HMACHINE hMachine
)
3289 ULONG ulDataType
= REG_NONE
;
3292 TRACE("CM_Get_DevNode_Registry_Property_ExA(%lx %lu %p %p %p %lx %p)\n",
3293 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3297 return CR_INVALID_POINTER
;
3299 LengthW
= *pulLength
* sizeof(WCHAR
);
3300 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
3303 return CR_OUT_OF_MEMORY
;
3305 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
3313 if (ret
== CR_SUCCESS
)
3315 if (ulDataType
== REG_SZ
||
3316 ulDataType
== REG_EXPAND_SZ
||
3317 ulDataType
== REG_MULTI_SZ
)
3319 /* Do W->A conversion */
3320 *pulLength
= WideCharToMultiByte(CP_ACP
,
3323 lstrlenW(BufferW
) + 1,
3328 if (*pulLength
== 0)
3333 /* Directly copy the value */
3334 if (LengthW
<= *pulLength
)
3335 memcpy(Buffer
, BufferW
, LengthW
);
3338 *pulLength
= LengthW
;
3339 ret
= CR_BUFFER_SMALL
;
3345 *pulRegDataType
= ulDataType
;
3347 HeapFree(GetProcessHeap(), 0, BufferW
);
3353 /***********************************************************************
3354 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
3358 CM_Get_DevNode_Registry_Property_ExW(
3359 _In_ DEVINST dnDevInst
,
3360 _In_ ULONG ulProperty
,
3361 _Out_opt_ PULONG pulRegDataType
,
3362 _Out_writes_bytes_opt_(*pulLength
) PVOID Buffer
,
3363 _Inout_ PULONG pulLength
,
3365 _In_opt_ HMACHINE hMachine
)
3367 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3368 HSTRING_TABLE StringTable
= NULL
;
3369 CONFIGRET ret
= CR_SUCCESS
;
3371 ULONG ulDataType
= REG_NONE
;
3372 ULONG ulTransferLength
= 0;
3374 TRACE("CM_Get_DevNode_Registry_Property_ExW(%lx %lu %p %p %p %lx %p)\n",
3375 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
3379 return CR_INVALID_DEVNODE
;
3381 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
3382 return CR_INVALID_PROPERTY
;
3384 /* pulRegDataType is optional */
3386 /* Buffer is optional */
3388 if (pulLength
== NULL
)
3389 return CR_INVALID_POINTER
;
3391 if (*pulLength
== 0)
3392 return CR_INVALID_POINTER
;
3395 return CR_INVALID_FLAG
;
3397 if (hMachine
!= NULL
)
3399 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3400 if (BindingHandle
== NULL
)
3403 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3404 if (StringTable
== 0)
3409 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3413 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3414 if (lpDevInst
== NULL
)
3415 return CR_INVALID_DEVNODE
;
3417 ulTransferLength
= *pulLength
;
3421 ret
= PNP_GetDeviceRegProp(BindingHandle
,
3430 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3432 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3436 if (ret
== CR_SUCCESS
)
3438 if (pulRegDataType
!= NULL
)
3439 *pulRegDataType
= ulDataType
;
3446 /***********************************************************************
3447 * CM_Get_DevNode_Status [SETUPAPI.@]
3451 CM_Get_DevNode_Status(
3452 _Out_ PULONG pulStatus
,
3453 _Out_ PULONG pulProblemNumber
,
3454 _In_ DEVINST dnDevInst
,
3457 TRACE("CM_Get_DevNode_Status(%p %p %lx %lx)\n",
3458 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
3460 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
3465 /***********************************************************************
3466 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
3470 CM_Get_DevNode_Status_Ex(
3471 _Out_ PULONG pulStatus
,
3472 _Out_ PULONG pulProblemNumber
,
3473 _In_ DEVINST dnDevInst
,
3475 _In_opt_ HMACHINE hMachine
)
3477 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3478 HSTRING_TABLE StringTable
= NULL
;
3482 TRACE("CM_Get_DevNode_Status_Ex(%p %p %lx %lx %p)\n",
3483 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
3485 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
3486 return CR_INVALID_POINTER
;
3489 return CR_INVALID_DEVINST
;
3492 return CR_INVALID_FLAG
;
3494 if (hMachine
!= NULL
)
3496 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3497 if (BindingHandle
== NULL
)
3500 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3501 if (StringTable
== 0)
3506 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3510 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3511 if (lpDevInst
== NULL
)
3512 return CR_INVALID_DEVNODE
;
3516 ret
= PNP_GetDeviceStatus(BindingHandle
,
3522 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3524 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3532 /***********************************************************************
3533 * CM_Get_Device_IDA [SETUPAPI.@]
3538 _In_ DEVINST dnDevInst
,
3539 _Out_writes_(BufferLen
) PCHAR Buffer
,
3540 _In_ ULONG BufferLen
,
3543 TRACE("CM_Get_Device_IDA(%lx %p %lu %lx)\n",
3544 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3546 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3550 /***********************************************************************
3551 * CM_Get_Device_IDW [SETUPAPI.@]
3556 _In_ DEVINST dnDevInst
,
3557 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3558 _In_ ULONG BufferLen
,
3561 TRACE("CM_Get_Device_IDW(%lx %p %lu %lx)\n",
3562 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
3564 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
3568 /***********************************************************************
3569 * CM_Get_Device_ID_ExA [SETUPAPI.@]
3573 CM_Get_Device_ID_ExA(
3574 _In_ DEVINST dnDevInst
,
3575 _Out_writes_(BufferLen
) PCHAR Buffer
,
3576 _In_ ULONG BufferLen
,
3578 _In_opt_ HMACHINE hMachine
)
3580 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
3581 CONFIGRET ret
= CR_SUCCESS
;
3583 TRACE("CM_Get_Device_ID_ExA(%lx %p %lu %lx %p)\n",
3584 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3587 return CR_INVALID_POINTER
;
3589 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
3594 if (ret
== CR_SUCCESS
)
3596 if (WideCharToMultiByte(CP_ACP
,
3599 lstrlenW(szBufferW
) + 1,
3611 /***********************************************************************
3612 * CM_Get_Device_ID_ExW [SETUPAPI.@]
3616 CM_Get_Device_ID_ExW(
3617 _In_ DEVINST dnDevInst
,
3618 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3619 _In_ ULONG BufferLen
,
3621 _In_opt_ HMACHINE hMachine
)
3623 HSTRING_TABLE StringTable
= NULL
;
3625 TRACE("CM_Get_Device_ID_ExW(%lx %p %lu %lx %p)\n",
3626 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3629 return CR_INVALID_DEVINST
;
3632 return CR_INVALID_POINTER
;
3635 return CR_INVALID_FLAG
;
3637 if (hMachine
!= NULL
)
3639 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3640 if (StringTable
== NULL
)
3645 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3649 if (!pSetupStringTableStringFromIdEx(StringTable
,
3659 /***********************************************************************
3660 * CM_Get_Device_ID_ListA [SETUPAPI.@]
3664 CM_Get_Device_ID_ListA(
3665 _In_ PCSTR pszFilter
,
3666 _Out_writes_(BufferLen
) PCHAR Buffer
,
3667 _In_ ULONG BufferLen
,
3670 TRACE("CM_Get_Device_ID_ListA(%p %p %lu %lx)\n",
3671 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3673 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
3678 /***********************************************************************
3679 * CM_Get_Device_ID_ListW [SETUPAPI.@]
3683 CM_Get_Device_ID_ListW(
3684 _In_ PCWSTR pszFilter
,
3685 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3686 _In_ ULONG BufferLen
,
3689 TRACE("CM_Get_Device_ID_ListW(%p %p %lu %lx)\n",
3690 pszFilter
, Buffer
, BufferLen
, ulFlags
);
3692 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
3697 /***********************************************************************
3698 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
3702 CM_Get_Device_ID_List_ExA(
3703 _In_ PCSTR pszFilter
,
3704 _Out_writes_(BufferLen
) PCHAR Buffer
,
3705 _In_ ULONG BufferLen
,
3707 _In_opt_ HMACHINE hMachine
)
3709 LPWSTR BufferW
= NULL
;
3710 LPWSTR pszFilterW
= NULL
;
3711 CONFIGRET ret
= CR_SUCCESS
;
3713 TRACE("CM_Get_Device_ID_List_ExA(%p %p %lu %lx %p)\n",
3714 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3716 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
3717 if (BufferW
== NULL
)
3718 return CR_OUT_OF_MEMORY
;
3720 if (pszFilter
== NULL
)
3722 ret
= CM_Get_Device_ID_List_ExW(NULL
,
3730 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3732 ret
= CR_INVALID_DEVICE_ID
;
3736 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
3745 if (WideCharToMultiByte(CP_ACP
,
3748 lstrlenW(BufferW
) + 1,
3762 /***********************************************************************
3763 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
3767 CM_Get_Device_ID_List_ExW(
3768 _In_ PCWSTR pszFilter
,
3769 _Out_writes_(BufferLen
) PWCHAR Buffer
,
3770 _In_ ULONG BufferLen
,
3772 _In_opt_ HMACHINE hMachine
)
3774 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3777 TRACE("CM_Get_Device_ID_List_ExW(%p %p %lu %lx %p)\n",
3778 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3780 if (Buffer
== NULL
|| BufferLen
== 0)
3781 return CR_INVALID_POINTER
;
3783 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3784 return CR_INVALID_FLAG
;
3786 if (hMachine
!= NULL
)
3788 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3789 if (BindingHandle
== NULL
)
3794 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3802 ret
= PNP_GetDeviceList(BindingHandle
,
3808 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3810 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3818 /***********************************************************************
3819 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
3823 CM_Get_Device_ID_List_SizeA(
3824 _Out_ PULONG pulLen
,
3825 _In_opt_ PCSTR pszFilter
,
3828 TRACE("CM_Get_Device_ID_List_SizeA(%p %s %lx)\n",
3829 pulLen
, debugstr_a(pszFilter
), ulFlags
);
3831 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
3835 /***********************************************************************
3836 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
3840 CM_Get_Device_ID_List_SizeW(
3841 _Out_ PULONG pulLen
,
3842 _In_opt_ PCWSTR pszFilter
,
3845 TRACE("CM_Get_Device_ID_List_SizeW(%p %s %lx)\n",
3846 pulLen
, debugstr_w(pszFilter
), ulFlags
);
3848 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
3852 /***********************************************************************
3853 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
3857 CM_Get_Device_ID_List_Size_ExA(
3858 _Out_ PULONG pulLen
,
3859 _In_opt_ PCSTR pszFilter
,
3861 _In_opt_ HMACHINE hMachine
)
3863 LPWSTR pszFilterW
= NULL
;
3864 CONFIGRET ret
= CR_SUCCESS
;
3866 FIXME("CM_Get_Device_ID_List_Size_ExA(%p %s %lx %p)\n",
3867 pulLen
, debugstr_a(pszFilter
), ulFlags
, hMachine
);
3869 if (pszFilter
== NULL
)
3871 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3878 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3879 return CR_INVALID_DEVICE_ID
;
3881 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3893 /***********************************************************************
3894 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
3898 CM_Get_Device_ID_List_Size_ExW(
3899 _Out_ PULONG pulLen
,
3900 _In_opt_ PCWSTR pszFilter
,
3902 _In_opt_ HMACHINE hMachine
)
3904 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3907 FIXME("CM_Get_Device_ID_List_Size_ExW(%p %s %lx %p)\n",
3908 pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
3911 return CR_INVALID_POINTER
;
3913 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3914 return CR_INVALID_FLAG
;
3916 if (hMachine
!= NULL
)
3918 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3919 if (BindingHandle
== NULL
)
3924 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3932 ret
= PNP_GetDeviceListSize(BindingHandle
,
3937 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3939 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3947 /***********************************************************************
3948 * CM_Get_Device_ID_Size [SETUPAPI.@]
3952 CM_Get_Device_ID_Size(
3953 _Out_ PULONG pulLen
,
3954 _In_ DEVINST dnDevInst
,
3957 TRACE("CM_Get_Device_ID_Size(%p %lx %lx)\n",
3958 pulLen
, dnDevInst
, ulFlags
);
3960 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
3964 /***********************************************************************
3965 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
3969 CM_Get_Device_ID_Size_Ex(
3970 _Out_ PULONG pulLen
,
3971 _In_ DEVINST dnDevInst
,
3973 _In_opt_ HMACHINE hMachine
)
3975 HSTRING_TABLE StringTable
= NULL
;
3978 TRACE("CM_Get_Device_ID_Size_Ex(%p %lx %lx %p)\n",
3979 pulLen
, dnDevInst
, ulFlags
, hMachine
);
3982 return CR_INVALID_POINTER
;
3985 return CR_INVALID_DEVINST
;
3988 return CR_INVALID_FLAG
;
3990 if (hMachine
!= NULL
)
3992 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3993 if (StringTable
== NULL
)
3998 if (!PnpGetLocalHandles(NULL
, &StringTable
))
4002 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4003 if (DeviceId
== NULL
)
4009 *pulLen
= lstrlenW(DeviceId
);
4015 /***********************************************************************
4016 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
4020 CM_Get_Device_Interface_AliasA(
4021 _In_ LPCSTR pszDeviceInterface
,
4022 _In_ LPGUID AliasInterfaceGuid
,
4023 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
4024 _Inout_ PULONG pulLength
,
4027 TRACE("CM_Get_Device_Interface_AliasA(%p %p %p %p %lx)\n",
4028 pszDeviceInterface
, AliasInterfaceGuid
,
4029 pszAliasDeviceInterface
, pulLength
, ulFlags
);
4031 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
4032 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
4037 /***********************************************************************
4038 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
4042 CM_Get_Device_Interface_AliasW(
4043 _In_ LPCWSTR pszDeviceInterface
,
4044 _In_ LPGUID AliasInterfaceGuid
,
4045 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
4046 _Inout_ PULONG pulLength
,
4049 TRACE("CM_Get_Device_Interface_AliasW(%p %p %p %p %lx)\n",
4050 pszDeviceInterface
, AliasInterfaceGuid
,
4051 pszAliasDeviceInterface
, pulLength
, ulFlags
);
4053 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
4054 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
4059 /***********************************************************************
4060 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
4064 CM_Get_Device_Interface_Alias_ExA(
4065 _In_ LPCSTR pszDeviceInterface
,
4066 _In_ LPGUID AliasInterfaceGuid
,
4067 _Out_writes_(*pulLength
) LPSTR pszAliasDeviceInterface
,
4068 _Inout_ PULONG pulLength
,
4070 _In_opt_ HMACHINE hMachine
)
4072 FIXME("CM_Get_Device_Interface_Alias_ExA(%p %p %p %p %lx %p)\n",
4073 pszDeviceInterface
, AliasInterfaceGuid
,
4074 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4076 return CR_CALL_NOT_IMPLEMENTED
;
4080 /***********************************************************************
4081 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
4085 CM_Get_Device_Interface_Alias_ExW(
4086 _In_ LPCWSTR pszDeviceInterface
,
4087 _In_ LPGUID AliasInterfaceGuid
,
4088 _Out_writes_(*pulLength
) LPWSTR pszAliasDeviceInterface
,
4089 _Inout_ PULONG pulLength
,
4091 _In_opt_ HMACHINE hMachine
)
4093 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4094 ULONG ulTransferLength
;
4095 CONFIGRET ret
= CR_SUCCESS
;
4097 TRACE("CM_Get_Device_Interface_Alias_ExW(%p %p %p %p %lx %p)\n",
4098 pszDeviceInterface
, AliasInterfaceGuid
,
4099 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
4101 if (pszDeviceInterface
== NULL
||
4102 AliasInterfaceGuid
== NULL
||
4103 pszAliasDeviceInterface
== NULL
||
4105 return CR_INVALID_POINTER
;
4108 return CR_INVALID_FLAG
;
4110 if (hMachine
!= NULL
)
4112 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4113 if (BindingHandle
== NULL
)
4118 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4122 ulTransferLength
= *pulLength
;
4126 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
4127 (LPWSTR
)pszDeviceInterface
,
4129 pszAliasDeviceInterface
,
4134 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4136 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4144 /***********************************************************************
4145 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
4149 CM_Get_Device_Interface_ListA(
4150 _In_ LPGUID InterfaceClassGuid
,
4151 _In_opt_ DEVINSTID_A pDeviceID
,
4152 _Out_writes_(BufferLen
) PCHAR Buffer
,
4153 _In_ ULONG BufferLen
,
4156 TRACE("CM_Get_Device_Interface_ListA(%s %s %p %lu 0x%08lx)\n",
4157 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4158 Buffer
, BufferLen
, ulFlags
);
4160 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
4161 Buffer
, BufferLen
, ulFlags
, NULL
);
4165 /***********************************************************************
4166 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
4170 CM_Get_Device_Interface_ListW(
4171 _In_ LPGUID InterfaceClassGuid
,
4172 _In_opt_ DEVINSTID_W pDeviceID
,
4173 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4174 _In_ ULONG BufferLen
,
4177 TRACE("CM_Get_Device_Interface_ListW(%s %s %p %lu 0x%08lx)\n",
4178 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4179 Buffer
, BufferLen
, ulFlags
);
4181 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
4182 Buffer
, BufferLen
, ulFlags
, NULL
);
4186 /***********************************************************************
4187 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
4191 CM_Get_Device_Interface_List_ExA(
4192 _In_ LPGUID InterfaceClassGuid
,
4193 _In_opt_ DEVINSTID_A pDeviceID
,
4194 _Out_writes_(BufferLen
) PCHAR Buffer
,
4195 _In_ ULONG BufferLen
,
4197 _In_opt_ HMACHINE hMachine
)
4199 DEVINSTID_W pDeviceIdW
= NULL
;
4200 PWCHAR BufferW
= NULL
;
4201 CONFIGRET ret
= CR_SUCCESS
;
4203 TRACE("CM_Get_Device_Interface_List_ExA(%s %s %p %lu 0x%08lx %p)\n",
4204 debugstr_guid(InterfaceClassGuid
), debugstr_a(pDeviceID
),
4205 Buffer
, BufferLen
, ulFlags
, hMachine
);
4207 if (Buffer
== NULL
||
4209 return CR_INVALID_POINTER
;
4211 if (pDeviceID
!= NULL
)
4213 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4214 return CR_INVALID_DEVICE_ID
;
4217 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
4218 if (BufferW
== NULL
)
4220 ret
= CR_OUT_OF_MEMORY
;
4224 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
4225 BufferW
, BufferLen
, ulFlags
,
4227 if (ret
!= CR_SUCCESS
)
4230 if (WideCharToMultiByte(CP_ACP
,
4233 lstrlenW(BufferW
) + 1,
4241 if (BufferW
!= NULL
)
4244 if (pDeviceIdW
!= NULL
)
4251 /***********************************************************************
4252 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
4256 CM_Get_Device_Interface_List_ExW(
4257 _In_ LPGUID InterfaceClassGuid
,
4258 _In_opt_ DEVINSTID_W pDeviceID
,
4259 _Out_writes_(BufferLen
) PWCHAR Buffer
,
4260 _In_ ULONG BufferLen
,
4262 _In_opt_ HMACHINE hMachine
)
4264 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4265 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
4266 CONFIGRET ret
= CR_SUCCESS
;
4268 TRACE("CM_Get_Device_Interface_List_ExW(%s %s %p %lu 0x%08lx %p)\n",
4269 debugstr_guid(InterfaceClassGuid
), debugstr_w(pDeviceID
),
4270 Buffer
, BufferLen
, ulFlags
, hMachine
);
4272 if (Buffer
== NULL
||
4274 return CR_INVALID_POINTER
;
4276 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4277 return CR_INVALID_FLAG
;
4279 if (hMachine
!= NULL
)
4281 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4282 if (BindingHandle
== NULL
)
4287 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4292 BufferSize
= BufferLen
;
4296 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
4303 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4305 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4313 /***********************************************************************
4314 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
4318 CM_Get_Device_Interface_List_SizeA(
4319 _Out_ PULONG pulLen
,
4320 _In_ LPGUID InterfaceClassGuid
,
4321 _In_opt_ DEVINSTID_A pDeviceID
,
4324 TRACE("CM_Get_Device_Interface_List_SizeA(%p %p %s 0x%08lx)\n",
4325 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
);
4327 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
4328 pDeviceID
, ulFlags
, NULL
);
4332 /***********************************************************************
4333 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
4337 CM_Get_Device_Interface_List_SizeW(
4338 _Out_ PULONG pulLen
,
4339 _In_ LPGUID InterfaceClassGuid
,
4340 _In_opt_ DEVINSTID_W pDeviceID
,
4343 TRACE("CM_Get_Device_Interface_List_SizeW(%p %p %s 0x%08lx)\n",
4344 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
);
4346 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4347 pDeviceID
, ulFlags
, NULL
);
4351 /***********************************************************************
4352 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
4356 CM_Get_Device_Interface_List_Size_ExA(
4357 _Out_ PULONG pulLen
,
4358 _In_ LPGUID InterfaceClassGuid
,
4359 _In_opt_ DEVINSTID_A pDeviceID
,
4361 _In_opt_ HMACHINE hMachine
)
4363 DEVINSTID_W pDeviceIdW
= NULL
;
4364 CONFIGRET ret
= CR_SUCCESS
;
4366 TRACE("CM_Get_Device_Interface_List_Size_ExA(%p %p %s 0x%08lx %p)\n",
4367 pulLen
, InterfaceClassGuid
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
4370 return CR_INVALID_POINTER
;
4372 if (pDeviceID
!= NULL
)
4374 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
4375 return CR_INVALID_DEVICE_ID
;
4380 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
4381 pDeviceIdW
, ulFlags
, hMachine
);
4383 if (pDeviceIdW
!= NULL
)
4390 /***********************************************************************
4391 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
4395 CM_Get_Device_Interface_List_Size_ExW(
4396 _Out_ PULONG pulLen
,
4397 _In_ LPGUID InterfaceClassGuid
,
4398 _In_opt_ DEVINSTID_W pDeviceID
,
4400 _In_opt_ HMACHINE hMachine
)
4402 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4403 CONFIGRET ret
= CR_SUCCESS
;
4405 TRACE("CM_Get_Device_Interface_List_Size_ExW(%p %p %s 0x%08lx %p)\n",
4406 pulLen
, InterfaceClassGuid
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
4409 return CR_INVALID_POINTER
;
4411 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
4412 return CR_INVALID_FLAG
;
4414 if (hMachine
!= NULL
)
4416 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4417 if (BindingHandle
== NULL
)
4422 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4430 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
4436 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4438 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4446 /***********************************************************************
4447 * CM_Get_First_Log_Conf [SETUPAPI.@]
4451 CM_Get_First_Log_Conf(
4452 _Out_opt_ PLOG_CONF plcLogConf
,
4453 _In_ DEVINST dnDevInst
,
4456 TRACE("CM_Get_First_Log_Conf(%p %lx %lx)\n",
4457 plcLogConf
, dnDevInst
, ulFlags
);
4459 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
4463 /***********************************************************************
4464 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
4468 CM_Get_First_Log_Conf_Ex(
4469 _Out_opt_ PLOG_CONF plcLogConf
,
4470 _In_ DEVINST dnDevInst
,
4472 _In_opt_ HMACHINE hMachine
)
4474 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4475 HSTRING_TABLE StringTable
= NULL
;
4476 LPWSTR lpDevInst
= NULL
;
4477 CONFIGRET ret
= CR_SUCCESS
;
4479 PLOG_CONF_INFO pLogConfInfo
;
4481 FIXME("CM_Get_First_Log_Conf_Ex(%p %lx %lx %p)\n",
4482 plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
4485 return CR_INVALID_DEVINST
;
4487 if (ulFlags
& ~LOG_CONF_BITS
)
4488 return CR_INVALID_FLAG
;
4493 if (hMachine
!= NULL
)
4495 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4496 if (BindingHandle
== NULL
)
4499 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4500 if (StringTable
== 0)
4505 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4509 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4510 if (lpDevInst
== NULL
)
4511 return CR_INVALID_DEVNODE
;
4515 ret
= PNP_GetFirstLogConf(BindingHandle
,
4521 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4523 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4527 if (ret
!= CR_SUCCESS
)
4532 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4533 if (pLogConfInfo
== NULL
)
4534 return CR_OUT_OF_MEMORY
;
4536 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4537 pLogConfInfo
->dnDevInst
= dnDevInst
;
4538 pLogConfInfo
->ulFlags
= ulFlags
;
4539 pLogConfInfo
->ulTag
= ulTag
;
4541 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
4548 /***********************************************************************
4549 * CM_Get_Global_State [SETUPAPI.@]
4553 CM_Get_Global_State(
4554 _Out_ PULONG pulState
,
4557 TRACE("CM_Get_Global_State(%p %lx)\n",
4560 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
4564 /***********************************************************************
4565 * CM_Get_Global_State_Ex [SETUPAPI.@]
4569 CM_Get_Global_State_Ex(
4570 _Out_ PULONG pulState
,
4572 _In_opt_ HMACHINE hMachine
)
4574 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4577 TRACE("CM_Get_Global_State_Ex(%p %lx %p)\n",
4578 pulState
, ulFlags
, hMachine
);
4580 if (pulState
== NULL
)
4581 return CR_INVALID_POINTER
;
4584 return CR_INVALID_FLAG
;
4586 if (hMachine
!= NULL
)
4588 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4589 if (BindingHandle
== NULL
)
4594 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4600 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
4602 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4604 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4612 /***********************************************************************
4613 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
4617 CM_Get_HW_Prof_FlagsA(
4618 _In_ DEVINSTID_A szDevInstName
,
4619 _In_ ULONG ulHardwareProfile
,
4620 _Out_ PULONG pulValue
,
4623 TRACE("CM_Get_HW_Prof_FlagsA(%s %lu %p %lx)\n",
4624 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4626 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
4627 pulValue
, ulFlags
, NULL
);
4631 /***********************************************************************
4632 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
4636 CM_Get_HW_Prof_FlagsW(
4637 _In_ DEVINSTID_W szDevInstName
,
4638 _In_ ULONG ulHardwareProfile
,
4639 _Out_ PULONG pulValue
,
4642 TRACE("CM_Get_HW_Prof_FlagsW(%s %lu %p %lx)\n",
4643 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
);
4645 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
4646 pulValue
, ulFlags
, NULL
);
4650 /***********************************************************************
4651 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
4655 CM_Get_HW_Prof_Flags_ExA(
4656 _In_ DEVINSTID_A szDevInstName
,
4657 _In_ ULONG ulHardwareProfile
,
4658 _Out_ PULONG pulValue
,
4660 _In_opt_ HMACHINE hMachine
)
4662 DEVINSTID_W pszDevIdW
= NULL
;
4663 CONFIGRET ret
= CR_SUCCESS
;
4665 TRACE("CM_Get_HW_Prof_Flags_ExA(%s %lu %p %lx %p)\n",
4666 debugstr_a(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4668 if (szDevInstName
!= NULL
)
4670 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
4671 return CR_INVALID_DEVICE_ID
;
4674 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
4675 pulValue
, ulFlags
, hMachine
);
4677 if (pszDevIdW
!= NULL
)
4684 /***********************************************************************
4685 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
4689 CM_Get_HW_Prof_Flags_ExW(
4690 _In_ DEVINSTID_W szDevInstName
,
4691 _In_ ULONG ulHardwareProfile
,
4692 _Out_ PULONG pulValue
,
4694 _In_opt_ HMACHINE hMachine
)
4696 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4699 FIXME("CM_Get_HW_Prof_Flags_ExW(%s %lu %p %lx %p)\n",
4700 debugstr_w(szDevInstName
), ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
4702 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
4703 return CR_INVALID_POINTER
;
4706 return CR_INVALID_FLAG
;
4708 /* FIXME: Check whether szDevInstName is valid */
4710 if (hMachine
!= NULL
)
4712 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4713 if (BindingHandle
== NULL
)
4718 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4724 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
4725 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
4727 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4729 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4737 /***********************************************************************
4738 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
4742 CM_Get_Hardware_Profile_InfoA(
4744 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4747 TRACE("CM_Get_Hardware_Profile_InfoA(%lu %p %lx)\n",
4748 ulIndex
, pHWProfileInfo
, ulFlags
);
4750 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
4755 /***********************************************************************
4756 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
4760 CM_Get_Hardware_Profile_InfoW(
4762 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4765 TRACE("CM_Get_Hardware_Profile_InfoW(%lu %p %lx)\n",
4766 ulIndex
, pHWProfileInfo
, ulFlags
);
4768 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
4773 /***********************************************************************
4774 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
4778 CM_Get_Hardware_Profile_Info_ExA(
4780 _Out_ PHWPROFILEINFO_A pHWProfileInfo
,
4782 _In_opt_ HMACHINE hMachine
)
4784 HWPROFILEINFO_W LocalProfileInfo
;
4787 TRACE("CM_Get_Hardware_Profile_Info_ExA(%lu %p %lx %p)\n",
4788 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4790 if (pHWProfileInfo
== NULL
)
4791 return CR_INVALID_POINTER
;
4793 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
4795 if (ret
== CR_SUCCESS
)
4797 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
4798 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
4800 if (WideCharToMultiByte(CP_ACP
,
4802 LocalProfileInfo
.HWPI_szFriendlyName
,
4803 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
4804 pHWProfileInfo
->HWPI_szFriendlyName
,
4815 /***********************************************************************
4816 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
4820 CM_Get_Hardware_Profile_Info_ExW(
4822 _Out_ PHWPROFILEINFO_W pHWProfileInfo
,
4824 _In_opt_ HMACHINE hMachine
)
4826 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4829 TRACE("CM_Get_Hardware_Profile_Info_ExW(%lu %p %lx %p)\n",
4830 ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4832 if (pHWProfileInfo
== NULL
)
4833 return CR_INVALID_POINTER
;
4836 return CR_INVALID_FLAG
;
4838 if (hMachine
!= NULL
)
4840 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4841 if (BindingHandle
== NULL
)
4846 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4852 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
4853 sizeof(HWPROFILEINFO_W
), 0);
4855 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4857 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4865 /***********************************************************************
4866 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
4870 CM_Get_Log_Conf_Priority(
4871 _In_ LOG_CONF lcLogConf
,
4872 _Out_ PPRIORITY pPriority
,
4875 TRACE("CM_Get_Log_Conf_Priority(%p %p %lx)\n",
4876 lcLogConf
, pPriority
, ulFlags
);
4878 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
4882 /***********************************************************************
4883 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
4887 CM_Get_Log_Conf_Priority_Ex(
4888 _In_ LOG_CONF lcLogConf
,
4889 _Out_ PPRIORITY pPriority
,
4891 _In_opt_ HMACHINE hMachine
)
4893 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4894 HSTRING_TABLE StringTable
= NULL
;
4895 PLOG_CONF_INFO pLogConfInfo
;
4899 FIXME("CM_Get_Log_Conf_Priority_Ex(%p %p %lx %p)\n",
4900 lcLogConf
, pPriority
, ulFlags
, hMachine
);
4902 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4903 if (!IsValidLogConf(pLogConfInfo
))
4904 return CR_INVALID_LOG_CONF
;
4906 if (pPriority
== NULL
)
4907 return CR_INVALID_POINTER
;
4910 return CR_INVALID_FLAG
;
4912 if (hMachine
!= NULL
)
4914 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4915 if (BindingHandle
== NULL
)
4918 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4919 if (StringTable
== 0)
4924 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4928 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4929 if (lpDevInst
== NULL
)
4930 return CR_INVALID_DEVNODE
;
4934 ret
= PNP_GetLogConfPriority(BindingHandle
,
4936 pLogConfInfo
->ulFlags
,
4937 pLogConfInfo
->ulTag
,
4941 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4943 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4951 /***********************************************************************
4952 * CM_Get_Next_Log_Conf [SETUPAPI.@]
4956 CM_Get_Next_Log_Conf(
4957 _Out_opt_ PLOG_CONF plcLogConf
,
4958 _In_ LOG_CONF lcLogConf
,
4961 TRACE("CM_Get_Next_Log_Conf(%p %p %lx)\n",
4962 plcLogConf
, lcLogConf
, ulFlags
);
4964 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
4968 /***********************************************************************
4969 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
4973 CM_Get_Next_Log_Conf_Ex(
4974 _Out_opt_ PLOG_CONF plcLogConf
,
4975 _In_ LOG_CONF lcLogConf
,
4977 _In_opt_ HMACHINE hMachine
)
4979 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4980 HSTRING_TABLE StringTable
= NULL
;
4981 PLOG_CONF_INFO pLogConfInfo
;
4982 PLOG_CONF_INFO pNewLogConfInfo
;
4987 FIXME("CM_Get_Next_Log_Conf_Ex(%p %p %lx %p)\n",
4988 plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
4993 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4994 if (!IsValidLogConf(pLogConfInfo
))
4995 return CR_INVALID_LOG_CONF
;
4998 return CR_INVALID_FLAG
;
5000 if (hMachine
!= NULL
)
5002 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5003 if (BindingHandle
== NULL
)
5006 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5007 if (StringTable
== 0)
5012 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5016 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
5017 if (lpDevInst
== NULL
)
5018 return CR_INVALID_DEVNODE
;
5022 ret
= PNP_GetNextLogConf(BindingHandle
,
5024 pLogConfInfo
->ulFlags
,
5025 pLogConfInfo
->ulTag
,
5029 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5031 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5035 if (ret
!= CR_SUCCESS
)
5040 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
5041 if (pNewLogConfInfo
== NULL
)
5042 return CR_OUT_OF_MEMORY
;
5044 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
5045 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
5046 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
5047 pNewLogConfInfo
->ulTag
= ulNewTag
;
5049 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
5056 /***********************************************************************
5057 * CM_Get_Next_Re_Des [SETUPAPI.@]
5061 CM_Get_Next_Res_Des(
5062 _Out_ PRES_DES prdResDes
,
5063 _In_ RES_DES rdResDes
,
5064 _In_ RESOURCEID ForResource
,
5065 _Out_opt_ PRESOURCEID pResourceID
,
5068 TRACE("CM_Get_Next_Res_Des(%p %p %lu %p %lx)\n",
5069 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
);
5071 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
5072 pResourceID
, ulFlags
, NULL
);
5076 /***********************************************************************
5077 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
5081 CM_Get_Next_Res_Des_Ex(
5082 _Out_ PRES_DES prdResDes
,
5083 _In_ RES_DES rdResDes
,
5084 _In_ RESOURCEID ForResource
,
5085 _Out_opt_ PRESOURCEID pResourceID
,
5087 _In_opt_ HMACHINE hMachine
)
5089 FIXME("CM_Get_Next_Res_Des_Ex(%p %p %lu %p %lx %p)\n",
5090 prdResDes
, rdResDes
, ForResource
, pResourceID
, ulFlags
, hMachine
);
5092 return CR_CALL_NOT_IMPLEMENTED
;
5096 /***********************************************************************
5097 * CM_Get_Parent [SETUPAPI.@]
5102 _Out_ PDEVINST pdnDevInst
,
5103 _In_ DEVINST dnDevInst
,
5106 TRACE("CM_Get_Parent(%p %p %lx)\n",
5107 pdnDevInst
, dnDevInst
, ulFlags
);
5109 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5113 /***********************************************************************
5114 * CM_Get_Parent_Ex [SETUPAPI.@]
5119 _Out_ PDEVINST pdnDevInst
,
5120 _In_ DEVINST dnDevInst
,
5122 _In_opt_ HMACHINE hMachine
)
5124 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5125 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5126 HSTRING_TABLE StringTable
= NULL
;
5128 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5131 TRACE("CM_Get_Parent_Ex(%p %lx %lx %p)\n",
5132 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5134 if (pdnDevInst
== NULL
)
5135 return CR_INVALID_POINTER
;
5138 return CR_INVALID_DEVINST
;
5141 return CR_INVALID_FLAG
;
5145 if (hMachine
!= NULL
)
5147 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5148 if (BindingHandle
== NULL
)
5151 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5152 if (StringTable
== 0)
5157 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5161 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5162 if (lpDevInst
== NULL
)
5163 return CR_INVALID_DEVNODE
;
5167 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5168 PNP_GET_PARENT_DEVICE_INSTANCE
,
5174 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5176 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5180 if (ret
!= CR_SUCCESS
)
5183 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5185 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5189 *pdnDevInst
= dwIndex
;
5195 /***********************************************************************
5196 * CM_Get_Res_Des_Data [SETUPAPI.@]
5200 CM_Get_Res_Des_Data(
5201 _In_ RES_DES rdResDes
,
5202 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5203 _In_ ULONG BufferLen
,
5206 TRACE("CM_Get_Res_Des_Data(%p %p %lu %lx)\n",
5207 rdResDes
, Buffer
, BufferLen
, ulFlags
);
5209 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
5213 /***********************************************************************
5214 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
5218 CM_Get_Res_Des_Data_Ex(
5219 _In_ RES_DES rdResDes
,
5220 _Out_writes_bytes_(BufferLen
) PVOID Buffer
,
5221 _In_ ULONG BufferLen
,
5223 _In_opt_ HMACHINE hMachine
)
5225 FIXME("CM_Get_Res_Des_Data_Ex(%p %p %lu %lx %p)\n",
5226 rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
5228 return CR_CALL_NOT_IMPLEMENTED
;
5232 /***********************************************************************
5233 * CM_Get_Res_Des_Size [SETUPAPI.@]
5237 CM_Get_Res_Des_Data_Size(
5238 _Out_ PULONG pulSize
,
5239 _In_ RES_DES rdResDes
,
5242 TRACE("CM_Get_Res_Des_Data_Size(%p %p %lx)\n",
5243 pulSize
, rdResDes
, ulFlags
);
5245 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
5249 /***********************************************************************
5250 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
5254 CM_Get_Res_Des_Data_Size_Ex(
5255 _Out_ PULONG pulSize
,
5256 _In_ RES_DES rdResDes
,
5258 _In_opt_ HMACHINE hMachine
)
5260 TRACE("CM_Get_Res_Des_Data_Size_Ex(%p %p %lx %p)\n",
5261 pulSize
, rdResDes
, ulFlags
, hMachine
);
5263 return CR_CALL_NOT_IMPLEMENTED
;
5267 /***********************************************************************
5268 * CM_Get_Resource_Conflict_Count [SETUPAPI.@]
5272 CM_Get_Resource_Conflict_Count(
5273 _In_ CONFLICT_LIST clConflictList
,
5274 _Out_ PULONG pulCount
)
5276 PCONFLICT_DATA pConflictData
;
5278 FIXME("CM_Get_Resource_Conflict_Count(%p %p)\n",
5279 clConflictList
, pulCount
);
5281 pConflictData
= (PCONFLICT_DATA
)clConflictList
;
5282 if (!IsValidConflictData(pConflictData
))
5283 return CR_INVALID_CONFLICT_LIST
;
5285 if (pulCount
== NULL
)
5286 return CR_INVALID_POINTER
;
5288 *pulCount
= pConflictData
->pConflictList
->ConflictsListed
;
5294 /***********************************************************************
5295 * CM_Get_Resource_Conflict_DetailsA [SETUPAPI.@]
5299 CM_Get_Resource_Conflict_DetailsA(
5300 _In_ CONFLICT_LIST clConflictList
,
5302 _Inout_ PCONFLICT_DETAILS_A pConflictDetails
)
5304 FIXME("CM_Get_Resource_Conflict_CountA(%p %lu %p)\n",
5305 clConflictList
, ulIndex
, pConflictDetails
);
5307 return CR_CALL_NOT_IMPLEMENTED
;
5311 /***********************************************************************
5312 * CM_Get_Resource_Conflict_DetailsW [SETUPAPI.@]
5316 CM_Get_Resource_Conflict_DetailsW(
5317 _In_ CONFLICT_LIST clConflictList
,
5319 _Inout_ PCONFLICT_DETAILS_W pConflictDetails
)
5321 FIXME("CM_Get_Resource_Conflict_CountW(%p %lu %p)\n",
5322 clConflictList
, ulIndex
, pConflictDetails
);
5324 return CR_CALL_NOT_IMPLEMENTED
;
5328 /***********************************************************************
5329 * CM_Get_Sibling [SETUPAPI.@]
5334 _Out_ PDEVINST pdnDevInst
,
5335 _In_ DEVINST dnDevInst
,
5338 TRACE("CM_Get_Sibling(%p %p %lx)\n",
5339 pdnDevInst
, dnDevInst
, ulFlags
);
5341 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
5345 /***********************************************************************
5346 * CM_Get_Sibling_Ex [SETUPAPI.@]
5351 _Out_ PDEVINST pdnDevInst
,
5352 _In_ DEVINST dnDevInst
,
5354 _In_opt_ HMACHINE hMachine
)
5356 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
5357 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5358 HSTRING_TABLE StringTable
= NULL
;
5360 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
5363 TRACE("CM_Get_Sibling_Ex(%p %lx %lx %p)\n",
5364 pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
5366 if (pdnDevInst
== NULL
)
5367 return CR_INVALID_POINTER
;
5370 return CR_INVALID_DEVINST
;
5373 return CR_INVALID_FLAG
;
5377 if (hMachine
!= NULL
)
5379 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5380 if (BindingHandle
== NULL
)
5383 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5384 if (StringTable
== 0)
5389 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5393 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5394 if (lpDevInst
== NULL
)
5395 return CR_INVALID_DEVNODE
;
5399 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
5400 PNP_GET_SIBLING_DEVICE_INSTANCE
,
5406 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5408 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5412 if (ret
!= CR_SUCCESS
)
5415 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
5417 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
5421 *pdnDevInst
= dwIndex
;
5427 /***********************************************************************
5428 * CM_Get_Version [SETUPAPI.@]
5432 CM_Get_Version(VOID
)
5434 TRACE("CM_Get_Version()\n");
5436 return CM_Get_Version_Ex(NULL
);
5440 /***********************************************************************
5441 * CM_Get_Version_Ex [SETUPAPI.@]
5446 _In_opt_ HMACHINE hMachine
)
5448 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5452 TRACE("CM_Get_Version_Ex(%p)\n", hMachine
);
5454 if (hMachine
!= NULL
)
5456 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5457 if (BindingHandle
== NULL
)
5462 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5468 ret
= PNP_GetVersion(BindingHandle
, &Version
);
5470 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5472 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5476 if (ret
!= CR_SUCCESS
)
5483 /***********************************************************************
5484 * CM_Intersect_Range_List [SETUPAPI.@]
5488 CM_Intersect_Range_List(
5489 _In_ RANGE_LIST rlhOld1
,
5490 _In_ RANGE_LIST rlhOld2
,
5491 _In_ RANGE_LIST rlhNew
,
5494 FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
5495 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5497 return CR_CALL_NOT_IMPLEMENTED
;
5501 /***********************************************************************
5502 * CM_Invert_Range_List [SETUPAPI.@]
5506 CM_Invert_Range_List(
5507 _In_ RANGE_LIST rlhOld
,
5508 _In_ RANGE_LIST rlhNew
,
5509 _In_ DWORDLONG ullMaxValue
,
5512 FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
5513 rlhOld
, rlhNew
, ullMaxValue
, ulFlags
);
5515 return CR_CALL_NOT_IMPLEMENTED
;
5519 /***********************************************************************
5520 * CM_Is_Dock_Station_Present [SETUPAPI.@]
5524 CM_Is_Dock_Station_Present(
5525 _Out_ PBOOL pbPresent
)
5527 TRACE("CM_Is_Dock_Station_Present(%p)\n",
5530 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
5534 /***********************************************************************
5535 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
5539 CM_Is_Dock_Station_Present_Ex(
5540 _Out_ PBOOL pbPresent
,
5541 _In_opt_ HMACHINE hMachine
)
5543 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5546 TRACE("CM_Is_Dock_Station_Present_Ex(%p %p)\n",
5547 pbPresent
, hMachine
);
5549 if (pbPresent
== NULL
)
5550 return CR_INVALID_POINTER
;
5554 if (hMachine
!= NULL
)
5556 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5557 if (BindingHandle
== NULL
)
5562 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5568 ret
= PNP_IsDockStationPresent(BindingHandle
,
5571 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5573 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5581 /***********************************************************************
5582 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5586 CM_Is_Version_Available(
5589 TRACE("CM_Is_Version_Available(%hu)\n",
5592 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
5596 /***********************************************************************
5597 * CM_Is_Version_Available_Ex [SETUPAPI.@]
5601 CM_Is_Version_Available_Ex(
5603 _In_opt_ HMACHINE hMachine
)
5605 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5606 WORD wServerVersion
;
5609 TRACE("CM_Is_Version_Available_Ex(%hu %p)\n",
5610 wVersion
, hMachine
);
5612 if (wVersion
<= 0x400)
5615 if (hMachine
!= NULL
)
5617 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5618 if (BindingHandle
== NULL
)
5623 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
5629 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
5631 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5633 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5637 if (ret
!= CR_SUCCESS
)
5640 return (wServerVersion
>= wVersion
);
5644 /***********************************************************************
5645 * CM_Locate_DevNodeA [SETUPAPI.@]
5650 _Out_ PDEVINST pdnDevInst
,
5651 _In_opt_ DEVINSTID_A pDeviceID
,
5654 TRACE("CM_Locate_DevNodeA(%p %s %lx)\n",
5655 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
);
5657 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5661 /***********************************************************************
5662 * CM_Locate_DevNodeW [SETUPAPI.@]
5667 _Out_ PDEVINST pdnDevInst
,
5668 _In_opt_ DEVINSTID_W pDeviceID
,
5671 TRACE("CM_Locate_DevNodeW(%p %s %lx)\n",
5672 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
5674 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
5678 /***********************************************************************
5679 * CM_Locate_DevNode_ExA [SETUPAPI.@]
5683 CM_Locate_DevNode_ExA(
5684 _Out_ PDEVINST pdnDevInst
,
5685 _In_opt_ DEVINSTID_A pDeviceID
,
5687 _In_opt_ HMACHINE hMachine
)
5689 DEVINSTID_W pDevIdW
= NULL
;
5690 CONFIGRET ret
= CR_SUCCESS
;
5692 TRACE("CM_Locate_DevNode_ExA(%p %s %lx %p)\n",
5693 pdnDevInst
, debugstr_a(pDeviceID
), ulFlags
, hMachine
);
5695 if (pDeviceID
!= NULL
)
5697 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
5698 return CR_INVALID_DEVICE_ID
;
5701 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
5703 if (pDevIdW
!= NULL
)
5710 /***********************************************************************
5711 * CM_Locate_DevNode_ExW [SETUPAPI.@]
5715 CM_Locate_DevNode_ExW(
5716 _Out_ PDEVINST pdnDevInst
,
5717 _In_opt_ DEVINSTID_W pDeviceID
,
5719 _In_opt_ HMACHINE hMachine
)
5721 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
5722 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5723 HSTRING_TABLE StringTable
= NULL
;
5724 CONFIGRET ret
= CR_SUCCESS
;
5726 TRACE("CM_Locate_DevNode_ExW(%p %s %lx %p)\n",
5727 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
5729 if (pdnDevInst
== NULL
)
5730 return CR_INVALID_POINTER
;
5732 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
5733 return CR_INVALID_FLAG
;
5735 if (hMachine
!= NULL
)
5737 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5738 if (BindingHandle
== NULL
)
5741 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5742 if (StringTable
== 0)
5747 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5751 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
5753 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
5759 /* Get the root device ID */
5760 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
5764 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5766 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5770 if (ret
!= CR_SUCCESS
)
5773 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
5777 /* Validate the device ID */
5778 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
5782 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5784 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5788 if (ret
== CR_SUCCESS
)
5790 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
5791 if (*pdnDevInst
== -1)
5799 /***********************************************************************
5800 * CM_Merge_Range_List [SETUPAPI.@]
5804 CM_Merge_Range_List(
5805 _In_ RANGE_LIST rlhOld1
,
5806 _In_ RANGE_LIST rlhOld2
,
5807 _In_ RANGE_LIST rlhNew
,
5810 FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
5811 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
5813 return CR_CALL_NOT_IMPLEMENTED
;
5817 /***********************************************************************
5818 * CM_Modify_Res_Des [SETUPAPI.@]
5823 _Out_ PRES_DES prdResDes
,
5824 _In_ RES_DES rdResDes
,
5825 _In_ RESOURCEID ResourceID
,
5826 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5827 _In_ ULONG ResourceLen
,
5830 TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
5831 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5832 ResourceLen
, ulFlags
);
5834 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5835 ResourceLen
, ulFlags
, NULL
);
5839 /***********************************************************************
5840 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
5844 CM_Modify_Res_Des_Ex(
5845 _Out_ PRES_DES prdResDes
,
5846 _In_ RES_DES rdResDes
,
5847 _In_ RESOURCEID ResourceID
,
5848 _In_reads_bytes_(ResourceLen
) PCVOID ResourceData
,
5849 _In_ ULONG ResourceLen
,
5851 _In_opt_ HMACHINE hMachine
)
5853 FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %p)\n",
5854 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
5855 ResourceLen
, ulFlags
, hMachine
);
5857 return CR_CALL_NOT_IMPLEMENTED
;
5861 /***********************************************************************
5862 * CM_Move_DevNode [SETUPAPI.@]
5867 _In_ DEVINST dnFromDevInst
,
5868 _In_ DEVINST dnToDevInst
,
5871 TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
5872 dnFromDevInst
, dnToDevInst
, ulFlags
);
5874 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
5878 /***********************************************************************
5879 * CM_Move_DevNode_Ex [SETUPAPI.@]
5884 _In_ DEVINST dnFromDevInst
,
5885 _In_ DEVINST dnToDevInst
,
5887 _In_opt_ HMACHINE hMachine
)
5889 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5890 HSTRING_TABLE StringTable
= NULL
;
5891 LPWSTR lpFromDevInst
;
5895 FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %p)\n",
5896 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
5898 if (!pSetupIsUserAdmin())
5899 return CR_ACCESS_DENIED
;
5901 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
5902 return CR_INVALID_DEVNODE
;
5905 return CR_INVALID_FLAG
;
5907 if (hMachine
!= NULL
)
5909 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5910 if (BindingHandle
== NULL
)
5913 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5914 if (StringTable
== 0)
5919 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5923 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
5924 if (lpFromDevInst
== NULL
)
5925 return CR_INVALID_DEVNODE
;
5927 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
5928 if (lpToDevInst
== NULL
)
5929 return CR_INVALID_DEVNODE
;
5933 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5939 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5941 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5949 /***********************************************************************
5950 * CM_Next_Range [SETUPAPI.@]
5955 _Inout_ PRANGE_ELEMENT preElement
,
5956 _Out_ PDWORDLONG pullStart
,
5957 _Out_ PDWORDLONG pullEnd
,
5960 PINTERNAL_RANGE_LIST pRangeList
;
5961 PINTERNAL_RANGE pRange
;
5962 PLIST_ENTRY ListEntry
;
5963 CONFIGRET ret
= CR_SUCCESS
;
5965 FIXME("CM_Next_Range(%p %p %p %lx)\n",
5966 preElement
, pullStart
, pullEnd
, ulFlags
);
5968 pRange
= (PINTERNAL_RANGE
)preElement
;
5970 if (pRange
== NULL
|| pRange
->pRangeList
== NULL
)
5973 if (pullStart
== NULL
|| pullEnd
== NULL
)
5974 return CR_INVALID_POINTER
;
5977 return CR_INVALID_FLAG
;
5979 pRangeList
= pRange
->pRangeList
;
5981 /* Lock the range list */
5982 WaitForSingleObject(pRangeList
->hMutex
, INFINITE
);
5984 /* Fail, if we reached the end of the list */
5985 if (pRange
->ListEntry
.Flink
== &pRangeList
->ListHead
)
5991 /* Get the next range */
5992 ListEntry
= pRangeList
->ListHead
.Flink
;
5993 pRange
= CONTAINING_RECORD(ListEntry
, INTERNAL_RANGE
, ListEntry
);
5995 /* Return the range data */
5996 *pullStart
= pRange
->ullStart
;
5997 *pullEnd
= pRange
->ullEnd
;
5998 *preElement
= (RANGE_ELEMENT
)pRange
;
6001 /* Unlock the range list */
6002 ReleaseMutex(pRangeList
->hMutex
);
6008 /***********************************************************************
6009 * CM_Open_Class_KeyA [SETUPAPI.@]
6014 _In_opt_ LPGUID pClassGuid
,
6015 _In_opt_ LPCSTR pszClassName
,
6016 _In_ REGSAM samDesired
,
6017 _In_ REGDISPOSITION Disposition
,
6018 _Out_ PHKEY phkClass
,
6021 TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
6022 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
6023 samDesired
, Disposition
, phkClass
, ulFlags
);
6025 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
6026 Disposition
, phkClass
, ulFlags
, NULL
);
6030 /***********************************************************************
6031 * CM_Open_Class_KeyW [SETUPAPI.@]
6036 _In_opt_ LPGUID pClassGuid
,
6037 _In_opt_ LPCWSTR pszClassName
,
6038 _In_ REGSAM samDesired
,
6039 _In_ REGDISPOSITION Disposition
,
6040 _Out_ PHKEY phkClass
,
6043 TRACE("CM_Open_Class_KeyW%p %s %lx %lx %p %lx)\n",
6044 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
6045 samDesired
, Disposition
, phkClass
, ulFlags
);
6047 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
6048 Disposition
, phkClass
, ulFlags
, NULL
);
6052 /***********************************************************************
6053 * CM_Open_Class_Key_ExA [SETUPAPI.@]
6057 CM_Open_Class_Key_ExA(
6058 _In_opt_ LPGUID pClassGuid
,
6059 _In_opt_ LPCSTR pszClassName
,
6060 _In_ REGSAM samDesired
,
6061 _In_ REGDISPOSITION Disposition
,
6062 _Out_ PHKEY phkClass
,
6064 _In_opt_ HMACHINE hMachine
)
6066 LPWSTR pszClassNameW
= NULL
;
6069 TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %p)\n",
6070 debugstr_guid(pClassGuid
), debugstr_a(pszClassName
),
6071 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
6073 if (pszClassName
!= NULL
)
6075 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
6076 return CR_INVALID_DATA
;
6079 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
6080 Disposition
, phkClass
, ulFlags
, hMachine
);
6082 if (pszClassNameW
!= NULL
)
6083 MyFree(pszClassNameW
);
6089 /***********************************************************************
6090 * CM_Open_Class_Key_ExW [SETUPAPI.@]
6094 CM_Open_Class_Key_ExW(
6095 _In_opt_ LPGUID pClassGuid
,
6096 _In_opt_ LPCWSTR pszClassName
,
6097 _In_ REGSAM samDesired
,
6098 _In_ REGDISPOSITION Disposition
,
6099 _Out_ PHKEY phkClass
,
6101 _In_opt_ HMACHINE hMachine
)
6103 WCHAR szKeyName
[MAX_PATH
];
6104 LPWSTR lpGuidString
;
6105 DWORD dwDisposition
;
6109 TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %p)\n",
6110 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
6111 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
6113 /* Check Disposition and ulFlags */
6114 if ((Disposition
& ~RegDisposition_Bits
) ||
6115 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
6116 return CR_INVALID_FLAG
;
6118 /* Check phkClass */
6119 if (phkClass
== NULL
)
6120 return CR_INVALID_POINTER
;
6124 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
6125 pszClassName
!= NULL
)
6126 return CR_INVALID_DATA
;
6128 if (hMachine
== NULL
)
6130 hKey
= HKEY_LOCAL_MACHINE
;
6134 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6137 return CR_REGISTRY_ERROR
;
6140 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
6142 lstrcpyW(szKeyName
, DeviceClasses
);
6146 lstrcpyW(szKeyName
, ControlClass
);
6149 if (pClassGuid
!= NULL
)
6151 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
6154 return CR_INVALID_DATA
;
6157 lstrcatW(szKeyName
, Backslash
);
6158 lstrcatW(szKeyName
, lpGuidString
);
6161 if (Disposition
== RegDisposition_OpenAlways
)
6163 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
6164 NULL
, phkClass
, &dwDisposition
);
6168 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
6173 if (pClassGuid
!= NULL
)
6174 RpcStringFreeW(&lpGuidString
);
6176 if (dwError
!= ERROR_SUCCESS
)
6179 return CR_NO_SUCH_REGISTRY_KEY
;
6182 if (pszClassName
!= NULL
)
6184 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
6185 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
6192 /***********************************************************************
6193 * CM_Open_DevNode_Key [SETUPAPI.@]
6197 CM_Open_DevNode_Key(
6198 _In_ DEVINST dnDevNode
,
6199 _In_ REGSAM samDesired
,
6200 _In_ ULONG ulHardwareProfile
,
6201 _In_ REGDISPOSITION Disposition
,
6202 _Out_ PHKEY phkDevice
,
6205 TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
6206 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
6208 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
6209 Disposition
, phkDevice
, ulFlags
, NULL
);
6213 /***********************************************************************
6214 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
6218 CM_Open_DevNode_Key_Ex(
6219 _In_ DEVINST dnDevNode
,
6220 _In_ REGSAM samDesired
,
6221 _In_ ULONG ulHardwareProfile
,
6222 _In_ REGDISPOSITION Disposition
,
6223 _Out_ PHKEY phkDevice
,
6225 _In_opt_ HMACHINE hMachine
)
6227 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6228 HSTRING_TABLE StringTable
= NULL
;
6229 LPWSTR pszDevInst
, pszKeyPath
= NULL
, pszInstancePath
= NULL
;
6231 DWORD dwDisposition
;
6232 HKEY hRootKey
= NULL
;
6233 CONFIGRET ret
= CR_CALL_NOT_IMPLEMENTED
;
6235 TRACE("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %p)\n",
6236 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
6238 if (phkDevice
== NULL
)
6239 return CR_INVALID_POINTER
;
6244 return CR_INVALID_DEVNODE
;
6246 if (ulFlags
& ~CM_REGISTRY_BITS
)
6247 return CR_INVALID_FLAG
;
6249 if (Disposition
& ~RegDisposition_Bits
)
6250 return CR_INVALID_DATA
;
6252 if (hMachine
!= NULL
)
6254 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6255 if (BindingHandle
== NULL
)
6258 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6259 if (StringTable
== 0)
6264 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6268 pszDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevNode
);
6269 if (pszDevInst
== NULL
)
6270 return CR_INVALID_DEVNODE
;
6272 TRACE("pszDevInst: %S\n", pszDevInst
);
6274 pszKeyPath
= MyMalloc(512 * sizeof(WCHAR
));
6275 if (pszKeyPath
== NULL
)
6277 ret
= CR_OUT_OF_MEMORY
;
6281 pszInstancePath
= MyMalloc(512 * sizeof(WCHAR
));
6282 if (pszInstancePath
== NULL
)
6284 ret
= CR_OUT_OF_MEMORY
;
6288 ret
= GetDeviceInstanceKeyPath(BindingHandle
,
6294 if (ret
!= CR_SUCCESS
)
6297 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6298 TRACE("pszInstancePath: %S\n", pszInstancePath
);
6300 wcscat(pszKeyPath
, L
"\\");
6301 wcscat(pszKeyPath
, pszInstancePath
);
6303 TRACE("pszKeyPath: %S\n", pszKeyPath
);
6305 if (hMachine
== NULL
)
6307 hRootKey
= HKEY_LOCAL_MACHINE
;
6311 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
6315 ret
= CR_REGISTRY_ERROR
;
6320 if (Disposition
== RegDisposition_OpenAlways
)
6322 lError
= RegCreateKeyExW(hRootKey
,
6334 lError
= RegOpenKeyExW(hRootKey
,
6341 if (lError
!= ERROR_SUCCESS
)
6344 ret
= CR_NO_SUCH_REGISTRY_KEY
;
6348 if ((hRootKey
!= NULL
) && (hRootKey
!= HKEY_LOCAL_MACHINE
))
6349 RegCloseKey(hRootKey
);
6351 if (pszInstancePath
!= NULL
)
6352 MyFree(pszInstancePath
);
6354 if (pszKeyPath
!= NULL
)
6361 /***********************************************************************
6362 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
6366 CM_Query_And_Remove_SubTreeA(
6367 _In_ DEVINST dnAncestor
,
6368 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6369 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6370 _In_ ULONG ulNameLength
,
6373 TRACE("CM_Query_And_Remove_SubTreeA(%lx %p %s %lu %lx)\n",
6374 dnAncestor
, pVetoType
, pszVetoName
, ulNameLength
, ulFlags
);
6376 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
6377 ulNameLength
, ulFlags
, NULL
);
6381 /***********************************************************************
6382 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
6386 CM_Query_And_Remove_SubTreeW(
6387 _In_ DEVINST dnAncestor
,
6388 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6389 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6390 _In_ ULONG ulNameLength
,
6393 TRACE("CM_Query_And_Remove_SubTreeW(%lx %p %s %lu %lx)\n",
6394 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
6396 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
6397 ulNameLength
, ulFlags
, NULL
);
6401 /***********************************************************************
6402 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
6406 CM_Query_And_Remove_SubTree_ExA(
6407 _In_ DEVINST dnAncestor
,
6408 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6409 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
6410 _In_ ULONG ulNameLength
,
6412 _In_opt_ HMACHINE hMachine
)
6414 LPWSTR lpLocalVetoName
;
6417 TRACE("CM_Query_And_Remove_SubTree_ExA(%lx %p %s %lu %lx %p)\n",
6418 dnAncestor
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
,
6421 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6422 return CR_INVALID_POINTER
;
6424 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
6425 if (lpLocalVetoName
== NULL
)
6426 return CR_OUT_OF_MEMORY
;
6428 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
6429 ulNameLength
, ulFlags
, hMachine
);
6430 if (ret
== CR_REMOVE_VETOED
)
6432 if (WideCharToMultiByte(CP_ACP
,
6443 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
6449 /***********************************************************************
6450 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
6454 CM_Query_And_Remove_SubTree_ExW(
6455 _In_ DEVINST dnAncestor
,
6456 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
6457 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
6458 _In_ ULONG ulNameLength
,
6460 _In_opt_ HMACHINE hMachine
)
6462 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6463 HSTRING_TABLE StringTable
= NULL
;
6467 TRACE("CM_Query_And_Remove_SubTree_ExW(%lx %p %s %lu %lx %p)\n",
6468 dnAncestor
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
,
6471 if (dnAncestor
== 0)
6472 return CR_INVALID_DEVNODE
;
6474 if (ulFlags
& ~CM_REMOVE_BITS
)
6475 return CR_INVALID_FLAG
;
6477 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6478 return CR_INVALID_POINTER
;
6480 if (hMachine
!= NULL
)
6482 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6483 if (BindingHandle
== NULL
)
6486 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6487 if (StringTable
== 0)
6492 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6496 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
6497 if (lpDevInst
== NULL
)
6498 return CR_INVALID_DEVNODE
;
6502 ret
= PNP_QueryRemove(BindingHandle
,
6509 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6511 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6519 /***********************************************************************
6520 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
6524 CM_Query_Arbitrator_Free_Data(
6525 _Out_writes_bytes_(DataLen
) PVOID pData
,
6527 _In_ DEVINST dnDevInst
,
6528 _In_ RESOURCEID ResourceID
,
6531 TRACE("CM_Query_Arbitrator_Free_Data(%p %lu %lx %lu 0x%08lx)\n",
6532 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
);
6534 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
6535 ResourceID
, ulFlags
, NULL
);
6539 /***********************************************************************
6540 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
6544 CM_Query_Arbitrator_Free_Data_Ex(
6545 _Out_writes_bytes_(DataLen
) PVOID pData
,
6547 _In_ DEVINST dnDevInst
,
6548 _In_ RESOURCEID ResourceID
,
6550 _In_opt_ HMACHINE hMachine
)
6552 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6553 HSTRING_TABLE StringTable
= NULL
;
6557 TRACE("CM_Query_Arbitrator_Free_Data_Ex(%p %lu %lx %lu 0x%08lx %p)\n",
6558 pData
, DataLen
, dnDevInst
, ResourceID
, ulFlags
, hMachine
);
6560 if (pData
== NULL
|| DataLen
== 0)
6561 return CR_INVALID_POINTER
;
6564 return CR_INVALID_DEVINST
;
6566 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6567 return CR_INVALID_FLAG
;
6569 if (hMachine
!= NULL
)
6571 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6572 if (BindingHandle
== NULL
)
6575 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6576 if (StringTable
== 0)
6581 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6585 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6586 if (lpDevInst
== NULL
)
6587 return CR_INVALID_DEVNODE
;
6591 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
6598 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6600 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6608 /***********************************************************************
6609 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
6613 CM_Query_Arbitrator_Free_Size(
6614 _Out_ PULONG pulSize
,
6615 _In_ DEVINST dnDevInst
,
6616 _In_ RESOURCEID ResourceID
,
6619 TRACE("CM_Query_Arbitrator_Free_Size(%p %lu %lx 0x%08lx)\n",
6620 pulSize
, dnDevInst
,ResourceID
, ulFlags
);
6622 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
6627 /***********************************************************************
6628 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
6632 CM_Query_Arbitrator_Free_Size_Ex(
6633 _Out_ PULONG pulSize
,
6634 _In_ DEVINST dnDevInst
,
6635 _In_ RESOURCEID ResourceID
,
6637 _In_opt_ HMACHINE hMachine
)
6639 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6640 HSTRING_TABLE StringTable
= NULL
;
6644 TRACE("CM_Query_Arbitrator_Free_Size_Ex(%p %lu %lx 0x%08lx %p)\n",
6645 pulSize
, dnDevInst
,ResourceID
, ulFlags
, hMachine
);
6647 if (pulSize
== NULL
)
6648 return CR_INVALID_POINTER
;
6651 return CR_INVALID_DEVINST
;
6653 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
6654 return CR_INVALID_FLAG
;
6656 if (hMachine
!= NULL
)
6658 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6659 if (BindingHandle
== NULL
)
6662 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6663 if (StringTable
== 0)
6668 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6672 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6673 if (lpDevInst
== NULL
)
6674 return CR_INVALID_DEVNODE
;
6678 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
6684 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6686 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6694 /***********************************************************************
6695 * CM_Query_Remove_SubTree [SETUPAPI.@]
6697 * This function is obsolete in Windows XP and above.
6701 CM_Query_Remove_SubTree(
6702 _In_ DEVINST dnAncestor
,
6705 TRACE("CM_Query_Remove_SubTree(%lx %lx)\n",
6706 dnAncestor
, ulFlags
);
6708 return CR_CALL_NOT_IMPLEMENTED
;
6712 /***********************************************************************
6713 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
6715 * This function is obsolete in Windows XP and above.
6719 CM_Query_Remove_SubTree_Ex(
6720 _In_ DEVINST dnAncestor
,
6722 _In_opt_ HMACHINE hMachine
)
6724 TRACE("CM_Query_Remove_SubTree_Ex(%lx %lx %p)\n",
6725 dnAncestor
, ulFlags
, hMachine
);
6727 return CR_CALL_NOT_IMPLEMENTED
;
6731 /***********************************************************************
6732 * CM_Query_Resource_Conflict_List [SETUPAPI.@]
6736 CM_Query_Resource_Conflict_List(
6737 _Out_ PCONFLICT_LIST pclConflictList
,
6738 _In_ DEVINST dnDevInst
,
6739 _In_ RESOURCEID ResourceID
,
6740 _In_ PCVOID ResourceData
,
6741 _In_ ULONG ResourceLen
,
6743 _In_opt_ HMACHINE hMachine
)
6745 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6746 HSTRING_TABLE StringTable
= NULL
;
6747 PPNP_CONFLICT_LIST pConflictBuffer
= NULL
;
6748 PCONFLICT_DATA pConflictData
= NULL
;
6749 ULONG ulBufferLength
;
6753 FIXME("CM_Query_Resource_Conflict_List(%p %lx %lu %p %lu %lx %p)\n",
6754 pclConflictList
, dnDevInst
, ResourceID
, ResourceData
,
6755 ResourceLen
, ulFlags
, hMachine
);
6758 return CR_INVALID_DEVNODE
;
6760 if (ulFlags
& ~CM_RESDES_WIDTH_BITS
)
6761 return CR_INVALID_FLAG
;
6763 if (pclConflictList
== NULL
||
6764 ResourceData
== NULL
||
6766 return CR_INVALID_POINTER
;
6768 if (ResourceID
== 0)
6769 return CR_INVALID_RESOURCEID
;
6771 *pclConflictList
= 0;
6773 if (hMachine
!= NULL
)
6775 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6776 if (BindingHandle
== NULL
)
6779 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6780 if (StringTable
== 0)
6785 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6789 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6790 if (lpDevInst
== NULL
)
6791 return CR_INVALID_DEVNODE
;
6793 pConflictData
= MyMalloc(sizeof(CONFLICT_DATA
));
6794 if (pConflictData
== NULL
)
6796 ret
= CR_OUT_OF_MEMORY
;
6800 ulBufferLength
= sizeof(PNP_CONFLICT_LIST
) +
6801 sizeof(PNP_CONFLICT_STRINGS
) +
6802 (sizeof(wchar_t) * 200);
6803 pConflictBuffer
= MyMalloc(ulBufferLength
);
6804 if (pConflictBuffer
== NULL
)
6806 ret
= CR_OUT_OF_MEMORY
;
6812 ret
= PNP_QueryResConfList(BindingHandle
,
6815 (PBYTE
)ResourceData
,
6817 (PBYTE
)pConflictBuffer
,
6821 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6823 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6827 if (ret
!= CR_SUCCESS
)
6830 pConflictData
->ulMagic
= CONFLICT_MAGIC
;
6831 pConflictData
->pConflictList
= pConflictBuffer
;
6833 *pclConflictList
= (CONFLICT_LIST
)pConflictData
;
6836 if (ret
!= CR_SUCCESS
)
6838 if (pConflictBuffer
!= NULL
)
6839 MyFree(pConflictBuffer
);
6841 if (pConflictData
!= NULL
)
6842 MyFree(pConflictData
);
6849 /***********************************************************************
6850 * CM_Reenumerate_DevNode [SETUPAPI.@]
6854 CM_Reenumerate_DevNode(
6855 _In_ DEVINST dnDevInst
,
6858 TRACE("CM_Reenumerate_DevNode(%lx %lx)\n",
6859 dnDevInst
, ulFlags
);
6861 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
6865 /***********************************************************************
6866 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
6869 CM_Reenumerate_DevNode_Ex(
6870 _In_ DEVINST dnDevInst
,
6872 _In_opt_ HMACHINE hMachine
)
6874 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6875 HSTRING_TABLE StringTable
= NULL
;
6879 FIXME("CM_Reenumerate_DevNode_Ex(%lx %lx %p)\n",
6880 dnDevInst
, ulFlags
, hMachine
);
6883 return CR_INVALID_DEVNODE
;
6885 if (ulFlags
& ~CM_REENUMERATE_BITS
)
6886 return CR_INVALID_FLAG
;
6888 if (hMachine
!= NULL
)
6890 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6891 if (BindingHandle
== NULL
)
6894 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6895 if (StringTable
== 0)
6900 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6904 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6905 if (lpDevInst
== NULL
)
6906 return CR_INVALID_DEVNODE
;
6910 ret
= PNP_DeviceInstanceAction(BindingHandle
,
6911 PNP_DEVINST_REENUMERATE
,
6916 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6918 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6926 /***********************************************************************
6927 * CM_Register_Device_Driver [SETUPAPI.@]
6931 CM_Register_Device_Driver(
6932 _In_ DEVINST dnDevInst
,
6935 TRACE("CM_Register_Device_Driver(%lx 0x%08lx)\n",
6936 dnDevInst
, ulFlags
);
6938 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
6942 /***********************************************************************
6943 * CM_Register_Device_Driver_Ex [SETUPAPI.@]
6947 CM_Register_Device_Driver_Ex(
6948 _In_ DEVINST dnDevInst
,
6950 _In_opt_ HMACHINE hMachine
)
6952 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6953 HSTRING_TABLE StringTable
= NULL
;
6957 TRACE("CM_Register_Device_Driver_Ex(%lx 0x%08lx %p)\n",
6958 dnDevInst
, ulFlags
, hMachine
);
6961 return CR_INVALID_DEVNODE
;
6963 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
6964 return CR_INVALID_FLAG
;
6966 if (hMachine
!= NULL
)
6968 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6969 if (BindingHandle
== NULL
)
6972 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6973 if (StringTable
== 0)
6978 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6982 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6983 if (lpDevInst
== NULL
)
6984 return CR_INVALID_DEVNODE
;
6988 ret
= PNP_RegisterDriver(BindingHandle
,
6992 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6994 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7002 /***********************************************************************
7003 * CM_Register_Device_InterfaceA [SETUPAPI.@]
7007 CM_Register_Device_InterfaceA(
7008 _In_ DEVINST dnDevInst
,
7009 _In_ LPGUID InterfaceClassGuid
,
7010 _In_opt_ LPCSTR pszReference
,
7011 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
7012 _Inout_ PULONG pulLength
,
7015 TRACE("CM_Register_Device_InterfaceA(%lx %s %s %p %p %lx)\n",
7016 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
7017 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
7019 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
7020 pszReference
, pszDeviceInterface
,
7021 pulLength
, ulFlags
, NULL
);
7025 /***********************************************************************
7026 * CM_Register_Device_InterfaceW [SETUPAPI.@]
7030 CM_Register_Device_InterfaceW(
7031 _In_ DEVINST dnDevInst
,
7032 _In_ LPGUID InterfaceClassGuid
,
7033 _In_opt_ LPCWSTR pszReference
,
7034 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
7035 _Inout_ PULONG pulLength
,
7038 TRACE("CM_Register_Device_InterfaceW(%lx %s %s %p %p %lx)\n",
7039 dnDevInst
, debugstr_guid(InterfaceClassGuid
),
7040 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
7042 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
7043 pszReference
, pszDeviceInterface
,
7044 pulLength
, ulFlags
, NULL
);
7048 /***********************************************************************
7049 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
7053 CM_Register_Device_Interface_ExA(
7054 _In_ DEVINST dnDevInst
,
7055 _In_ LPGUID InterfaceClassGuid
,
7056 _In_opt_ LPCSTR pszReference
,
7057 _Out_writes_(*pulLength
) LPSTR pszDeviceInterface
,
7058 _Inout_ PULONG pulLength
,
7060 _In_opt_ HMACHINE hMachine
)
7062 LPWSTR pszReferenceW
= NULL
;
7063 LPWSTR pszDeviceInterfaceW
= NULL
;
7067 TRACE("CM_Register_Device_Interface_ExA(%lx %s %s %p %p %lx %p)\n",
7068 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_a(pszReference
),
7069 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
7071 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
7072 return CR_INVALID_POINTER
;
7074 if (pszReference
!= NULL
)
7076 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
7077 return CR_INVALID_DATA
;
7080 ulLength
= *pulLength
;
7082 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
7083 if (pszDeviceInterfaceW
== NULL
)
7085 ret
= CR_OUT_OF_MEMORY
;
7089 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
7092 pszDeviceInterfaceW
,
7096 if (ret
== CR_SUCCESS
)
7098 if (WideCharToMultiByte(CP_ACP
,
7100 pszDeviceInterfaceW
,
7109 *pulLength
= ulLength
;
7112 if (pszDeviceInterfaceW
!= NULL
)
7113 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
7115 if (pszReferenceW
!= NULL
)
7116 MyFree(pszReferenceW
);
7122 /***********************************************************************
7123 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
7127 CM_Register_Device_Interface_ExW(
7128 _In_ DEVINST dnDevInst
,
7129 _In_ LPGUID InterfaceClassGuid
,
7130 _In_opt_ LPCWSTR pszReference
,
7131 _Out_writes_(*pulLength
) LPWSTR pszDeviceInterface
,
7132 _Inout_ PULONG pulLength
,
7134 _In_opt_ HMACHINE hMachine
)
7136 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7137 HSTRING_TABLE StringTable
= NULL
;
7139 ULONG ulTransferLength
;
7142 TRACE("CM_Register_Device_Interface_ExW(%lx %s %s %p %p %lx %p)\n",
7143 dnDevInst
, debugstr_guid(InterfaceClassGuid
), debugstr_w(pszReference
),
7144 pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
7147 return CR_INVALID_DEVNODE
;
7149 if (InterfaceClassGuid
== NULL
||
7150 pszDeviceInterface
== NULL
||
7152 return CR_INVALID_POINTER
;
7155 return CR_INVALID_FLAG
;
7157 if (hMachine
!= NULL
)
7159 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7160 if (BindingHandle
== NULL
)
7163 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7164 if (StringTable
== 0)
7169 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7173 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7174 if (lpDevInst
== NULL
)
7175 return CR_INVALID_DEVNODE
;
7177 ulTransferLength
= *pulLength
;
7181 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
7184 (LPWSTR
)pszReference
,
7190 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7192 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7200 /***********************************************************************
7201 * CM_Remove_SubTree [SETUPAPI.@]
7203 * This function is obsolete in Windows XP and above.
7208 _In_ DEVINST dnAncestor
,
7211 TRACE("CM_Remove_SubTree(%lx %lx)\n",
7212 dnAncestor
, ulFlags
);
7214 return CR_CALL_NOT_IMPLEMENTED
;
7218 /***********************************************************************
7219 * CM_Remove_SubTree_Ex [SETUPAPI.@]
7221 * This function is obsolete in Windows XP and above.
7225 CM_Remove_SubTree_Ex(
7226 _In_ DEVINST dnAncestor
,
7228 _In_opt_ HMACHINE hMachine
)
7230 TRACE("CM_Remove_SubTree_Ex(%lx %lx %p)\n",
7231 dnAncestor
, ulFlags
, hMachine
);
7233 return CR_CALL_NOT_IMPLEMENTED
;
7237 /***********************************************************************
7238 * CM_Request_Device_EjectA [SETUPAPI.@]
7242 CM_Request_Device_EjectA(
7243 _In_ DEVINST dnDevInst
,
7244 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7245 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7246 _In_ ULONG ulNameLength
,
7249 TRACE("CM_Request_Device_EjectA(%lx %p %s %lu %lx)\n",
7250 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
);
7252 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
7253 ulNameLength
, ulFlags
, NULL
);
7257 /***********************************************************************
7258 * CM_Request_Device_EjectW [SETUPAPI.@]
7262 CM_Request_Device_EjectW(
7263 _In_ DEVINST dnDevInst
,
7264 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7265 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7266 _In_ ULONG ulNameLength
,
7269 TRACE("CM_Request_Device_EjectW(%lx %p %s %lu %lx)\n",
7270 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
7272 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
7273 ulNameLength
, ulFlags
, NULL
);
7277 /***********************************************************************
7278 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
7282 CM_Request_Device_Eject_ExA(
7283 _In_ DEVINST dnDevInst
,
7284 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7285 _Out_writes_opt_(ulNameLength
) LPSTR pszVetoName
,
7286 _In_ ULONG ulNameLength
,
7288 _In_opt_ HMACHINE hMachine
)
7290 LPWSTR lpLocalVetoName
;
7293 TRACE("CM_Request_Device_Eject_ExA(%lx %p %s %lu %lx %p)\n",
7294 dnDevInst
, pVetoType
, debugstr_a(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7296 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7297 return CR_INVALID_POINTER
;
7299 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
7300 if (lpLocalVetoName
== NULL
)
7301 return CR_OUT_OF_MEMORY
;
7303 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
7304 ulNameLength
, ulFlags
, hMachine
);
7305 if (ret
== CR_REMOVE_VETOED
)
7307 if (WideCharToMultiByte(CP_ACP
,
7318 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
7324 /***********************************************************************
7325 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
7329 CM_Request_Device_Eject_ExW(
7330 _In_ DEVINST dnDevInst
,
7331 _Out_opt_ PPNP_VETO_TYPE pVetoType
,
7332 _Out_writes_opt_(ulNameLength
) LPWSTR pszVetoName
,
7333 _In_ ULONG ulNameLength
,
7335 _In_opt_ HMACHINE hMachine
)
7337 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7338 HSTRING_TABLE StringTable
= NULL
;
7342 TRACE("CM_Request_Device_Eject_ExW(%lx %p %s %lu %lx %p)\n",
7343 dnDevInst
, pVetoType
, debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
7346 return CR_INVALID_DEVNODE
;
7349 return CR_INVALID_FLAG
;
7351 if (pszVetoName
== NULL
&& ulNameLength
== 0)
7352 return CR_INVALID_POINTER
;
7354 if (hMachine
!= NULL
)
7356 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7357 if (BindingHandle
== NULL
)
7360 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7361 if (StringTable
== 0)
7366 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7370 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7371 if (lpDevInst
== NULL
)
7372 return CR_INVALID_DEVNODE
;
7376 ret
= PNP_RequestDeviceEject(BindingHandle
,
7383 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7385 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7393 /***********************************************************************
7394 * CM_Request_Eject_PC [SETUPAPI.@]
7398 CM_Request_Eject_PC(VOID
)
7400 TRACE("CM_Request_Eject_PC()\n");
7402 return CM_Request_Eject_PC_Ex(NULL
);
7406 /***********************************************************************
7407 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
7411 CM_Request_Eject_PC_Ex(
7412 _In_opt_ HMACHINE hMachine
)
7414 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7417 TRACE("CM_Request_Eject_PC_Ex(%p)\n", hMachine
);
7419 if (hMachine
!= NULL
)
7421 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7422 if (BindingHandle
== NULL
)
7427 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7433 ret
= PNP_RequestEjectPC(BindingHandle
);
7435 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7437 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7445 /***********************************************************************
7446 * CM_Run_Detection [SETUPAPI.@]
7453 TRACE("CM_Run_Detection(%lx)\n", ulFlags
);
7455 return CM_Run_Detection_Ex(ulFlags
, NULL
);
7459 /***********************************************************************
7460 * CM_Run_Detection_Ex [SETUPAPI.@]
7464 CM_Run_Detection_Ex(
7466 _In_opt_ HMACHINE hMachine
)
7468 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7471 TRACE("CM_Run_Detection_Ex(%lx %p)\n",
7474 if (!pSetupIsUserAdmin())
7475 return CR_ACCESS_DENIED
;
7477 if (ulFlags
& ~CM_DETECT_BITS
)
7478 return CR_INVALID_FLAG
;
7480 if (hMachine
!= NULL
)
7482 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7483 if (BindingHandle
== NULL
)
7488 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7494 ret
= PNP_RunDetection(BindingHandle
,
7497 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7499 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7507 /***********************************************************************
7508 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
7512 CM_Set_Class_Registry_PropertyA(
7513 _In_ LPGUID ClassGuid
,
7514 _In_ ULONG ulProperty
,
7515 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7516 _In_ ULONG ulLength
,
7518 _In_opt_ HMACHINE hMachine
)
7520 FIXME("CM_Set_Class_Registry_PropertyA(%p %lx %p %lu %lx %p)\n",
7521 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7523 return CR_CALL_NOT_IMPLEMENTED
;
7527 /***********************************************************************
7528 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
7532 CM_Set_Class_Registry_PropertyW(
7533 _In_ LPGUID ClassGuid
,
7534 _In_ ULONG ulProperty
,
7535 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7536 _In_ ULONG ulLength
,
7538 _In_opt_ HMACHINE hMachine
)
7540 FIXME("CM_Set_Class_Registry_PropertyW(%p %lx %p %lu %lx %p)\n",
7541 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7543 return CR_CALL_NOT_IMPLEMENTED
;
7547 /***********************************************************************
7548 * CM_Set_DevNode_Problem [SETUPAPI.@]
7552 CM_Set_DevNode_Problem(
7553 _In_ DEVINST dnDevInst
,
7554 _In_ ULONG ulProblem
,
7557 TRACE("CM_Set_DevNode_Problem(%lx %lx %lx)\n",
7558 dnDevInst
, ulProblem
, ulFlags
);
7560 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
7564 /***********************************************************************
7565 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
7569 CM_Set_DevNode_Problem_Ex(
7570 _In_ DEVINST dnDevInst
,
7571 _In_ ULONG ulProblem
,
7573 _In_opt_ HMACHINE hMachine
)
7575 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7576 HSTRING_TABLE StringTable
= NULL
;
7580 TRACE("CM_Set_DevNode_Problem_Ex(%lx %lx %lx %p)\n",
7581 dnDevInst
, ulProblem
, ulFlags
, hMachine
);
7584 return CR_INVALID_DEVNODE
;
7586 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
7587 return CR_INVALID_FLAG
;
7589 if (hMachine
!= NULL
)
7591 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7592 if (BindingHandle
== NULL
)
7595 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7596 if (StringTable
== 0)
7601 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7605 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7606 if (lpDevInst
== NULL
)
7607 return CR_INVALID_DEVNODE
;
7611 ret
= PNP_SetDeviceProblem(BindingHandle
,
7616 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7618 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7626 /***********************************************************************
7627 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
7631 CM_Set_DevNode_Registry_PropertyA(
7632 _In_ DEVINST dnDevInst
,
7633 _In_ ULONG ulProperty
,
7634 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7635 _In_ ULONG ulLength
,
7638 TRACE("CM_Set_DevNode_Registry_PropertyA(%lx %lu %p %lx %lx)\n",
7639 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7641 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
7647 /***********************************************************************
7648 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
7652 CM_Set_DevNode_Registry_PropertyW(
7653 _In_ DEVINST dnDevInst
,
7654 _In_ ULONG ulProperty
,
7655 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7656 _In_ ULONG ulLength
,
7659 TRACE("CM_Set_DevNode_Registry_PropertyW(%lx %lu %p %lx %lx)\n",
7660 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
7662 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
7668 /***********************************************************************
7669 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
7673 CM_Set_DevNode_Registry_Property_ExA(
7674 _In_ DEVINST dnDevInst
,
7675 _In_ ULONG ulProperty
,
7676 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7677 _In_ ULONG ulLength
,
7679 _In_opt_ HMACHINE hMachine
)
7681 CONFIGRET ret
= CR_SUCCESS
;
7685 FIXME("CM_Set_DevNode_Registry_Property_ExA(%lx %lu %p %lx %lx %p)\n",
7686 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7688 if (Buffer
== NULL
&& ulLength
!= 0)
7689 return CR_INVALID_POINTER
;
7691 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7692 return CR_INVALID_PROPERTY
;
7696 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7705 /* Get property type */
7706 ulType
= GetRegistryPropertyType(ulProperty
);
7708 /* Allocate buffer if needed */
7709 if (ulType
== REG_SZ
||
7710 ulType
== REG_MULTI_SZ
)
7712 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
7713 if (lpBuffer
== NULL
)
7715 ret
= CR_OUT_OF_MEMORY
;
7719 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
7720 ulLength
, lpBuffer
, ulLength
))
7727 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7730 ulLength
* sizeof(WCHAR
),
7739 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
7747 ret
= CR_CALL_NOT_IMPLEMENTED
;
7754 /***********************************************************************
7755 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
7759 CM_Set_DevNode_Registry_Property_ExW(
7760 _In_ DEVINST dnDevInst
,
7761 _In_ ULONG ulProperty
,
7762 _In_reads_bytes_opt_(ulLength
) PCVOID Buffer
,
7763 _In_ ULONG ulLength
,
7765 _In_opt_ HMACHINE hMachine
)
7767 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7768 HSTRING_TABLE StringTable
= NULL
;
7773 TRACE("CM_Set_DevNode_Registry_Property_ExW(%lx %lu %p %lx %lx %p)\n",
7774 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
7777 return CR_INVALID_DEVNODE
;
7779 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
7780 return CR_INVALID_PROPERTY
;
7782 if (Buffer
!= NULL
&& ulLength
== 0)
7783 return CR_INVALID_POINTER
;
7786 return CR_INVALID_FLAG
;
7788 if (hMachine
!= NULL
)
7790 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7791 if (BindingHandle
== NULL
)
7794 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
7795 if (StringTable
== 0)
7800 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
7804 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
7805 if (lpDevInst
== NULL
)
7806 return CR_INVALID_DEVNODE
;
7808 /* Get property type */
7809 ulType
= GetRegistryPropertyType(ulProperty
);
7813 ret
= PNP_SetDeviceRegProp(BindingHandle
,
7821 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7823 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7831 /***********************************************************************
7832 * CM_Set_HW_Prof [SETUPAPI.@]
7837 _In_ ULONG ulHardwareProfile
,
7840 TRACE("CM_Set_HW_Prof(%lu %lx)\n",
7841 ulHardwareProfile
, ulFlags
);
7843 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
7847 /***********************************************************************
7848 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
7853 _In_ ULONG ulHardwareProfile
,
7855 _In_opt_ HMACHINE hMachine
)
7857 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7860 TRACE("CM_Set_HW_Prof_Ex(%lu %lx %p)\n",
7861 ulHardwareProfile
, ulFlags
, hMachine
);
7863 if (!pSetupIsUserAdmin())
7864 return CR_ACCESS_DENIED
;
7867 return CR_INVALID_FLAG
;
7869 if (hMachine
!= NULL
)
7871 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7872 if (BindingHandle
== NULL
)
7877 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
7883 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
7885 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
7887 ret
= RpcStatusToCmStatus(RpcExceptionCode());
7895 /***********************************************************************
7896 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
7900 CM_Set_HW_Prof_FlagsA(
7901 _In_ DEVINSTID_A szDevInstName
,
7902 _In_ ULONG ulConfig
,
7906 TRACE("CM_Set_HW_Prof_FlagsA(%s %lu %lu %lx)\n",
7907 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7909 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
7914 /***********************************************************************
7915 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
7919 CM_Set_HW_Prof_FlagsW(
7920 _In_ DEVINSTID_W szDevInstName
,
7921 _In_ ULONG ulConfig
,
7925 TRACE("CM_Set_HW_Prof_FlagsW(%s %lu %lu %lx)\n",
7926 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
);
7928 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
7933 /***********************************************************************
7934 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
7938 CM_Set_HW_Prof_Flags_ExA(
7939 _In_ DEVINSTID_A szDevInstName
,
7940 _In_ ULONG ulConfig
,
7943 _In_opt_ HMACHINE hMachine
)
7945 DEVINSTID_W pszDevIdW
= NULL
;
7946 CONFIGRET ret
= CR_SUCCESS
;
7948 TRACE("CM_Set_HW_Prof_Flags_ExA(%s %lu %lu %lx %p)\n",
7949 debugstr_a(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7951 if (szDevInstName
!= NULL
)
7953 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
7954 return CR_INVALID_DEVICE_ID
;
7957 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
7960 if (pszDevIdW
!= NULL
)
7967 /***********************************************************************
7968 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
7972 CM_Set_HW_Prof_Flags_ExW(
7973 _In_ DEVINSTID_W szDevInstName
,
7974 _In_ ULONG ulConfig
,
7977 _In_opt_ HMACHINE hMachine
)
7979 RPC_BINDING_HANDLE BindingHandle
= NULL
;
7982 FIXME("CM_Set_HW_Prof_Flags_ExW(%s %lu %lu %lx %p)\n",
7983 debugstr_w(szDevInstName
), ulConfig
, ulValue
, ulFlags
, hMachine
);
7985 if (szDevInstName
== NULL
)
7986 return CR_INVALID_POINTER
;
7988 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
7989 return CR_INVALID_FLAG
;
7991 /* FIXME: Check whether szDevInstName is valid */
7993 if (hMachine
!= NULL
)
7995 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
7996 if (BindingHandle
== NULL
)
8001 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
8007 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
8008 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
8010 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8012 ret
= RpcStatusToCmStatus(RpcExceptionCode());
8020 /***********************************************************************
8021 * CM_Setup_DevNode [SETUPAPI.@]
8026 _In_ DEVINST dnDevInst
,
8029 TRACE("CM_Setup_DevNode(%lx %lx)\n",
8030 dnDevInst
, ulFlags
);
8032 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
8036 /***********************************************************************
8037 * CM_Setup_DevNode_Ex [SETUPAPI.@]
8041 CM_Setup_DevNode_Ex(
8042 _In_ DEVINST dnDevInst
,
8044 _In_opt_ HMACHINE hMachine
)
8046 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8047 HSTRING_TABLE StringTable
= NULL
;
8051 FIXME("CM_Setup_DevNode_Ex(%lx %lx %p)\n",
8052 dnDevInst
, ulFlags
, hMachine
);
8054 if (!pSetupIsUserAdmin())
8055 return CR_ACCESS_DENIED
;
8058 return CR_INVALID_DEVNODE
;
8060 if (ulFlags
& ~CM_SETUP_BITS
)
8061 return CR_INVALID_FLAG
;
8063 if (hMachine
!= NULL
)
8065 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8066 if (BindingHandle
== NULL
)
8069 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
8070 if (StringTable
== 0)
8075 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
8079 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
8080 if (lpDevInst
== NULL
)
8081 return CR_INVALID_DEVNODE
;
8085 ret
= PNP_DeviceInstanceAction(BindingHandle
,
8091 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8093 ret
= RpcStatusToCmStatus(RpcExceptionCode());
8101 /***********************************************************************
8102 * CM_Test_Range_Available [SETUPAPI.@]
8106 CM_Test_Range_Available(
8107 _In_ DWORDLONG ullStartValue
,
8108 _In_ DWORDLONG ullEndValue
,
8109 _In_ RANGE_LIST rlh
,
8112 FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
8113 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
8114 return CR_CALL_NOT_IMPLEMENTED
;
8118 /***********************************************************************
8119 * CM_Uninstall_DevNode [SETUPAPI.@]
8123 CM_Uninstall_DevNode(
8124 _In_ DEVINST dnPhantom
,
8127 TRACE("CM_Uninstall_DevNode(%lx %lx)\n",
8128 dnPhantom
, ulFlags
);
8130 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
8134 /***********************************************************************
8135 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
8139 CM_Uninstall_DevNode_Ex(
8140 _In_ DEVINST dnPhantom
,
8142 _In_opt_ HMACHINE hMachine
)
8144 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8145 HSTRING_TABLE StringTable
= NULL
;
8149 TRACE("CM_Uninstall_DevNode_Ex(%lx %lx %p)\n",
8150 dnPhantom
, ulFlags
, hMachine
);
8153 return CR_INVALID_DEVNODE
;
8156 return CR_INVALID_FLAG
;
8158 if (hMachine
!= NULL
)
8160 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8161 if (BindingHandle
== NULL
)
8164 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
8165 if (StringTable
== 0)
8170 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
8174 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
8175 if (lpDevInst
== NULL
)
8176 return CR_INVALID_DEVNODE
;
8180 ret
= PNP_UninstallDevInst(BindingHandle
,
8184 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8186 ret
= RpcStatusToCmStatus(RpcExceptionCode());
8194 /***********************************************************************
8195 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
8199 CM_Unregister_Device_InterfaceA(
8200 _In_ LPCSTR pszDeviceInterface
,
8203 TRACE("CM_Unregister_Device_InterfaceA(%s %lx)\n",
8204 debugstr_a(pszDeviceInterface
), ulFlags
);
8206 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
8211 /***********************************************************************
8212 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
8216 CM_Unregister_Device_InterfaceW(
8217 _In_ LPCWSTR pszDeviceInterface
,
8220 TRACE("CM_Unregister_Device_InterfaceW(%s %lx)\n",
8221 debugstr_w(pszDeviceInterface
), ulFlags
);
8223 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
8228 /***********************************************************************
8229 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
8233 CM_Unregister_Device_Interface_ExA(
8234 _In_ LPCSTR pszDeviceInterface
,
8236 _In_opt_ HMACHINE hMachine
)
8238 LPWSTR pszDeviceInterfaceW
= NULL
;
8241 TRACE("CM_Unregister_Device_Interface_ExA(%s %lx %p)\n",
8242 debugstr_a(pszDeviceInterface
), ulFlags
, hMachine
);
8244 if (pszDeviceInterface
== NULL
)
8245 return CR_INVALID_POINTER
;
8247 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
8248 return CR_INVALID_DATA
;
8250 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
8253 if (pszDeviceInterfaceW
!= NULL
)
8254 MyFree(pszDeviceInterfaceW
);
8260 /***********************************************************************
8261 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
8265 CM_Unregister_Device_Interface_ExW(
8266 _In_ LPCWSTR pszDeviceInterface
,
8268 _In_opt_ HMACHINE hMachine
)
8270 RPC_BINDING_HANDLE BindingHandle
= NULL
;
8273 TRACE("CM_Unregister_Device_Interface_ExW(%s %lx %p)\n",
8274 debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
8276 if (pszDeviceInterface
== NULL
)
8277 return CR_INVALID_POINTER
;
8280 return CR_INVALID_FLAG
;
8282 if (hMachine
!= NULL
)
8284 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
8285 if (BindingHandle
== NULL
)
8290 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
8296 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
8297 (LPWSTR
)pszDeviceInterface
,
8300 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
8302 ret
= RpcStatusToCmStatus(RpcExceptionCode());