2 * Configuration manager functions
4 * Copyright 2000 James Hatheway
5 * Copyright 2005, 2006 Eric Kohl
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "setupapi_private.h"
27 #include "rpc_private.h"
29 /* Registry key and value names */
30 static const WCHAR Backslash
[] = {'\\', 0};
31 static const WCHAR Class
[] = {'C','l','a','s','s',0};
33 static const WCHAR ControlClass
[] = {'S','y','s','t','e','m','\\',
34 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
35 'C','o','n','t','r','o','l','\\',
36 'C','l','a','s','s',0};
38 static const WCHAR DeviceClasses
[] = {'S','y','s','t','e','m','\\',
39 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
40 'C','o','n','t','r','o','l','\\',
41 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
43 typedef struct _MACHINE_INFO
45 WCHAR szMachineName
[SP_MAX_MACHINENAME_LENGTH
];
46 RPC_BINDING_HANDLE BindingHandle
;
47 HSTRING_TABLE StringTable
;
49 } MACHINE_INFO
, *PMACHINE_INFO
;
52 typedef struct _LOG_CONF_INFO
58 } LOG_CONF_INFO
, *PLOG_CONF_INFO
;
60 #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */
63 typedef struct _NOTIFY_DATA
67 } NOTIFY_DATA
, *PNOTIFY_DATA
;
69 #define NOTIFY_MAGIC 0x44556677
72 typedef struct _INTERNAL_RANGE_ELEMENT
74 struct _INTERNAL_RANGE_ELEMENT
*Next
;
76 } INTERNAL_RANGE_ELEMENT
, *PINTERNAL_RANGE_ELEMENT
;
78 typedef struct _INTERNAL_RANGE_LIST
81 PINTERNAL_RANGE_ELEMENT Current
;
82 PINTERNAL_RANGE_ELEMENT First
;
83 } INTERNAL_RANGE_LIST
, *PINTERNAL_RANGE_LIST
;
85 #define RANGE_LIST_MAGIC 0x33445566
88 static BOOL
GuidToString(LPGUID Guid
, LPWSTR String
)
92 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
95 lstrcpyW(&String
[1], lpString
);
98 String
[MAX_GUID_STRING_LEN
- 2] = '}';
99 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
101 RpcStringFreeW(&lpString
);
108 RpcStatusToCmStatus(RPC_STATUS Status
)
116 GetRegistryPropertyType(
121 case CM_DRP_DEVICEDESC
:
124 case CM_DRP_CLASSGUID
:
127 case CM_DRP_FRIENDLYNAME
:
128 case CM_DRP_LOCATION_INFORMATION
:
129 case CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME
:
130 case CM_DRP_ENUMERATOR_NAME
:
131 case CM_DRP_SECURITY_SDS
:
132 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
135 case CM_DRP_HARDWAREID
:
136 case CM_DRP_COMPATIBLEIDS
:
137 case CM_DRP_UPPERFILTERS
:
138 case CM_DRP_LOWERFILTERS
:
141 case CM_DRP_CONFIGFLAGS
:
142 case CM_DRP_CAPABILITIES
:
143 case CM_DRP_UI_NUMBER
:
144 case CM_DRP_LEGACYBUSTYPE
:
145 case CM_DRP_BUSNUMBER
:
147 case CM_DRP_EXCLUSIVE
:
148 case CM_DRP_CHARACTERISTICS
:
150 case CM_DRP_REMOVAL_POLICY
:
151 case CM_DRP_REMOVAL_POLICY_HW_DEFAULT
:
152 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
153 case CM_DRP_INSTALL_STATE
:
156 case CM_DRP_BUSTYPEGUID
:
157 case CM_DRP_SECURITY
:
158 case CM_DRP_DEVICE_POWER_DATA
:
169 SplitDeviceInstanceId(
170 _In_ PWSTR pszDeviceInstanceId
,
171 _Out_ PWSTR pszDeviceId
,
172 _Out_ PWSTR pszInstanceId
)
176 wcscpy(pszDeviceId
, pszDeviceInstanceId
);
178 ptr
= wcschr(pszDeviceId
, L
'\\');
184 wcscpy(pszInstanceId
, ptr
);
188 *pszInstanceId
= UNICODE_NULL
;
195 GetDeviceInstanceKeyPath(
196 _In_ RPC_BINDING_HANDLE BindingHandle
,
197 _In_ PWSTR pszDeviceInst
,
198 _Out_ PWSTR pszKeyPath
,
199 _Out_ PWSTR pszInstancePath
,
200 _In_ ULONG ulHardwareProfile
,
203 PWSTR pszBuffer
= NULL
;
205 ULONG ulTransferLength
, ulLength
;
206 CONFIGRET ret
= CR_SUCCESS
;
208 TRACE("GetDeviceInstanceKeyPath()\n");
210 if (ulFlags
& CM_REGISTRY_SOFTWARE
)
212 /* Software Key Path */
214 if (ulFlags
& CM_REGISTRY_CONFIG
)
216 SplitDeviceInstanceId(pszDeviceInst
,
220 if (ulHardwareProfile
== 0)
222 wsprintfW(pszKeyPath
,
224 L
"System\\CurrentControlSet\\Hardware Profiles",
226 L
"System\\CurrentControlSet\\Control\\Enum",
231 wsprintfW(pszKeyPath
,
232 L
"%s\\%04lu\\%s\\%s",
233 L
"System\\CurrentControlSet\\Hardware Profiles",
235 L
"System\\CurrentControlSet\\Control\\Enum",
241 ret
= CR_CALL_NOT_IMPLEMENTED
;
246 /* Hardware Key Path */
248 ulTransferLength
= 300 * sizeof(WCHAR
);
249 ulLength
= 300 * sizeof(WCHAR
);
251 pszBuffer
= MyMalloc(ulTransferLength
);
252 if (pszBuffer
== NULL
)
254 ERR("MyMalloc() failed\n");
255 ret
= CR_OUT_OF_MEMORY
;
259 ret
= PNP_GetDeviceRegProp(BindingHandle
,
267 if (ret
!= CR_SUCCESS
)
269 ERR("PNP_GetDeviceRegProp() failed (Error %lu)\n", ret
);
273 TRACE("szBuffer: %S\n", pszBuffer
);
275 SplitDeviceInstanceId(pszBuffer
,
279 TRACE("szBuffer: %S\n", pszBuffer
);
281 if (ulFlags
& CM_REGISTRY_CONFIG
)
283 if (ulHardwareProfile
== 0)
285 wsprintfW(pszKeyPath
,
287 L
"System\\CurrentControlSet\\Hardware Profiles",
289 L
"System\\CurrentControlSet\\Control\\Class",
294 wsprintfW(pszKeyPath
,
295 L
"%s\\%04lu\\%s\\%s",
296 L
"System\\CurrentControlSet\\Hardware Profiles",
298 L
"System\\CurrentControlSet\\Control\\Class",
304 wsprintfW(pszKeyPath
,
306 L
"System\\CurrentControlSet\\Control\\Class",
312 if (pszBuffer
!= NULL
)
319 /***********************************************************************
320 * CMP_GetBlockedDriverInfo [SETUPAPI.@]
324 CMP_GetBlockedDriverInfo(
325 _Out_opt_ LPWSTR pszNames
,
326 _Inout_ PULONG pulLength
,
328 _In_opt_ HMACHINE hMachine
)
330 RPC_BINDING_HANDLE BindingHandle
= NULL
;
331 ULONG ulTransferLength
;
334 TRACE("CMP_GetBlockedDriverInfo(%p %p %lx %p)\n",
335 pszNames
, pulLength
, ulFlags
, hMachine
);
337 if (hMachine
!= NULL
)
339 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
340 if (BindingHandle
== NULL
)
345 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
349 ulTransferLength
= *pulLength
;
353 ret
= PNP_GetBlockedDriverInfo(BindingHandle
,
359 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
361 ret
= RpcStatusToCmStatus(RpcExceptionCode());
369 /***********************************************************************
370 * CMP_GetServerSideDeviceInstallFlags [SETUPAPI.@]
374 CMP_GetServerSideDeviceInstallFlags(
375 _Out_ PULONG pulSSDIFlags
,
377 _In_opt_ HMACHINE hMachine
)
379 RPC_BINDING_HANDLE BindingHandle
= NULL
;
382 TRACE("CMP_GetServerSideDeviceInstallFlags(%p %lx %p)\n",
383 pulSSDIFlags
, ulFlags
, hMachine
);
385 if (pulSSDIFlags
== NULL
)
386 return CR_INVALID_POINTER
;
389 return CR_INVALID_FLAG
;
391 if (hMachine
!= NULL
)
393 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
394 if (BindingHandle
== NULL
)
399 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
405 ret
= PNP_GetServerSideDeviceInstallFlags(BindingHandle
,
409 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
411 ret
= RpcStatusToCmStatus(RpcExceptionCode());
419 /***********************************************************************
420 * CMP_Init_Detection [SETUPAPI.@]
427 RPC_BINDING_HANDLE BindingHandle
= NULL
;
430 TRACE("CMP_Init_Detection(%lu)\n", ulMagic
);
432 if (ulMagic
!= CMP_MAGIC
)
433 return CR_INVALID_DATA
;
435 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
440 ret
= PNP_InitDetection(BindingHandle
);
442 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
444 ret
= RpcStatusToCmStatus(RpcExceptionCode());
452 /***********************************************************************
453 * CMP_RegisterNotification [SETUPAPI.@]
457 CMP_RegisterNotification(
458 _In_ HANDLE hRecipient
,
459 _In_ LPVOID lpvNotificationFilter
,
461 _Out_ PHDEVNOTIFY phDevNotify
)
463 RPC_BINDING_HANDLE BindingHandle
= NULL
;
464 PNOTIFY_DATA pNotifyData
= NULL
;
465 CONFIGRET ret
= CR_SUCCESS
;
467 TRACE("CMP_RegisterNotification(%p %p %lu %p)\n",
468 hRecipient
, lpvNotificationFilter
, ulFlags
, phDevNotify
);
470 if ((hRecipient
== NULL
) ||
471 (lpvNotificationFilter
== NULL
) ||
472 (phDevNotify
== NULL
))
473 return CR_INVALID_POINTER
;
476 return CR_INVALID_FLAG
;
478 if (((PDEV_BROADCAST_HDR
)lpvNotificationFilter
)->dbch_size
< sizeof(DEV_BROADCAST_HDR
))
479 return CR_INVALID_DATA
;
481 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
484 pNotifyData
= HeapAlloc(GetProcessHeap(),
486 sizeof(NOTIFY_DATA
));
487 if (pNotifyData
== NULL
)
488 return CR_OUT_OF_MEMORY
;
490 pNotifyData
->ulMagic
= NOTIFY_MAGIC
;
493 if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_WINDOW_HANDLE)
497 else if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_SERVICE_HANDLE)
505 ret
= PNP_RegisterNotification(BindingHandle
,
507 &pNotifyData
->ulNotifyData
);
509 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
511 ret
= RpcStatusToCmStatus(RpcExceptionCode());
515 if (ret
== CR_SUCCESS
)
517 *phDevNotify
= (HDEVNOTIFY
)pNotifyData
;
521 if (pNotifyData
!= NULL
)
522 HeapFree(GetProcessHeap(), 0, pNotifyData
);
524 *phDevNotify
= (HDEVNOTIFY
)NULL
;
531 /***********************************************************************
532 * CMP_Report_LogOn [SETUPAPI.@]
538 _In_ DWORD dwProcessId
)
540 RPC_BINDING_HANDLE BindingHandle
= NULL
;
541 CONFIGRET ret
= CR_SUCCESS
;
545 TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic
, dwProcessId
);
547 if (dwMagic
!= CMP_MAGIC
)
548 return CR_INVALID_DATA
;
550 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
553 bAdmin
= pSetupIsUserAdmin();
555 for (i
= 0; i
< 30; i
++)
559 ret
= PNP_ReportLogOn(BindingHandle
,
563 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
565 ret
= RpcStatusToCmStatus(RpcExceptionCode());
569 if (ret
== CR_SUCCESS
)
579 /***********************************************************************
580 * CMP_UnregisterNotification [SETUPAPI.@]
584 CMP_UnregisterNotification(
585 _In_ HDEVNOTIFY hDevNotify
)
587 RPC_BINDING_HANDLE BindingHandle
= NULL
;
588 PNOTIFY_DATA pNotifyData
;
589 CONFIGRET ret
= CR_SUCCESS
;
591 TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify
);
593 pNotifyData
= (PNOTIFY_DATA
)hDevNotify
;
595 if ((pNotifyData
== NULL
) ||
596 (pNotifyData
->ulMagic
!= NOTIFY_MAGIC
))
597 return CR_INVALID_POINTER
;
599 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
604 ret
= PNP_UnregisterNotification(BindingHandle
,
605 pNotifyData
->ulNotifyData
);
607 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
609 ret
= RpcStatusToCmStatus(RpcExceptionCode());
613 if (ret
== CR_SUCCESS
)
614 HeapFree(GetProcessHeap(), 0, pNotifyData
);
620 /***********************************************************************
621 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
625 CMP_WaitNoPendingInstallEvents(
626 _In_ DWORD dwTimeout
)
631 TRACE("CMP_WaitNoPendingInstallEvents(%lu)\n", dwTimeout
);
633 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
637 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
643 /***********************************************************************
644 * CMP_WaitServicesAvailable [SETUPAPI.@]
648 CMP_WaitServicesAvailable(
649 _In_opt_ HMACHINE hMachine
)
651 RPC_BINDING_HANDLE BindingHandle
= NULL
;
652 CONFIGRET ret
= CR_SUCCESS
;
655 TRACE("CMP_WaitServicesAvailable(%p)\n", hMachine
);
657 if (hMachine
!= NULL
)
659 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
660 if (BindingHandle
== NULL
)
665 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
671 ret
= PNP_GetVersion(BindingHandle
, &Version
);
673 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
675 ret
= RpcStatusToCmStatus(RpcExceptionCode());
683 /***********************************************************************
684 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
686 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf(
687 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
690 TRACE("%p %p %lu %lx\n", plcLogConf
, dnDevInst
, Priority
, ulFlags
);
691 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
696 /***********************************************************************
697 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
699 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf_Ex(
700 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
701 ULONG ulFlags
, HMACHINE hMachine
)
703 RPC_BINDING_HANDLE BindingHandle
= NULL
;
704 HSTRING_TABLE StringTable
= NULL
;
705 ULONG ulLogConfTag
= 0;
707 PLOG_CONF_INFO pLogConfInfo
;
708 CONFIGRET ret
= CR_SUCCESS
;
710 FIXME("%p %p %lu %lx %p\n",
711 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
713 if (!pSetupIsUserAdmin())
714 return CR_ACCESS_DENIED
;
716 if (plcLogConf
== NULL
)
717 return CR_INVALID_POINTER
;
720 return CR_INVALID_DEVINST
;
722 if (Priority
> 0xFFFF)
723 return CR_INVALID_PRIORITY
;
725 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
726 return CR_INVALID_FLAG
;
728 if (hMachine
!= NULL
)
730 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
731 if (BindingHandle
== NULL
)
734 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
735 if (StringTable
== 0)
740 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
744 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
745 if (lpDevInst
== NULL
)
746 return CR_INVALID_DEVNODE
;
750 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
751 &ulLogConfTag
, ulFlags
);
753 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
755 ret
= RpcStatusToCmStatus(RpcExceptionCode());
759 if (ret
== CR_SUCCESS
)
761 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
762 if (pLogConfInfo
== NULL
)
764 ret
= CR_OUT_OF_MEMORY
;
768 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
769 pLogConfInfo
->dnDevInst
= dnDevInst
;
770 pLogConfInfo
->ulFlags
= ulFlags
;
771 pLogConfInfo
->ulTag
= ulLogConfTag
;
773 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
783 /***********************************************************************
784 * CM_Add_IDA [SETUPAPI.@]
786 CONFIGRET WINAPI
CM_Add_IDA(
787 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
)
789 TRACE("%p %s %lx\n", dnDevInst
, pszID
, ulFlags
);
790 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
794 /***********************************************************************
795 * CM_Add_IDW [SETUPAPI.@]
797 CONFIGRET WINAPI
CM_Add_IDW(
798 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
)
800 TRACE("%p %s %lx\n", dnDevInst
, debugstr_w(pszID
), ulFlags
);
801 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
805 /***********************************************************************
806 * CM_Add_ID_ExA [SETUPAPI.@]
808 CONFIGRET WINAPI
CM_Add_ID_ExA(
809 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
814 TRACE("%p %s %lx %p\n", dnDevInst
, pszID
, ulFlags
, hMachine
);
816 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
817 return CR_INVALID_DATA
;
819 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
827 /***********************************************************************
828 * CM_Add_ID_ExW [SETUPAPI.@]
830 CONFIGRET WINAPI
CM_Add_ID_ExW(
831 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
833 RPC_BINDING_HANDLE BindingHandle
= NULL
;
834 HSTRING_TABLE StringTable
= NULL
;
838 TRACE("%p %s %lx %p\n", dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
840 if (!pSetupIsUserAdmin())
841 return CR_ACCESS_DENIED
;
844 return CR_INVALID_DEVINST
;
847 return CR_INVALID_POINTER
;
849 if (ulFlags
& ~CM_ADD_ID_BITS
)
850 return CR_INVALID_FLAG
;
852 if (hMachine
!= NULL
)
854 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
855 if (BindingHandle
== NULL
)
858 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
859 if (StringTable
== 0)
864 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
868 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
869 if (lpDevInst
== NULL
)
870 return CR_INVALID_DEVNODE
;
874 ret
= PNP_AddID(BindingHandle
,
879 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
881 ret
= RpcStatusToCmStatus(RpcExceptionCode());
889 /***********************************************************************
890 * CM_Add_Range [SETUPAPI.@]
895 _In_ DWORDLONG ullStartValue
,
896 _In_ DWORDLONG ullEndValue
,
900 FIXME("CM_Add_Range(%I64u %I64u %p %lx)\n",
901 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
902 return CR_CALL_NOT_IMPLEMENTED
;
906 /***********************************************************************
907 * CM_Add_Res_Des [SETUPAPI.@]
909 CONFIGRET WINAPI
CM_Add_Res_Des(
910 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
911 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
913 TRACE("%p %p %lu %p %lu %lx\n", prdResDes
, lcLogConf
, ResourceID
,
914 ResourceData
, ResourceLen
, ulFlags
);
915 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
916 ResourceLen
, ulFlags
, NULL
);
920 /***********************************************************************
921 * CM_Add_Res_Des_Ex [SETUPAPI.@]
923 CONFIGRET WINAPI
CM_Add_Res_Des_Ex(
924 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
925 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
927 FIXME("%p %p %lu %p %lu %lx %p\n", prdResDes
, lcLogConf
, ResourceID
,
928 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
930 return CR_CALL_NOT_IMPLEMENTED
;
934 /***********************************************************************
935 * CM_Connect_MachineA [SETUPAPI.@]
937 CONFIGRET WINAPI
CM_Connect_MachineA(
938 PCSTR UNCServerName
, PHMACHINE phMachine
)
943 TRACE("%s %p\n", UNCServerName
, phMachine
);
945 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
946 return CM_Connect_MachineW(NULL
, phMachine
);
948 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
949 return CR_INVALID_DATA
;
951 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
953 MyFree(pServerNameW
);
959 /***********************************************************************
960 * CM_Connect_MachineW [SETUPAPI.@]
962 CONFIGRET WINAPI
CM_Connect_MachineW(
963 PCWSTR UNCServerName
, PHMACHINE phMachine
)
965 PMACHINE_INFO pMachine
;
967 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
969 if (phMachine
== NULL
)
970 return CR_INVALID_POINTER
;
974 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
975 if (pMachine
== NULL
)
976 return CR_OUT_OF_MEMORY
;
978 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
980 pMachine
->bLocal
= TRUE
;
982 /* FIXME: store the computers name in pMachine->szMachineName */
984 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
985 &pMachine
->StringTable
))
987 HeapFree(GetProcessHeap(), 0, pMachine
);
993 pMachine
->bLocal
= FALSE
;
994 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
996 HeapFree(GetProcessHeap(), 0, pMachine
);
997 return CR_INVALID_MACHINENAME
;
999 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
1001 pMachine
->StringTable
= pSetupStringTableInitialize();
1002 if (pMachine
->StringTable
== NULL
)
1004 HeapFree(GetProcessHeap(), 0, pMachine
);
1008 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
1010 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
1012 pSetupStringTableDestroy(pMachine
->StringTable
);
1013 HeapFree(GetProcessHeap(), 0, pMachine
);
1014 return CR_INVALID_MACHINENAME
;
1018 *phMachine
= (PHMACHINE
)pMachine
;
1024 /***********************************************************************
1025 * CM_Create_DevNodeA [SETUPAPI.@]
1027 CONFIGRET WINAPI
CM_Create_DevNodeA(
1028 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
1031 TRACE("%p %s %p %lx\n",
1032 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
1033 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
1038 /***********************************************************************
1039 * CM_Create_DevNodeW [SETUPAPI.@]
1041 CONFIGRET WINAPI
CM_Create_DevNodeW(
1042 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
1045 TRACE("%p %s %p %lx\n",
1046 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
1047 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
1052 /***********************************************************************
1053 * CM_Create_DevNode_ExA [SETUPAPI.@]
1055 CONFIGRET WINAPI
CM_Create_DevNode_ExA(
1056 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
1057 ULONG ulFlags
, HANDLE hMachine
)
1059 DEVINSTID_W pDeviceIDW
;
1062 TRACE("%p %s %p %lx %p\n",
1063 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1065 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
1066 return CR_INVALID_DATA
;
1068 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
1077 /***********************************************************************
1078 * CM_Create_DevNode_ExW [SETUPAPI.@]
1080 CONFIGRET WINAPI
CM_Create_DevNode_ExW(
1081 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
1082 ULONG ulFlags
, HANDLE hMachine
)
1084 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1085 HSTRING_TABLE StringTable
= NULL
;
1086 LPWSTR lpParentDevInst
;
1087 CONFIGRET ret
= CR_SUCCESS
;
1088 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
1090 TRACE("%p %s %p %lx %p\n",
1091 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1093 if (!pSetupIsUserAdmin())
1094 return CR_ACCESS_DENIED
;
1096 if (pdnDevInst
== NULL
)
1097 return CR_INVALID_POINTER
;
1099 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
1100 return CR_INVALID_DEVICE_ID
;
1103 return CR_INVALID_DEVNODE
;
1105 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
1106 return CR_INVALID_FLAG
;
1108 if (hMachine
!= NULL
)
1110 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1111 if (BindingHandle
== NULL
)
1114 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1115 if (StringTable
== 0)
1120 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1124 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
1125 if (lpParentDevInst
== NULL
)
1126 return CR_INVALID_DEVNODE
;
1128 wcscpy(szLocalDeviceID
, pDeviceID
);
1132 ret
= PNP_CreateDevInst(BindingHandle
,
1138 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1140 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1144 if (ret
== CR_SUCCESS
)
1146 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
1147 * will return the generated device ID in szLocalDeviceID */
1148 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
1149 if (*pdnDevInst
== 0)
1150 ret
= CR_NO_SUCH_DEVNODE
;
1157 /***********************************************************************
1158 * CM_Create_Range_List [SETUPAPI.@]
1162 CM_Create_Range_List(
1163 _Out_ PRANGE_LIST prlh
,
1166 PINTERNAL_RANGE_LIST pRangeList
= NULL
;
1168 FIXME("CM_Create_Range_List(%p %lx)\n", prlh
, ulFlags
);
1171 return CR_INVALID_FLAG
;
1174 return CR_INVALID_POINTER
;
1176 pRangeList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(INTERNAL_RANGE_LIST
));
1177 if (pRangeList
== NULL
)
1178 return CR_OUT_OF_MEMORY
;
1180 pRangeList
->ulMagic
= RANGE_LIST_MAGIC
;
1182 // TODO: More initialization
1184 *prlh
= (RANGE_LIST
)pRangeList
;
1190 /***********************************************************************
1191 * CM_Delete_Class_Key [SETUPAPI.@]
1193 CONFIGRET WINAPI
CM_Delete_Class_Key(
1194 LPGUID ClassGuid
, ULONG ulFlags
)
1196 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
1197 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
1201 /***********************************************************************
1202 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
1204 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
1205 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
1207 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1208 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1211 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
1213 if (ClassGuid
== NULL
)
1214 return CR_INVALID_POINTER
;
1216 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
1217 return CR_INVALID_FLAG
;
1219 if (!GuidToString(ClassGuid
, szGuidString
))
1220 return CR_INVALID_DATA
;
1222 if (hMachine
!= NULL
)
1224 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1225 if (BindingHandle
== NULL
)
1230 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1236 ret
= PNP_DeleteClassKey(BindingHandle
,
1240 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1242 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1250 /***********************************************************************
1251 * CM_Delete_DevNode_Key [SETUPAPI.@]
1253 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
1254 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
1256 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
1257 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
1262 /***********************************************************************
1263 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
1265 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
1266 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
1269 FIXME("%p %lu %lx %p\n",
1270 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
1272 return CR_CALL_NOT_IMPLEMENTED
;
1276 /***********************************************************************
1277 * CM_Delete_Range [SETUPAPI.@]
1282 _In_ DWORDLONG ullStartValue
,
1283 _In_ DWORDLONG ullEndValue
,
1284 _In_ RANGE_LIST rlh
,
1287 FIXME("CM_Delete_Range(%I64u %I64u %p %lx)\n",
1288 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1289 return CR_CALL_NOT_IMPLEMENTED
;
1293 /***********************************************************************
1294 * CM_Disable_DevNode [SETUPAPI.@]
1296 CONFIGRET WINAPI
CM_Disable_DevNode(
1297 DEVINST dnDevInst
, ULONG ulFlags
)
1299 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
1300 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1304 /***********************************************************************
1305 * CM_Disable_DevNode_Ex [SETUPAPI.@]
1307 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
1308 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1310 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1311 HSTRING_TABLE StringTable
= NULL
;
1315 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
1317 if (!pSetupIsUserAdmin())
1318 return CR_ACCESS_DENIED
;
1321 return CR_INVALID_DEVINST
;
1324 return CR_INVALID_FLAG
;
1326 if (hMachine
!= NULL
)
1328 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1329 if (BindingHandle
== NULL
)
1332 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1333 if (StringTable
== 0)
1338 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1342 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1343 if (lpDevInst
== NULL
)
1344 return CR_INVALID_DEVNODE
;
1348 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1349 PNP_DEVINST_DISABLE
,
1354 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1356 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1364 /***********************************************************************
1365 * CM_Disconnect_Machine [SETUPAPI.@]
1367 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
1369 PMACHINE_INFO pMachine
;
1371 TRACE("%lx\n", hMachine
);
1373 pMachine
= (PMACHINE_INFO
)hMachine
;
1374 if (pMachine
== NULL
)
1377 if (pMachine
->bLocal
== FALSE
)
1379 if (pMachine
->StringTable
!= NULL
)
1380 pSetupStringTableDestroy(pMachine
->StringTable
);
1382 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
1383 return CR_ACCESS_DENIED
;
1386 HeapFree(GetProcessHeap(), 0, pMachine
);
1392 /***********************************************************************
1393 * CM_Dup_Range_List [SETUPAPI.@]
1398 _In_ RANGE_LIST rlhOld
,
1399 _In_ RANGE_LIST rlhNew
,
1402 FIXME("CM_Dup_Range_List(%p %p %lx)\n",
1403 rlhOld
, rlhNew
, ulFlags
);
1404 return CR_CALL_NOT_IMPLEMENTED
;
1408 /***********************************************************************
1409 * CM_Enable_DevNode [SETUPAPI.@]
1411 CONFIGRET WINAPI
CM_Enable_DevNode(
1412 DEVINST dnDevInst
, ULONG ulFlags
)
1414 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
1415 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1419 /***********************************************************************
1420 * CM_Enable_DevNode_Ex [SETUPAPI.@]
1422 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
1423 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1425 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1426 HSTRING_TABLE StringTable
= NULL
;
1430 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
1432 if (!pSetupIsUserAdmin())
1433 return CR_ACCESS_DENIED
;
1436 return CR_INVALID_DEVINST
;
1439 return CR_INVALID_FLAG
;
1441 if (hMachine
!= NULL
)
1443 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1444 if (BindingHandle
== NULL
)
1447 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1448 if (StringTable
== 0)
1453 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1457 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1458 if (lpDevInst
== NULL
)
1459 return CR_INVALID_DEVNODE
;
1463 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1469 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1471 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1479 /***********************************************************************
1480 * CM_Enumerate_Classes [SETUPAPI.@]
1482 CONFIGRET WINAPI
CM_Enumerate_Classes(
1483 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
1485 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
1486 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
1490 /***********************************************************************
1491 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
1493 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
1494 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
1496 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1497 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1498 CONFIGRET ret
= CR_SUCCESS
;
1499 ULONG ulLength
= MAX_GUID_STRING_LEN
;
1501 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
1503 if (ClassGuid
== NULL
)
1504 return CR_INVALID_POINTER
;
1507 return CR_INVALID_FLAG
;
1509 if (hMachine
!= NULL
)
1511 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1512 if (BindingHandle
== NULL
)
1517 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1523 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1527 MAX_GUID_STRING_LEN
,
1531 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1533 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1537 if (ret
== CR_SUCCESS
)
1540 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1542 /* Convert the buffer to a GUID */
1543 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1551 /***********************************************************************
1552 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1554 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
1555 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1557 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1558 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1563 /***********************************************************************
1564 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1566 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
1567 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1569 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1570 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1575 /***********************************************************************
1576 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1578 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
1579 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1582 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1585 CONFIGRET ret
= CR_SUCCESS
;
1587 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1590 if (Buffer
== NULL
|| pulLength
== NULL
)
1591 return CR_INVALID_POINTER
;
1594 return CR_INVALID_FLAG
;
1596 ulOrigLength
= *pulLength
;
1599 ulLength
= MAX_DEVICE_ID_LEN
;
1600 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1602 if (ret
== CR_SUCCESS
)
1604 if (WideCharToMultiByte(CP_ACP
,
1614 *pulLength
= lstrlenA(Buffer
) + 1;
1621 /***********************************************************************
1622 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1624 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1625 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1628 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1631 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1634 if (Buffer
== NULL
|| pulLength
== NULL
)
1635 return CR_INVALID_POINTER
;
1638 return CR_INVALID_FLAG
;
1640 *Buffer
= UNICODE_NULL
;
1642 if (hMachine
!= NULL
)
1644 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1645 if (BindingHandle
== NULL
)
1650 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1656 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1657 PNP_ENUMERATOR_SUBKEYS
,
1664 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1666 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1674 /***********************************************************************
1675 * CM_Find_Range [SETUPAPI.@]
1680 _Out_ PDWORDLONG pullStart
,
1681 _In_ DWORDLONG ullStart
,
1682 _In_ ULONG ulLength
,
1683 _In_ DWORDLONG ullAlignment
,
1684 _In_ DWORDLONG ullEnd
,
1685 _In_ RANGE_LIST rlh
,
1688 FIXME("CM_Find_Range(%p %I64u %lu %I64u %I64u %p %lx)\n",
1689 pullStart
, ullStart
, ulLength
, ullAlignment
, ullEnd
, rlh
, ulFlags
);
1690 return CR_CALL_NOT_IMPLEMENTED
;
1694 /***********************************************************************
1695 * CM_First_Range [SETUPAPI.@]
1700 _In_ RANGE_LIST rlh
,
1701 _Out_ PDWORDLONG pullStart
,
1702 _Out_ PDWORDLONG pullEnd
,
1703 _Out_ PRANGE_ELEMENT preElement
,
1706 FIXME("CM_First_Range(%p %p %p %p %lx)\n",
1707 rlh
, pullStart
, pullEnd
, preElement
, ulFlags
);
1708 return CR_CALL_NOT_IMPLEMENTED
;
1712 /***********************************************************************
1713 * CM_Free_Log_Conf [SETUPAPI.@]
1715 CONFIGRET WINAPI
CM_Free_Log_Conf(
1716 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1718 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1719 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1723 /***********************************************************************
1724 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1726 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1727 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1729 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1730 HSTRING_TABLE StringTable
= NULL
;
1732 PLOG_CONF_INFO pLogConfInfo
;
1735 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1737 if (!pSetupIsUserAdmin())
1738 return CR_ACCESS_DENIED
;
1740 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1741 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1742 return CR_INVALID_LOG_CONF
;
1745 return CR_INVALID_FLAG
;
1747 if (hMachine
!= NULL
)
1749 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1750 if (BindingHandle
== NULL
)
1753 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1754 if (StringTable
== 0)
1759 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1763 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1764 if (lpDevInst
== NULL
)
1765 return CR_INVALID_DEVNODE
;
1769 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1770 pLogConfInfo
->ulTag
, 0);
1772 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1774 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1782 /***********************************************************************
1783 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1785 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1788 PLOG_CONF_INFO pLogConfInfo
;
1790 TRACE("%lx\n", lcLogConf
);
1792 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1793 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1794 return CR_INVALID_LOG_CONF
;
1796 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1802 /***********************************************************************
1803 * CM_Free_Range_List [SETUPAPI.@]
1808 _In_ RANGE_LIST RangeList
,
1811 PINTERNAL_RANGE_LIST pRangeList
;
1813 FIXME("CM_Free_Range_List(%p %lx)\n", RangeList
, ulFlags
);
1815 pRangeList
= (PINTERNAL_RANGE_LIST
)RangeList
;
1817 if (pRangeList
== NULL
|| pRangeList
->ulMagic
!= RANGE_LIST_MAGIC
)
1818 return CR_INVALID_RANGE_LIST
;
1821 return CR_INVALID_FLAG
;
1823 // TODO: Free the list of ranges
1825 HeapFree(GetProcessHeap(), 0, pRangeList
);
1831 /***********************************************************************
1832 * CM_Free_Res_Des [SETUPAPI.@]
1834 CONFIGRET WINAPI
CM_Free_Res_Des(
1835 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
)
1837 TRACE("%p %p %lx\n", prdResDes
, rdResDes
, ulFlags
);
1838 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
1842 /***********************************************************************
1843 * CM_Free_Res_Des_Ex [SETUPAPI.@]
1845 CONFIGRET WINAPI
CM_Free_Res_Des_Ex(
1846 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
,
1849 FIXME("%p %p %lx %lx\n", prdResDes
, rdResDes
, ulFlags
, hMachine
);
1851 return CR_CALL_NOT_IMPLEMENTED
;
1855 /***********************************************************************
1856 * CM_Free_Res_Des_Handle [SETUPAPI.@]
1858 CONFIGRET WINAPI
CM_Free_Res_Des_Handle(
1861 FIXME("%p\n", rdResDes
);
1863 return CR_CALL_NOT_IMPLEMENTED
;
1867 /***********************************************************************
1868 * CM_Get_Child [SETUPAPI.@]
1870 CONFIGRET WINAPI
CM_Get_Child(
1871 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1873 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1874 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1878 /***********************************************************************
1879 * CM_Get_Child_Ex [SETUPAPI.@]
1881 CONFIGRET WINAPI
CM_Get_Child_Ex(
1882 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1884 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1885 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1886 HSTRING_TABLE StringTable
= NULL
;
1888 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1891 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1893 if (pdnDevInst
== NULL
)
1894 return CR_INVALID_POINTER
;
1897 return CR_INVALID_DEVINST
;
1900 return CR_INVALID_FLAG
;
1904 if (hMachine
!= NULL
)
1906 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1907 if (BindingHandle
== NULL
)
1910 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1911 if (StringTable
== 0)
1916 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1920 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1921 if (lpDevInst
== NULL
)
1922 return CR_INVALID_DEVNODE
;
1926 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1927 PNP_GET_CHILD_DEVICE_INSTANCE
,
1933 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1935 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1939 if (ret
!= CR_SUCCESS
)
1942 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1944 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
1948 *pdnDevInst
= dwIndex
;
1954 /***********************************************************************
1955 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1957 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1958 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1960 TRACE("%p %p %p %lx\n",
1961 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1962 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1967 /***********************************************************************
1968 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1970 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1971 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1973 TRACE("%p %p %p %lx\n",
1974 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1975 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1980 /***********************************************************************
1981 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1983 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1984 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1987 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1988 CONFIGRET ret
= CR_SUCCESS
;
1992 TRACE("%p %p %p %lx %lx\n",
1993 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1995 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1996 return CR_INVALID_POINTER
;
1998 ulOrigLength
= *pulLength
;
2001 ulLength
= MAX_GUID_STRING_LEN
;
2002 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2004 if (ret
== CR_SUCCESS
)
2006 if (WideCharToMultiByte(CP_ACP
,
2016 *pulLength
= lstrlenA(pszKeyName
) + 1;
2023 /***********************************************************************
2024 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
2026 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
2027 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
2030 TRACE("%p %p %p %lx %lx\n",
2031 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2033 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2034 return CR_INVALID_POINTER
;
2037 return CR_INVALID_FLAG
;
2039 if (*pulLength
< MAX_GUID_STRING_LEN
)
2042 return CR_BUFFER_SMALL
;
2045 if (!GuidToString(ClassGuid
, pszKeyName
))
2046 return CR_INVALID_DATA
;
2048 *pulLength
= MAX_GUID_STRING_LEN
;
2054 /***********************************************************************
2055 * CM_Get_Class_NameA [SETUPAPI.@]
2057 CONFIGRET WINAPI
CM_Get_Class_NameA(
2058 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
2060 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
2061 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2066 /***********************************************************************
2067 * CM_Get_Class_NameW [SETUPAPI.@]
2069 CONFIGRET WINAPI
CM_Get_Class_NameW(
2070 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
2072 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
2073 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2078 /***********************************************************************
2079 * CM_Get_Class_Name_ExA [SETUPAPI.@]
2081 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
2082 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
2085 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
2086 CONFIGRET ret
= CR_SUCCESS
;
2090 TRACE("%p %p %p %lx %lx\n",
2091 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2093 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2094 return CR_INVALID_POINTER
;
2096 ulOrigLength
= *pulLength
;
2099 ulLength
= MAX_CLASS_NAME_LEN
;
2100 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2102 if (ret
== CR_SUCCESS
)
2104 if (WideCharToMultiByte(CP_ACP
,
2114 *pulLength
= lstrlenA(Buffer
) + 1;
2121 /***********************************************************************
2122 * CM_Get_Class_Name_ExW [SETUPAPI.@]
2125 CM_Get_Class_Name_ExW(
2126 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
2129 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
2130 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2133 TRACE("%p %p %p %lx %lx\n",
2134 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2136 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2137 return CR_INVALID_POINTER
;
2140 return CR_INVALID_FLAG
;
2142 if (!GuidToString(ClassGuid
, szGuidString
))
2143 return CR_INVALID_DATA
;
2145 TRACE("Guid %s\n", debugstr_w(szGuidString
));
2147 if (hMachine
!= NULL
)
2149 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2150 if (BindingHandle
== NULL
)
2155 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2161 ret
= PNP_GetClassName(BindingHandle
,
2167 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2169 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2177 /***********************************************************************
2178 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
2180 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyA(
2181 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
2182 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2184 PWSTR BufferW
= NULL
;
2189 TRACE("%p %lu %p %p %p %lx %lx\n",
2190 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2193 if (pulLength
== NULL
)
2194 return CR_INVALID_POINTER
;
2196 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2197 return CR_INVALID_PROPERTY
;
2199 ulType
= GetRegistryPropertyType(ulProperty
);
2200 if (ulType
== REG_SZ
|| ulType
== REG_MULTI_SZ
)
2202 /* Get the required buffer size */
2203 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2204 NULL
, &ulLength
, ulFlags
, hMachine
);
2205 if (ret
!= CR_BUFFER_SMALL
)
2208 /* Allocate the unicode buffer */
2209 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLength
);
2210 if (BufferW
== NULL
)
2211 return CR_OUT_OF_MEMORY
;
2213 /* Get the property */
2214 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2215 BufferW
, &ulLength
, ulFlags
, hMachine
);
2216 if (ret
!= CR_SUCCESS
)
2218 HeapFree(GetProcessHeap(), 0, BufferW
);
2222 /* Do W->A conversion */
2223 *pulLength
= WideCharToMultiByte(CP_ACP
,
2226 lstrlenW(BufferW
) + 1,
2232 /* Release the unicode buffer */
2233 HeapFree(GetProcessHeap(), 0, BufferW
);
2235 if (*pulLength
== 0)
2240 /* Get the property */
2241 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2242 Buffer
, pulLength
, ulFlags
, hMachine
);
2249 /***********************************************************************
2250 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
2252 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyW(
2253 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
2254 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2256 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2257 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
2259 ULONG ulTransferLength
= 0;
2262 TRACE("%p %lu %p %p %p %lx %lx\n",
2263 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2266 if (ClassGuid
== NULL
|| pulLength
== NULL
)
2267 return CR_INVALID_POINTER
;
2270 return CR_INVALID_FLAG
;
2272 if (pSetupStringFromGuid(ClassGuid
,
2274 PNP_MAX_GUID_STRING_LEN
) != 0)
2275 return CR_INVALID_DATA
;
2277 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2278 return CR_INVALID_PROPERTY
;
2280 if (hMachine
!= NULL
)
2282 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2283 if (BindingHandle
== NULL
)
2288 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2292 ulTransferLength
= *pulLength
;
2296 ret
= PNP_GetClassRegProp(BindingHandle
,
2305 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2307 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2311 if (ret
== CR_SUCCESS
)
2313 if (pulRegDataType
!= NULL
)
2314 *pulRegDataType
= ulType
;
2321 /***********************************************************************
2322 * CM_Get_Depth [SETUPAPI.@]
2324 CONFIGRET WINAPI
CM_Get_Depth(
2325 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
2327 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
2328 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
2332 /***********************************************************************
2333 * CM_Get_Depth_Ex [SETUPAPI.@]
2335 CONFIGRET WINAPI
CM_Get_Depth_Ex(
2336 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2338 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2339 HSTRING_TABLE StringTable
= NULL
;
2343 TRACE("%p %lx %lx %lx\n",
2344 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
2346 if (pulDepth
== NULL
)
2347 return CR_INVALID_POINTER
;
2350 return CR_INVALID_DEVINST
;
2353 return CR_INVALID_FLAG
;
2355 if (hMachine
!= NULL
)
2357 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2358 if (BindingHandle
== NULL
)
2361 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2362 if (StringTable
== 0)
2367 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2371 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2372 if (lpDevInst
== NULL
)
2373 return CR_INVALID_DEVNODE
;
2377 ret
= PNP_GetDepth(BindingHandle
,
2382 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2384 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2392 /***********************************************************************
2393 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
2395 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyA(
2396 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2397 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2399 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, pszCustomPropertyName
,
2400 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2401 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
2402 pulRegDataType
, Buffer
,
2403 pulLength
, ulFlags
, NULL
);
2407 /***********************************************************************
2408 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
2410 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyW(
2411 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2412 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2414 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, debugstr_w(pszCustomPropertyName
),
2415 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2416 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
2417 pulRegDataType
, Buffer
,
2418 pulLength
, ulFlags
, NULL
);
2422 /***********************************************************************
2423 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
2425 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExA(
2426 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2427 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2429 LPWSTR pszPropertyNameW
= NULL
;
2432 ULONG ulDataType
= REG_NONE
;
2435 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
, pszCustomPropertyName
,
2436 pulRegDataType
, Buffer
, pulLength
, ulFlags
, hMachine
);
2439 return CR_INVALID_POINTER
;
2441 ulLengthW
= *pulLength
* sizeof(WCHAR
);
2442 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
2444 return CR_OUT_OF_MEMORY
;
2446 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
2448 if (pszPropertyNameW
== NULL
)
2450 HeapFree(GetProcessHeap(), 0, BufferW
);
2451 return CR_OUT_OF_MEMORY
;
2454 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
2461 if (ret
== CR_SUCCESS
)
2463 if (ulDataType
== REG_SZ
||
2464 ulDataType
== REG_EXPAND_SZ
||
2465 ulDataType
== REG_MULTI_SZ
)
2467 /* Do W->A conversion */
2468 *pulLength
= WideCharToMultiByte(CP_ACP
,
2471 lstrlenW(BufferW
) + 1,
2476 if (*pulLength
== 0)
2481 /* Directly copy the value */
2482 if (ulLengthW
<= *pulLength
)
2483 memcpy(Buffer
, BufferW
, ulLengthW
);
2486 *pulLength
= ulLengthW
;
2487 ret
= CR_BUFFER_SMALL
;
2493 *pulRegDataType
= ulDataType
;
2495 HeapFree(GetProcessHeap(), 0, BufferW
);
2496 MyFree(pszPropertyNameW
);
2502 /***********************************************************************
2503 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
2505 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExW(
2506 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2507 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2509 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2510 HSTRING_TABLE StringTable
= NULL
;
2512 ULONG ulDataType
= REG_NONE
;
2513 ULONG ulTransferLength
;
2514 CONFIGRET ret
= CR_SUCCESS
;
2516 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
,
2517 debugstr_w(pszCustomPropertyName
), pulRegDataType
, Buffer
,
2518 pulLength
, ulFlags
, hMachine
);
2521 return CR_INVALID_DEVNODE
;
2523 if (pszCustomPropertyName
== NULL
||
2524 pulLength
== NULL
||
2526 return CR_INVALID_POINTER
;
2528 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
2529 return CR_INVALID_FLAG
;
2531 if (hMachine
!= NULL
)
2533 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2534 if (BindingHandle
== NULL
)
2537 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2538 if (StringTable
== 0)
2543 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2547 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2548 if (lpDevInst
== NULL
)
2549 return CR_INVALID_DEVNODE
;
2551 ulTransferLength
= *pulLength
;
2555 ret
= PNP_GetCustomDevProp(BindingHandle
,
2557 (LPWSTR
)pszCustomPropertyName
,
2564 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2566 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2570 if (ret
== CR_SUCCESS
)
2572 if (pulRegDataType
!= NULL
)
2573 *pulRegDataType
= ulDataType
;
2580 /***********************************************************************
2581 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
2583 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
2584 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2585 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2587 TRACE("%lx %lu %p %p %p %lx\n",
2588 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2590 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
2591 pulRegDataType
, Buffer
,
2592 pulLength
, ulFlags
, NULL
);
2596 /***********************************************************************
2597 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
2599 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
2600 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2601 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2603 TRACE("%lx %lu %p %p %p %lx\n",
2604 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2606 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
2607 pulRegDataType
, Buffer
,
2608 pulLength
, ulFlags
, NULL
);
2612 /***********************************************************************
2613 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
2615 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
2616 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2617 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2621 ULONG ulDataType
= REG_NONE
;
2624 TRACE("%lx %lu %p %p %p %lx %lx\n",
2625 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2629 return CR_INVALID_POINTER
;
2631 LengthW
= *pulLength
* sizeof(WCHAR
);
2632 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
2635 return CR_OUT_OF_MEMORY
;
2637 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
2645 if (ret
== CR_SUCCESS
)
2647 if (ulDataType
== REG_SZ
||
2648 ulDataType
== REG_EXPAND_SZ
||
2649 ulDataType
== REG_MULTI_SZ
)
2651 /* Do W->A conversion */
2652 *pulLength
= WideCharToMultiByte(CP_ACP
,
2655 lstrlenW(BufferW
) + 1,
2660 if (*pulLength
== 0)
2665 /* Directly copy the value */
2666 if (LengthW
<= *pulLength
)
2667 memcpy(Buffer
, BufferW
, LengthW
);
2670 *pulLength
= LengthW
;
2671 ret
= CR_BUFFER_SMALL
;
2677 *pulRegDataType
= ulDataType
;
2679 HeapFree(GetProcessHeap(), 0, BufferW
);
2685 /***********************************************************************
2686 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
2688 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
2689 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2690 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2692 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2693 HSTRING_TABLE StringTable
= NULL
;
2694 CONFIGRET ret
= CR_SUCCESS
;
2696 ULONG ulDataType
= REG_NONE
;
2697 ULONG ulTransferLength
= 0;
2699 TRACE("%lx %lu %p %p %p %lx %lx\n",
2700 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2704 return CR_INVALID_DEVNODE
;
2706 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
2707 return CR_INVALID_PROPERTY
;
2709 /* pulRegDataType is optional */
2711 /* Buffer is optional */
2713 if (pulLength
== NULL
)
2714 return CR_INVALID_POINTER
;
2716 if (*pulLength
== 0)
2717 return CR_INVALID_POINTER
;
2720 return CR_INVALID_FLAG
;
2722 if (hMachine
!= NULL
)
2724 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2725 if (BindingHandle
== NULL
)
2728 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2729 if (StringTable
== 0)
2734 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2738 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2739 if (lpDevInst
== NULL
)
2740 return CR_INVALID_DEVNODE
;
2742 ulTransferLength
= *pulLength
;
2746 ret
= PNP_GetDeviceRegProp(BindingHandle
,
2755 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2757 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2761 if (ret
== CR_SUCCESS
)
2763 if (pulRegDataType
!= NULL
)
2764 *pulRegDataType
= ulDataType
;
2771 /***********************************************************************
2772 * CM_Get_DevNode_Status [SETUPAPI.@]
2774 CONFIGRET WINAPI
CM_Get_DevNode_Status(
2775 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2778 TRACE("%p %p %lx %lx\n",
2779 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
2780 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
2785 /***********************************************************************
2786 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
2789 CM_Get_DevNode_Status_Ex(
2790 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2791 ULONG ulFlags
, HMACHINE hMachine
)
2793 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2794 HSTRING_TABLE StringTable
= NULL
;
2798 TRACE("%p %p %lx %lx %lx\n",
2799 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
2801 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
2802 return CR_INVALID_POINTER
;
2805 return CR_INVALID_DEVINST
;
2808 return CR_INVALID_FLAG
;
2810 if (hMachine
!= NULL
)
2812 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2813 if (BindingHandle
== NULL
)
2816 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2817 if (StringTable
== 0)
2822 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2826 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2827 if (lpDevInst
== NULL
)
2828 return CR_INVALID_DEVNODE
;
2832 ret
= PNP_GetDeviceStatus(BindingHandle
,
2838 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2840 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2848 /***********************************************************************
2849 * CM_Get_Device_IDA [SETUPAPI.@]
2851 CONFIGRET WINAPI
CM_Get_Device_IDA(
2852 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2854 TRACE("%lx %p %ld %ld\n",
2855 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2856 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2860 /***********************************************************************
2861 * CM_Get_Device_IDW [SETUPAPI.@]
2863 CONFIGRET WINAPI
CM_Get_Device_IDW(
2864 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2866 TRACE("%lx %p %ld %ld\n",
2867 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2868 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2872 /***********************************************************************
2873 * CM_Get_Device_ID_ExA [SETUPAPI.@]
2875 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
2876 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2879 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
2880 CONFIGRET ret
= CR_SUCCESS
;
2882 TRACE("%lx %p %ld %ld %lx\n",
2883 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2886 return CR_INVALID_POINTER
;
2888 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
2893 if (ret
== CR_SUCCESS
)
2895 if (WideCharToMultiByte(CP_ACP
,
2898 lstrlenW(szBufferW
) + 1,
2910 /***********************************************************************
2911 * CM_Get_Device_ID_ExW [SETUPAPI.@]
2913 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
2914 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2917 HSTRING_TABLE StringTable
= NULL
;
2919 TRACE("%lx %p %ld %ld %lx\n",
2920 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2923 return CR_INVALID_DEVINST
;
2926 return CR_INVALID_POINTER
;
2929 return CR_INVALID_FLAG
;
2931 if (hMachine
!= NULL
)
2933 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2934 if (StringTable
== NULL
)
2939 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2943 if (!pSetupStringTableStringFromIdEx(StringTable
,
2953 /***********************************************************************
2954 * CM_Get_Device_ID_ListA [SETUPAPI.@]
2956 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
2957 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2959 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2960 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
2965 /***********************************************************************
2966 * CM_Get_Device_ID_ListW [SETUPAPI.@]
2968 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
2969 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2971 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2972 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
2977 /***********************************************************************
2978 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
2980 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
2981 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2984 LPWSTR BufferW
= NULL
;
2985 LPWSTR pszFilterW
= NULL
;
2986 CONFIGRET ret
= CR_SUCCESS
;
2988 TRACE("%p %p %ld %ld %lx\n",
2989 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2991 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2992 if (BufferW
== NULL
)
2993 return CR_OUT_OF_MEMORY
;
2995 if (pszFilter
== NULL
)
2997 ret
= CM_Get_Device_ID_List_ExW(NULL
,
3005 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3007 ret
= CR_INVALID_DEVICE_ID
;
3011 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
3020 if (WideCharToMultiByte(CP_ACP
,
3023 lstrlenW(BufferW
) + 1,
3037 /***********************************************************************
3038 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
3040 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
3041 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3044 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3047 TRACE("%p %p %ld %ld %lx\n",
3048 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3050 if (Buffer
== NULL
|| BufferLen
== 0)
3051 return CR_INVALID_POINTER
;
3053 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3054 return CR_INVALID_FLAG
;
3056 if (hMachine
!= NULL
)
3058 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3059 if (BindingHandle
== NULL
)
3064 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3072 ret
= PNP_GetDeviceList(BindingHandle
,
3078 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3080 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3088 /***********************************************************************
3089 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
3091 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
3092 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
3094 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
3095 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
3099 /***********************************************************************
3100 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
3102 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
3103 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
3105 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
3106 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
3110 /***********************************************************************
3111 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
3113 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
3114 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
3116 LPWSTR pszFilterW
= NULL
;
3117 CONFIGRET ret
= CR_SUCCESS
;
3119 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
3121 if (pszFilter
== NULL
)
3123 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3130 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3131 return CR_INVALID_DEVICE_ID
;
3133 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3145 /***********************************************************************
3146 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
3148 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
3149 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
3151 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3154 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
3157 return CR_INVALID_POINTER
;
3159 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3160 return CR_INVALID_FLAG
;
3162 if (hMachine
!= NULL
)
3164 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3165 if (BindingHandle
== NULL
)
3170 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3178 ret
= PNP_GetDeviceListSize(BindingHandle
,
3183 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3185 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3193 /***********************************************************************
3194 * CM_Get_Device_ID_Size [SETUPAPI.@]
3196 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
3197 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
3199 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
3200 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
3204 /***********************************************************************
3205 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
3207 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
3208 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3210 HSTRING_TABLE StringTable
= NULL
;
3213 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
3216 return CR_INVALID_POINTER
;
3219 return CR_INVALID_DEVINST
;
3222 return CR_INVALID_FLAG
;
3224 if (hMachine
!= NULL
)
3226 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3227 if (StringTable
== NULL
)
3232 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3236 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3237 if (DeviceId
== NULL
)
3243 *pulLen
= lstrlenW(DeviceId
);
3249 /***********************************************************************
3250 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
3252 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasA(
3253 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
3254 LPSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
3256 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
3257 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3259 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
3260 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3265 /***********************************************************************
3266 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
3268 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasW(
3269 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
3270 LPWSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
3272 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
3273 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3275 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
3276 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3281 /***********************************************************************
3282 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
3284 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExA(
3285 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPSTR pszAliasDeviceInterface
,
3286 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
3288 FIXME("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
3289 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
3291 return CR_CALL_NOT_IMPLEMENTED
;
3295 /***********************************************************************
3296 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
3298 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExW(
3299 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPWSTR pszAliasDeviceInterface
,
3300 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
3302 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3303 ULONG ulTransferLength
;
3304 CONFIGRET ret
= CR_SUCCESS
;
3306 TRACE("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
3307 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
3309 if (pszDeviceInterface
== NULL
||
3310 AliasInterfaceGuid
== NULL
||
3311 pszAliasDeviceInterface
== NULL
||
3313 return CR_INVALID_POINTER
;
3316 return CR_INVALID_FLAG
;
3318 if (hMachine
!= NULL
)
3320 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3321 if (BindingHandle
== NULL
)
3326 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3330 ulTransferLength
= *pulLength
;
3334 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
3335 (LPWSTR
)pszDeviceInterface
,
3337 pszAliasDeviceInterface
,
3342 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3344 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3352 /***********************************************************************
3353 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
3355 CONFIGRET WINAPI
CM_Get_Device_Interface_ListA(
3356 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
3357 ULONG BufferLen
, ULONG ulFlags
)
3359 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
3360 pDeviceID
, Buffer
, BufferLen
, ulFlags
);
3362 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
3363 Buffer
, BufferLen
, ulFlags
, NULL
);
3367 /***********************************************************************
3368 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
3370 CONFIGRET WINAPI
CM_Get_Device_Interface_ListW(
3371 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
3372 ULONG BufferLen
, ULONG ulFlags
)
3374 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
3375 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
);
3377 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
3378 Buffer
, BufferLen
, ulFlags
, NULL
);
3382 /***********************************************************************
3383 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
3385 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExA(
3386 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
3387 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
3389 DEVINSTID_W pDeviceIdW
= NULL
;
3390 PWCHAR BufferW
= NULL
;
3391 CONFIGRET ret
= CR_SUCCESS
;
3393 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
3394 pDeviceID
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3396 if (Buffer
== NULL
||
3398 return CR_INVALID_POINTER
;
3400 if (pDeviceID
!= NULL
)
3402 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
3403 return CR_INVALID_DEVICE_ID
;
3406 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
3407 if (BufferW
== NULL
)
3409 ret
= CR_OUT_OF_MEMORY
;
3413 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
3414 BufferW
, BufferLen
, ulFlags
,
3416 if (ret
!= CR_SUCCESS
)
3419 if (WideCharToMultiByte(CP_ACP
,
3422 lstrlenW(BufferW
) + 1,
3430 if (BufferW
!= NULL
)
3433 if (pDeviceIdW
!= NULL
)
3440 /***********************************************************************
3441 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
3443 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExW(
3444 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
3445 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
3447 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3448 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
3449 CONFIGRET ret
= CR_SUCCESS
;
3451 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
3452 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
, hMachine
);
3454 if (Buffer
== NULL
||
3456 return CR_INVALID_POINTER
;
3458 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
3459 return CR_INVALID_FLAG
;
3461 if (hMachine
!= NULL
)
3463 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3464 if (BindingHandle
== NULL
)
3469 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3474 BufferSize
= BufferLen
;
3478 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
3485 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3487 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3495 /***********************************************************************
3496 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
3498 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeA(
3499 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
3502 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
3503 pDeviceId
, ulFlags
);
3505 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
3506 pDeviceId
, ulFlags
, NULL
);
3510 /***********************************************************************
3511 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
3513 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeW(
3514 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
3517 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
3518 debugstr_w(pDeviceId
), ulFlags
);
3520 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
3521 pDeviceId
, ulFlags
, NULL
);
3525 /***********************************************************************
3526 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
3528 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExA(
3529 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
3530 ULONG ulFlags
, HMACHINE hMachine
)
3532 DEVINSTID_W pDeviceIdW
= NULL
;
3533 CONFIGRET ret
= CR_SUCCESS
;
3535 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
3536 pDeviceId
, ulFlags
, hMachine
);
3539 return CR_INVALID_POINTER
;
3541 if (pDeviceId
!= NULL
)
3543 if (!pSetupCaptureAndConvertAnsiArg(pDeviceId
, &pDeviceIdW
))
3544 return CR_INVALID_DEVICE_ID
;
3549 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
3550 pDeviceIdW
, ulFlags
, hMachine
);
3552 if (pDeviceIdW
!= NULL
)
3559 /***********************************************************************
3560 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
3562 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExW(
3563 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
3564 ULONG ulFlags
, HMACHINE hMachine
)
3566 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3567 CONFIGRET ret
= CR_SUCCESS
;
3569 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
3570 debugstr_w(pDeviceId
), ulFlags
, hMachine
);
3573 return CR_INVALID_POINTER
;
3575 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
3576 return CR_INVALID_FLAG
;
3578 if (hMachine
!= NULL
)
3580 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3581 if (BindingHandle
== NULL
)
3586 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3594 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
3600 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3602 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3610 /***********************************************************************
3611 * CM_Get_First_Log_Conf [SETUPAPI.@]
3613 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
3614 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
3616 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
3617 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
3621 /***********************************************************************
3622 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
3624 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
3625 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3627 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3628 HSTRING_TABLE StringTable
= NULL
;
3629 LPWSTR lpDevInst
= NULL
;
3630 CONFIGRET ret
= CR_SUCCESS
;
3632 PLOG_CONF_INFO pLogConfInfo
;
3634 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
3637 return CR_INVALID_DEVINST
;
3639 if (ulFlags
& ~LOG_CONF_BITS
)
3640 return CR_INVALID_FLAG
;
3645 if (hMachine
!= NULL
)
3647 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3648 if (BindingHandle
== NULL
)
3651 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3652 if (StringTable
== 0)
3657 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3661 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3662 if (lpDevInst
== NULL
)
3663 return CR_INVALID_DEVNODE
;
3667 ret
= PNP_GetFirstLogConf(BindingHandle
,
3673 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3675 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3679 if (ret
!= CR_SUCCESS
)
3684 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3685 if (pLogConfInfo
== NULL
)
3686 return CR_OUT_OF_MEMORY
;
3688 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3689 pLogConfInfo
->dnDevInst
= dnDevInst
;
3690 pLogConfInfo
->ulFlags
= ulFlags
;
3691 pLogConfInfo
->ulTag
= ulTag
;
3693 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
3700 /***********************************************************************
3701 * CM_Get_Global_State [SETUPAPI.@]
3703 CONFIGRET WINAPI
CM_Get_Global_State(
3704 PULONG pulState
, ULONG ulFlags
)
3706 TRACE("%p %lx\n", pulState
, ulFlags
);
3707 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
3711 /***********************************************************************
3712 * CM_Get_Global_State_Ex [SETUPAPI.@]
3714 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
3715 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
3717 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3720 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
3722 if (pulState
== NULL
)
3723 return CR_INVALID_POINTER
;
3726 return CR_INVALID_FLAG
;
3728 if (hMachine
!= NULL
)
3730 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3731 if (BindingHandle
== NULL
)
3736 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3742 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
3744 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3746 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3754 /***********************************************************************
3755 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
3757 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
3758 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3761 TRACE("%s %lu %p %lx\n", szDevInstName
,
3762 ulHardwareProfile
, pulValue
, ulFlags
);
3764 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
3765 pulValue
, ulFlags
, NULL
);
3769 /***********************************************************************
3770 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
3772 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
3773 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3776 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
3777 ulHardwareProfile
, pulValue
, ulFlags
);
3779 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
3780 pulValue
, ulFlags
, NULL
);
3784 /***********************************************************************
3785 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
3787 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
3788 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3789 ULONG ulFlags
, HMACHINE hMachine
)
3791 DEVINSTID_W pszDevIdW
= NULL
;
3792 CONFIGRET ret
= CR_SUCCESS
;
3794 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
3795 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3797 if (szDevInstName
!= NULL
)
3799 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
3800 return CR_INVALID_DEVICE_ID
;
3803 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
3804 pulValue
, ulFlags
, hMachine
);
3806 if (pszDevIdW
!= NULL
)
3813 /***********************************************************************
3814 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
3816 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
3817 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3818 ULONG ulFlags
, HMACHINE hMachine
)
3820 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3823 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
3824 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3826 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
3827 return CR_INVALID_POINTER
;
3830 return CR_INVALID_FLAG
;
3832 /* FIXME: Check whether szDevInstName is valid */
3834 if (hMachine
!= NULL
)
3836 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3837 if (BindingHandle
== NULL
)
3842 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3848 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
3849 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
3851 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3853 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3861 /***********************************************************************
3862 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
3864 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoA(
3865 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
)
3867 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3869 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
3874 /***********************************************************************
3875 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
3877 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoW(
3878 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
)
3880 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3882 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
3887 /***********************************************************************
3888 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
3890 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExA(
3891 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
,
3894 HWPROFILEINFO_W LocalProfileInfo
;
3897 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3899 if (pHWProfileInfo
== NULL
)
3900 return CR_INVALID_POINTER
;
3902 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
3904 if (ret
== CR_SUCCESS
)
3906 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
3907 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
3909 if (WideCharToMultiByte(CP_ACP
,
3911 LocalProfileInfo
.HWPI_szFriendlyName
,
3912 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
3913 pHWProfileInfo
->HWPI_szFriendlyName
,
3924 /***********************************************************************
3925 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
3927 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExW(
3928 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
,
3931 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3934 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3936 if (pHWProfileInfo
== NULL
)
3937 return CR_INVALID_POINTER
;
3940 return CR_INVALID_FLAG
;
3942 if (hMachine
!= NULL
)
3944 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3945 if (BindingHandle
== NULL
)
3950 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3956 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
3957 sizeof(HWPROFILEINFO_W
), 0);
3959 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3961 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3969 /***********************************************************************
3970 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
3972 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
3973 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
3975 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
3976 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
3980 /***********************************************************************
3981 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
3983 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
3984 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
3987 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3988 HSTRING_TABLE StringTable
= NULL
;
3989 PLOG_CONF_INFO pLogConfInfo
;
3993 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
3995 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3996 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3997 return CR_INVALID_LOG_CONF
;
3999 if (pPriority
== NULL
)
4000 return CR_INVALID_POINTER
;
4003 return CR_INVALID_FLAG
;
4005 if (hMachine
!= NULL
)
4007 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4008 if (BindingHandle
== NULL
)
4011 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4012 if (StringTable
== 0)
4017 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4021 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4022 if (lpDevInst
== NULL
)
4023 return CR_INVALID_DEVNODE
;
4027 ret
= PNP_GetLogConfPriority(BindingHandle
,
4029 pLogConfInfo
->ulFlags
,
4030 pLogConfInfo
->ulTag
,
4034 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4036 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4044 /***********************************************************************
4045 * CM_Get_Next_Log_Conf [SETUPAPI.@]
4047 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
4048 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
4050 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
4051 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
4055 /***********************************************************************
4056 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
4058 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
4059 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
4062 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4063 HSTRING_TABLE StringTable
= NULL
;
4064 PLOG_CONF_INFO pLogConfInfo
;
4065 PLOG_CONF_INFO pNewLogConfInfo
;
4070 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
4075 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4076 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
4077 return CR_INVALID_LOG_CONF
;
4080 return CR_INVALID_FLAG
;
4082 if (hMachine
!= NULL
)
4084 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4085 if (BindingHandle
== NULL
)
4088 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4089 if (StringTable
== 0)
4094 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4098 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4099 if (lpDevInst
== NULL
)
4100 return CR_INVALID_DEVNODE
;
4104 ret
= PNP_GetNextLogConf(BindingHandle
,
4106 pLogConfInfo
->ulFlags
,
4107 pLogConfInfo
->ulTag
,
4111 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4113 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4117 if (ret
!= CR_SUCCESS
)
4122 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4123 if (pNewLogConfInfo
== NULL
)
4124 return CR_OUT_OF_MEMORY
;
4126 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4127 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
4128 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
4129 pNewLogConfInfo
->ulTag
= ulNewTag
;
4131 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
4138 /***********************************************************************
4139 * CM_Get_Next_Re_Des [SETUPAPI.@]
4141 CONFIGRET WINAPI
CM_Get_Next_Res_Des(
4142 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
4143 PRESOURCEID pResourceID
, ULONG ulFlags
)
4145 TRACE("%p %p %lu %p %lx\n", prdResDes
, rdResDes
, ForResource
,
4146 pResourceID
, ulFlags
);
4147 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
4148 pResourceID
, ulFlags
, NULL
);
4152 /***********************************************************************
4153 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
4155 CONFIGRET WINAPI
CM_Get_Next_Res_Des_Ex(
4156 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
4157 PRESOURCEID pResourceID
, ULONG ulFlags
, HMACHINE hMachine
)
4159 FIXME("%p %p %lu %p %lx %lx\n", prdResDes
, rdResDes
, ForResource
,
4160 pResourceID
, ulFlags
, hMachine
);
4162 return CR_CALL_NOT_IMPLEMENTED
;
4166 /***********************************************************************
4167 * CM_Get_Parent [SETUPAPI.@]
4169 CONFIGRET WINAPI
CM_Get_Parent(
4170 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
4172 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
4173 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
4177 /***********************************************************************
4178 * CM_Get_Parent_Ex [SETUPAPI.@]
4180 CONFIGRET WINAPI
CM_Get_Parent_Ex(
4181 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4183 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
4184 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4185 HSTRING_TABLE StringTable
= NULL
;
4187 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
4190 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
4192 if (pdnDevInst
== NULL
)
4193 return CR_INVALID_POINTER
;
4196 return CR_INVALID_DEVINST
;
4199 return CR_INVALID_FLAG
;
4203 if (hMachine
!= NULL
)
4205 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4206 if (BindingHandle
== NULL
)
4209 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4210 if (StringTable
== 0)
4215 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4219 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4220 if (lpDevInst
== NULL
)
4221 return CR_INVALID_DEVNODE
;
4225 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
4226 PNP_GET_PARENT_DEVICE_INSTANCE
,
4232 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4234 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4238 if (ret
!= CR_SUCCESS
)
4241 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
4243 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
4247 *pdnDevInst
= dwIndex
;
4253 /***********************************************************************
4254 * CM_Get_Res_Des_Data [SETUPAPI.@]
4256 CONFIGRET WINAPI
CM_Get_Res_Des_Data(
4257 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
)
4259 TRACE("%p %p %l %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
);
4260 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
4264 /***********************************************************************
4265 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
4267 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Ex(
4268 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
,
4271 FIXME("%p %p %l %lx %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
4272 return CR_CALL_NOT_IMPLEMENTED
;
4276 /***********************************************************************
4277 * CM_Get_Res_Des_Size [SETUPAPI.@]
4279 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size(
4280 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
)
4282 TRACE("%p %p %lx\n", pulSize
, rdResDes
, ulFlags
);
4283 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
4287 /***********************************************************************
4288 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
4290 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size_Ex(
4291 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
, HMACHINE hMachine
)
4293 TRACE("%p %p %lx %lx\n", pulSize
, rdResDes
, ulFlags
, hMachine
);
4294 return CR_CALL_NOT_IMPLEMENTED
;
4298 /***********************************************************************
4299 * CM_Get_Sibling [SETUPAPI.@]
4301 CONFIGRET WINAPI
CM_Get_Sibling(
4302 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
4304 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
4305 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
4309 /***********************************************************************
4310 * CM_Get_Sibling_Ex [SETUPAPI.@]
4312 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
4313 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4315 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
4316 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4317 HSTRING_TABLE StringTable
= NULL
;
4319 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
4322 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
4324 if (pdnDevInst
== NULL
)
4325 return CR_INVALID_POINTER
;
4328 return CR_INVALID_DEVINST
;
4331 return CR_INVALID_FLAG
;
4335 if (hMachine
!= NULL
)
4337 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4338 if (BindingHandle
== NULL
)
4341 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4342 if (StringTable
== 0)
4347 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4351 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4352 if (lpDevInst
== NULL
)
4353 return CR_INVALID_DEVNODE
;
4357 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
4358 PNP_GET_SIBLING_DEVICE_INSTANCE
,
4364 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4366 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4370 if (ret
!= CR_SUCCESS
)
4373 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
4375 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
4379 *pdnDevInst
= dwIndex
;
4385 /***********************************************************************
4386 * CM_Get_Version [SETUPAPI.@]
4388 WORD WINAPI
CM_Get_Version(VOID
)
4391 return CM_Get_Version_Ex(NULL
);
4395 /***********************************************************************
4396 * CM_Get_Version_Ex [SETUPAPI.@]
4398 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
4400 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4404 TRACE("%lx\n", hMachine
);
4406 if (hMachine
!= NULL
)
4408 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4409 if (BindingHandle
== NULL
)
4414 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4420 ret
= PNP_GetVersion(BindingHandle
, &Version
);
4422 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4424 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4428 if (ret
!= CR_SUCCESS
)
4435 /***********************************************************************
4436 * CM_Intersect_Range_List [SETUPAPI.@]
4440 CM_Intersect_Range_List(
4441 _In_ RANGE_LIST rlhOld1
,
4442 _In_ RANGE_LIST rlhOld2
,
4443 _In_ RANGE_LIST rlhNew
,
4446 FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
4447 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
4448 return CR_CALL_NOT_IMPLEMENTED
;
4452 /***********************************************************************
4453 * CM_Invert_Range_List [SETUPAPI.@]
4457 CM_Invert_Range_List(
4458 _In_ RANGE_LIST rlhOld
,
4459 _In_ RANGE_LIST rlhNew
,
4460 _In_ DWORDLONG ullMaxValue
,
4463 FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
4464 rlhOld
, rlhNew
, ullMaxValue
, ulFlags
);
4465 return CR_CALL_NOT_IMPLEMENTED
;
4469 /***********************************************************************
4470 * CM_Is_Dock_Station_Present [SETUPAPI.@]
4474 CM_Is_Dock_Station_Present(
4475 _Out_ PBOOL pbPresent
)
4477 TRACE("CM_Is_Dock_Station_Present(%p)\n",
4479 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
4483 /***********************************************************************
4484 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
4488 CM_Is_Dock_Station_Present_Ex(
4489 _Out_ PBOOL pbPresent
,
4490 _In_opt_ HMACHINE hMachine
)
4492 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4495 TRACE("CM_Is_Dock_Station_Present_Ex(%p %lx)\n",
4496 pbPresent
, hMachine
);
4498 if (pbPresent
== NULL
)
4499 return CR_INVALID_POINTER
;
4503 if (hMachine
!= NULL
)
4505 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4506 if (BindingHandle
== NULL
)
4511 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4517 ret
= PNP_IsDockStationPresent(BindingHandle
,
4520 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4522 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4530 /***********************************************************************
4531 * CM_Is_Version_Available_Ex [SETUPAPI.@]
4535 CM_Is_Version_Available(
4538 TRACE("CM_Is_Version_Available(%hu)\n",
4540 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
4544 /***********************************************************************
4545 * CM_Is_Version_Available_Ex [SETUPAPI.@]
4549 CM_Is_Version_Available_Ex(
4551 _In_opt_ HMACHINE hMachine
)
4553 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4554 WORD wServerVersion
;
4557 TRACE("CM_Is_Version_Available_Ex(%hu %lx)\n",
4558 wVersion
, hMachine
);
4560 if (wVersion
<= 0x400)
4563 if (hMachine
!= NULL
)
4565 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4566 if (BindingHandle
== NULL
)
4571 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4577 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
4579 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4581 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4585 if (ret
!= CR_SUCCESS
)
4588 return (wServerVersion
>= wVersion
);
4592 /***********************************************************************
4593 * CM_Locate_DevNodeA [SETUPAPI.@]
4598 _Out_ PDEVINST pdnDevInst
,
4599 _In_opt_ DEVINSTID_A pDeviceID
,
4602 TRACE("CM_Locate_DevNodeA(%p %s %lu)\n",
4603 pdnDevInst
, pDeviceID
, ulFlags
);
4604 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
4608 /***********************************************************************
4609 * CM_Locate_DevNodeW [SETUPAPI.@]
4614 _Out_ PDEVINST pdnDevInst
,
4615 _In_opt_ DEVINSTID_W pDeviceID
,
4618 TRACE("CM_Locate_DevNodeW(%p %s %lu)\n",
4619 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
4620 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
4624 /***********************************************************************
4625 * CM_Locate_DevNode_ExA [SETUPAPI.@]
4629 CM_Locate_DevNode_ExA(
4630 _Out_ PDEVINST pdnDevInst
,
4631 _In_opt_ DEVINSTID_A pDeviceID
,
4633 _In_opt_ HMACHINE hMachine
)
4635 DEVINSTID_W pDevIdW
= NULL
;
4636 CONFIGRET ret
= CR_SUCCESS
;
4638 TRACE("CM_Locate_DevNode_ExA(%p %s %lu %lx)\n",
4639 pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
4641 if (pDeviceID
!= NULL
)
4643 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
4644 return CR_INVALID_DEVICE_ID
;
4647 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
4649 if (pDevIdW
!= NULL
)
4656 /***********************************************************************
4657 * CM_Locate_DevNode_ExW [SETUPAPI.@]
4661 CM_Locate_DevNode_ExW(
4662 _Out_ PDEVINST pdnDevInst
,
4663 _In_opt_ DEVINSTID_W pDeviceID
,
4665 _In_opt_ HMACHINE hMachine
)
4667 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
4668 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4669 HSTRING_TABLE StringTable
= NULL
;
4670 CONFIGRET ret
= CR_SUCCESS
;
4672 TRACE("CM_Locate_DevNode_ExW(%p %s %lu %lx)\n",
4673 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
4675 if (pdnDevInst
== NULL
)
4676 return CR_INVALID_POINTER
;
4678 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
4679 return CR_INVALID_FLAG
;
4681 if (hMachine
!= NULL
)
4683 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4684 if (BindingHandle
== NULL
)
4687 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4688 if (StringTable
== 0)
4693 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4697 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
4699 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
4705 /* Get the root device ID */
4706 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
4710 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4712 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4716 if (ret
!= CR_SUCCESS
)
4719 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
4723 /* Validate the device ID */
4724 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
4728 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4730 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4734 if (ret
== CR_SUCCESS
)
4736 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
4737 if (*pdnDevInst
== -1)
4745 /***********************************************************************
4746 * CM_Merge_Range_List [SETUPAPI.@]
4750 CM_Merge_Range_List(
4751 _In_ RANGE_LIST rlhOld1
,
4752 _In_ RANGE_LIST rlhOld2
,
4753 _In_ RANGE_LIST rlhNew
,
4756 FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
4757 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
4758 return CR_CALL_NOT_IMPLEMENTED
;
4762 /***********************************************************************
4763 * CM_Modify_Res_Des [SETUPAPI.@]
4768 _Out_ PRES_DES prdResDes
,
4769 _In_ RES_DES rdResDes
,
4770 _In_ RESOURCEID ResourceID
,
4771 _In_ PCVOID ResourceData
,
4772 _In_ ULONG ResourceLen
,
4775 TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
4776 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4777 ResourceLen
, ulFlags
);
4778 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4779 ResourceLen
, ulFlags
, NULL
);
4783 /***********************************************************************
4784 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
4788 CM_Modify_Res_Des_Ex(
4789 _Out_ PRES_DES prdResDes
,
4790 _In_ RES_DES rdResDes
,
4791 _In_ RESOURCEID ResourceID
,
4792 _In_ PCVOID ResourceData
,
4793 _In_ ULONG ResourceLen
,
4795 _In_opt_ HMACHINE hMachine
)
4797 FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %lx)\n",
4798 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4799 ResourceLen
, ulFlags
, hMachine
);
4800 return CR_CALL_NOT_IMPLEMENTED
;
4804 /***********************************************************************
4805 * CM_Move_DevNode [SETUPAPI.@]
4810 _In_ DEVINST dnFromDevInst
,
4811 _In_ DEVINST dnToDevInst
,
4814 TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
4815 dnFromDevInst
, dnToDevInst
, ulFlags
);
4816 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
4820 /***********************************************************************
4821 * CM_Move_DevNode_Ex [SETUPAPI.@]
4826 _In_ DEVINST dnFromDevInst
,
4827 _In_ DEVINST dnToDevInst
,
4829 _In_opt_ HMACHINE hMachine
)
4831 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4832 HSTRING_TABLE StringTable
= NULL
;
4833 LPWSTR lpFromDevInst
;
4837 FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %lx)\n",
4838 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
4840 if (!pSetupIsUserAdmin())
4841 return CR_ACCESS_DENIED
;
4843 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
4844 return CR_INVALID_DEVNODE
;
4847 return CR_INVALID_FLAG
;
4849 if (hMachine
!= NULL
)
4851 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4852 if (BindingHandle
== NULL
)
4855 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4856 if (StringTable
== 0)
4861 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4865 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
4866 if (lpFromDevInst
== NULL
)
4867 return CR_INVALID_DEVNODE
;
4869 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
4870 if (lpToDevInst
== NULL
)
4871 return CR_INVALID_DEVNODE
;
4875 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4881 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4883 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4891 /***********************************************************************
4892 * CM_Next_Range [SETUPAPI.@]
4897 _Inout_ PRANGE_ELEMENT preElement
,
4898 _Out_ PDWORDLONG pullStart
,
4899 _Out_ PDWORDLONG pullEnd
,
4902 FIXME("CM_Next_Range(%p %p %p %lx)\n",
4903 preElement
, pullStart
, pullEnd
, ulFlags
);
4904 return CR_CALL_NOT_IMPLEMENTED
;
4908 /***********************************************************************
4909 * CM_Open_Class_KeyA [SETUPAPI.@]
4914 _In_opt_ LPGUID pClassGuid
,
4915 _In_opt_ LPCSTR pszClassName
,
4916 _In_ REGSAM samDesired
,
4917 _In_ REGDISPOSITION Disposition
,
4918 _Out_ PHKEY phkClass
,
4921 TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
4922 debugstr_guid(pClassGuid
), pszClassName
,
4923 samDesired
, Disposition
, phkClass
, ulFlags
);
4925 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
4926 Disposition
, phkClass
, ulFlags
, NULL
);
4930 /***********************************************************************
4931 * CM_Open_Class_KeyW [SETUPAPI.@]
4936 _In_opt_ LPGUID pClassGuid
,
4937 _In_opt_ LPCWSTR pszClassName
,
4938 _In_ REGSAM samDesired
,
4939 _In_ REGDISPOSITION Disposition
,
4940 _Out_ PHKEY phkClass
,
4943 TRACE("CM_Open_Class_KeyW%p %s %lx %lx %p %lx)\n",
4944 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4945 samDesired
, Disposition
, phkClass
, ulFlags
);
4947 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
4948 Disposition
, phkClass
, ulFlags
, NULL
);
4952 /***********************************************************************
4953 * CM_Open_Class_Key_ExA [SETUPAPI.@]
4957 CM_Open_Class_Key_ExA(
4958 _In_opt_ LPGUID pClassGuid
,
4959 _In_opt_ LPCSTR pszClassName
,
4960 _In_ REGSAM samDesired
,
4961 _In_ REGDISPOSITION Disposition
,
4962 _Out_ PHKEY phkClass
,
4964 _In_opt_ HMACHINE hMachine
)
4966 LPWSTR pszClassNameW
= NULL
;
4969 TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %lx)\n",
4970 debugstr_guid(pClassGuid
), pszClassName
,
4971 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4973 if (pszClassName
!= NULL
)
4975 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
4976 return CR_INVALID_DATA
;
4979 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
4980 Disposition
, phkClass
, ulFlags
, hMachine
);
4982 if (pszClassNameW
!= NULL
)
4983 MyFree(pszClassNameW
);
4989 /***********************************************************************
4990 * CM_Open_Class_Key_ExW [SETUPAPI.@]
4994 CM_Open_Class_Key_ExW(
4995 _In_opt_ LPGUID pClassGuid
,
4996 _In_opt_ LPCWSTR pszClassName
,
4997 _In_ REGSAM samDesired
,
4998 _In_ REGDISPOSITION Disposition
,
4999 _Out_ PHKEY phkClass
,
5001 _In_opt_ HMACHINE hMachine
)
5003 WCHAR szKeyName
[MAX_PATH
];
5004 LPWSTR lpGuidString
;
5005 DWORD dwDisposition
;
5009 TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %lx)\n",
5010 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
5011 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
5013 /* Check Disposition and ulFlags */
5014 if ((Disposition
& ~RegDisposition_Bits
) ||
5015 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
5016 return CR_INVALID_FLAG
;
5018 /* Check phkClass */
5019 if (phkClass
== NULL
)
5020 return CR_INVALID_POINTER
;
5024 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
5025 pszClassName
!= NULL
)
5026 return CR_INVALID_DATA
;
5028 if (hMachine
== NULL
)
5030 hKey
= HKEY_LOCAL_MACHINE
;
5034 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
5037 return CR_REGISTRY_ERROR
;
5040 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
5042 lstrcpyW(szKeyName
, DeviceClasses
);
5046 lstrcpyW(szKeyName
, ControlClass
);
5049 if (pClassGuid
!= NULL
)
5051 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
5054 return CR_INVALID_DATA
;
5057 lstrcatW(szKeyName
, Backslash
);
5058 lstrcatW(szKeyName
, lpGuidString
);
5061 if (Disposition
== RegDisposition_OpenAlways
)
5063 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
5064 NULL
, phkClass
, &dwDisposition
);
5068 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
5073 if (pClassGuid
!= NULL
)
5074 RpcStringFreeW(&lpGuidString
);
5076 if (dwError
!= ERROR_SUCCESS
)
5079 return CR_NO_SUCH_REGISTRY_KEY
;
5082 if (pszClassName
!= NULL
)
5084 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
5085 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
5092 /***********************************************************************
5093 * CM_Open_DevNode_Key [SETUPAPI.@]
5097 CM_Open_DevNode_Key(
5098 _In_ DEVINST dnDevNode
,
5099 _In_ REGSAM samDesired
,
5100 _In_ ULONG ulHardwareProfile
,
5101 _In_ REGDISPOSITION Disposition
,
5102 _Out_ PHKEY phkDevice
,
5105 TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
5106 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
5107 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
5108 Disposition
, phkDevice
, ulFlags
, NULL
);
5112 /***********************************************************************
5113 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
5117 CM_Open_DevNode_Key_Ex(
5118 _In_ DEVINST dnDevNode
,
5119 _In_ REGSAM samDesired
,
5120 _In_ ULONG ulHardwareProfile
,
5121 _In_ REGDISPOSITION Disposition
,
5122 _Out_ PHKEY phkDevice
,
5124 _In_opt_ HMACHINE hMachine
)
5126 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5127 HSTRING_TABLE StringTable
= NULL
;
5128 LPWSTR pszDevInst
, pszKeyPath
= NULL
, pszInstancePath
= NULL
;
5130 DWORD dwDisposition
;
5131 HKEY hRootKey
= NULL
;
5132 CONFIGRET ret
= CR_CALL_NOT_IMPLEMENTED
;
5134 FIXME("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %lx)\n",
5135 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
5137 if (phkDevice
== NULL
)
5138 return CR_INVALID_POINTER
;
5143 return CR_INVALID_DEVNODE
;
5145 if (ulFlags
& ~CM_REGISTRY_BITS
)
5146 return CR_INVALID_FLAG
;
5148 if (Disposition
& ~RegDisposition_Bits
)
5149 return CR_INVALID_DATA
;
5151 if (hMachine
!= NULL
)
5153 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5154 if (BindingHandle
== NULL
)
5157 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5158 if (StringTable
== 0)
5163 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5167 pszDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevNode
);
5168 if (pszDevInst
== NULL
)
5169 return CR_INVALID_DEVNODE
;
5171 TRACE("pszDevInst: %S\n", pszDevInst
);
5173 pszKeyPath
= MyMalloc(512 * sizeof(WCHAR
));
5174 if (pszKeyPath
== NULL
)
5176 ret
= CR_OUT_OF_MEMORY
;
5180 pszInstancePath
= MyMalloc(512 * sizeof(WCHAR
));
5181 if (pszInstancePath
== NULL
)
5183 ret
= CR_OUT_OF_MEMORY
;
5187 ret
= GetDeviceInstanceKeyPath(BindingHandle
,
5193 if (ret
!= CR_SUCCESS
)
5196 TRACE("pszKeyPath: %S\n", pszKeyPath
);
5197 TRACE("pszInstancePath: %S\n", pszInstancePath
);
5199 wcscat(pszKeyPath
, L
"\\");
5200 wcscat(pszKeyPath
, pszInstancePath
);
5202 TRACE("pszKeyPath: %S\n", pszKeyPath
);
5204 if (hMachine
== NULL
)
5206 hRootKey
= HKEY_LOCAL_MACHINE
;
5210 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
5214 ret
= CR_REGISTRY_ERROR
;
5219 if (Disposition
== RegDisposition_OpenAlways
)
5221 lError
= RegCreateKeyExW(hRootKey
,
5233 lError
= RegOpenKeyExW(hRootKey
,
5240 if (lError
!= ERROR_SUCCESS
)
5243 ret
= CR_NO_SUCH_REGISTRY_KEY
;
5247 if ((hRootKey
!= NULL
) && (hRootKey
!= HKEY_LOCAL_MACHINE
))
5248 RegCloseKey(hRootKey
);
5250 if (pszInstancePath
!= NULL
)
5251 MyFree(pszInstancePath
);
5253 if (pszKeyPath
!= NULL
)
5260 /***********************************************************************
5261 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
5263 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeA(
5264 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5265 ULONG ulNameLength
, ULONG ulFlags
)
5267 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
5268 ulNameLength
, ulFlags
);
5270 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
5271 ulNameLength
, ulFlags
, NULL
);
5275 /***********************************************************************
5276 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
5278 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeW(
5279 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5280 ULONG ulNameLength
, ULONG ulFlags
)
5282 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
,
5283 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
5285 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
5286 ulNameLength
, ulFlags
, NULL
);
5290 /***********************************************************************
5291 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
5293 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExA(
5294 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5295 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5297 LPWSTR lpLocalVetoName
;
5300 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
5301 ulNameLength
, ulFlags
, hMachine
);
5303 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5304 return CR_INVALID_POINTER
;
5306 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
5307 if (lpLocalVetoName
== NULL
)
5308 return CR_OUT_OF_MEMORY
;
5310 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
5311 ulNameLength
, ulFlags
, hMachine
);
5312 if (ret
== CR_REMOVE_VETOED
)
5314 if (WideCharToMultiByte(CP_ACP
,
5325 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
5331 /***********************************************************************
5332 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
5334 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExW(
5335 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5336 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5338 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5339 HSTRING_TABLE StringTable
= NULL
;
5343 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
,
5344 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
5346 if (dnAncestor
== 0)
5347 return CR_INVALID_DEVNODE
;
5349 if (ulFlags
& ~CM_REMOVE_BITS
)
5350 return CR_INVALID_FLAG
;
5352 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5353 return CR_INVALID_POINTER
;
5355 if (hMachine
!= NULL
)
5357 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5358 if (BindingHandle
== NULL
)
5361 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5362 if (StringTable
== 0)
5367 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5371 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
5372 if (lpDevInst
== NULL
)
5373 return CR_INVALID_DEVNODE
;
5377 ret
= PNP_QueryRemove(BindingHandle
,
5384 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5386 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5394 /***********************************************************************
5395 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
5397 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data(
5398 PVOID pData
, ULONG DataLen
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
5401 TRACE("%p %lu %lx %lu 0x%08lx\n", pData
, DataLen
, dnDevInst
,
5402 ResourceID
, ulFlags
);
5404 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
5405 ResourceID
, ulFlags
, NULL
);
5409 /***********************************************************************
5410 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
5412 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data_Ex(
5415 IN DEVINST dnDevInst
,
5416 IN RESOURCEID ResourceID
,
5418 IN HMACHINE hMachine
)
5420 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5421 HSTRING_TABLE StringTable
= NULL
;
5425 TRACE("%p %lu %lx %lu 0x%08lx %p\n", pData
, DataLen
, dnDevInst
,
5426 ResourceID
, ulFlags
, hMachine
);
5428 if (pData
== NULL
|| DataLen
== 0)
5429 return CR_INVALID_POINTER
;
5432 return CR_INVALID_DEVINST
;
5434 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
5435 return CR_INVALID_FLAG
;
5437 if (hMachine
!= NULL
)
5439 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5440 if (BindingHandle
== NULL
)
5443 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5444 if (StringTable
== 0)
5449 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5453 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5454 if (lpDevInst
== NULL
)
5455 return CR_INVALID_DEVNODE
;
5459 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
5466 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5468 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5476 /***********************************************************************
5477 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
5479 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size(
5480 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
, ULONG ulFlags
)
5482 TRACE("%p %lu %lx 0x%08lx\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
);
5484 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
5489 /***********************************************************************
5490 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
5492 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size_Ex(
5493 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
5494 ULONG ulFlags
, HMACHINE hMachine
)
5496 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5497 HSTRING_TABLE StringTable
= NULL
;
5501 TRACE("%p %lu %lx 0x%08lx %p\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
,
5504 if (pulSize
== NULL
)
5505 return CR_INVALID_POINTER
;
5508 return CR_INVALID_DEVINST
;
5510 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
5511 return CR_INVALID_FLAG
;
5513 if (hMachine
!= NULL
)
5515 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5516 if (BindingHandle
== NULL
)
5519 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5520 if (StringTable
== 0)
5525 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5529 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5530 if (lpDevInst
== NULL
)
5531 return CR_INVALID_DEVNODE
;
5535 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
5541 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5543 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5551 /***********************************************************************
5552 * CM_Query_Remove_SubTree [SETUPAPI.@]
5554 * This function is obsolete in Windows XP and above.
5556 CONFIGRET WINAPI
CM_Query_Remove_SubTree(
5557 DEVINST dnAncestor
, ULONG ulFlags
)
5559 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
5560 return CR_CALL_NOT_IMPLEMENTED
;
5564 /***********************************************************************
5565 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
5567 * This function is obsolete in Windows XP and above.
5569 CONFIGRET WINAPI
CM_Query_Remove_SubTree_Ex(
5570 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
5572 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
5573 return CR_CALL_NOT_IMPLEMENTED
;
5577 /***********************************************************************
5578 * CM_Reenumerate_DevNode [SETUPAPI.@]
5580 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
5581 DEVINST dnDevInst
, ULONG ulFlags
)
5583 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
5584 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
5588 /***********************************************************************
5589 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
5592 CM_Reenumerate_DevNode_Ex(
5593 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5595 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5596 HSTRING_TABLE StringTable
= NULL
;
5600 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
5603 return CR_INVALID_DEVNODE
;
5605 if (ulFlags
& ~CM_REENUMERATE_BITS
)
5606 return CR_INVALID_FLAG
;
5608 if (hMachine
!= NULL
)
5610 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5611 if (BindingHandle
== NULL
)
5614 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5615 if (StringTable
== 0)
5620 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5624 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5625 if (lpDevInst
== NULL
)
5626 return CR_INVALID_DEVNODE
;
5630 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5631 PNP_DEVINST_REENUMERATE
,
5636 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5638 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5646 /***********************************************************************
5647 * CM_Register_Device_InterfaceA [SETUPAPI.@]
5649 CONFIGRET WINAPI
CM_Register_Device_InterfaceA(
5650 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
5651 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
5653 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5654 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
5656 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
5657 pszReference
, pszDeviceInterface
,
5658 pulLength
, ulFlags
, NULL
);
5662 /***********************************************************************
5663 * CM_Register_Device_InterfaceW [SETUPAPI.@]
5665 CONFIGRET WINAPI
CM_Register_Device_InterfaceW(
5666 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
5667 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
5669 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5670 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
5672 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
5673 pszReference
, pszDeviceInterface
,
5674 pulLength
, ulFlags
, NULL
);
5678 /***********************************************************************
5679 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
5681 CONFIGRET WINAPI
CM_Register_Device_Interface_ExA(
5682 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
5683 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
5685 LPWSTR pszReferenceW
= NULL
;
5686 LPWSTR pszDeviceInterfaceW
= NULL
;
5690 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5691 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
5693 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
5694 return CR_INVALID_POINTER
;
5696 if (pszReference
!= NULL
)
5698 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
5699 return CR_INVALID_DATA
;
5702 ulLength
= *pulLength
;
5704 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
5705 if (pszDeviceInterfaceW
== NULL
)
5707 ret
= CR_OUT_OF_MEMORY
;
5711 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
5714 pszDeviceInterfaceW
,
5718 if (ret
== CR_SUCCESS
)
5720 if (WideCharToMultiByte(CP_ACP
,
5722 pszDeviceInterfaceW
,
5731 *pulLength
= ulLength
;
5734 if (pszDeviceInterfaceW
!= NULL
)
5735 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
5737 if (pszReferenceW
!= NULL
)
5738 MyFree(pszReferenceW
);
5744 /***********************************************************************
5745 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
5747 CONFIGRET WINAPI
CM_Register_Device_Interface_ExW(
5748 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
5749 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
5751 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5752 HSTRING_TABLE StringTable
= NULL
;
5754 ULONG ulTransferLength
;
5757 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5758 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
5761 return CR_INVALID_DEVNODE
;
5763 if (InterfaceClassGuid
== NULL
||
5764 pszDeviceInterface
== NULL
||
5766 return CR_INVALID_POINTER
;
5769 return CR_INVALID_FLAG
;
5771 if (hMachine
!= NULL
)
5773 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5774 if (BindingHandle
== NULL
)
5777 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5778 if (StringTable
== 0)
5783 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5787 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5788 if (lpDevInst
== NULL
)
5789 return CR_INVALID_DEVNODE
;
5791 ulTransferLength
= *pulLength
;
5795 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
5798 (LPWSTR
)pszReference
,
5804 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5806 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5814 /***********************************************************************
5815 * CM_Register_Device_Driver [SETUPAPI.@]
5817 CONFIGRET WINAPI
CM_Register_Device_Driver(
5818 DEVINST dnDevInst
, ULONG ulFlags
)
5820 TRACE("%lx 0x%08lx\n", dnDevInst
, ulFlags
);
5821 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
5825 /***********************************************************************
5826 * CM_Register_Device_Driver [SETUPAPI.@]
5828 CONFIGRET WINAPI
CM_Register_Device_Driver_Ex(
5829 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5831 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5832 HSTRING_TABLE StringTable
= NULL
;
5836 TRACE("%lx 0x%08lx %p\n", dnDevInst
, ulFlags
, hMachine
);
5839 return CR_INVALID_DEVNODE
;
5841 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
5842 return CR_INVALID_FLAG
;
5844 if (hMachine
!= NULL
)
5846 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5847 if (BindingHandle
== NULL
)
5850 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5851 if (StringTable
== 0)
5856 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5860 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5861 if (lpDevInst
== NULL
)
5862 return CR_INVALID_DEVNODE
;
5866 ret
= PNP_RegisterDriver(BindingHandle
,
5870 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5872 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5880 /***********************************************************************
5881 * CM_Remove_SubTree [SETUPAPI.@]
5883 * This function is obsolete in Windows XP and above.
5885 CONFIGRET WINAPI
CM_Remove_SubTree(
5886 DEVINST dnAncestor
, ULONG ulFlags
)
5888 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
5889 return CR_CALL_NOT_IMPLEMENTED
;
5893 /***********************************************************************
5894 * CM_Remove_SubTree_Ex [SETUPAPI.@]
5896 * This function is obsolete in Windows XP and above.
5898 CONFIGRET WINAPI
CM_Remove_SubTree_Ex(
5899 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
5901 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
5902 return CR_CALL_NOT_IMPLEMENTED
;
5906 /***********************************************************************
5907 * CM_Request_Device_EjectA [SETUPAPI.@]
5909 CONFIGRET WINAPI
CM_Request_Device_EjectA(
5910 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5911 ULONG ulNameLength
, ULONG ulFlags
)
5913 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
5914 ulNameLength
, ulFlags
);
5915 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
5916 ulNameLength
, ulFlags
, NULL
);
5920 /***********************************************************************
5921 * CM_Request_Device_EjectW [SETUPAPI.@]
5923 CONFIGRET WINAPI
CM_Request_Device_EjectW(
5924 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5925 ULONG ulNameLength
, ULONG ulFlags
)
5927 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, debugstr_w(pszVetoName
),
5928 ulNameLength
, ulFlags
);
5929 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
5930 ulNameLength
, ulFlags
, NULL
);
5934 /***********************************************************************
5935 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
5937 CONFIGRET WINAPI
CM_Request_Device_Eject_ExA(
5938 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5939 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5941 LPWSTR lpLocalVetoName
;
5944 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
5945 ulNameLength
, ulFlags
, hMachine
);
5947 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5948 return CR_INVALID_POINTER
;
5950 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
5951 if (lpLocalVetoName
== NULL
)
5952 return CR_OUT_OF_MEMORY
;
5954 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
5955 ulNameLength
, ulFlags
, hMachine
);
5956 if (ret
== CR_REMOVE_VETOED
)
5958 if (WideCharToMultiByte(CP_ACP
,
5969 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
5975 /***********************************************************************
5976 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
5978 CONFIGRET WINAPI
CM_Request_Device_Eject_ExW(
5979 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5980 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5982 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5983 HSTRING_TABLE StringTable
= NULL
;
5987 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
,
5988 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
5991 return CR_INVALID_DEVNODE
;
5994 return CR_INVALID_FLAG
;
5996 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5997 return CR_INVALID_POINTER
;
5999 if (hMachine
!= NULL
)
6001 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6002 if (BindingHandle
== NULL
)
6005 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6006 if (StringTable
== 0)
6011 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6015 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6016 if (lpDevInst
== NULL
)
6017 return CR_INVALID_DEVNODE
;
6021 ret
= PNP_RequestDeviceEject(BindingHandle
,
6028 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6030 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6038 /***********************************************************************
6039 * CM_Request_Eject_PC [SETUPAPI.@]
6041 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
6044 return CM_Request_Eject_PC_Ex(NULL
);
6048 /***********************************************************************
6049 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
6051 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
6054 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6057 TRACE("%lx\n", hMachine
);
6059 if (hMachine
!= NULL
)
6061 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6062 if (BindingHandle
== NULL
)
6067 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6073 ret
= PNP_RequestEjectPC(BindingHandle
);
6075 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6077 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6085 /***********************************************************************
6086 * CM_Run_Detection [SETUPAPI.@]
6088 CONFIGRET WINAPI
CM_Run_Detection(
6091 TRACE("%lx\n", ulFlags
);
6092 return CM_Run_Detection_Ex(ulFlags
, NULL
);
6096 /***********************************************************************
6097 * CM_Run_Detection_Ex [SETUPAPI.@]
6099 CONFIGRET WINAPI
CM_Run_Detection_Ex(
6100 ULONG ulFlags
, HMACHINE hMachine
)
6102 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6105 TRACE("%lx %lx\n", ulFlags
, hMachine
);
6107 if (!pSetupIsUserAdmin())
6108 return CR_ACCESS_DENIED
;
6110 if (ulFlags
& ~CM_DETECT_BITS
)
6111 return CR_INVALID_FLAG
;
6113 if (hMachine
!= NULL
)
6115 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6116 if (BindingHandle
== NULL
)
6121 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6127 ret
= PNP_RunDetection(BindingHandle
,
6130 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6132 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6140 /***********************************************************************
6141 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
6143 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyA(
6144 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6145 ULONG ulFlags
, HMACHINE hMachine
)
6147 FIXME("%p %lx %p %lu %lx %p\n",
6148 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6149 return CR_CALL_NOT_IMPLEMENTED
;
6153 /***********************************************************************
6154 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
6156 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyW(
6157 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6158 ULONG ulFlags
, HMACHINE hMachine
)
6160 FIXME("%p %lx %p %lu %lx %p\n",
6161 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6162 return CR_CALL_NOT_IMPLEMENTED
;
6166 /***********************************************************************
6167 * CM_Set_DevNode_Problem [SETUPAPI.@]
6169 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
6170 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
6172 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
6173 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
6177 /***********************************************************************
6178 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
6180 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
6181 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
6183 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6184 HSTRING_TABLE StringTable
= NULL
;
6188 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
6191 return CR_INVALID_DEVNODE
;
6193 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
6194 return CR_INVALID_FLAG
;
6196 if (hMachine
!= NULL
)
6198 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6199 if (BindingHandle
== NULL
)
6202 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6203 if (StringTable
== 0)
6208 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6212 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6213 if (lpDevInst
== NULL
)
6214 return CR_INVALID_DEVNODE
;
6218 ret
= PNP_SetDeviceProblem(BindingHandle
,
6223 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6225 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6233 /***********************************************************************
6234 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
6236 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
6237 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6240 TRACE("%lx %lu %p %lx %lx\n",
6241 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
6242 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
6248 /***********************************************************************
6249 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
6251 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
6252 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6255 TRACE("%lx %lu %p %lx %lx\n",
6256 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
6257 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
6263 /***********************************************************************
6264 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
6266 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
6267 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6268 ULONG ulFlags
, HMACHINE hMachine
)
6270 CONFIGRET ret
= CR_SUCCESS
;
6274 FIXME("%lx %lu %p %lx %lx %lx\n",
6275 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6277 if (Buffer
== NULL
&& ulLength
!= 0)
6278 return CR_INVALID_POINTER
;
6280 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
6281 return CR_INVALID_PROPERTY
;
6285 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
6294 /* Get property type */
6295 ulType
= GetRegistryPropertyType(ulProperty
);
6297 /* Allocate buffer if needed */
6298 if (ulType
== REG_SZ
||
6299 ulType
== REG_MULTI_SZ
)
6301 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
6302 if (lpBuffer
== NULL
)
6304 ret
= CR_OUT_OF_MEMORY
;
6308 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
6309 ulLength
, lpBuffer
, ulLength
))
6316 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
6319 ulLength
* sizeof(WCHAR
),
6328 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
6336 ret
= CR_CALL_NOT_IMPLEMENTED
;
6343 /***********************************************************************
6344 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
6346 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
6347 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6348 ULONG ulFlags
, HMACHINE hMachine
)
6350 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6351 HSTRING_TABLE StringTable
= NULL
;
6356 TRACE("%lx %lu %p %lx %lx %lx\n",
6357 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6360 return CR_INVALID_DEVNODE
;
6362 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
6363 return CR_INVALID_PROPERTY
;
6365 if (Buffer
!= NULL
&& ulLength
== 0)
6366 return CR_INVALID_POINTER
;
6369 return CR_INVALID_FLAG
;
6371 if (hMachine
!= NULL
)
6373 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6374 if (BindingHandle
== NULL
)
6377 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6378 if (StringTable
== 0)
6383 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6387 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6388 if (lpDevInst
== NULL
)
6389 return CR_INVALID_DEVNODE
;
6391 /* Get property type */
6392 ulType
= GetRegistryPropertyType(ulProperty
);
6396 ret
= PNP_SetDeviceRegProp(BindingHandle
,
6404 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6406 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6414 /***********************************************************************
6415 * CM_Set_HW_Prof [SETUPAPI.@]
6417 CONFIGRET WINAPI
CM_Set_HW_Prof(
6418 ULONG ulHardwareProfile
, ULONG ulFlags
)
6420 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
6421 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
6425 /***********************************************************************
6426 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
6428 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
6429 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
6431 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6434 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
6436 if (!pSetupIsUserAdmin())
6437 return CR_ACCESS_DENIED
;
6440 return CR_INVALID_FLAG
;
6442 if (hMachine
!= NULL
)
6444 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6445 if (BindingHandle
== NULL
)
6450 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6456 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
6458 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6460 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6468 /***********************************************************************
6469 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
6471 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
6472 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6475 TRACE("%s %lu %lu %lx\n", szDevInstName
,
6476 ulConfig
, ulValue
, ulFlags
);
6477 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
6482 /***********************************************************************
6483 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
6485 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
6486 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6489 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
6490 ulConfig
, ulValue
, ulFlags
);
6491 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
6496 /***********************************************************************
6497 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
6499 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
6500 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6501 ULONG ulFlags
, HMACHINE hMachine
)
6503 DEVINSTID_W pszDevIdW
= NULL
;
6504 CONFIGRET ret
= CR_SUCCESS
;
6506 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
6507 ulConfig
, ulValue
, ulFlags
, hMachine
);
6509 if (szDevInstName
!= NULL
)
6511 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
6512 return CR_INVALID_DEVICE_ID
;
6515 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
6518 if (pszDevIdW
!= NULL
)
6525 /***********************************************************************
6526 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
6528 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
6529 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6530 ULONG ulFlags
, HMACHINE hMachine
)
6532 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6535 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
6536 ulConfig
, ulValue
, ulFlags
, hMachine
);
6538 if (szDevInstName
== NULL
)
6539 return CR_INVALID_POINTER
;
6541 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
6542 return CR_INVALID_FLAG
;
6544 /* FIXME: Check whether szDevInstName is valid */
6546 if (hMachine
!= NULL
)
6548 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6549 if (BindingHandle
== NULL
)
6554 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6560 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
6561 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
6563 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6565 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6573 /***********************************************************************
6574 * CM_Setup_DevNode [SETUPAPI.@]
6576 CONFIGRET WINAPI
CM_Setup_DevNode(
6577 DEVINST dnDevInst
, ULONG ulFlags
)
6579 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
6580 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
6584 /***********************************************************************
6585 * CM_Setup_DevNode_Ex [SETUPAPI.@]
6587 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
6588 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
6590 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6591 HSTRING_TABLE StringTable
= NULL
;
6595 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
6597 if (!pSetupIsUserAdmin())
6598 return CR_ACCESS_DENIED
;
6601 return CR_INVALID_DEVNODE
;
6603 if (ulFlags
& ~CM_SETUP_BITS
)
6604 return CR_INVALID_FLAG
;
6606 if (hMachine
!= NULL
)
6608 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6609 if (BindingHandle
== NULL
)
6612 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6613 if (StringTable
== 0)
6618 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6622 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6623 if (lpDevInst
== NULL
)
6624 return CR_INVALID_DEVNODE
;
6628 ret
= PNP_DeviceInstanceAction(BindingHandle
,
6634 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6636 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6644 /***********************************************************************
6645 * CM_Test_Range_Available [SETUPAPI.@]
6649 CM_Test_Range_Available(
6650 _In_ DWORDLONG ullStartValue
,
6651 _In_ DWORDLONG ullEndValue
,
6652 _In_ RANGE_LIST rlh
,
6655 FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
6656 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
6657 return CR_CALL_NOT_IMPLEMENTED
;
6661 /***********************************************************************
6662 * CM_Uninstall_DevNode [SETUPAPI.@]
6664 CONFIGRET WINAPI
CM_Uninstall_DevNode(
6665 DEVINST dnPhantom
, ULONG ulFlags
)
6667 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
6668 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
6672 /***********************************************************************
6673 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
6675 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
6676 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
6678 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6679 HSTRING_TABLE StringTable
= NULL
;
6683 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
6686 return CR_INVALID_DEVNODE
;
6689 return CR_INVALID_FLAG
;
6691 if (hMachine
!= NULL
)
6693 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6694 if (BindingHandle
== NULL
)
6697 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6698 if (StringTable
== 0)
6703 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6707 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
6708 if (lpDevInst
== NULL
)
6709 return CR_INVALID_DEVNODE
;
6713 ret
= PNP_UninstallDevInst(BindingHandle
,
6717 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6719 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6727 /***********************************************************************
6728 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
6730 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceA(
6731 LPCSTR pszDeviceInterface
, ULONG ulFlags
)
6733 TRACE("%s %lx\n", pszDeviceInterface
, ulFlags
);
6735 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
6740 /***********************************************************************
6741 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
6743 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceW(
6744 LPCWSTR pszDeviceInterface
, ULONG ulFlags
)
6746 TRACE("%s %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
);
6748 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
6753 /***********************************************************************
6754 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
6756 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExA(
6757 LPCSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
6759 LPWSTR pszDeviceInterfaceW
= NULL
;
6762 TRACE("%s %lx %lx\n", pszDeviceInterface
, ulFlags
, hMachine
);
6764 if (pszDeviceInterface
== NULL
)
6765 return CR_INVALID_POINTER
;
6767 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
6768 return CR_INVALID_DATA
;
6770 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
6773 if (pszDeviceInterfaceW
!= NULL
)
6774 MyFree(pszDeviceInterfaceW
);
6780 /***********************************************************************
6781 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
6783 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExW(
6784 LPCWSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
6786 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6789 TRACE("%s %lx %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
6791 if (pszDeviceInterface
== NULL
)
6792 return CR_INVALID_POINTER
;
6795 return CR_INVALID_FLAG
;
6797 if (hMachine
!= NULL
)
6799 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6800 if (BindingHandle
== NULL
)
6805 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6811 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
6812 (LPWSTR
)pszDeviceInterface
,
6815 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6817 ret
= RpcStatusToCmStatus(RpcExceptionCode());