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 */
213 ret
= CR_CALL_NOT_IMPLEMENTED
;
217 /* Hardware Key Path */
219 ulTransferLength
= 300 * sizeof(WCHAR
);
220 ulLength
= 300 * sizeof(WCHAR
);
222 pszBuffer
= MyMalloc(ulTransferLength
);
223 if (pszBuffer
== NULL
)
225 ERR("MyMalloc() failed\n");
226 ret
= CR_OUT_OF_MEMORY
;
230 ret
= PNP_GetDeviceRegProp(BindingHandle
,
238 if (ret
!= CR_SUCCESS
)
240 ERR("PNP_GetDeviceRegProp() failed (Error %lu)\n", ret
);
244 TRACE("szBuffer: %S\n", pszBuffer
);
246 SplitDeviceInstanceId(pszBuffer
,
250 TRACE("szBuffer: %S\n", pszBuffer
);
252 if (ulFlags
& CM_REGISTRY_CONFIG
)
254 if (ulHardwareProfile
== 0)
256 wsprintfW(pszKeyPath
,
258 L
"System\\CurrentControlSet\\Hardware Profiles",
260 L
"System\\CurrentControlSet\\Control\\Class",
265 wsprintfW(pszKeyPath
,
266 L
"%s\\%04lu\\%s\\%s",
267 L
"System\\CurrentControlSet\\Hardware Profiles",
269 L
"System\\CurrentControlSet\\Control\\Class",
275 wsprintfW(pszKeyPath
,
277 L
"System\\CurrentControlSet\\Control\\Class",
283 if (pszBuffer
!= NULL
)
290 /***********************************************************************
291 * CMP_GetBlockedDriverInfo [SETUPAPI.@]
295 CMP_GetBlockedDriverInfo(
296 _Out_opt_ LPWSTR pszNames
,
297 _Inout_ PULONG pulLength
,
299 _In_opt_ HMACHINE hMachine
)
301 RPC_BINDING_HANDLE BindingHandle
= NULL
;
302 ULONG ulTransferLength
;
305 TRACE("CMP_GetBlockedDriverInfo(%p %p %lx %p)\n",
306 pszNames
, pulLength
, ulFlags
, hMachine
);
308 if (hMachine
!= NULL
)
310 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
311 if (BindingHandle
== NULL
)
316 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
320 ulTransferLength
= *pulLength
;
324 ret
= PNP_GetBlockedDriverInfo(BindingHandle
,
330 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
332 ret
= RpcStatusToCmStatus(RpcExceptionCode());
340 /***********************************************************************
341 * CMP_GetServerSideDeviceInstallFlags [SETUPAPI.@]
345 CMP_GetServerSideDeviceInstallFlags(
346 _Out_ PULONG pulSSDIFlags
,
348 _In_opt_ HMACHINE hMachine
)
350 RPC_BINDING_HANDLE BindingHandle
= NULL
;
353 TRACE("CMP_GetServerSideDeviceInstallFlags(%p %lx %p)\n",
354 pulSSDIFlags
, ulFlags
, hMachine
);
356 if (pulSSDIFlags
== NULL
)
357 return CR_INVALID_POINTER
;
360 return CR_INVALID_FLAG
;
362 if (hMachine
!= NULL
)
364 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
365 if (BindingHandle
== NULL
)
370 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
376 ret
= PNP_GetServerSideDeviceInstallFlags(BindingHandle
,
380 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
382 ret
= RpcStatusToCmStatus(RpcExceptionCode());
390 /***********************************************************************
391 * CMP_Init_Detection [SETUPAPI.@]
398 RPC_BINDING_HANDLE BindingHandle
= NULL
;
401 TRACE("CMP_Init_Detection(%lu)\n", ulMagic
);
403 if (ulMagic
!= CMP_MAGIC
)
404 return CR_INVALID_DATA
;
406 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
411 ret
= PNP_InitDetection(BindingHandle
);
413 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
415 ret
= RpcStatusToCmStatus(RpcExceptionCode());
423 /***********************************************************************
424 * CMP_RegisterNotification [SETUPAPI.@]
428 CMP_RegisterNotification(
429 _In_ HANDLE hRecipient
,
430 _In_ LPVOID lpvNotificationFilter
,
432 _Out_ PHDEVNOTIFY phDevNotify
)
434 RPC_BINDING_HANDLE BindingHandle
= NULL
;
435 PNOTIFY_DATA pNotifyData
= NULL
;
436 CONFIGRET ret
= CR_SUCCESS
;
438 TRACE("CMP_RegisterNotification(%p %p %lu %p)\n",
439 hRecipient
, lpvNotificationFilter
, ulFlags
, phDevNotify
);
441 if ((hRecipient
== NULL
) ||
442 (lpvNotificationFilter
== NULL
) ||
443 (phDevNotify
== NULL
))
444 return CR_INVALID_POINTER
;
447 return CR_INVALID_FLAG
;
449 if (((PDEV_BROADCAST_HDR
)lpvNotificationFilter
)->dbch_size
< sizeof(DEV_BROADCAST_HDR
))
450 return CR_INVALID_DATA
;
452 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
455 pNotifyData
= HeapAlloc(GetProcessHeap(),
457 sizeof(NOTIFY_DATA
));
458 if (pNotifyData
== NULL
)
459 return CR_OUT_OF_MEMORY
;
461 pNotifyData
->ulMagic
= NOTIFY_MAGIC
;
464 if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_WINDOW_HANDLE)
468 else if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_SERVICE_HANDLE)
476 ret
= PNP_RegisterNotification(BindingHandle
,
478 &pNotifyData
->ulNotifyData
);
480 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
482 ret
= RpcStatusToCmStatus(RpcExceptionCode());
486 if (ret
== CR_SUCCESS
)
488 *phDevNotify
= (HDEVNOTIFY
)pNotifyData
;
492 if (pNotifyData
!= NULL
)
493 HeapFree(GetProcessHeap(), 0, pNotifyData
);
495 *phDevNotify
= (HDEVNOTIFY
)NULL
;
502 /***********************************************************************
503 * CMP_Report_LogOn [SETUPAPI.@]
509 _In_ DWORD dwProcessId
)
511 RPC_BINDING_HANDLE BindingHandle
= NULL
;
512 CONFIGRET ret
= CR_SUCCESS
;
516 TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic
, dwProcessId
);
518 if (dwMagic
!= CMP_MAGIC
)
519 return CR_INVALID_DATA
;
521 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
524 bAdmin
= pSetupIsUserAdmin();
526 for (i
= 0; i
< 30; i
++)
530 ret
= PNP_ReportLogOn(BindingHandle
,
534 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
536 ret
= RpcStatusToCmStatus(RpcExceptionCode());
540 if (ret
== CR_SUCCESS
)
550 /***********************************************************************
551 * CMP_UnregisterNotification [SETUPAPI.@]
555 CMP_UnregisterNotification(
556 _In_ HDEVNOTIFY hDevNotify
)
558 RPC_BINDING_HANDLE BindingHandle
= NULL
;
559 PNOTIFY_DATA pNotifyData
;
560 CONFIGRET ret
= CR_SUCCESS
;
562 TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify
);
564 pNotifyData
= (PNOTIFY_DATA
)hDevNotify
;
566 if ((pNotifyData
== NULL
) ||
567 (pNotifyData
->ulMagic
!= NOTIFY_MAGIC
))
568 return CR_INVALID_POINTER
;
570 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
575 ret
= PNP_UnregisterNotification(BindingHandle
,
576 pNotifyData
->ulNotifyData
);
578 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
580 ret
= RpcStatusToCmStatus(RpcExceptionCode());
584 if (ret
== CR_SUCCESS
)
585 HeapFree(GetProcessHeap(), 0, pNotifyData
);
591 /***********************************************************************
592 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
596 CMP_WaitNoPendingInstallEvents(
597 _In_ DWORD dwTimeout
)
602 TRACE("CMP_WaitNoPendingInstallEvents(%lu)\n", dwTimeout
);
604 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
608 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
614 /***********************************************************************
615 * CMP_WaitServicesAvailable [SETUPAPI.@]
619 CMP_WaitServicesAvailable(
620 _In_opt_ HMACHINE hMachine
)
622 RPC_BINDING_HANDLE BindingHandle
= NULL
;
623 CONFIGRET ret
= CR_SUCCESS
;
626 TRACE("CMP_WaitServicesAvailable(%p)\n", hMachine
);
628 if (hMachine
!= NULL
)
630 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
631 if (BindingHandle
== NULL
)
636 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
642 ret
= PNP_GetVersion(BindingHandle
, &Version
);
644 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
646 ret
= RpcStatusToCmStatus(RpcExceptionCode());
654 /***********************************************************************
655 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
657 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf(
658 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
661 TRACE("%p %p %lu %lx\n", plcLogConf
, dnDevInst
, Priority
, ulFlags
);
662 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
667 /***********************************************************************
668 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
670 CONFIGRET WINAPI
CM_Add_Empty_Log_Conf_Ex(
671 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, PRIORITY Priority
,
672 ULONG ulFlags
, HMACHINE hMachine
)
674 RPC_BINDING_HANDLE BindingHandle
= NULL
;
675 HSTRING_TABLE StringTable
= NULL
;
676 ULONG ulLogConfTag
= 0;
678 PLOG_CONF_INFO pLogConfInfo
;
679 CONFIGRET ret
= CR_SUCCESS
;
681 FIXME("%p %p %lu %lx %p\n",
682 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
684 if (!pSetupIsUserAdmin())
685 return CR_ACCESS_DENIED
;
687 if (plcLogConf
== NULL
)
688 return CR_INVALID_POINTER
;
691 return CR_INVALID_DEVINST
;
693 if (Priority
> 0xFFFF)
694 return CR_INVALID_PRIORITY
;
696 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
697 return CR_INVALID_FLAG
;
699 if (hMachine
!= NULL
)
701 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
702 if (BindingHandle
== NULL
)
705 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
706 if (StringTable
== 0)
711 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
715 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
716 if (lpDevInst
== NULL
)
717 return CR_INVALID_DEVNODE
;
721 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
722 &ulLogConfTag
, ulFlags
);
724 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
726 ret
= RpcStatusToCmStatus(RpcExceptionCode());
730 if (ret
== CR_SUCCESS
)
732 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
733 if (pLogConfInfo
== NULL
)
735 ret
= CR_OUT_OF_MEMORY
;
739 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
740 pLogConfInfo
->dnDevInst
= dnDevInst
;
741 pLogConfInfo
->ulFlags
= ulFlags
;
742 pLogConfInfo
->ulTag
= ulLogConfTag
;
744 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
754 /***********************************************************************
755 * CM_Add_IDA [SETUPAPI.@]
757 CONFIGRET WINAPI
CM_Add_IDA(
758 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
)
760 TRACE("%p %s %lx\n", dnDevInst
, pszID
, ulFlags
);
761 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
765 /***********************************************************************
766 * CM_Add_IDW [SETUPAPI.@]
768 CONFIGRET WINAPI
CM_Add_IDW(
769 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
)
771 TRACE("%p %s %lx\n", dnDevInst
, debugstr_w(pszID
), ulFlags
);
772 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
776 /***********************************************************************
777 * CM_Add_ID_ExA [SETUPAPI.@]
779 CONFIGRET WINAPI
CM_Add_ID_ExA(
780 DEVINST dnDevInst
, PSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
785 TRACE("%p %s %lx %p\n", dnDevInst
, pszID
, ulFlags
, hMachine
);
787 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
788 return CR_INVALID_DATA
;
790 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
798 /***********************************************************************
799 * CM_Add_ID_ExW [SETUPAPI.@]
801 CONFIGRET WINAPI
CM_Add_ID_ExW(
802 DEVINST dnDevInst
, PWSTR pszID
, ULONG ulFlags
, HMACHINE hMachine
)
804 RPC_BINDING_HANDLE BindingHandle
= NULL
;
805 HSTRING_TABLE StringTable
= NULL
;
809 TRACE("%p %s %lx %p\n", dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
811 if (!pSetupIsUserAdmin())
812 return CR_ACCESS_DENIED
;
815 return CR_INVALID_DEVINST
;
818 return CR_INVALID_POINTER
;
820 if (ulFlags
& ~CM_ADD_ID_BITS
)
821 return CR_INVALID_FLAG
;
823 if (hMachine
!= NULL
)
825 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
826 if (BindingHandle
== NULL
)
829 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
830 if (StringTable
== 0)
835 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
839 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
840 if (lpDevInst
== NULL
)
841 return CR_INVALID_DEVNODE
;
845 ret
= PNP_AddID(BindingHandle
,
850 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
852 ret
= RpcStatusToCmStatus(RpcExceptionCode());
860 /***********************************************************************
861 * CM_Add_Range [SETUPAPI.@]
866 _In_ DWORDLONG ullStartValue
,
867 _In_ DWORDLONG ullEndValue
,
871 FIXME("CM_Add_Range(%I64u %I64u %p %lx)\n",
872 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
873 return CR_CALL_NOT_IMPLEMENTED
;
877 /***********************************************************************
878 * CM_Add_Res_Des [SETUPAPI.@]
880 CONFIGRET WINAPI
CM_Add_Res_Des(
881 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
882 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
)
884 TRACE("%p %p %lu %p %lu %lx\n", prdResDes
, lcLogConf
, ResourceID
,
885 ResourceData
, ResourceLen
, ulFlags
);
886 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
887 ResourceLen
, ulFlags
, NULL
);
891 /***********************************************************************
892 * CM_Add_Res_Des_Ex [SETUPAPI.@]
894 CONFIGRET WINAPI
CM_Add_Res_Des_Ex(
895 PRES_DES prdResDes
, LOG_CONF lcLogConf
, RESOURCEID ResourceID
,
896 PCVOID ResourceData
, ULONG ResourceLen
, ULONG ulFlags
, HMACHINE hMachine
)
898 FIXME("%p %p %lu %p %lu %lx %p\n", prdResDes
, lcLogConf
, ResourceID
,
899 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
901 return CR_CALL_NOT_IMPLEMENTED
;
905 /***********************************************************************
906 * CM_Connect_MachineA [SETUPAPI.@]
908 CONFIGRET WINAPI
CM_Connect_MachineA(
909 PCSTR UNCServerName
, PHMACHINE phMachine
)
914 TRACE("%s %p\n", UNCServerName
, phMachine
);
916 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
917 return CM_Connect_MachineW(NULL
, phMachine
);
919 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
920 return CR_INVALID_DATA
;
922 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
924 MyFree(pServerNameW
);
930 /***********************************************************************
931 * CM_Connect_MachineW [SETUPAPI.@]
933 CONFIGRET WINAPI
CM_Connect_MachineW(
934 PCWSTR UNCServerName
, PHMACHINE phMachine
)
936 PMACHINE_INFO pMachine
;
938 TRACE("%s %p\n", debugstr_w(UNCServerName
), phMachine
);
940 if (phMachine
== NULL
)
941 return CR_INVALID_POINTER
;
945 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
946 if (pMachine
== NULL
)
947 return CR_OUT_OF_MEMORY
;
949 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
951 pMachine
->bLocal
= TRUE
;
953 /* FIXME: store the computers name in pMachine->szMachineName */
955 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
956 &pMachine
->StringTable
))
958 HeapFree(GetProcessHeap(), 0, pMachine
);
964 pMachine
->bLocal
= FALSE
;
965 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
967 HeapFree(GetProcessHeap(), 0, pMachine
);
968 return CR_INVALID_MACHINENAME
;
970 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
972 pMachine
->StringTable
= pSetupStringTableInitialize();
973 if (pMachine
->StringTable
== NULL
)
975 HeapFree(GetProcessHeap(), 0, pMachine
);
979 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
981 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
983 pSetupStringTableDestroy(pMachine
->StringTable
);
984 HeapFree(GetProcessHeap(), 0, pMachine
);
985 return CR_INVALID_MACHINENAME
;
989 *phMachine
= (PHMACHINE
)pMachine
;
995 /***********************************************************************
996 * CM_Create_DevNodeA [SETUPAPI.@]
998 CONFIGRET WINAPI
CM_Create_DevNodeA(
999 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
1002 TRACE("%p %s %p %lx\n",
1003 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
1004 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
1009 /***********************************************************************
1010 * CM_Create_DevNodeW [SETUPAPI.@]
1012 CONFIGRET WINAPI
CM_Create_DevNodeW(
1013 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
1016 TRACE("%p %s %p %lx\n",
1017 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
1018 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
1023 /***********************************************************************
1024 * CM_Create_DevNode_ExA [SETUPAPI.@]
1026 CONFIGRET WINAPI
CM_Create_DevNode_ExA(
1027 PDEVINST pdnDevInst
, DEVINSTID_A pDeviceID
, DEVINST dnParent
,
1028 ULONG ulFlags
, HANDLE hMachine
)
1030 DEVINSTID_W pDeviceIDW
;
1033 TRACE("%p %s %p %lx %p\n",
1034 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1036 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
1037 return CR_INVALID_DATA
;
1039 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
1048 /***********************************************************************
1049 * CM_Create_DevNode_ExW [SETUPAPI.@]
1051 CONFIGRET WINAPI
CM_Create_DevNode_ExW(
1052 PDEVINST pdnDevInst
, DEVINSTID_W pDeviceID
, DEVINST dnParent
,
1053 ULONG ulFlags
, HANDLE hMachine
)
1055 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1056 HSTRING_TABLE StringTable
= NULL
;
1057 LPWSTR lpParentDevInst
;
1058 CONFIGRET ret
= CR_SUCCESS
;
1059 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
1061 TRACE("%p %s %p %lx %p\n",
1062 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1064 if (!pSetupIsUserAdmin())
1065 return CR_ACCESS_DENIED
;
1067 if (pdnDevInst
== NULL
)
1068 return CR_INVALID_POINTER
;
1070 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
1071 return CR_INVALID_DEVICE_ID
;
1074 return CR_INVALID_DEVNODE
;
1076 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
1077 return CR_INVALID_FLAG
;
1079 if (hMachine
!= NULL
)
1081 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1082 if (BindingHandle
== NULL
)
1085 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1086 if (StringTable
== 0)
1091 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1095 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
1096 if (lpParentDevInst
== NULL
)
1097 return CR_INVALID_DEVNODE
;
1099 wcscpy(szLocalDeviceID
, pDeviceID
);
1103 ret
= PNP_CreateDevInst(BindingHandle
,
1109 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1111 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1115 if (ret
== CR_SUCCESS
)
1117 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
1118 * will return the generated device ID in szLocalDeviceID */
1119 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
1120 if (*pdnDevInst
== 0)
1121 ret
= CR_NO_SUCH_DEVNODE
;
1128 /***********************************************************************
1129 * CM_Create_Range_List [SETUPAPI.@]
1133 CM_Create_Range_List(
1134 _Out_ PRANGE_LIST prlh
,
1137 PINTERNAL_RANGE_LIST pRangeList
= NULL
;
1139 FIXME("CM_Create_Range_List(%p %lx)\n", prlh
, ulFlags
);
1142 return CR_INVALID_FLAG
;
1145 return CR_INVALID_POINTER
;
1147 pRangeList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(INTERNAL_RANGE_LIST
));
1148 if (pRangeList
== NULL
)
1149 return CR_OUT_OF_MEMORY
;
1151 pRangeList
->ulMagic
= RANGE_LIST_MAGIC
;
1153 // TODO: More initialization
1155 *prlh
= (RANGE_LIST
)pRangeList
;
1161 /***********************************************************************
1162 * CM_Delete_Class_Key [SETUPAPI.@]
1164 CONFIGRET WINAPI
CM_Delete_Class_Key(
1165 LPGUID ClassGuid
, ULONG ulFlags
)
1167 TRACE("%p %lx\n", ClassGuid
, ulFlags
);
1168 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
1172 /***********************************************************************
1173 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
1175 CONFIGRET WINAPI
CM_Delete_Class_Key_Ex(
1176 LPGUID ClassGuid
, ULONG ulFlags
, HANDLE hMachine
)
1178 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1179 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1182 TRACE("%p %lx %lx\n", ClassGuid
, ulFlags
, hMachine
);
1184 if (ClassGuid
== NULL
)
1185 return CR_INVALID_POINTER
;
1187 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
1188 return CR_INVALID_FLAG
;
1190 if (!GuidToString(ClassGuid
, szGuidString
))
1191 return CR_INVALID_DATA
;
1193 if (hMachine
!= NULL
)
1195 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1196 if (BindingHandle
== NULL
)
1201 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1207 ret
= PNP_DeleteClassKey(BindingHandle
,
1211 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1213 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1221 /***********************************************************************
1222 * CM_Delete_DevNode_Key [SETUPAPI.@]
1224 CONFIGRET WINAPI
CM_Delete_DevNode_Key(
1225 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
)
1227 TRACE("%p %lu %lx\n", dnDevNode
, ulHardwareProfile
, ulFlags
);
1228 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
1233 /***********************************************************************
1234 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
1236 CONFIGRET WINAPI
CM_Delete_DevNode_Key_Ex(
1237 DEVNODE dnDevNode
, ULONG ulHardwareProfile
, ULONG ulFlags
,
1240 FIXME("%p %lu %lx %p\n",
1241 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
1243 return CR_CALL_NOT_IMPLEMENTED
;
1247 /***********************************************************************
1248 * CM_Delete_Range [SETUPAPI.@]
1253 _In_ DWORDLONG ullStartValue
,
1254 _In_ DWORDLONG ullEndValue
,
1255 _In_ RANGE_LIST rlh
,
1258 FIXME("CM_Delete_Range(%I64u %I64u %p %lx)\n",
1259 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1260 return CR_CALL_NOT_IMPLEMENTED
;
1264 /***********************************************************************
1265 * CM_Disable_DevNode [SETUPAPI.@]
1267 CONFIGRET WINAPI
CM_Disable_DevNode(
1268 DEVINST dnDevInst
, ULONG ulFlags
)
1270 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
1271 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1275 /***********************************************************************
1276 * CM_Disable_DevNode_Ex [SETUPAPI.@]
1278 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
1279 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1281 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1282 HSTRING_TABLE StringTable
= NULL
;
1286 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
1288 if (!pSetupIsUserAdmin())
1289 return CR_ACCESS_DENIED
;
1292 return CR_INVALID_DEVINST
;
1295 return CR_INVALID_FLAG
;
1297 if (hMachine
!= NULL
)
1299 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1300 if (BindingHandle
== NULL
)
1303 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1304 if (StringTable
== 0)
1309 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1313 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1314 if (lpDevInst
== NULL
)
1315 return CR_INVALID_DEVNODE
;
1319 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1320 PNP_DEVINST_DISABLE
,
1325 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1327 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1335 /***********************************************************************
1336 * CM_Disconnect_Machine [SETUPAPI.@]
1338 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
1340 PMACHINE_INFO pMachine
;
1342 TRACE("%lx\n", hMachine
);
1344 pMachine
= (PMACHINE_INFO
)hMachine
;
1345 if (pMachine
== NULL
)
1348 if (pMachine
->bLocal
== FALSE
)
1350 if (pMachine
->StringTable
!= NULL
)
1351 pSetupStringTableDestroy(pMachine
->StringTable
);
1353 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
1354 return CR_ACCESS_DENIED
;
1357 HeapFree(GetProcessHeap(), 0, pMachine
);
1363 /***********************************************************************
1364 * CM_Dup_Range_List [SETUPAPI.@]
1369 _In_ RANGE_LIST rlhOld
,
1370 _In_ RANGE_LIST rlhNew
,
1373 FIXME("CM_Dup_Range_List(%p %p %lx)\n",
1374 rlhOld
, rlhNew
, ulFlags
);
1375 return CR_CALL_NOT_IMPLEMENTED
;
1379 /***********************************************************************
1380 * CM_Enable_DevNode [SETUPAPI.@]
1382 CONFIGRET WINAPI
CM_Enable_DevNode(
1383 DEVINST dnDevInst
, ULONG ulFlags
)
1385 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
1386 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1390 /***********************************************************************
1391 * CM_Enable_DevNode_Ex [SETUPAPI.@]
1393 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
1394 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1396 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1397 HSTRING_TABLE StringTable
= NULL
;
1401 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
1403 if (!pSetupIsUserAdmin())
1404 return CR_ACCESS_DENIED
;
1407 return CR_INVALID_DEVINST
;
1410 return CR_INVALID_FLAG
;
1412 if (hMachine
!= NULL
)
1414 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1415 if (BindingHandle
== NULL
)
1418 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1419 if (StringTable
== 0)
1424 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1428 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1429 if (lpDevInst
== NULL
)
1430 return CR_INVALID_DEVNODE
;
1434 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1440 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1442 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1450 /***********************************************************************
1451 * CM_Enumerate_Classes [SETUPAPI.@]
1453 CONFIGRET WINAPI
CM_Enumerate_Classes(
1454 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
1456 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
1457 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
1461 /***********************************************************************
1462 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
1464 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
1465 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
1467 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1468 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1469 CONFIGRET ret
= CR_SUCCESS
;
1470 ULONG ulLength
= MAX_GUID_STRING_LEN
;
1472 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
1474 if (ClassGuid
== NULL
)
1475 return CR_INVALID_POINTER
;
1478 return CR_INVALID_FLAG
;
1480 if (hMachine
!= NULL
)
1482 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1483 if (BindingHandle
== NULL
)
1488 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1494 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1498 MAX_GUID_STRING_LEN
,
1502 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1504 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1508 if (ret
== CR_SUCCESS
)
1511 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1513 /* Convert the buffer to a GUID */
1514 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1522 /***********************************************************************
1523 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1525 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
1526 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1528 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1529 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1534 /***********************************************************************
1535 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1537 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
1538 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1540 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1541 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1546 /***********************************************************************
1547 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1549 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
1550 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1553 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1556 CONFIGRET ret
= CR_SUCCESS
;
1558 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1561 if (Buffer
== NULL
|| pulLength
== NULL
)
1562 return CR_INVALID_POINTER
;
1565 return CR_INVALID_FLAG
;
1567 ulOrigLength
= *pulLength
;
1570 ulLength
= MAX_DEVICE_ID_LEN
;
1571 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1573 if (ret
== CR_SUCCESS
)
1575 if (WideCharToMultiByte(CP_ACP
,
1585 *pulLength
= lstrlenA(Buffer
) + 1;
1592 /***********************************************************************
1593 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1595 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1596 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1599 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1602 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1605 if (Buffer
== NULL
|| pulLength
== NULL
)
1606 return CR_INVALID_POINTER
;
1609 return CR_INVALID_FLAG
;
1611 *Buffer
= UNICODE_NULL
;
1613 if (hMachine
!= NULL
)
1615 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1616 if (BindingHandle
== NULL
)
1621 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1627 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1628 PNP_ENUMERATOR_SUBKEYS
,
1635 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1637 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1645 /***********************************************************************
1646 * CM_Find_Range [SETUPAPI.@]
1651 _Out_ PDWORDLONG pullStart
,
1652 _In_ DWORDLONG ullStart
,
1653 _In_ ULONG ulLength
,
1654 _In_ DWORDLONG ullAlignment
,
1655 _In_ DWORDLONG ullEnd
,
1656 _In_ RANGE_LIST rlh
,
1659 FIXME("CM_Find_Range(%p %I64u %lu %I64u %I64u %p %lx)\n",
1660 pullStart
, ullStart
, ulLength
, ullAlignment
, ullEnd
, rlh
, ulFlags
);
1661 return CR_CALL_NOT_IMPLEMENTED
;
1665 /***********************************************************************
1666 * CM_First_Range [SETUPAPI.@]
1671 _In_ RANGE_LIST rlh
,
1672 _Out_ PDWORDLONG pullStart
,
1673 _Out_ PDWORDLONG pullEnd
,
1674 _Out_ PRANGE_ELEMENT preElement
,
1677 FIXME("CM_First_Range(%p %p %p %p %lx)\n",
1678 rlh
, pullStart
, pullEnd
, preElement
, ulFlags
);
1679 return CR_CALL_NOT_IMPLEMENTED
;
1683 /***********************************************************************
1684 * CM_Free_Log_Conf [SETUPAPI.@]
1686 CONFIGRET WINAPI
CM_Free_Log_Conf(
1687 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1689 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1690 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1694 /***********************************************************************
1695 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1697 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1698 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1700 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1701 HSTRING_TABLE StringTable
= NULL
;
1703 PLOG_CONF_INFO pLogConfInfo
;
1706 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1708 if (!pSetupIsUserAdmin())
1709 return CR_ACCESS_DENIED
;
1711 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1712 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1713 return CR_INVALID_LOG_CONF
;
1716 return CR_INVALID_FLAG
;
1718 if (hMachine
!= NULL
)
1720 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1721 if (BindingHandle
== NULL
)
1724 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1725 if (StringTable
== 0)
1730 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1734 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1735 if (lpDevInst
== NULL
)
1736 return CR_INVALID_DEVNODE
;
1740 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1741 pLogConfInfo
->ulTag
, 0);
1743 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1745 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1753 /***********************************************************************
1754 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1756 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1759 PLOG_CONF_INFO pLogConfInfo
;
1761 TRACE("%lx\n", lcLogConf
);
1763 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1764 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1765 return CR_INVALID_LOG_CONF
;
1767 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1773 /***********************************************************************
1774 * CM_Free_Range_List [SETUPAPI.@]
1779 _In_ RANGE_LIST RangeList
,
1782 PINTERNAL_RANGE_LIST pRangeList
;
1784 FIXME("CM_Free_Range_List(%p %lx)\n", RangeList
, ulFlags
);
1786 pRangeList
= (PINTERNAL_RANGE_LIST
)RangeList
;
1788 if (pRangeList
== NULL
|| pRangeList
->ulMagic
!= RANGE_LIST_MAGIC
)
1789 return CR_INVALID_RANGE_LIST
;
1792 return CR_INVALID_FLAG
;
1794 // TODO: Free the list of ranges
1796 HeapFree(GetProcessHeap(), 0, pRangeList
);
1802 /***********************************************************************
1803 * CM_Free_Res_Des [SETUPAPI.@]
1805 CONFIGRET WINAPI
CM_Free_Res_Des(
1806 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
)
1808 TRACE("%p %p %lx\n", prdResDes
, rdResDes
, ulFlags
);
1809 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
1813 /***********************************************************************
1814 * CM_Free_Res_Des_Ex [SETUPAPI.@]
1816 CONFIGRET WINAPI
CM_Free_Res_Des_Ex(
1817 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
,
1820 FIXME("%p %p %lx %lx\n", prdResDes
, rdResDes
, ulFlags
, hMachine
);
1822 return CR_CALL_NOT_IMPLEMENTED
;
1826 /***********************************************************************
1827 * CM_Free_Res_Des_Handle [SETUPAPI.@]
1829 CONFIGRET WINAPI
CM_Free_Res_Des_Handle(
1832 FIXME("%p\n", rdResDes
);
1834 return CR_CALL_NOT_IMPLEMENTED
;
1838 /***********************************************************************
1839 * CM_Get_Child [SETUPAPI.@]
1841 CONFIGRET WINAPI
CM_Get_Child(
1842 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1844 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1845 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1849 /***********************************************************************
1850 * CM_Get_Child_Ex [SETUPAPI.@]
1852 CONFIGRET WINAPI
CM_Get_Child_Ex(
1853 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1855 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1856 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1857 HSTRING_TABLE StringTable
= NULL
;
1859 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1862 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1864 if (pdnDevInst
== NULL
)
1865 return CR_INVALID_POINTER
;
1868 return CR_INVALID_DEVINST
;
1871 return CR_INVALID_FLAG
;
1875 if (hMachine
!= NULL
)
1877 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1878 if (BindingHandle
== NULL
)
1881 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1882 if (StringTable
== 0)
1887 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1891 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1892 if (lpDevInst
== NULL
)
1893 return CR_INVALID_DEVNODE
;
1897 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
1898 PNP_GET_CHILD_DEVICE_INSTANCE
,
1904 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1906 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1910 if (ret
!= CR_SUCCESS
)
1913 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
1915 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
1919 *pdnDevInst
= dwIndex
;
1925 /***********************************************************************
1926 * CM_Get_Class_Key_NameA [SETUPAPI.@]
1928 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
1929 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1931 TRACE("%p %p %p %lx\n",
1932 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1933 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
1938 /***********************************************************************
1939 * CM_Get_Class_Key_NameW [SETUPAPI.@]
1941 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
1942 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
1944 TRACE("%p %p %p %lx\n",
1945 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
1946 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
1951 /***********************************************************************
1952 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
1954 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
1955 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
1958 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1959 CONFIGRET ret
= CR_SUCCESS
;
1963 TRACE("%p %p %p %lx %lx\n",
1964 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
1966 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
1967 return CR_INVALID_POINTER
;
1969 ulOrigLength
= *pulLength
;
1972 ulLength
= MAX_GUID_STRING_LEN
;
1973 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
1975 if (ret
== CR_SUCCESS
)
1977 if (WideCharToMultiByte(CP_ACP
,
1987 *pulLength
= lstrlenA(pszKeyName
) + 1;
1994 /***********************************************************************
1995 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
1997 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
1998 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
2001 TRACE("%p %p %p %lx %lx\n",
2002 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2004 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2005 return CR_INVALID_POINTER
;
2008 return CR_INVALID_FLAG
;
2010 if (*pulLength
< MAX_GUID_STRING_LEN
)
2013 return CR_BUFFER_SMALL
;
2016 if (!GuidToString(ClassGuid
, pszKeyName
))
2017 return CR_INVALID_DATA
;
2019 *pulLength
= MAX_GUID_STRING_LEN
;
2025 /***********************************************************************
2026 * CM_Get_Class_NameA [SETUPAPI.@]
2028 CONFIGRET WINAPI
CM_Get_Class_NameA(
2029 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
2031 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
2032 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2037 /***********************************************************************
2038 * CM_Get_Class_NameW [SETUPAPI.@]
2040 CONFIGRET WINAPI
CM_Get_Class_NameW(
2041 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
2043 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
2044 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2049 /***********************************************************************
2050 * CM_Get_Class_Name_ExA [SETUPAPI.@]
2052 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
2053 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
2056 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
2057 CONFIGRET ret
= CR_SUCCESS
;
2061 TRACE("%p %p %p %lx %lx\n",
2062 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2064 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2065 return CR_INVALID_POINTER
;
2067 ulOrigLength
= *pulLength
;
2070 ulLength
= MAX_CLASS_NAME_LEN
;
2071 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2073 if (ret
== CR_SUCCESS
)
2075 if (WideCharToMultiByte(CP_ACP
,
2085 *pulLength
= lstrlenA(Buffer
) + 1;
2092 /***********************************************************************
2093 * CM_Get_Class_Name_ExW [SETUPAPI.@]
2096 CM_Get_Class_Name_ExW(
2097 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
2100 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
2101 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2104 TRACE("%p %p %p %lx %lx\n",
2105 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2107 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2108 return CR_INVALID_POINTER
;
2111 return CR_INVALID_FLAG
;
2113 if (!GuidToString(ClassGuid
, szGuidString
))
2114 return CR_INVALID_DATA
;
2116 TRACE("Guid %s\n", debugstr_w(szGuidString
));
2118 if (hMachine
!= NULL
)
2120 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2121 if (BindingHandle
== NULL
)
2126 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2132 ret
= PNP_GetClassName(BindingHandle
,
2138 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2140 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2148 /***********************************************************************
2149 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
2151 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyA(
2152 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
2153 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2155 PWSTR BufferW
= NULL
;
2160 TRACE("%p %lu %p %p %p %lx %lx\n",
2161 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2164 if (pulLength
== NULL
)
2165 return CR_INVALID_POINTER
;
2167 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2168 return CR_INVALID_PROPERTY
;
2170 ulType
= GetRegistryPropertyType(ulProperty
);
2171 if (ulType
== REG_SZ
|| ulType
== REG_MULTI_SZ
)
2173 /* Get the required buffer size */
2174 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2175 NULL
, &ulLength
, ulFlags
, hMachine
);
2176 if (ret
!= CR_BUFFER_SMALL
)
2179 /* Allocate the unicode buffer */
2180 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLength
);
2181 if (BufferW
== NULL
)
2182 return CR_OUT_OF_MEMORY
;
2184 /* Get the property */
2185 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2186 BufferW
, &ulLength
, ulFlags
, hMachine
);
2187 if (ret
!= CR_SUCCESS
)
2189 HeapFree(GetProcessHeap(), 0, BufferW
);
2193 /* Do W->A conversion */
2194 *pulLength
= WideCharToMultiByte(CP_ACP
,
2197 lstrlenW(BufferW
) + 1,
2203 /* Release the unicode buffer */
2204 HeapFree(GetProcessHeap(), 0, BufferW
);
2206 if (*pulLength
== 0)
2211 /* Get the property */
2212 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2213 Buffer
, pulLength
, ulFlags
, hMachine
);
2220 /***********************************************************************
2221 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
2223 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyW(
2224 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
2225 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2227 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2228 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
2230 ULONG ulTransferLength
= 0;
2233 TRACE("%p %lu %p %p %p %lx %lx\n",
2234 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2237 if (ClassGuid
== NULL
|| pulLength
== NULL
)
2238 return CR_INVALID_POINTER
;
2241 return CR_INVALID_FLAG
;
2243 if (pSetupStringFromGuid(ClassGuid
,
2245 PNP_MAX_GUID_STRING_LEN
) != 0)
2246 return CR_INVALID_DATA
;
2248 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2249 return CR_INVALID_PROPERTY
;
2251 if (hMachine
!= NULL
)
2253 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2254 if (BindingHandle
== NULL
)
2259 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2263 ulTransferLength
= *pulLength
;
2267 ret
= PNP_GetClassRegProp(BindingHandle
,
2276 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2278 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2282 if (ret
== CR_SUCCESS
)
2284 if (pulRegDataType
!= NULL
)
2285 *pulRegDataType
= ulType
;
2292 /***********************************************************************
2293 * CM_Get_Depth [SETUPAPI.@]
2295 CONFIGRET WINAPI
CM_Get_Depth(
2296 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
2298 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
2299 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
2303 /***********************************************************************
2304 * CM_Get_Depth_Ex [SETUPAPI.@]
2306 CONFIGRET WINAPI
CM_Get_Depth_Ex(
2307 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2309 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2310 HSTRING_TABLE StringTable
= NULL
;
2314 TRACE("%p %lx %lx %lx\n",
2315 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
2317 if (pulDepth
== NULL
)
2318 return CR_INVALID_POINTER
;
2321 return CR_INVALID_DEVINST
;
2324 return CR_INVALID_FLAG
;
2326 if (hMachine
!= NULL
)
2328 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2329 if (BindingHandle
== NULL
)
2332 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2333 if (StringTable
== 0)
2338 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2342 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2343 if (lpDevInst
== NULL
)
2344 return CR_INVALID_DEVNODE
;
2348 ret
= PNP_GetDepth(BindingHandle
,
2353 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2355 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2363 /***********************************************************************
2364 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
2366 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyA(
2367 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2368 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2370 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, pszCustomPropertyName
,
2371 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2372 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
2373 pulRegDataType
, Buffer
,
2374 pulLength
, ulFlags
, NULL
);
2378 /***********************************************************************
2379 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
2381 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyW(
2382 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2383 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2385 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, debugstr_w(pszCustomPropertyName
),
2386 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2387 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
2388 pulRegDataType
, Buffer
,
2389 pulLength
, ulFlags
, NULL
);
2393 /***********************************************************************
2394 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
2396 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExA(
2397 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2398 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2400 LPWSTR pszPropertyNameW
= NULL
;
2403 ULONG ulDataType
= REG_NONE
;
2406 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
, pszCustomPropertyName
,
2407 pulRegDataType
, Buffer
, pulLength
, ulFlags
, hMachine
);
2410 return CR_INVALID_POINTER
;
2412 ulLengthW
= *pulLength
* sizeof(WCHAR
);
2413 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
2415 return CR_OUT_OF_MEMORY
;
2417 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
2419 if (pszPropertyNameW
== NULL
)
2421 HeapFree(GetProcessHeap(), 0, BufferW
);
2422 return CR_OUT_OF_MEMORY
;
2425 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
2432 if (ret
== CR_SUCCESS
)
2434 if (ulDataType
== REG_SZ
||
2435 ulDataType
== REG_EXPAND_SZ
||
2436 ulDataType
== REG_MULTI_SZ
)
2438 /* Do W->A conversion */
2439 *pulLength
= WideCharToMultiByte(CP_ACP
,
2442 lstrlenW(BufferW
) + 1,
2447 if (*pulLength
== 0)
2452 /* Directly copy the value */
2453 if (ulLengthW
<= *pulLength
)
2454 memcpy(Buffer
, BufferW
, ulLengthW
);
2457 *pulLength
= ulLengthW
;
2458 ret
= CR_BUFFER_SMALL
;
2464 *pulRegDataType
= ulDataType
;
2466 HeapFree(GetProcessHeap(), 0, BufferW
);
2467 MyFree(pszPropertyNameW
);
2473 /***********************************************************************
2474 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
2476 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExW(
2477 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2478 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2480 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2481 HSTRING_TABLE StringTable
= NULL
;
2483 ULONG ulDataType
= REG_NONE
;
2484 ULONG ulTransferLength
;
2485 CONFIGRET ret
= CR_SUCCESS
;
2487 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
,
2488 debugstr_w(pszCustomPropertyName
), pulRegDataType
, Buffer
,
2489 pulLength
, ulFlags
, hMachine
);
2492 return CR_INVALID_DEVNODE
;
2494 if (pszCustomPropertyName
== NULL
||
2495 pulLength
== NULL
||
2497 return CR_INVALID_POINTER
;
2499 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
2500 return CR_INVALID_FLAG
;
2502 if (hMachine
!= NULL
)
2504 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2505 if (BindingHandle
== NULL
)
2508 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2509 if (StringTable
== 0)
2514 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2518 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2519 if (lpDevInst
== NULL
)
2520 return CR_INVALID_DEVNODE
;
2522 ulTransferLength
= *pulLength
;
2526 ret
= PNP_GetCustomDevProp(BindingHandle
,
2528 (LPWSTR
)pszCustomPropertyName
,
2535 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2537 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2541 if (ret
== CR_SUCCESS
)
2543 if (pulRegDataType
!= NULL
)
2544 *pulRegDataType
= ulDataType
;
2551 /***********************************************************************
2552 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
2554 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
2555 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2556 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2558 TRACE("%lx %lu %p %p %p %lx\n",
2559 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2561 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
2562 pulRegDataType
, Buffer
,
2563 pulLength
, ulFlags
, NULL
);
2567 /***********************************************************************
2568 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
2570 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
2571 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2572 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2574 TRACE("%lx %lu %p %p %p %lx\n",
2575 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2577 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
2578 pulRegDataType
, Buffer
,
2579 pulLength
, ulFlags
, NULL
);
2583 /***********************************************************************
2584 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
2586 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
2587 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2588 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2592 ULONG ulDataType
= REG_NONE
;
2595 TRACE("%lx %lu %p %p %p %lx %lx\n",
2596 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2600 return CR_INVALID_POINTER
;
2602 LengthW
= *pulLength
* sizeof(WCHAR
);
2603 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
2606 return CR_OUT_OF_MEMORY
;
2608 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
2616 if (ret
== CR_SUCCESS
)
2618 if (ulDataType
== REG_SZ
||
2619 ulDataType
== REG_EXPAND_SZ
||
2620 ulDataType
== REG_MULTI_SZ
)
2622 /* Do W->A conversion */
2623 *pulLength
= WideCharToMultiByte(CP_ACP
,
2626 lstrlenW(BufferW
) + 1,
2631 if (*pulLength
== 0)
2636 /* Directly copy the value */
2637 if (LengthW
<= *pulLength
)
2638 memcpy(Buffer
, BufferW
, LengthW
);
2641 *pulLength
= LengthW
;
2642 ret
= CR_BUFFER_SMALL
;
2648 *pulRegDataType
= ulDataType
;
2650 HeapFree(GetProcessHeap(), 0, BufferW
);
2656 /***********************************************************************
2657 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
2659 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
2660 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2661 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2663 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2664 HSTRING_TABLE StringTable
= NULL
;
2665 CONFIGRET ret
= CR_SUCCESS
;
2667 ULONG ulDataType
= REG_NONE
;
2668 ULONG ulTransferLength
= 0;
2670 TRACE("%lx %lu %p %p %p %lx %lx\n",
2671 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2675 return CR_INVALID_DEVNODE
;
2677 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
2678 return CR_INVALID_PROPERTY
;
2680 /* pulRegDataType is optional */
2682 /* Buffer is optional */
2684 if (pulLength
== NULL
)
2685 return CR_INVALID_POINTER
;
2687 if (*pulLength
== 0)
2688 return CR_INVALID_POINTER
;
2691 return CR_INVALID_FLAG
;
2693 if (hMachine
!= NULL
)
2695 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2696 if (BindingHandle
== NULL
)
2699 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2700 if (StringTable
== 0)
2705 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2709 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2710 if (lpDevInst
== NULL
)
2711 return CR_INVALID_DEVNODE
;
2713 ulTransferLength
= *pulLength
;
2717 ret
= PNP_GetDeviceRegProp(BindingHandle
,
2726 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2728 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2732 if (ret
== CR_SUCCESS
)
2734 if (pulRegDataType
!= NULL
)
2735 *pulRegDataType
= ulDataType
;
2742 /***********************************************************************
2743 * CM_Get_DevNode_Status [SETUPAPI.@]
2745 CONFIGRET WINAPI
CM_Get_DevNode_Status(
2746 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2749 TRACE("%p %p %lx %lx\n",
2750 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
2751 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
2756 /***********************************************************************
2757 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
2760 CM_Get_DevNode_Status_Ex(
2761 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2762 ULONG ulFlags
, HMACHINE hMachine
)
2764 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2765 HSTRING_TABLE StringTable
= NULL
;
2769 TRACE("%p %p %lx %lx %lx\n",
2770 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
2772 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
2773 return CR_INVALID_POINTER
;
2776 return CR_INVALID_DEVINST
;
2779 return CR_INVALID_FLAG
;
2781 if (hMachine
!= NULL
)
2783 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2784 if (BindingHandle
== NULL
)
2787 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2788 if (StringTable
== 0)
2793 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2797 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2798 if (lpDevInst
== NULL
)
2799 return CR_INVALID_DEVNODE
;
2803 ret
= PNP_GetDeviceStatus(BindingHandle
,
2809 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2811 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2819 /***********************************************************************
2820 * CM_Get_Device_IDA [SETUPAPI.@]
2822 CONFIGRET WINAPI
CM_Get_Device_IDA(
2823 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2825 TRACE("%lx %p %ld %ld\n",
2826 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2827 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2831 /***********************************************************************
2832 * CM_Get_Device_IDW [SETUPAPI.@]
2834 CONFIGRET WINAPI
CM_Get_Device_IDW(
2835 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2837 TRACE("%lx %p %ld %ld\n",
2838 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2839 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2843 /***********************************************************************
2844 * CM_Get_Device_ID_ExA [SETUPAPI.@]
2846 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
2847 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2850 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
2851 CONFIGRET ret
= CR_SUCCESS
;
2853 TRACE("%lx %p %ld %ld %lx\n",
2854 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2857 return CR_INVALID_POINTER
;
2859 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
2864 if (ret
== CR_SUCCESS
)
2866 if (WideCharToMultiByte(CP_ACP
,
2869 lstrlenW(szBufferW
) + 1,
2881 /***********************************************************************
2882 * CM_Get_Device_ID_ExW [SETUPAPI.@]
2884 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
2885 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2888 HSTRING_TABLE StringTable
= NULL
;
2890 TRACE("%lx %p %ld %ld %lx\n",
2891 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2894 return CR_INVALID_DEVINST
;
2897 return CR_INVALID_POINTER
;
2900 return CR_INVALID_FLAG
;
2902 if (hMachine
!= NULL
)
2904 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2905 if (StringTable
== NULL
)
2910 if (!PnpGetLocalHandles(NULL
, &StringTable
))
2914 if (!pSetupStringTableStringFromIdEx(StringTable
,
2924 /***********************************************************************
2925 * CM_Get_Device_ID_ListA [SETUPAPI.@]
2927 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
2928 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2930 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2931 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
2936 /***********************************************************************
2937 * CM_Get_Device_ID_ListW [SETUPAPI.@]
2939 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
2940 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2942 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
2943 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
2948 /***********************************************************************
2949 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
2951 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
2952 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2955 LPWSTR BufferW
= NULL
;
2956 LPWSTR pszFilterW
= NULL
;
2957 CONFIGRET ret
= CR_SUCCESS
;
2959 TRACE("%p %p %ld %ld %lx\n",
2960 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2962 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
2963 if (BufferW
== NULL
)
2964 return CR_OUT_OF_MEMORY
;
2966 if (pszFilter
== NULL
)
2968 ret
= CM_Get_Device_ID_List_ExW(NULL
,
2976 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
2978 ret
= CR_INVALID_DEVICE_ID
;
2982 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
2991 if (WideCharToMultiByte(CP_ACP
,
2994 lstrlenW(BufferW
) + 1,
3008 /***********************************************************************
3009 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
3011 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
3012 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3015 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3018 TRACE("%p %p %ld %ld %lx\n",
3019 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3021 if (Buffer
== NULL
|| BufferLen
== 0)
3022 return CR_INVALID_POINTER
;
3024 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3025 return CR_INVALID_FLAG
;
3027 if (hMachine
!= NULL
)
3029 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3030 if (BindingHandle
== NULL
)
3035 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3043 ret
= PNP_GetDeviceList(BindingHandle
,
3049 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3051 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3059 /***********************************************************************
3060 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
3062 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
3063 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
3065 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
3066 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
3070 /***********************************************************************
3071 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
3073 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
3074 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
3076 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
3077 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
3081 /***********************************************************************
3082 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
3084 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
3085 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
3087 LPWSTR pszFilterW
= NULL
;
3088 CONFIGRET ret
= CR_SUCCESS
;
3090 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
3092 if (pszFilter
== NULL
)
3094 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3101 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3102 return CR_INVALID_DEVICE_ID
;
3104 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3116 /***********************************************************************
3117 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
3119 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
3120 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
3122 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3125 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
3128 return CR_INVALID_POINTER
;
3130 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3131 return CR_INVALID_FLAG
;
3133 if (hMachine
!= NULL
)
3135 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3136 if (BindingHandle
== NULL
)
3141 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3149 ret
= PNP_GetDeviceListSize(BindingHandle
,
3154 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3156 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3164 /***********************************************************************
3165 * CM_Get_Device_ID_Size [SETUPAPI.@]
3167 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
3168 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
3170 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
3171 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
3175 /***********************************************************************
3176 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
3178 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
3179 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3181 HSTRING_TABLE StringTable
= NULL
;
3184 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
3187 return CR_INVALID_POINTER
;
3190 return CR_INVALID_DEVINST
;
3193 return CR_INVALID_FLAG
;
3195 if (hMachine
!= NULL
)
3197 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3198 if (StringTable
== NULL
)
3203 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3207 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3208 if (DeviceId
== NULL
)
3214 *pulLen
= lstrlenW(DeviceId
);
3220 /***********************************************************************
3221 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
3223 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasA(
3224 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
3225 LPSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
3227 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
3228 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3230 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
3231 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3236 /***********************************************************************
3237 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
3239 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasW(
3240 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
3241 LPWSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
3243 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
3244 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3246 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
3247 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3252 /***********************************************************************
3253 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
3255 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExA(
3256 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPSTR pszAliasDeviceInterface
,
3257 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
3259 FIXME("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
3260 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
3262 return CR_CALL_NOT_IMPLEMENTED
;
3266 /***********************************************************************
3267 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
3269 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExW(
3270 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPWSTR pszAliasDeviceInterface
,
3271 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
3273 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3274 ULONG ulTransferLength
;
3275 CONFIGRET ret
= CR_SUCCESS
;
3277 TRACE("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
3278 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
3280 if (pszDeviceInterface
== NULL
||
3281 AliasInterfaceGuid
== NULL
||
3282 pszAliasDeviceInterface
== NULL
||
3284 return CR_INVALID_POINTER
;
3287 return CR_INVALID_FLAG
;
3289 if (hMachine
!= NULL
)
3291 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3292 if (BindingHandle
== NULL
)
3297 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3301 ulTransferLength
= *pulLength
;
3305 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
3306 (LPWSTR
)pszDeviceInterface
,
3308 pszAliasDeviceInterface
,
3313 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3315 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3323 /***********************************************************************
3324 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
3326 CONFIGRET WINAPI
CM_Get_Device_Interface_ListA(
3327 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
3328 ULONG BufferLen
, ULONG ulFlags
)
3330 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
3331 pDeviceID
, Buffer
, BufferLen
, ulFlags
);
3333 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
3334 Buffer
, BufferLen
, ulFlags
, NULL
);
3338 /***********************************************************************
3339 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
3341 CONFIGRET WINAPI
CM_Get_Device_Interface_ListW(
3342 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
3343 ULONG BufferLen
, ULONG ulFlags
)
3345 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
3346 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
);
3348 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
3349 Buffer
, BufferLen
, ulFlags
, NULL
);
3353 /***********************************************************************
3354 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
3356 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExA(
3357 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
3358 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
3360 DEVINSTID_W pDeviceIdW
= NULL
;
3361 PWCHAR BufferW
= NULL
;
3362 CONFIGRET ret
= CR_SUCCESS
;
3364 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
3365 pDeviceID
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3367 if (Buffer
== NULL
||
3369 return CR_INVALID_POINTER
;
3371 if (pDeviceID
!= NULL
)
3373 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
3374 return CR_INVALID_DEVICE_ID
;
3377 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
3378 if (BufferW
== NULL
)
3380 ret
= CR_OUT_OF_MEMORY
;
3384 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
3385 BufferW
, BufferLen
, ulFlags
,
3387 if (ret
!= CR_SUCCESS
)
3390 if (WideCharToMultiByte(CP_ACP
,
3393 lstrlenW(BufferW
) + 1,
3401 if (BufferW
!= NULL
)
3404 if (pDeviceIdW
!= NULL
)
3411 /***********************************************************************
3412 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
3414 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExW(
3415 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
3416 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
3418 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3419 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
3420 CONFIGRET ret
= CR_SUCCESS
;
3422 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
3423 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
, hMachine
);
3425 if (Buffer
== NULL
||
3427 return CR_INVALID_POINTER
;
3429 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
3430 return CR_INVALID_FLAG
;
3432 if (hMachine
!= NULL
)
3434 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3435 if (BindingHandle
== NULL
)
3440 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3445 BufferSize
= BufferLen
;
3449 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
3456 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3458 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3466 /***********************************************************************
3467 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
3469 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeA(
3470 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
3473 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
3474 pDeviceId
, ulFlags
);
3476 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
3477 pDeviceId
, ulFlags
, NULL
);
3481 /***********************************************************************
3482 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
3484 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeW(
3485 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
3488 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
3489 debugstr_w(pDeviceId
), ulFlags
);
3491 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
3492 pDeviceId
, ulFlags
, NULL
);
3496 /***********************************************************************
3497 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
3499 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExA(
3500 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
3501 ULONG ulFlags
, HMACHINE hMachine
)
3503 DEVINSTID_W pDeviceIdW
= NULL
;
3504 CONFIGRET ret
= CR_SUCCESS
;
3506 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
3507 pDeviceId
, ulFlags
, hMachine
);
3510 return CR_INVALID_POINTER
;
3512 if (pDeviceId
!= NULL
)
3514 if (!pSetupCaptureAndConvertAnsiArg(pDeviceId
, &pDeviceIdW
))
3515 return CR_INVALID_DEVICE_ID
;
3520 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
3521 pDeviceIdW
, ulFlags
, hMachine
);
3523 if (pDeviceIdW
!= NULL
)
3530 /***********************************************************************
3531 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
3533 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExW(
3534 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
3535 ULONG ulFlags
, HMACHINE hMachine
)
3537 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3538 CONFIGRET ret
= CR_SUCCESS
;
3540 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
3541 debugstr_w(pDeviceId
), ulFlags
, hMachine
);
3544 return CR_INVALID_POINTER
;
3546 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
3547 return CR_INVALID_FLAG
;
3549 if (hMachine
!= NULL
)
3551 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3552 if (BindingHandle
== NULL
)
3557 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3565 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
3571 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3573 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3581 /***********************************************************************
3582 * CM_Get_First_Log_Conf [SETUPAPI.@]
3584 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
3585 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
3587 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
3588 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
3592 /***********************************************************************
3593 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
3595 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
3596 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3598 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3599 HSTRING_TABLE StringTable
= NULL
;
3600 LPWSTR lpDevInst
= NULL
;
3601 CONFIGRET ret
= CR_SUCCESS
;
3603 PLOG_CONF_INFO pLogConfInfo
;
3605 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
3608 return CR_INVALID_DEVINST
;
3610 if (ulFlags
& ~LOG_CONF_BITS
)
3611 return CR_INVALID_FLAG
;
3616 if (hMachine
!= NULL
)
3618 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3619 if (BindingHandle
== NULL
)
3622 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3623 if (StringTable
== 0)
3628 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3632 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3633 if (lpDevInst
== NULL
)
3634 return CR_INVALID_DEVNODE
;
3638 ret
= PNP_GetFirstLogConf(BindingHandle
,
3644 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3646 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3650 if (ret
!= CR_SUCCESS
)
3655 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3656 if (pLogConfInfo
== NULL
)
3657 return CR_OUT_OF_MEMORY
;
3659 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3660 pLogConfInfo
->dnDevInst
= dnDevInst
;
3661 pLogConfInfo
->ulFlags
= ulFlags
;
3662 pLogConfInfo
->ulTag
= ulTag
;
3664 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
3671 /***********************************************************************
3672 * CM_Get_Global_State [SETUPAPI.@]
3674 CONFIGRET WINAPI
CM_Get_Global_State(
3675 PULONG pulState
, ULONG ulFlags
)
3677 TRACE("%p %lx\n", pulState
, ulFlags
);
3678 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
3682 /***********************************************************************
3683 * CM_Get_Global_State_Ex [SETUPAPI.@]
3685 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
3686 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
3688 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3691 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
3693 if (pulState
== NULL
)
3694 return CR_INVALID_POINTER
;
3697 return CR_INVALID_FLAG
;
3699 if (hMachine
!= NULL
)
3701 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3702 if (BindingHandle
== NULL
)
3707 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3713 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
3715 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3717 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3725 /***********************************************************************
3726 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
3728 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
3729 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3732 TRACE("%s %lu %p %lx\n", szDevInstName
,
3733 ulHardwareProfile
, pulValue
, ulFlags
);
3735 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
3736 pulValue
, ulFlags
, NULL
);
3740 /***********************************************************************
3741 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
3743 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
3744 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3747 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
3748 ulHardwareProfile
, pulValue
, ulFlags
);
3750 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
3751 pulValue
, ulFlags
, NULL
);
3755 /***********************************************************************
3756 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
3758 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
3759 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3760 ULONG ulFlags
, HMACHINE hMachine
)
3762 DEVINSTID_W pszDevIdW
= NULL
;
3763 CONFIGRET ret
= CR_SUCCESS
;
3765 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
3766 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3768 if (szDevInstName
!= NULL
)
3770 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
3771 return CR_INVALID_DEVICE_ID
;
3774 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
3775 pulValue
, ulFlags
, hMachine
);
3777 if (pszDevIdW
!= NULL
)
3784 /***********************************************************************
3785 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
3787 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
3788 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3789 ULONG ulFlags
, HMACHINE hMachine
)
3791 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3794 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
3795 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3797 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
3798 return CR_INVALID_POINTER
;
3801 return CR_INVALID_FLAG
;
3803 /* FIXME: Check whether szDevInstName is valid */
3805 if (hMachine
!= NULL
)
3807 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3808 if (BindingHandle
== NULL
)
3813 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3819 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
3820 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
3822 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3824 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3832 /***********************************************************************
3833 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
3835 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoA(
3836 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
)
3838 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3840 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
3845 /***********************************************************************
3846 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
3848 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoW(
3849 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
)
3851 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3853 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
3858 /***********************************************************************
3859 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
3861 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExA(
3862 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
,
3865 HWPROFILEINFO_W LocalProfileInfo
;
3868 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3870 if (pHWProfileInfo
== NULL
)
3871 return CR_INVALID_POINTER
;
3873 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
3875 if (ret
== CR_SUCCESS
)
3877 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
3878 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
3880 if (WideCharToMultiByte(CP_ACP
,
3882 LocalProfileInfo
.HWPI_szFriendlyName
,
3883 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
3884 pHWProfileInfo
->HWPI_szFriendlyName
,
3895 /***********************************************************************
3896 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
3898 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExW(
3899 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
,
3902 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3905 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3907 if (pHWProfileInfo
== NULL
)
3908 return CR_INVALID_POINTER
;
3911 return CR_INVALID_FLAG
;
3913 if (hMachine
!= NULL
)
3915 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3916 if (BindingHandle
== NULL
)
3921 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3927 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
3928 sizeof(HWPROFILEINFO_W
), 0);
3930 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3932 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3940 /***********************************************************************
3941 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
3943 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
3944 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
3946 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
3947 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
3951 /***********************************************************************
3952 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
3954 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
3955 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
3958 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3959 HSTRING_TABLE StringTable
= NULL
;
3960 PLOG_CONF_INFO pLogConfInfo
;
3964 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
3966 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
3967 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
3968 return CR_INVALID_LOG_CONF
;
3970 if (pPriority
== NULL
)
3971 return CR_INVALID_POINTER
;
3974 return CR_INVALID_FLAG
;
3976 if (hMachine
!= NULL
)
3978 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3979 if (BindingHandle
== NULL
)
3982 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3983 if (StringTable
== 0)
3988 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3992 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
3993 if (lpDevInst
== NULL
)
3994 return CR_INVALID_DEVNODE
;
3998 ret
= PNP_GetLogConfPriority(BindingHandle
,
4000 pLogConfInfo
->ulFlags
,
4001 pLogConfInfo
->ulTag
,
4005 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4007 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4015 /***********************************************************************
4016 * CM_Get_Next_Log_Conf [SETUPAPI.@]
4018 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
4019 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
4021 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
4022 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
4026 /***********************************************************************
4027 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
4029 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
4030 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
4033 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4034 HSTRING_TABLE StringTable
= NULL
;
4035 PLOG_CONF_INFO pLogConfInfo
;
4036 PLOG_CONF_INFO pNewLogConfInfo
;
4041 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
4046 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4047 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
4048 return CR_INVALID_LOG_CONF
;
4051 return CR_INVALID_FLAG
;
4053 if (hMachine
!= NULL
)
4055 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4056 if (BindingHandle
== NULL
)
4059 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4060 if (StringTable
== 0)
4065 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4069 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4070 if (lpDevInst
== NULL
)
4071 return CR_INVALID_DEVNODE
;
4075 ret
= PNP_GetNextLogConf(BindingHandle
,
4077 pLogConfInfo
->ulFlags
,
4078 pLogConfInfo
->ulTag
,
4082 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4084 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4088 if (ret
!= CR_SUCCESS
)
4093 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4094 if (pNewLogConfInfo
== NULL
)
4095 return CR_OUT_OF_MEMORY
;
4097 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4098 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
4099 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
4100 pNewLogConfInfo
->ulTag
= ulNewTag
;
4102 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
4109 /***********************************************************************
4110 * CM_Get_Next_Re_Des [SETUPAPI.@]
4112 CONFIGRET WINAPI
CM_Get_Next_Res_Des(
4113 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
4114 PRESOURCEID pResourceID
, ULONG ulFlags
)
4116 TRACE("%p %p %lu %p %lx\n", prdResDes
, rdResDes
, ForResource
,
4117 pResourceID
, ulFlags
);
4118 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
4119 pResourceID
, ulFlags
, NULL
);
4123 /***********************************************************************
4124 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
4126 CONFIGRET WINAPI
CM_Get_Next_Res_Des_Ex(
4127 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
4128 PRESOURCEID pResourceID
, ULONG ulFlags
, HMACHINE hMachine
)
4130 FIXME("%p %p %lu %p %lx %lx\n", prdResDes
, rdResDes
, ForResource
,
4131 pResourceID
, ulFlags
, hMachine
);
4133 return CR_CALL_NOT_IMPLEMENTED
;
4137 /***********************************************************************
4138 * CM_Get_Parent [SETUPAPI.@]
4140 CONFIGRET WINAPI
CM_Get_Parent(
4141 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
4143 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
4144 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
4148 /***********************************************************************
4149 * CM_Get_Parent_Ex [SETUPAPI.@]
4151 CONFIGRET WINAPI
CM_Get_Parent_Ex(
4152 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4154 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
4155 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4156 HSTRING_TABLE StringTable
= NULL
;
4158 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
4161 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
4163 if (pdnDevInst
== NULL
)
4164 return CR_INVALID_POINTER
;
4167 return CR_INVALID_DEVINST
;
4170 return CR_INVALID_FLAG
;
4174 if (hMachine
!= NULL
)
4176 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4177 if (BindingHandle
== NULL
)
4180 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4181 if (StringTable
== 0)
4186 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4190 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4191 if (lpDevInst
== NULL
)
4192 return CR_INVALID_DEVNODE
;
4196 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
4197 PNP_GET_PARENT_DEVICE_INSTANCE
,
4203 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4205 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4209 if (ret
!= CR_SUCCESS
)
4212 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
4214 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
4218 *pdnDevInst
= dwIndex
;
4224 /***********************************************************************
4225 * CM_Get_Res_Des_Data [SETUPAPI.@]
4227 CONFIGRET WINAPI
CM_Get_Res_Des_Data(
4228 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
)
4230 TRACE("%p %p %l %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
);
4231 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
4235 /***********************************************************************
4236 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
4238 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Ex(
4239 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
,
4242 FIXME("%p %p %l %lx %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
4243 return CR_CALL_NOT_IMPLEMENTED
;
4247 /***********************************************************************
4248 * CM_Get_Res_Des_Size [SETUPAPI.@]
4250 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size(
4251 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
)
4253 TRACE("%p %p %lx\n", pulSize
, rdResDes
, ulFlags
);
4254 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
4258 /***********************************************************************
4259 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
4261 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size_Ex(
4262 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
, HMACHINE hMachine
)
4264 TRACE("%p %p %lx %lx\n", pulSize
, rdResDes
, ulFlags
, hMachine
);
4265 return CR_CALL_NOT_IMPLEMENTED
;
4269 /***********************************************************************
4270 * CM_Get_Sibling [SETUPAPI.@]
4272 CONFIGRET WINAPI
CM_Get_Sibling(
4273 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
4275 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
4276 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
4280 /***********************************************************************
4281 * CM_Get_Sibling_Ex [SETUPAPI.@]
4283 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
4284 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4286 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
4287 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4288 HSTRING_TABLE StringTable
= NULL
;
4290 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
4293 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
4295 if (pdnDevInst
== NULL
)
4296 return CR_INVALID_POINTER
;
4299 return CR_INVALID_DEVINST
;
4302 return CR_INVALID_FLAG
;
4306 if (hMachine
!= NULL
)
4308 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4309 if (BindingHandle
== NULL
)
4312 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4313 if (StringTable
== 0)
4318 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4322 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4323 if (lpDevInst
== NULL
)
4324 return CR_INVALID_DEVNODE
;
4328 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
4329 PNP_GET_SIBLING_DEVICE_INSTANCE
,
4335 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4337 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4341 if (ret
!= CR_SUCCESS
)
4344 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
4346 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
4350 *pdnDevInst
= dwIndex
;
4356 /***********************************************************************
4357 * CM_Get_Version [SETUPAPI.@]
4359 WORD WINAPI
CM_Get_Version(VOID
)
4362 return CM_Get_Version_Ex(NULL
);
4366 /***********************************************************************
4367 * CM_Get_Version_Ex [SETUPAPI.@]
4369 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
4371 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4375 TRACE("%lx\n", hMachine
);
4377 if (hMachine
!= NULL
)
4379 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4380 if (BindingHandle
== NULL
)
4385 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4391 ret
= PNP_GetVersion(BindingHandle
, &Version
);
4393 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4395 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4399 if (ret
!= CR_SUCCESS
)
4406 /***********************************************************************
4407 * CM_Intersect_Range_List [SETUPAPI.@]
4411 CM_Intersect_Range_List(
4412 _In_ RANGE_LIST rlhOld1
,
4413 _In_ RANGE_LIST rlhOld2
,
4414 _In_ RANGE_LIST rlhNew
,
4417 FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
4418 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
4419 return CR_CALL_NOT_IMPLEMENTED
;
4423 /***********************************************************************
4424 * CM_Invert_Range_List [SETUPAPI.@]
4428 CM_Invert_Range_List(
4429 _In_ RANGE_LIST rlhOld
,
4430 _In_ RANGE_LIST rlhNew
,
4431 _In_ DWORDLONG ullMaxValue
,
4434 FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
4435 rlhOld
, rlhNew
, ullMaxValue
, ulFlags
);
4436 return CR_CALL_NOT_IMPLEMENTED
;
4440 /***********************************************************************
4441 * CM_Is_Dock_Station_Present [SETUPAPI.@]
4445 CM_Is_Dock_Station_Present(
4446 _Out_ PBOOL pbPresent
)
4448 TRACE("CM_Is_Dock_Station_Present(%p)\n",
4450 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
4454 /***********************************************************************
4455 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
4459 CM_Is_Dock_Station_Present_Ex(
4460 _Out_ PBOOL pbPresent
,
4461 _In_opt_ HMACHINE hMachine
)
4463 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4466 TRACE("CM_Is_Dock_Station_Present_Ex(%p %lx)\n",
4467 pbPresent
, hMachine
);
4469 if (pbPresent
== NULL
)
4470 return CR_INVALID_POINTER
;
4474 if (hMachine
!= NULL
)
4476 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4477 if (BindingHandle
== NULL
)
4482 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4488 ret
= PNP_IsDockStationPresent(BindingHandle
,
4491 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4493 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4501 /***********************************************************************
4502 * CM_Is_Version_Available_Ex [SETUPAPI.@]
4506 CM_Is_Version_Available(
4509 TRACE("CM_Is_Version_Available(%hu)\n",
4511 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
4515 /***********************************************************************
4516 * CM_Is_Version_Available_Ex [SETUPAPI.@]
4520 CM_Is_Version_Available_Ex(
4522 _In_opt_ HMACHINE hMachine
)
4524 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4525 WORD wServerVersion
;
4528 TRACE("CM_Is_Version_Available_Ex(%hu %lx)\n",
4529 wVersion
, hMachine
);
4531 if (wVersion
<= 0x400)
4534 if (hMachine
!= NULL
)
4536 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4537 if (BindingHandle
== NULL
)
4542 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4548 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
4550 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4552 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4556 if (ret
!= CR_SUCCESS
)
4559 return (wServerVersion
>= wVersion
);
4563 /***********************************************************************
4564 * CM_Locate_DevNodeA [SETUPAPI.@]
4569 _Out_ PDEVINST pdnDevInst
,
4570 _In_opt_ DEVINSTID_A pDeviceID
,
4573 TRACE("CM_Locate_DevNodeA(%p %s %lu)\n",
4574 pdnDevInst
, pDeviceID
, ulFlags
);
4575 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
4579 /***********************************************************************
4580 * CM_Locate_DevNodeW [SETUPAPI.@]
4585 _Out_ PDEVINST pdnDevInst
,
4586 _In_opt_ DEVINSTID_W pDeviceID
,
4589 TRACE("CM_Locate_DevNodeW(%p %s %lu)\n",
4590 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
4591 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
4595 /***********************************************************************
4596 * CM_Locate_DevNode_ExA [SETUPAPI.@]
4600 CM_Locate_DevNode_ExA(
4601 _Out_ PDEVINST pdnDevInst
,
4602 _In_opt_ DEVINSTID_A pDeviceID
,
4604 _In_opt_ HMACHINE hMachine
)
4606 DEVINSTID_W pDevIdW
= NULL
;
4607 CONFIGRET ret
= CR_SUCCESS
;
4609 TRACE("CM_Locate_DevNode_ExA(%p %s %lu %lx)\n",
4610 pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
4612 if (pDeviceID
!= NULL
)
4614 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
4615 return CR_INVALID_DEVICE_ID
;
4618 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
4620 if (pDevIdW
!= NULL
)
4627 /***********************************************************************
4628 * CM_Locate_DevNode_ExW [SETUPAPI.@]
4632 CM_Locate_DevNode_ExW(
4633 _Out_ PDEVINST pdnDevInst
,
4634 _In_opt_ DEVINSTID_W pDeviceID
,
4636 _In_opt_ HMACHINE hMachine
)
4638 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
4639 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4640 HSTRING_TABLE StringTable
= NULL
;
4641 CONFIGRET ret
= CR_SUCCESS
;
4643 TRACE("CM_Locate_DevNode_ExW(%p %s %lu %lx)\n",
4644 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
4646 if (pdnDevInst
== NULL
)
4647 return CR_INVALID_POINTER
;
4649 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
4650 return CR_INVALID_FLAG
;
4652 if (hMachine
!= NULL
)
4654 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4655 if (BindingHandle
== NULL
)
4658 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4659 if (StringTable
== 0)
4664 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4668 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
4670 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
4676 /* Get the root device ID */
4677 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
4681 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4683 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4687 if (ret
!= CR_SUCCESS
)
4690 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
4694 /* Validate the device ID */
4695 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
4699 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4701 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4705 if (ret
== CR_SUCCESS
)
4707 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
4708 if (*pdnDevInst
== -1)
4716 /***********************************************************************
4717 * CM_Merge_Range_List [SETUPAPI.@]
4721 CM_Merge_Range_List(
4722 _In_ RANGE_LIST rlhOld1
,
4723 _In_ RANGE_LIST rlhOld2
,
4724 _In_ RANGE_LIST rlhNew
,
4727 FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
4728 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
4729 return CR_CALL_NOT_IMPLEMENTED
;
4733 /***********************************************************************
4734 * CM_Modify_Res_Des [SETUPAPI.@]
4739 _Out_ PRES_DES prdResDes
,
4740 _In_ RES_DES rdResDes
,
4741 _In_ RESOURCEID ResourceID
,
4742 _In_ PCVOID ResourceData
,
4743 _In_ ULONG ResourceLen
,
4746 TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
4747 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4748 ResourceLen
, ulFlags
);
4749 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4750 ResourceLen
, ulFlags
, NULL
);
4754 /***********************************************************************
4755 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
4759 CM_Modify_Res_Des_Ex(
4760 _Out_ PRES_DES prdResDes
,
4761 _In_ RES_DES rdResDes
,
4762 _In_ RESOURCEID ResourceID
,
4763 _In_ PCVOID ResourceData
,
4764 _In_ ULONG ResourceLen
,
4766 _In_opt_ HMACHINE hMachine
)
4768 FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %lx)\n",
4769 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4770 ResourceLen
, ulFlags
, hMachine
);
4771 return CR_CALL_NOT_IMPLEMENTED
;
4775 /***********************************************************************
4776 * CM_Move_DevNode [SETUPAPI.@]
4781 _In_ DEVINST dnFromDevInst
,
4782 _In_ DEVINST dnToDevInst
,
4785 TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
4786 dnFromDevInst
, dnToDevInst
, ulFlags
);
4787 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
4791 /***********************************************************************
4792 * CM_Move_DevNode_Ex [SETUPAPI.@]
4797 _In_ DEVINST dnFromDevInst
,
4798 _In_ DEVINST dnToDevInst
,
4800 _In_opt_ HMACHINE hMachine
)
4802 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4803 HSTRING_TABLE StringTable
= NULL
;
4804 LPWSTR lpFromDevInst
;
4808 FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %lx)\n",
4809 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
4811 if (!pSetupIsUserAdmin())
4812 return CR_ACCESS_DENIED
;
4814 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
4815 return CR_INVALID_DEVNODE
;
4818 return CR_INVALID_FLAG
;
4820 if (hMachine
!= NULL
)
4822 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4823 if (BindingHandle
== NULL
)
4826 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4827 if (StringTable
== 0)
4832 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4836 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
4837 if (lpFromDevInst
== NULL
)
4838 return CR_INVALID_DEVNODE
;
4840 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
4841 if (lpToDevInst
== NULL
)
4842 return CR_INVALID_DEVNODE
;
4846 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4852 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4854 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4862 /***********************************************************************
4863 * CM_Next_Range [SETUPAPI.@]
4868 _Inout_ PRANGE_ELEMENT preElement
,
4869 _Out_ PDWORDLONG pullStart
,
4870 _Out_ PDWORDLONG pullEnd
,
4873 FIXME("CM_Next_Range(%p %p %p %lx)\n",
4874 preElement
, pullStart
, pullEnd
, ulFlags
);
4875 return CR_CALL_NOT_IMPLEMENTED
;
4879 /***********************************************************************
4880 * CM_Open_Class_KeyA [SETUPAPI.@]
4885 _In_opt_ LPGUID pClassGuid
,
4886 _In_opt_ LPCSTR pszClassName
,
4887 _In_ REGSAM samDesired
,
4888 _In_ REGDISPOSITION Disposition
,
4889 _Out_ PHKEY phkClass
,
4892 TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
4893 debugstr_guid(pClassGuid
), pszClassName
,
4894 samDesired
, Disposition
, phkClass
, ulFlags
);
4896 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
4897 Disposition
, phkClass
, ulFlags
, NULL
);
4901 /***********************************************************************
4902 * CM_Open_Class_KeyW [SETUPAPI.@]
4907 _In_opt_ LPGUID pClassGuid
,
4908 _In_opt_ LPCWSTR pszClassName
,
4909 _In_ REGSAM samDesired
,
4910 _In_ REGDISPOSITION Disposition
,
4911 _Out_ PHKEY phkClass
,
4914 TRACE("CM_Open_Class_KeyW%p %s %lx %lx %p %lx)\n",
4915 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4916 samDesired
, Disposition
, phkClass
, ulFlags
);
4918 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
4919 Disposition
, phkClass
, ulFlags
, NULL
);
4923 /***********************************************************************
4924 * CM_Open_Class_Key_ExA [SETUPAPI.@]
4928 CM_Open_Class_Key_ExA(
4929 _In_opt_ LPGUID pClassGuid
,
4930 _In_opt_ LPCSTR pszClassName
,
4931 _In_ REGSAM samDesired
,
4932 _In_ REGDISPOSITION Disposition
,
4933 _Out_ PHKEY phkClass
,
4935 _In_opt_ HMACHINE hMachine
)
4937 LPWSTR pszClassNameW
= NULL
;
4940 TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %lx)\n",
4941 debugstr_guid(pClassGuid
), pszClassName
,
4942 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4944 if (pszClassName
!= NULL
)
4946 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
4947 return CR_INVALID_DATA
;
4950 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
4951 Disposition
, phkClass
, ulFlags
, hMachine
);
4953 if (pszClassNameW
!= NULL
)
4954 MyFree(pszClassNameW
);
4960 /***********************************************************************
4961 * CM_Open_Class_Key_ExW [SETUPAPI.@]
4965 CM_Open_Class_Key_ExW(
4966 _In_opt_ LPGUID pClassGuid
,
4967 _In_opt_ LPCWSTR pszClassName
,
4968 _In_ REGSAM samDesired
,
4969 _In_ REGDISPOSITION Disposition
,
4970 _Out_ PHKEY phkClass
,
4972 _In_opt_ HMACHINE hMachine
)
4974 WCHAR szKeyName
[MAX_PATH
];
4975 LPWSTR lpGuidString
;
4976 DWORD dwDisposition
;
4980 TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %lx)\n",
4981 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
4982 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
4984 /* Check Disposition and ulFlags */
4985 if ((Disposition
& ~RegDisposition_Bits
) ||
4986 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
4987 return CR_INVALID_FLAG
;
4989 /* Check phkClass */
4990 if (phkClass
== NULL
)
4991 return CR_INVALID_POINTER
;
4995 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
4996 pszClassName
!= NULL
)
4997 return CR_INVALID_DATA
;
4999 if (hMachine
== NULL
)
5001 hKey
= HKEY_LOCAL_MACHINE
;
5005 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
5006 HKEY_LOCAL_MACHINE
, &hKey
))
5007 return CR_REGISTRY_ERROR
;
5010 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
5012 lstrcpyW(szKeyName
, DeviceClasses
);
5016 lstrcpyW(szKeyName
, ControlClass
);
5019 if (pClassGuid
!= NULL
)
5021 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
5024 return CR_INVALID_DATA
;
5027 lstrcatW(szKeyName
, Backslash
);
5028 lstrcatW(szKeyName
, lpGuidString
);
5031 if (Disposition
== RegDisposition_OpenAlways
)
5033 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
5034 NULL
, phkClass
, &dwDisposition
);
5038 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
5043 if (pClassGuid
!= NULL
)
5044 RpcStringFreeW(&lpGuidString
);
5046 if (dwError
!= ERROR_SUCCESS
)
5049 return CR_NO_SUCH_REGISTRY_KEY
;
5052 if (pszClassName
!= NULL
)
5054 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
5055 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
5062 /***********************************************************************
5063 * CM_Open_DevNode_Key [SETUPAPI.@]
5067 CM_Open_DevNode_Key(
5068 _In_ DEVINST dnDevNode
,
5069 _In_ REGSAM samDesired
,
5070 _In_ ULONG ulHardwareProfile
,
5071 _In_ REGDISPOSITION Disposition
,
5072 _Out_ PHKEY phkDevice
,
5075 TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
5076 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
5077 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
5078 Disposition
, phkDevice
, ulFlags
, NULL
);
5082 /***********************************************************************
5083 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
5087 CM_Open_DevNode_Key_Ex(
5088 _In_ DEVINST dnDevNode
,
5089 _In_ REGSAM samDesired
,
5090 _In_ ULONG ulHardwareProfile
,
5091 _In_ REGDISPOSITION Disposition
,
5092 _Out_ PHKEY phkDevice
,
5094 _In_opt_ HMACHINE hMachine
)
5096 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5097 HSTRING_TABLE StringTable
= NULL
;
5098 LPWSTR pszDevInst
, pszKeyPath
= NULL
, pszInstancePath
= NULL
;
5100 CONFIGRET ret
= CR_CALL_NOT_IMPLEMENTED
;
5102 FIXME("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %lx)\n",
5103 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
5105 if (phkDevice
== NULL
)
5106 return CR_INVALID_POINTER
;
5111 return CR_INVALID_DEVNODE
;
5113 if (ulFlags
& ~CM_REGISTRY_BITS
)
5114 return CR_INVALID_FLAG
;
5116 if (Disposition
& ~RegDisposition_Bits
)
5117 return CR_INVALID_DATA
;
5119 if (hMachine
!= NULL
)
5121 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5122 if (BindingHandle
== NULL
)
5125 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5126 if (StringTable
== 0)
5131 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5135 pszDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevNode
);
5136 if (pszDevInst
== NULL
)
5137 return CR_INVALID_DEVNODE
;
5139 TRACE("pszDevInst: %S\n", pszDevInst
);
5141 pszKeyPath
= MyMalloc(1024);
5142 if (pszKeyPath
== NULL
)
5144 ret
= CR_OUT_OF_MEMORY
;
5148 pszInstancePath
= MyMalloc(1024);
5149 if (pszInstancePath
== NULL
)
5151 ret
= CR_OUT_OF_MEMORY
;
5155 ret
= GetDeviceInstanceKeyPath(BindingHandle
,
5161 if (ret
!= CR_SUCCESS
)
5164 TRACE("pszKeyPath: %S\n", pszKeyPath
);
5165 TRACE("pszInstancePath: %S\n", pszInstancePath
);
5167 wcscat(pszKeyPath
, L
"\\");
5168 wcscat(pszKeyPath
, pszInstancePath
);
5170 TRACE("pszKeyPath: %S\n", pszKeyPath
);
5172 // FIXME: Disposition
5175 lError
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
5180 if (lError
!= ERROR_SUCCESS
)
5183 ret
= CR_NO_SUCH_REGISTRY_KEY
;
5187 if (pszInstancePath
!= NULL
)
5188 MyFree(pszInstancePath
);
5190 if (pszKeyPath
!= NULL
)
5197 /***********************************************************************
5198 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
5200 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeA(
5201 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5202 ULONG ulNameLength
, ULONG ulFlags
)
5204 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
5205 ulNameLength
, ulFlags
);
5207 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
5208 ulNameLength
, ulFlags
, NULL
);
5212 /***********************************************************************
5213 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
5215 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeW(
5216 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5217 ULONG ulNameLength
, ULONG ulFlags
)
5219 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
,
5220 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
5222 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
5223 ulNameLength
, ulFlags
, NULL
);
5227 /***********************************************************************
5228 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
5230 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExA(
5231 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5232 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5234 LPWSTR lpLocalVetoName
;
5237 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
5238 ulNameLength
, ulFlags
, hMachine
);
5240 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5241 return CR_INVALID_POINTER
;
5243 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
5244 if (lpLocalVetoName
== NULL
)
5245 return CR_OUT_OF_MEMORY
;
5247 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
5248 ulNameLength
, ulFlags
, hMachine
);
5249 if (ret
== CR_REMOVE_VETOED
)
5251 if (WideCharToMultiByte(CP_ACP
,
5262 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
5268 /***********************************************************************
5269 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
5271 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExW(
5272 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5273 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5275 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5276 HSTRING_TABLE StringTable
= NULL
;
5280 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
,
5281 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
5283 if (dnAncestor
== 0)
5284 return CR_INVALID_DEVNODE
;
5286 if (ulFlags
& ~CM_REMOVE_BITS
)
5287 return CR_INVALID_FLAG
;
5289 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5290 return CR_INVALID_POINTER
;
5292 if (hMachine
!= NULL
)
5294 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5295 if (BindingHandle
== NULL
)
5298 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5299 if (StringTable
== 0)
5304 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5308 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnAncestor
);
5309 if (lpDevInst
== NULL
)
5310 return CR_INVALID_DEVNODE
;
5314 ret
= PNP_QueryRemove(BindingHandle
,
5321 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5323 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5331 /***********************************************************************
5332 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
5334 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data(
5335 PVOID pData
, ULONG DataLen
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
5338 TRACE("%p %lu %lx %lu 0x%08lx\n", pData
, DataLen
, dnDevInst
,
5339 ResourceID
, ulFlags
);
5341 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
5342 ResourceID
, ulFlags
, NULL
);
5346 /***********************************************************************
5347 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
5349 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data_Ex(
5352 IN DEVINST dnDevInst
,
5353 IN RESOURCEID ResourceID
,
5355 IN HMACHINE hMachine
)
5357 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5358 HSTRING_TABLE StringTable
= NULL
;
5362 TRACE("%p %lu %lx %lu 0x%08lx %p\n", pData
, DataLen
, dnDevInst
,
5363 ResourceID
, ulFlags
, hMachine
);
5365 if (pData
== NULL
|| DataLen
== 0)
5366 return CR_INVALID_POINTER
;
5369 return CR_INVALID_DEVINST
;
5371 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
5372 return CR_INVALID_FLAG
;
5374 if (hMachine
!= NULL
)
5376 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5377 if (BindingHandle
== NULL
)
5380 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5381 if (StringTable
== 0)
5386 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5390 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5391 if (lpDevInst
== NULL
)
5392 return CR_INVALID_DEVNODE
;
5396 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
5403 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5405 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5413 /***********************************************************************
5414 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
5416 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size(
5417 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
, ULONG ulFlags
)
5419 TRACE("%p %lu %lx 0x%08lx\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
);
5421 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
5426 /***********************************************************************
5427 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
5429 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size_Ex(
5430 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
5431 ULONG ulFlags
, HMACHINE hMachine
)
5433 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5434 HSTRING_TABLE StringTable
= NULL
;
5438 TRACE("%p %lu %lx 0x%08lx %p\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
,
5441 if (pulSize
== NULL
)
5442 return CR_INVALID_POINTER
;
5445 return CR_INVALID_DEVINST
;
5447 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
5448 return CR_INVALID_FLAG
;
5450 if (hMachine
!= NULL
)
5452 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5453 if (BindingHandle
== NULL
)
5456 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5457 if (StringTable
== 0)
5462 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5466 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5467 if (lpDevInst
== NULL
)
5468 return CR_INVALID_DEVNODE
;
5472 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
5478 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5480 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5488 /***********************************************************************
5489 * CM_Query_Remove_SubTree [SETUPAPI.@]
5491 * This function is obsolete in Windows XP and above.
5493 CONFIGRET WINAPI
CM_Query_Remove_SubTree(
5494 DEVINST dnAncestor
, ULONG ulFlags
)
5496 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
5497 return CR_CALL_NOT_IMPLEMENTED
;
5501 /***********************************************************************
5502 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
5504 * This function is obsolete in Windows XP and above.
5506 CONFIGRET WINAPI
CM_Query_Remove_SubTree_Ex(
5507 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
5509 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
5510 return CR_CALL_NOT_IMPLEMENTED
;
5514 /***********************************************************************
5515 * CM_Reenumerate_DevNode [SETUPAPI.@]
5517 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
5518 DEVINST dnDevInst
, ULONG ulFlags
)
5520 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
5521 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
5525 /***********************************************************************
5526 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
5529 CM_Reenumerate_DevNode_Ex(
5530 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5532 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5533 HSTRING_TABLE StringTable
= NULL
;
5537 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
5540 return CR_INVALID_DEVNODE
;
5542 if (ulFlags
& ~CM_REENUMERATE_BITS
)
5543 return CR_INVALID_FLAG
;
5545 if (hMachine
!= NULL
)
5547 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5548 if (BindingHandle
== NULL
)
5551 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5552 if (StringTable
== 0)
5557 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5561 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5562 if (lpDevInst
== NULL
)
5563 return CR_INVALID_DEVNODE
;
5567 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5568 PNP_DEVINST_REENUMERATE
,
5573 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5575 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5583 /***********************************************************************
5584 * CM_Register_Device_InterfaceA [SETUPAPI.@]
5586 CONFIGRET WINAPI
CM_Register_Device_InterfaceA(
5587 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
5588 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
5590 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5591 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
5593 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
5594 pszReference
, pszDeviceInterface
,
5595 pulLength
, ulFlags
, NULL
);
5599 /***********************************************************************
5600 * CM_Register_Device_InterfaceW [SETUPAPI.@]
5602 CONFIGRET WINAPI
CM_Register_Device_InterfaceW(
5603 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
5604 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
5606 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5607 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
5609 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
5610 pszReference
, pszDeviceInterface
,
5611 pulLength
, ulFlags
, NULL
);
5615 /***********************************************************************
5616 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
5618 CONFIGRET WINAPI
CM_Register_Device_Interface_ExA(
5619 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
5620 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
5622 LPWSTR pszReferenceW
= NULL
;
5623 LPWSTR pszDeviceInterfaceW
= NULL
;
5627 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5628 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
5630 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
5631 return CR_INVALID_POINTER
;
5633 if (pszReference
!= NULL
)
5635 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
5636 return CR_INVALID_DATA
;
5639 ulLength
= *pulLength
;
5641 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
5642 if (pszDeviceInterfaceW
== NULL
)
5644 ret
= CR_OUT_OF_MEMORY
;
5648 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
5651 pszDeviceInterfaceW
,
5655 if (ret
== CR_SUCCESS
)
5657 if (WideCharToMultiByte(CP_ACP
,
5659 pszDeviceInterfaceW
,
5668 *pulLength
= ulLength
;
5671 if (pszDeviceInterfaceW
!= NULL
)
5672 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
5674 if (pszReferenceW
!= NULL
)
5675 MyFree(pszReferenceW
);
5681 /***********************************************************************
5682 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
5684 CONFIGRET WINAPI
CM_Register_Device_Interface_ExW(
5685 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
5686 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
5688 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5689 HSTRING_TABLE StringTable
= NULL
;
5691 ULONG ulTransferLength
;
5694 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5695 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
5698 return CR_INVALID_DEVNODE
;
5700 if (InterfaceClassGuid
== NULL
||
5701 pszDeviceInterface
== NULL
||
5703 return CR_INVALID_POINTER
;
5706 return CR_INVALID_FLAG
;
5708 if (hMachine
!= NULL
)
5710 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5711 if (BindingHandle
== NULL
)
5714 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5715 if (StringTable
== 0)
5720 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5724 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5725 if (lpDevInst
== NULL
)
5726 return CR_INVALID_DEVNODE
;
5728 ulTransferLength
= *pulLength
;
5732 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
5735 (LPWSTR
)pszReference
,
5741 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5743 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5751 /***********************************************************************
5752 * CM_Register_Device_Driver [SETUPAPI.@]
5754 CONFIGRET WINAPI
CM_Register_Device_Driver(
5755 DEVINST dnDevInst
, ULONG ulFlags
)
5757 TRACE("%lx 0x%08lx\n", dnDevInst
, ulFlags
);
5758 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
5762 /***********************************************************************
5763 * CM_Register_Device_Driver [SETUPAPI.@]
5765 CONFIGRET WINAPI
CM_Register_Device_Driver_Ex(
5766 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5768 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5769 HSTRING_TABLE StringTable
= NULL
;
5773 TRACE("%lx 0x%08lx %p\n", dnDevInst
, ulFlags
, hMachine
);
5776 return CR_INVALID_DEVNODE
;
5778 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
5779 return CR_INVALID_FLAG
;
5781 if (hMachine
!= NULL
)
5783 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5784 if (BindingHandle
== NULL
)
5787 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5788 if (StringTable
== 0)
5793 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5797 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5798 if (lpDevInst
== NULL
)
5799 return CR_INVALID_DEVNODE
;
5803 ret
= PNP_RegisterDriver(BindingHandle
,
5807 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5809 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5817 /***********************************************************************
5818 * CM_Remove_SubTree [SETUPAPI.@]
5820 * This function is obsolete in Windows XP and above.
5822 CONFIGRET WINAPI
CM_Remove_SubTree(
5823 DEVINST dnAncestor
, ULONG ulFlags
)
5825 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
5826 return CR_CALL_NOT_IMPLEMENTED
;
5830 /***********************************************************************
5831 * CM_Remove_SubTree_Ex [SETUPAPI.@]
5833 * This function is obsolete in Windows XP and above.
5835 CONFIGRET WINAPI
CM_Remove_SubTree_Ex(
5836 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
5838 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
5839 return CR_CALL_NOT_IMPLEMENTED
;
5843 /***********************************************************************
5844 * CM_Request_Device_EjectA [SETUPAPI.@]
5846 CONFIGRET WINAPI
CM_Request_Device_EjectA(
5847 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5848 ULONG ulNameLength
, ULONG ulFlags
)
5850 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
5851 ulNameLength
, ulFlags
);
5852 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
5853 ulNameLength
, ulFlags
, NULL
);
5857 /***********************************************************************
5858 * CM_Request_Device_EjectW [SETUPAPI.@]
5860 CONFIGRET WINAPI
CM_Request_Device_EjectW(
5861 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5862 ULONG ulNameLength
, ULONG ulFlags
)
5864 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, debugstr_w(pszVetoName
),
5865 ulNameLength
, ulFlags
);
5866 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
5867 ulNameLength
, ulFlags
, NULL
);
5871 /***********************************************************************
5872 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
5874 CONFIGRET WINAPI
CM_Request_Device_Eject_ExA(
5875 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5876 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5878 LPWSTR lpLocalVetoName
;
5881 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
5882 ulNameLength
, ulFlags
, hMachine
);
5884 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5885 return CR_INVALID_POINTER
;
5887 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
5888 if (lpLocalVetoName
== NULL
)
5889 return CR_OUT_OF_MEMORY
;
5891 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
5892 ulNameLength
, ulFlags
, hMachine
);
5893 if (ret
== CR_REMOVE_VETOED
)
5895 if (WideCharToMultiByte(CP_ACP
,
5906 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
5912 /***********************************************************************
5913 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
5915 CONFIGRET WINAPI
CM_Request_Device_Eject_ExW(
5916 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5917 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5919 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5920 HSTRING_TABLE StringTable
= NULL
;
5924 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
,
5925 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
5928 return CR_INVALID_DEVNODE
;
5931 return CR_INVALID_FLAG
;
5933 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5934 return CR_INVALID_POINTER
;
5936 if (hMachine
!= NULL
)
5938 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5939 if (BindingHandle
== NULL
)
5942 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5943 if (StringTable
== 0)
5948 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5952 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5953 if (lpDevInst
== NULL
)
5954 return CR_INVALID_DEVNODE
;
5958 ret
= PNP_RequestDeviceEject(BindingHandle
,
5965 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5967 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5975 /***********************************************************************
5976 * CM_Request_Eject_PC [SETUPAPI.@]
5978 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
5981 return CM_Request_Eject_PC_Ex(NULL
);
5985 /***********************************************************************
5986 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
5988 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
5991 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5994 TRACE("%lx\n", hMachine
);
5996 if (hMachine
!= NULL
)
5998 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5999 if (BindingHandle
== NULL
)
6004 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6010 ret
= PNP_RequestEjectPC(BindingHandle
);
6012 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6014 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6022 /***********************************************************************
6023 * CM_Run_Detection [SETUPAPI.@]
6025 CONFIGRET WINAPI
CM_Run_Detection(
6028 TRACE("%lx\n", ulFlags
);
6029 return CM_Run_Detection_Ex(ulFlags
, NULL
);
6033 /***********************************************************************
6034 * CM_Run_Detection_Ex [SETUPAPI.@]
6036 CONFIGRET WINAPI
CM_Run_Detection_Ex(
6037 ULONG ulFlags
, HMACHINE hMachine
)
6039 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6042 TRACE("%lx %lx\n", ulFlags
, hMachine
);
6044 if (!pSetupIsUserAdmin())
6045 return CR_ACCESS_DENIED
;
6047 if (ulFlags
& ~CM_DETECT_BITS
)
6048 return CR_INVALID_FLAG
;
6050 if (hMachine
!= NULL
)
6052 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6053 if (BindingHandle
== NULL
)
6058 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6064 ret
= PNP_RunDetection(BindingHandle
,
6067 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6069 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6077 /***********************************************************************
6078 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
6080 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyA(
6081 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6082 ULONG ulFlags
, HMACHINE hMachine
)
6084 FIXME("%p %lx %p %lu %lx %p\n",
6085 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6086 return CR_CALL_NOT_IMPLEMENTED
;
6090 /***********************************************************************
6091 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
6093 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyW(
6094 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6095 ULONG ulFlags
, HMACHINE hMachine
)
6097 FIXME("%p %lx %p %lu %lx %p\n",
6098 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6099 return CR_CALL_NOT_IMPLEMENTED
;
6103 /***********************************************************************
6104 * CM_Set_DevNode_Problem [SETUPAPI.@]
6106 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
6107 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
6109 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
6110 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
6114 /***********************************************************************
6115 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
6117 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
6118 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
6120 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6121 HSTRING_TABLE StringTable
= NULL
;
6125 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
6128 return CR_INVALID_DEVNODE
;
6130 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
6131 return CR_INVALID_FLAG
;
6133 if (hMachine
!= NULL
)
6135 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6136 if (BindingHandle
== NULL
)
6139 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6140 if (StringTable
== 0)
6145 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6149 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6150 if (lpDevInst
== NULL
)
6151 return CR_INVALID_DEVNODE
;
6155 ret
= PNP_SetDeviceProblem(BindingHandle
,
6160 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6162 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6170 /***********************************************************************
6171 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
6173 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
6174 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6177 TRACE("%lx %lu %p %lx %lx\n",
6178 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
6179 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
6185 /***********************************************************************
6186 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
6188 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
6189 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6192 TRACE("%lx %lu %p %lx %lx\n",
6193 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
6194 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
6200 /***********************************************************************
6201 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
6203 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
6204 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6205 ULONG ulFlags
, HMACHINE hMachine
)
6207 CONFIGRET ret
= CR_SUCCESS
;
6211 FIXME("%lx %lu %p %lx %lx %lx\n",
6212 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6214 if (Buffer
== NULL
&& ulLength
!= 0)
6215 return CR_INVALID_POINTER
;
6217 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
6218 return CR_INVALID_PROPERTY
;
6222 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
6231 /* Get property type */
6232 ulType
= GetRegistryPropertyType(ulProperty
);
6234 /* Allocate buffer if needed */
6235 if (ulType
== REG_SZ
||
6236 ulType
== REG_MULTI_SZ
)
6238 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
6239 if (lpBuffer
== NULL
)
6241 ret
= CR_OUT_OF_MEMORY
;
6245 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
6246 ulLength
, lpBuffer
, ulLength
))
6253 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
6256 ulLength
* sizeof(WCHAR
),
6265 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
6273 ret
= CR_CALL_NOT_IMPLEMENTED
;
6280 /***********************************************************************
6281 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
6283 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
6284 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6285 ULONG ulFlags
, HMACHINE hMachine
)
6287 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6288 HSTRING_TABLE StringTable
= NULL
;
6293 TRACE("%lx %lu %p %lx %lx %lx\n",
6294 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6297 return CR_INVALID_DEVNODE
;
6299 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
6300 return CR_INVALID_PROPERTY
;
6302 if (Buffer
!= NULL
&& ulLength
== 0)
6303 return CR_INVALID_POINTER
;
6306 return CR_INVALID_FLAG
;
6308 if (hMachine
!= NULL
)
6310 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6311 if (BindingHandle
== NULL
)
6314 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6315 if (StringTable
== 0)
6320 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6324 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6325 if (lpDevInst
== NULL
)
6326 return CR_INVALID_DEVNODE
;
6328 /* Get property type */
6329 ulType
= GetRegistryPropertyType(ulProperty
);
6333 ret
= PNP_SetDeviceRegProp(BindingHandle
,
6341 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6343 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6351 /***********************************************************************
6352 * CM_Set_HW_Prof [SETUPAPI.@]
6354 CONFIGRET WINAPI
CM_Set_HW_Prof(
6355 ULONG ulHardwareProfile
, ULONG ulFlags
)
6357 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
6358 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
6362 /***********************************************************************
6363 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
6365 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
6366 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
6368 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6371 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
6373 if (!pSetupIsUserAdmin())
6374 return CR_ACCESS_DENIED
;
6377 return CR_INVALID_FLAG
;
6379 if (hMachine
!= NULL
)
6381 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6382 if (BindingHandle
== NULL
)
6387 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6393 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
6395 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6397 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6405 /***********************************************************************
6406 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
6408 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
6409 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6412 TRACE("%s %lu %lu %lx\n", szDevInstName
,
6413 ulConfig
, ulValue
, ulFlags
);
6414 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
6419 /***********************************************************************
6420 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
6422 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
6423 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6426 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
6427 ulConfig
, ulValue
, ulFlags
);
6428 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
6433 /***********************************************************************
6434 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
6436 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
6437 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6438 ULONG ulFlags
, HMACHINE hMachine
)
6440 DEVINSTID_W pszDevIdW
= NULL
;
6441 CONFIGRET ret
= CR_SUCCESS
;
6443 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
6444 ulConfig
, ulValue
, ulFlags
, hMachine
);
6446 if (szDevInstName
!= NULL
)
6448 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
6449 return CR_INVALID_DEVICE_ID
;
6452 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
6455 if (pszDevIdW
!= NULL
)
6462 /***********************************************************************
6463 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
6465 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
6466 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6467 ULONG ulFlags
, HMACHINE hMachine
)
6469 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6472 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
6473 ulConfig
, ulValue
, ulFlags
, hMachine
);
6475 if (szDevInstName
== NULL
)
6476 return CR_INVALID_POINTER
;
6478 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
6479 return CR_INVALID_FLAG
;
6481 /* FIXME: Check whether szDevInstName is valid */
6483 if (hMachine
!= NULL
)
6485 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6486 if (BindingHandle
== NULL
)
6491 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6497 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
6498 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
6500 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6502 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6510 /***********************************************************************
6511 * CM_Setup_DevNode [SETUPAPI.@]
6513 CONFIGRET WINAPI
CM_Setup_DevNode(
6514 DEVINST dnDevInst
, ULONG ulFlags
)
6516 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
6517 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
6521 /***********************************************************************
6522 * CM_Setup_DevNode_Ex [SETUPAPI.@]
6524 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
6525 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
6527 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6528 HSTRING_TABLE StringTable
= NULL
;
6532 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
6534 if (!pSetupIsUserAdmin())
6535 return CR_ACCESS_DENIED
;
6538 return CR_INVALID_DEVNODE
;
6540 if (ulFlags
& ~CM_SETUP_BITS
)
6541 return CR_INVALID_FLAG
;
6543 if (hMachine
!= NULL
)
6545 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6546 if (BindingHandle
== NULL
)
6549 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6550 if (StringTable
== 0)
6555 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6559 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6560 if (lpDevInst
== NULL
)
6561 return CR_INVALID_DEVNODE
;
6565 ret
= PNP_DeviceInstanceAction(BindingHandle
,
6571 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6573 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6581 /***********************************************************************
6582 * CM_Test_Range_Available [SETUPAPI.@]
6586 CM_Test_Range_Available(
6587 _In_ DWORDLONG ullStartValue
,
6588 _In_ DWORDLONG ullEndValue
,
6589 _In_ RANGE_LIST rlh
,
6592 FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
6593 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
6594 return CR_CALL_NOT_IMPLEMENTED
;
6598 /***********************************************************************
6599 * CM_Uninstall_DevNode [SETUPAPI.@]
6601 CONFIGRET WINAPI
CM_Uninstall_DevNode(
6602 DEVINST dnPhantom
, ULONG ulFlags
)
6604 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
6605 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
6609 /***********************************************************************
6610 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
6612 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
6613 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
6615 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6616 HSTRING_TABLE StringTable
= NULL
;
6620 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
6623 return CR_INVALID_DEVNODE
;
6626 return CR_INVALID_FLAG
;
6628 if (hMachine
!= NULL
)
6630 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6631 if (BindingHandle
== NULL
)
6634 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6635 if (StringTable
== 0)
6640 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6644 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
6645 if (lpDevInst
== NULL
)
6646 return CR_INVALID_DEVNODE
;
6650 ret
= PNP_UninstallDevInst(BindingHandle
,
6654 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6656 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6664 /***********************************************************************
6665 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
6667 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceA(
6668 LPCSTR pszDeviceInterface
, ULONG ulFlags
)
6670 TRACE("%s %lx\n", pszDeviceInterface
, ulFlags
);
6672 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
6677 /***********************************************************************
6678 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
6680 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceW(
6681 LPCWSTR pszDeviceInterface
, ULONG ulFlags
)
6683 TRACE("%s %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
);
6685 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
6690 /***********************************************************************
6691 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
6693 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExA(
6694 LPCSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
6696 LPWSTR pszDeviceInterfaceW
= NULL
;
6699 TRACE("%s %lx %lx\n", pszDeviceInterface
, ulFlags
, hMachine
);
6701 if (pszDeviceInterface
== NULL
)
6702 return CR_INVALID_POINTER
;
6704 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
6705 return CR_INVALID_DATA
;
6707 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
6710 if (pszDeviceInterfaceW
!= NULL
)
6711 MyFree(pszDeviceInterfaceW
);
6717 /***********************************************************************
6718 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
6720 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExW(
6721 LPCWSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
6723 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6726 TRACE("%s %lx %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
6728 if (pszDeviceInterface
== NULL
)
6729 return CR_INVALID_POINTER
;
6732 return CR_INVALID_FLAG
;
6734 if (hMachine
!= NULL
)
6736 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6737 if (BindingHandle
== NULL
)
6742 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6748 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
6749 (LPWSTR
)pszDeviceInterface
,
6752 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6754 ret
= RpcStatusToCmStatus(RpcExceptionCode());