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
96 if (UuidToStringW(Guid
, &lpString
) != RPC_S_OK
)
99 lstrcpyW(&String
[1], lpString
);
102 String
[MAX_GUID_STRING_LEN
- 2] = '}';
103 String
[MAX_GUID_STRING_LEN
- 1] = UNICODE_NULL
;
105 RpcStringFreeW(&lpString
);
114 _In_ RPC_STATUS Status
)
122 GetRegistryPropertyType(
123 _In_ ULONG ulProperty
)
127 case CM_DRP_DEVICEDESC
:
130 case CM_DRP_CLASSGUID
:
133 case CM_DRP_FRIENDLYNAME
:
134 case CM_DRP_LOCATION_INFORMATION
:
135 case CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME
:
136 case CM_DRP_ENUMERATOR_NAME
:
137 case CM_DRP_SECURITY_SDS
:
138 case CM_DRP_UI_NUMBER_DESC_FORMAT
:
141 case CM_DRP_HARDWAREID
:
142 case CM_DRP_COMPATIBLEIDS
:
143 case CM_DRP_UPPERFILTERS
:
144 case CM_DRP_LOWERFILTERS
:
147 case CM_DRP_CONFIGFLAGS
:
148 case CM_DRP_CAPABILITIES
:
149 case CM_DRP_UI_NUMBER
:
150 case CM_DRP_LEGACYBUSTYPE
:
151 case CM_DRP_BUSNUMBER
:
153 case CM_DRP_EXCLUSIVE
:
154 case CM_DRP_CHARACTERISTICS
:
156 case CM_DRP_REMOVAL_POLICY
:
157 case CM_DRP_REMOVAL_POLICY_HW_DEFAULT
:
158 case CM_DRP_REMOVAL_POLICY_OVERRIDE
:
159 case CM_DRP_INSTALL_STATE
:
162 case CM_DRP_BUSTYPEGUID
:
163 case CM_DRP_SECURITY
:
164 case CM_DRP_DEVICE_POWER_DATA
:
175 SplitDeviceInstanceId(
176 _In_ PWSTR pszDeviceInstanceId
,
177 _Out_ PWSTR pszDeviceId
,
178 _Out_ PWSTR pszInstanceId
)
182 wcscpy(pszDeviceId
, pszDeviceInstanceId
);
184 ptr
= wcschr(pszDeviceId
, L
'\\');
190 wcscpy(pszInstanceId
, ptr
);
194 *pszInstanceId
= UNICODE_NULL
;
201 GetDeviceInstanceKeyPath(
202 _In_ RPC_BINDING_HANDLE BindingHandle
,
203 _In_ PWSTR pszDeviceInst
,
204 _Out_ PWSTR pszKeyPath
,
205 _Out_ PWSTR pszInstancePath
,
206 _In_ ULONG ulHardwareProfile
,
209 PWSTR pszBuffer
= NULL
;
211 ULONG ulTransferLength
, ulLength
;
212 CONFIGRET ret
= CR_SUCCESS
;
214 TRACE("GetDeviceInstanceKeyPath()\n");
216 if (ulFlags
& CM_REGISTRY_SOFTWARE
)
218 /* Software Key Path */
220 if (ulFlags
& CM_REGISTRY_CONFIG
)
222 SplitDeviceInstanceId(pszDeviceInst
,
226 if (ulHardwareProfile
== 0)
228 wsprintfW(pszKeyPath
,
230 L
"System\\CurrentControlSet\\Hardware Profiles",
232 L
"System\\CurrentControlSet\\Control\\Enum",
237 wsprintfW(pszKeyPath
,
238 L
"%s\\%04lu\\%s\\%s",
239 L
"System\\CurrentControlSet\\Hardware Profiles",
241 L
"System\\CurrentControlSet\\Control\\Enum",
247 ret
= CR_CALL_NOT_IMPLEMENTED
;
252 /* Hardware Key Path */
254 ulTransferLength
= 300 * sizeof(WCHAR
);
255 ulLength
= 300 * sizeof(WCHAR
);
257 pszBuffer
= MyMalloc(ulTransferLength
);
258 if (pszBuffer
== NULL
)
260 ERR("MyMalloc() failed\n");
261 ret
= CR_OUT_OF_MEMORY
;
265 ret
= PNP_GetDeviceRegProp(BindingHandle
,
273 if (ret
!= CR_SUCCESS
)
275 ERR("PNP_GetDeviceRegProp() failed (Error %lu)\n", ret
);
279 TRACE("szBuffer: %S\n", pszBuffer
);
281 SplitDeviceInstanceId(pszBuffer
,
285 TRACE("szBuffer: %S\n", pszBuffer
);
287 if (ulFlags
& CM_REGISTRY_CONFIG
)
289 if (ulHardwareProfile
== 0)
291 wsprintfW(pszKeyPath
,
293 L
"System\\CurrentControlSet\\Hardware Profiles",
295 L
"System\\CurrentControlSet\\Control\\Class",
300 wsprintfW(pszKeyPath
,
301 L
"%s\\%04lu\\%s\\%s",
302 L
"System\\CurrentControlSet\\Hardware Profiles",
304 L
"System\\CurrentControlSet\\Control\\Class",
310 wsprintfW(pszKeyPath
,
312 L
"System\\CurrentControlSet\\Control\\Class",
318 if (pszBuffer
!= NULL
)
325 /***********************************************************************
326 * CMP_GetBlockedDriverInfo [SETUPAPI.@]
330 CMP_GetBlockedDriverInfo(
331 _Out_opt_ LPWSTR pszNames
,
332 _Inout_ PULONG pulLength
,
334 _In_opt_ HMACHINE hMachine
)
336 RPC_BINDING_HANDLE BindingHandle
= NULL
;
337 ULONG ulTransferLength
;
340 TRACE("CMP_GetBlockedDriverInfo(%p %p %lx %p)\n",
341 pszNames
, pulLength
, ulFlags
, hMachine
);
343 if (hMachine
!= NULL
)
345 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
346 if (BindingHandle
== NULL
)
351 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
355 ulTransferLength
= *pulLength
;
359 ret
= PNP_GetBlockedDriverInfo(BindingHandle
,
365 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
367 ret
= RpcStatusToCmStatus(RpcExceptionCode());
375 /***********************************************************************
376 * CMP_GetServerSideDeviceInstallFlags [SETUPAPI.@]
380 CMP_GetServerSideDeviceInstallFlags(
381 _Out_ PULONG pulSSDIFlags
,
383 _In_opt_ HMACHINE hMachine
)
385 RPC_BINDING_HANDLE BindingHandle
= NULL
;
388 TRACE("CMP_GetServerSideDeviceInstallFlags(%p %lx %p)\n",
389 pulSSDIFlags
, ulFlags
, hMachine
);
391 if (pulSSDIFlags
== NULL
)
392 return CR_INVALID_POINTER
;
395 return CR_INVALID_FLAG
;
397 if (hMachine
!= NULL
)
399 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
400 if (BindingHandle
== NULL
)
405 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
411 ret
= PNP_GetServerSideDeviceInstallFlags(BindingHandle
,
415 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
417 ret
= RpcStatusToCmStatus(RpcExceptionCode());
425 /***********************************************************************
426 * CMP_Init_Detection [SETUPAPI.@]
433 RPC_BINDING_HANDLE BindingHandle
= NULL
;
436 TRACE("CMP_Init_Detection(%lu)\n", ulMagic
);
438 if (ulMagic
!= CMP_MAGIC
)
439 return CR_INVALID_DATA
;
441 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
446 ret
= PNP_InitDetection(BindingHandle
);
448 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
450 ret
= RpcStatusToCmStatus(RpcExceptionCode());
458 /***********************************************************************
459 * CMP_RegisterNotification [SETUPAPI.@]
463 CMP_RegisterNotification(
464 _In_ HANDLE hRecipient
,
465 _In_ LPVOID lpvNotificationFilter
,
467 _Out_ PHDEVNOTIFY phDevNotify
)
469 RPC_BINDING_HANDLE BindingHandle
= NULL
;
470 PNOTIFY_DATA pNotifyData
= NULL
;
471 CONFIGRET ret
= CR_SUCCESS
;
473 TRACE("CMP_RegisterNotification(%p %p %lu %p)\n",
474 hRecipient
, lpvNotificationFilter
, ulFlags
, phDevNotify
);
476 if ((hRecipient
== NULL
) ||
477 (lpvNotificationFilter
== NULL
) ||
478 (phDevNotify
== NULL
))
479 return CR_INVALID_POINTER
;
482 return CR_INVALID_FLAG
;
484 if (((PDEV_BROADCAST_HDR
)lpvNotificationFilter
)->dbch_size
< sizeof(DEV_BROADCAST_HDR
))
485 return CR_INVALID_DATA
;
487 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
490 pNotifyData
= HeapAlloc(GetProcessHeap(),
492 sizeof(NOTIFY_DATA
));
493 if (pNotifyData
== NULL
)
494 return CR_OUT_OF_MEMORY
;
496 pNotifyData
->ulMagic
= NOTIFY_MAGIC
;
499 if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_WINDOW_HANDLE)
503 else if (dwFlags & DEVICE_NOTIFY_SERVICE_HANDLE == DEVICE_NOTYFY_SERVICE_HANDLE)
511 ret
= PNP_RegisterNotification(BindingHandle
,
513 &pNotifyData
->ulNotifyData
);
515 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
517 ret
= RpcStatusToCmStatus(RpcExceptionCode());
521 if (ret
== CR_SUCCESS
)
523 *phDevNotify
= (HDEVNOTIFY
)pNotifyData
;
527 if (pNotifyData
!= NULL
)
528 HeapFree(GetProcessHeap(), 0, pNotifyData
);
530 *phDevNotify
= (HDEVNOTIFY
)NULL
;
537 /***********************************************************************
538 * CMP_Report_LogOn [SETUPAPI.@]
544 _In_ DWORD dwProcessId
)
546 RPC_BINDING_HANDLE BindingHandle
= NULL
;
547 CONFIGRET ret
= CR_SUCCESS
;
551 TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic
, dwProcessId
);
553 if (dwMagic
!= CMP_MAGIC
)
554 return CR_INVALID_DATA
;
556 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
559 bAdmin
= pSetupIsUserAdmin();
561 for (i
= 0; i
< 30; i
++)
565 ret
= PNP_ReportLogOn(BindingHandle
,
569 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
571 ret
= RpcStatusToCmStatus(RpcExceptionCode());
575 if (ret
== CR_SUCCESS
)
585 /***********************************************************************
586 * CMP_UnregisterNotification [SETUPAPI.@]
590 CMP_UnregisterNotification(
591 _In_ HDEVNOTIFY hDevNotify
)
593 RPC_BINDING_HANDLE BindingHandle
= NULL
;
594 PNOTIFY_DATA pNotifyData
;
595 CONFIGRET ret
= CR_SUCCESS
;
597 TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify
);
599 pNotifyData
= (PNOTIFY_DATA
)hDevNotify
;
601 if ((pNotifyData
== NULL
) ||
602 (pNotifyData
->ulMagic
!= NOTIFY_MAGIC
))
603 return CR_INVALID_POINTER
;
605 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
610 ret
= PNP_UnregisterNotification(BindingHandle
,
611 pNotifyData
->ulNotifyData
);
613 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
615 ret
= RpcStatusToCmStatus(RpcExceptionCode());
619 if (ret
== CR_SUCCESS
)
620 HeapFree(GetProcessHeap(), 0, pNotifyData
);
626 /***********************************************************************
627 * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
631 CMP_WaitNoPendingInstallEvents(
632 _In_ DWORD dwTimeout
)
637 TRACE("CMP_WaitNoPendingInstallEvents(%lu)\n", dwTimeout
);
639 hEvent
= OpenEventW(SYNCHRONIZE
, FALSE
, L
"Global\\PnP_No_Pending_Install_Events");
643 ret
= WaitForSingleObject(hEvent
, dwTimeout
);
649 /***********************************************************************
650 * CMP_WaitServicesAvailable [SETUPAPI.@]
654 CMP_WaitServicesAvailable(
655 _In_opt_ HMACHINE hMachine
)
657 RPC_BINDING_HANDLE BindingHandle
= NULL
;
658 CONFIGRET ret
= CR_SUCCESS
;
661 TRACE("CMP_WaitServicesAvailable(%p)\n", hMachine
);
663 if (hMachine
!= NULL
)
665 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
666 if (BindingHandle
== NULL
)
671 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
677 ret
= PNP_GetVersion(BindingHandle
, &Version
);
679 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
681 ret
= RpcStatusToCmStatus(RpcExceptionCode());
689 /***********************************************************************
690 * CM_Add_Empty_Log_Conf [SETUPAPI.@]
694 CM_Add_Empty_Log_Conf(
695 _Out_ PLOG_CONF plcLogConf
,
696 _In_ DEVINST dnDevInst
,
697 _In_ PRIORITY Priority
,
700 TRACE("CM_Add_Empty_Log_Conf(%p %p %lu %lx)\n",
701 plcLogConf
, dnDevInst
, Priority
, ulFlags
);
702 return CM_Add_Empty_Log_Conf_Ex(plcLogConf
, dnDevInst
, Priority
,
707 /***********************************************************************
708 * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
711 WINAPI
CM_Add_Empty_Log_Conf_Ex(
712 _Out_ PLOG_CONF plcLogConf
,
713 _In_ DEVINST dnDevInst
,
714 _In_ PRIORITY Priority
,
716 _In_opt_ HMACHINE hMachine
)
718 RPC_BINDING_HANDLE BindingHandle
= NULL
;
719 HSTRING_TABLE StringTable
= NULL
;
720 ULONG ulLogConfTag
= 0;
722 PLOG_CONF_INFO pLogConfInfo
;
723 CONFIGRET ret
= CR_SUCCESS
;
725 FIXME("CM_Add_Empty_Log_Conf_Ex(%p %p %lu %lx %p)\n",
726 plcLogConf
, dnDevInst
, Priority
, ulFlags
, hMachine
);
728 if (!pSetupIsUserAdmin())
729 return CR_ACCESS_DENIED
;
731 if (plcLogConf
== NULL
)
732 return CR_INVALID_POINTER
;
735 return CR_INVALID_DEVINST
;
737 if (Priority
> 0xFFFF)
738 return CR_INVALID_PRIORITY
;
740 if (ulFlags
& ~(LOG_CONF_BITS
| PRIORITY_BIT
))
741 return CR_INVALID_FLAG
;
743 if (hMachine
!= NULL
)
745 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
746 if (BindingHandle
== NULL
)
749 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
750 if (StringTable
== 0)
755 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
759 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
760 if (lpDevInst
== NULL
)
761 return CR_INVALID_DEVNODE
;
765 ret
= PNP_AddEmptyLogConf(BindingHandle
, lpDevInst
, Priority
,
766 &ulLogConfTag
, ulFlags
);
768 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
770 ret
= RpcStatusToCmStatus(RpcExceptionCode());
774 if (ret
== CR_SUCCESS
)
776 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
777 if (pLogConfInfo
== NULL
)
779 ret
= CR_OUT_OF_MEMORY
;
783 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
784 pLogConfInfo
->dnDevInst
= dnDevInst
;
785 pLogConfInfo
->ulFlags
= ulFlags
;
786 pLogConfInfo
->ulTag
= ulLogConfTag
;
788 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
798 /***********************************************************************
799 * CM_Add_IDA [SETUPAPI.@]
804 _In_ DEVINST dnDevInst
,
808 TRACE("CM_Add_IDA(%p %s %lx)\n",
809 dnDevInst
, pszID
, ulFlags
);
810 return CM_Add_ID_ExA(dnDevInst
, pszID
, ulFlags
, NULL
);
814 /***********************************************************************
815 * CM_Add_IDW [SETUPAPI.@]
820 _In_ DEVINST dnDevInst
,
824 TRACE("CM_Add_IDW(%p %s %lx)\n",
825 dnDevInst
, debugstr_w(pszID
), ulFlags
);
826 return CM_Add_ID_ExW(dnDevInst
, pszID
, ulFlags
, NULL
);
830 /***********************************************************************
831 * CM_Add_ID_ExA [SETUPAPI.@]
836 _In_ DEVINST dnDevInst
,
839 _In_opt_ HMACHINE hMachine
)
844 TRACE("CM_Add_ID_ExA(%p %s %lx %p)\n",
845 dnDevInst
, pszID
, ulFlags
, hMachine
);
847 if (pSetupCaptureAndConvertAnsiArg(pszID
, &pszIDW
))
848 return CR_INVALID_DATA
;
850 ret
= CM_Add_ID_ExW(dnDevInst
, pszIDW
, ulFlags
, hMachine
);
858 /***********************************************************************
859 * CM_Add_ID_ExW [SETUPAPI.@]
864 _In_ DEVINST dnDevInst
,
867 _In_opt_ HMACHINE hMachine
)
869 RPC_BINDING_HANDLE BindingHandle
= NULL
;
870 HSTRING_TABLE StringTable
= NULL
;
874 TRACE("CM_Add_ID_ExW(%p %s %lx %p)\n",
875 dnDevInst
, debugstr_w(pszID
), ulFlags
, hMachine
);
877 if (!pSetupIsUserAdmin())
878 return CR_ACCESS_DENIED
;
881 return CR_INVALID_DEVINST
;
884 return CR_INVALID_POINTER
;
886 if (ulFlags
& ~CM_ADD_ID_BITS
)
887 return CR_INVALID_FLAG
;
889 if (hMachine
!= NULL
)
891 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
892 if (BindingHandle
== NULL
)
895 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
896 if (StringTable
== 0)
901 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
905 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
906 if (lpDevInst
== NULL
)
907 return CR_INVALID_DEVNODE
;
911 ret
= PNP_AddID(BindingHandle
,
916 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
918 ret
= RpcStatusToCmStatus(RpcExceptionCode());
926 /***********************************************************************
927 * CM_Add_Range [SETUPAPI.@]
932 _In_ DWORDLONG ullStartValue
,
933 _In_ DWORDLONG ullEndValue
,
937 FIXME("CM_Add_Range(%I64u %I64u %p %lx)\n",
938 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
939 return CR_CALL_NOT_IMPLEMENTED
;
943 /***********************************************************************
944 * CM_Add_Res_Des [SETUPAPI.@]
949 _Out_opt_ PRES_DES prdResDes
,
950 _In_ LOG_CONF lcLogConf
,
951 _In_ RESOURCEID ResourceID
,
952 _In_ PCVOID ResourceData
,
953 _In_ ULONG ResourceLen
,
956 TRACE("CM_Add_Res_Des(%p %p %lu %p %lu %lx)\n",
957 prdResDes
, lcLogConf
, ResourceID
, ResourceData
, ResourceLen
, ulFlags
);
958 return CM_Add_Res_Des_Ex(prdResDes
, lcLogConf
, ResourceID
, ResourceData
,
959 ResourceLen
, ulFlags
, NULL
);
963 /***********************************************************************
964 * CM_Add_Res_Des_Ex [SETUPAPI.@]
969 _Out_opt_ PRES_DES prdResDes
,
970 _In_ LOG_CONF lcLogConf
,
971 _In_ RESOURCEID ResourceID
,
972 _In_ PCVOID ResourceData
,
973 _In_ ULONG ResourceLen
,
975 _In_opt_ HMACHINE hMachine
)
977 FIXME("CM_Add_Res_Des_Ex(%p %p %lu %p %lu %lx %p)\n",
978 prdResDes
, lcLogConf
, ResourceID
,
979 ResourceData
, ResourceLen
, ulFlags
, hMachine
);
981 return CR_CALL_NOT_IMPLEMENTED
;
985 /***********************************************************************
986 * CM_Connect_MachineA [SETUPAPI.@]
991 _In_opt_ PCSTR UNCServerName
,
992 _Out_ PHMACHINE phMachine
)
997 TRACE("CM_Connect_MachineA(%s %p)\n",
998 UNCServerName
, phMachine
);
1000 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1001 return CM_Connect_MachineW(NULL
, phMachine
);
1003 if (pSetupCaptureAndConvertAnsiArg(UNCServerName
, &pServerNameW
))
1004 return CR_INVALID_DATA
;
1006 ret
= CM_Connect_MachineW(pServerNameW
, phMachine
);
1008 MyFree(pServerNameW
);
1014 /***********************************************************************
1015 * CM_Connect_MachineW [SETUPAPI.@]
1019 CM_Connect_MachineW(
1020 _In_opt_ PCWSTR UNCServerName
,
1021 _Out_ PHMACHINE phMachine
)
1023 PMACHINE_INFO pMachine
;
1025 TRACE("CM_Connect_MachineW(%s %p)\n",
1026 debugstr_w(UNCServerName
), phMachine
);
1028 if (phMachine
== NULL
)
1029 return CR_INVALID_POINTER
;
1033 pMachine
= HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO
));
1034 if (pMachine
== NULL
)
1035 return CR_OUT_OF_MEMORY
;
1037 if (UNCServerName
== NULL
|| *UNCServerName
== 0)
1039 pMachine
->bLocal
= TRUE
;
1041 /* FIXME: store the computers name in pMachine->szMachineName */
1043 if (!PnpGetLocalHandles(&pMachine
->BindingHandle
,
1044 &pMachine
->StringTable
))
1046 HeapFree(GetProcessHeap(), 0, pMachine
);
1052 pMachine
->bLocal
= FALSE
;
1053 if (wcslen(UNCServerName
) >= SP_MAX_MACHINENAME_LENGTH
- 1)
1055 HeapFree(GetProcessHeap(), 0, pMachine
);
1056 return CR_INVALID_MACHINENAME
;
1058 lstrcpyW(pMachine
->szMachineName
, UNCServerName
);
1060 pMachine
->StringTable
= pSetupStringTableInitialize();
1061 if (pMachine
->StringTable
== NULL
)
1063 HeapFree(GetProcessHeap(), 0, pMachine
);
1067 pSetupStringTableAddString(pMachine
->StringTable
, L
"PLT", 1);
1069 if (!PnpBindRpc(UNCServerName
, &pMachine
->BindingHandle
))
1071 pSetupStringTableDestroy(pMachine
->StringTable
);
1072 HeapFree(GetProcessHeap(), 0, pMachine
);
1073 return CR_INVALID_MACHINENAME
;
1077 *phMachine
= (PHMACHINE
)pMachine
;
1083 /***********************************************************************
1084 * CM_Create_DevNodeA [SETUPAPI.@]
1089 _Out_ PDEVINST pdnDevInst
,
1090 _In_ DEVINSTID_A pDeviceID
,
1091 _In_ DEVINST dnParent
,
1094 TRACE("CM_Create_DevNodeA(%p %s %p %lx)\n",
1095 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
);
1096 return CM_Create_DevNode_ExA(pdnDevInst
, pDeviceID
, dnParent
,
1101 /***********************************************************************
1102 * CM_Create_DevNodeW [SETUPAPI.@]
1107 _Out_ PDEVINST pdnDevInst
,
1108 _In_ DEVINSTID_W pDeviceID
,
1109 _In_ DEVINST dnParent
,
1112 TRACE("CM_Create_DevNodeW(%p %s %p %lx)\n",
1113 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
);
1114 return CM_Create_DevNode_ExW(pdnDevInst
, pDeviceID
, dnParent
,
1119 /***********************************************************************
1120 * CM_Create_DevNode_ExA [SETUPAPI.@]
1124 CM_Create_DevNode_ExA(
1125 _Out_ PDEVINST pdnDevInst
,
1126 _In_ DEVINSTID_A pDeviceID
,
1127 _In_ DEVINST dnParent
,
1129 _In_opt_ HANDLE hMachine
)
1131 DEVINSTID_W pDeviceIDW
;
1134 TRACE("CM_Create_DevNode_ExA(%p %s %p %lx %p)\n",
1135 pdnDevInst
, debugstr_a(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1137 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIDW
))
1138 return CR_INVALID_DATA
;
1140 ret
= CM_Create_DevNode_ExW(pdnDevInst
, pDeviceIDW
, dnParent
, ulFlags
,
1149 /***********************************************************************
1150 * CM_Create_DevNode_ExW [SETUPAPI.@]
1154 CM_Create_DevNode_ExW(
1155 _Out_ PDEVINST pdnDevInst
,
1156 _In_ DEVINSTID_W pDeviceID
,
1157 _In_ DEVINST dnParent
,
1159 _In_opt_ HANDLE hMachine
)
1161 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1162 HSTRING_TABLE StringTable
= NULL
;
1163 LPWSTR lpParentDevInst
;
1164 CONFIGRET ret
= CR_SUCCESS
;
1165 WCHAR szLocalDeviceID
[MAX_DEVICE_ID_LEN
];
1167 TRACE("CM_Create_DevNode_ExW(%p %s %p %lx %p)\n",
1168 pdnDevInst
, debugstr_w(pDeviceID
), dnParent
, ulFlags
, hMachine
);
1170 if (!pSetupIsUserAdmin())
1171 return CR_ACCESS_DENIED
;
1173 if (pdnDevInst
== NULL
)
1174 return CR_INVALID_POINTER
;
1176 if (pDeviceID
== NULL
|| wcslen(pDeviceID
) == 0 || wcslen(pDeviceID
) >= MAX_DEVICE_ID_LEN
)
1177 return CR_INVALID_DEVICE_ID
;
1180 return CR_INVALID_DEVNODE
;
1182 if (ulFlags
& ~CM_CREATE_DEVNODE_BITS
)
1183 return CR_INVALID_FLAG
;
1185 if (hMachine
!= NULL
)
1187 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1188 if (BindingHandle
== NULL
)
1191 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1192 if (StringTable
== 0)
1197 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1201 lpParentDevInst
= pSetupStringTableStringFromId(StringTable
, dnParent
);
1202 if (lpParentDevInst
== NULL
)
1203 return CR_INVALID_DEVNODE
;
1205 wcscpy(szLocalDeviceID
, pDeviceID
);
1209 ret
= PNP_CreateDevInst(BindingHandle
,
1215 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1217 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1221 if (ret
== CR_SUCCESS
)
1223 /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
1224 * will return the generated device ID in szLocalDeviceID */
1225 *pdnDevInst
= pSetupStringTableAddString(StringTable
, szLocalDeviceID
, 1);
1226 if (*pdnDevInst
== 0)
1227 ret
= CR_NO_SUCH_DEVNODE
;
1234 /***********************************************************************
1235 * CM_Create_Range_List [SETUPAPI.@]
1239 CM_Create_Range_List(
1240 _Out_ PRANGE_LIST prlh
,
1243 PINTERNAL_RANGE_LIST pRangeList
= NULL
;
1245 FIXME("CM_Create_Range_List(%p %lx)\n", prlh
, ulFlags
);
1248 return CR_INVALID_FLAG
;
1251 return CR_INVALID_POINTER
;
1253 pRangeList
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(INTERNAL_RANGE_LIST
));
1254 if (pRangeList
== NULL
)
1255 return CR_OUT_OF_MEMORY
;
1257 pRangeList
->ulMagic
= RANGE_LIST_MAGIC
;
1259 // TODO: More initialization
1261 *prlh
= (RANGE_LIST
)pRangeList
;
1267 /***********************************************************************
1268 * CM_Delete_Class_Key [SETUPAPI.@]
1272 CM_Delete_Class_Key(
1273 _In_ LPGUID ClassGuid
,
1276 TRACE("CM_Delete_Class_Key(%p %lx)\n",
1277 ClassGuid
, ulFlags
);
1278 return CM_Delete_Class_Key_Ex(ClassGuid
, ulFlags
, NULL
);
1282 /***********************************************************************
1283 * CM_Delete_Class_Key_Ex [SETUPAPI.@]
1287 CM_Delete_Class_Key_Ex(
1288 _In_ LPGUID ClassGuid
,
1290 _In_opt_ HANDLE hMachine
)
1292 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
1293 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1296 TRACE("CM_Delete_Class_Key_Ex(%p %lx %lx)\n",
1297 ClassGuid
, ulFlags
, hMachine
);
1299 if (ClassGuid
== NULL
)
1300 return CR_INVALID_POINTER
;
1302 if (ulFlags
& ~CM_DELETE_CLASS_BITS
)
1303 return CR_INVALID_FLAG
;
1305 if (!GuidToString(ClassGuid
, szGuidString
))
1306 return CR_INVALID_DATA
;
1308 if (hMachine
!= NULL
)
1310 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1311 if (BindingHandle
== NULL
)
1316 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1322 ret
= PNP_DeleteClassKey(BindingHandle
,
1326 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1328 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1336 /***********************************************************************
1337 * CM_Delete_DevNode_Key [SETUPAPI.@]
1341 CM_Delete_DevNode_Key(
1342 _In_ DEVNODE dnDevNode
,
1343 _In_ ULONG ulHardwareProfile
,
1346 TRACE("CM_Delete_DevNode_Key(%p %lu %lx)\n",
1347 dnDevNode
, ulHardwareProfile
, ulFlags
);
1348 return CM_Delete_DevNode_Key_Ex(dnDevNode
, ulHardwareProfile
, ulFlags
,
1353 /***********************************************************************
1354 * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
1358 CM_Delete_DevNode_Key_Ex(
1359 _In_ DEVNODE dnDevNode
,
1360 _In_ ULONG ulHardwareProfile
,
1362 _In_opt_ HANDLE hMachine
)
1364 FIXME("CM_Delete_DevNode_Key_Ex(%p %lu %lx %p)\n",
1365 dnDevNode
, ulHardwareProfile
, ulFlags
, hMachine
);
1367 return CR_CALL_NOT_IMPLEMENTED
;
1371 /***********************************************************************
1372 * CM_Delete_Range [SETUPAPI.@]
1377 _In_ DWORDLONG ullStartValue
,
1378 _In_ DWORDLONG ullEndValue
,
1379 _In_ RANGE_LIST rlh
,
1382 FIXME("CM_Delete_Range(%I64u %I64u %p %lx)\n",
1383 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
1384 return CR_CALL_NOT_IMPLEMENTED
;
1388 /***********************************************************************
1389 * CM_Disable_DevNode [SETUPAPI.@]
1391 CONFIGRET WINAPI
CM_Disable_DevNode(
1392 DEVINST dnDevInst
, ULONG ulFlags
)
1394 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
1395 return CM_Disable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1399 /***********************************************************************
1400 * CM_Disable_DevNode_Ex [SETUPAPI.@]
1402 CONFIGRET WINAPI
CM_Disable_DevNode_Ex(
1403 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1405 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1406 HSTRING_TABLE StringTable
= NULL
;
1410 FIXME("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
1412 if (!pSetupIsUserAdmin())
1413 return CR_ACCESS_DENIED
;
1416 return CR_INVALID_DEVINST
;
1419 return CR_INVALID_FLAG
;
1421 if (hMachine
!= NULL
)
1423 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1424 if (BindingHandle
== NULL
)
1427 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1428 if (StringTable
== 0)
1433 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1437 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1438 if (lpDevInst
== NULL
)
1439 return CR_INVALID_DEVNODE
;
1443 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1444 PNP_DEVINST_DISABLE
,
1449 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1451 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1459 /***********************************************************************
1460 * CM_Disconnect_Machine [SETUPAPI.@]
1462 CONFIGRET WINAPI
CM_Disconnect_Machine(HMACHINE hMachine
)
1464 PMACHINE_INFO pMachine
;
1466 TRACE("%lx\n", hMachine
);
1468 pMachine
= (PMACHINE_INFO
)hMachine
;
1469 if (pMachine
== NULL
)
1472 if (pMachine
->bLocal
== FALSE
)
1474 if (pMachine
->StringTable
!= NULL
)
1475 pSetupStringTableDestroy(pMachine
->StringTable
);
1477 if (!PnpUnbindRpc(pMachine
->BindingHandle
))
1478 return CR_ACCESS_DENIED
;
1481 HeapFree(GetProcessHeap(), 0, pMachine
);
1487 /***********************************************************************
1488 * CM_Dup_Range_List [SETUPAPI.@]
1493 _In_ RANGE_LIST rlhOld
,
1494 _In_ RANGE_LIST rlhNew
,
1497 FIXME("CM_Dup_Range_List(%p %p %lx)\n",
1498 rlhOld
, rlhNew
, ulFlags
);
1499 return CR_CALL_NOT_IMPLEMENTED
;
1503 /***********************************************************************
1504 * CM_Enable_DevNode [SETUPAPI.@]
1506 CONFIGRET WINAPI
CM_Enable_DevNode(
1507 DEVINST dnDevInst
, ULONG ulFlags
)
1509 TRACE("%p %lx\n", dnDevInst
, ulFlags
);
1510 return CM_Enable_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
1514 /***********************************************************************
1515 * CM_Enable_DevNode_Ex [SETUPAPI.@]
1517 CONFIGRET WINAPI
CM_Enable_DevNode_Ex(
1518 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1520 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1521 HSTRING_TABLE StringTable
= NULL
;
1525 TRACE("%p %lx %p\n", dnDevInst
, ulFlags
, hMachine
);
1527 if (!pSetupIsUserAdmin())
1528 return CR_ACCESS_DENIED
;
1531 return CR_INVALID_DEVINST
;
1534 return CR_INVALID_FLAG
;
1536 if (hMachine
!= NULL
)
1538 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1539 if (BindingHandle
== NULL
)
1542 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1543 if (StringTable
== 0)
1548 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1552 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
1553 if (lpDevInst
== NULL
)
1554 return CR_INVALID_DEVNODE
;
1558 ret
= PNP_DeviceInstanceAction(BindingHandle
,
1564 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1566 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1574 /***********************************************************************
1575 * CM_Enumerate_Classes [SETUPAPI.@]
1577 CONFIGRET WINAPI
CM_Enumerate_Classes(
1578 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
)
1580 TRACE("%lx %p %lx\n", ulClassIndex
, ClassGuid
, ulFlags
);
1581 return CM_Enumerate_Classes_Ex(ulClassIndex
, ClassGuid
, ulFlags
, NULL
);
1585 /***********************************************************************
1586 * CM_Enumerate_Classes_Ex [SETUPAPI.@]
1588 CONFIGRET WINAPI
CM_Enumerate_Classes_Ex(
1589 ULONG ulClassIndex
, LPGUID ClassGuid
, ULONG ulFlags
, HMACHINE hMachine
)
1591 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
1592 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1593 CONFIGRET ret
= CR_SUCCESS
;
1594 ULONG ulLength
= MAX_GUID_STRING_LEN
;
1596 TRACE("%lx %p %lx %p\n", ulClassIndex
, ClassGuid
, ulFlags
, hMachine
);
1598 if (ClassGuid
== NULL
)
1599 return CR_INVALID_POINTER
;
1602 return CR_INVALID_FLAG
;
1604 if (hMachine
!= NULL
)
1606 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1607 if (BindingHandle
== NULL
)
1612 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1618 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1622 MAX_GUID_STRING_LEN
,
1626 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1628 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1632 if (ret
== CR_SUCCESS
)
1635 szBuffer
[MAX_GUID_STRING_LEN
- 2] = UNICODE_NULL
;
1637 /* Convert the buffer to a GUID */
1638 if (UuidFromStringW(&szBuffer
[1], ClassGuid
) != RPC_S_OK
)
1646 /***********************************************************************
1647 * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
1649 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsA(
1650 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1652 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1653 return CM_Enumerate_Enumerators_ExA(ulEnumIndex
, Buffer
, pulLength
,
1658 /***********************************************************************
1659 * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
1661 CONFIGRET WINAPI
CM_Enumerate_EnumeratorsW(
1662 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
1664 TRACE("%lu %p %p %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
);
1665 return CM_Enumerate_Enumerators_ExW(ulEnumIndex
, Buffer
, pulLength
,
1670 /***********************************************************************
1671 * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
1673 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExA(
1674 ULONG ulEnumIndex
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1677 WCHAR szBuffer
[MAX_DEVICE_ID_LEN
];
1680 CONFIGRET ret
= CR_SUCCESS
;
1682 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1685 if (Buffer
== NULL
|| pulLength
== NULL
)
1686 return CR_INVALID_POINTER
;
1689 return CR_INVALID_FLAG
;
1691 ulOrigLength
= *pulLength
;
1694 ulLength
= MAX_DEVICE_ID_LEN
;
1695 ret
= CM_Enumerate_Enumerators_ExW(ulEnumIndex
, szBuffer
, &ulLength
,
1697 if (ret
== CR_SUCCESS
)
1699 if (WideCharToMultiByte(CP_ACP
,
1709 *pulLength
= lstrlenA(Buffer
) + 1;
1716 /***********************************************************************
1717 * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
1719 CONFIGRET WINAPI
CM_Enumerate_Enumerators_ExW(
1720 ULONG ulEnumIndex
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
1723 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1726 TRACE("%lu %p %p %lx %lx\n", ulEnumIndex
, Buffer
, pulLength
, ulFlags
,
1729 if (Buffer
== NULL
|| pulLength
== NULL
)
1730 return CR_INVALID_POINTER
;
1733 return CR_INVALID_FLAG
;
1735 *Buffer
= UNICODE_NULL
;
1737 if (hMachine
!= NULL
)
1739 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1740 if (BindingHandle
== NULL
)
1745 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
1751 ret
= PNP_EnumerateSubKeys(BindingHandle
,
1752 PNP_ENUMERATOR_SUBKEYS
,
1759 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1761 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1769 /***********************************************************************
1770 * CM_Find_Range [SETUPAPI.@]
1775 _Out_ PDWORDLONG pullStart
,
1776 _In_ DWORDLONG ullStart
,
1777 _In_ ULONG ulLength
,
1778 _In_ DWORDLONG ullAlignment
,
1779 _In_ DWORDLONG ullEnd
,
1780 _In_ RANGE_LIST rlh
,
1783 FIXME("CM_Find_Range(%p %I64u %lu %I64u %I64u %p %lx)\n",
1784 pullStart
, ullStart
, ulLength
, ullAlignment
, ullEnd
, rlh
, ulFlags
);
1785 return CR_CALL_NOT_IMPLEMENTED
;
1789 /***********************************************************************
1790 * CM_First_Range [SETUPAPI.@]
1795 _In_ RANGE_LIST rlh
,
1796 _Out_ PDWORDLONG pullStart
,
1797 _Out_ PDWORDLONG pullEnd
,
1798 _Out_ PRANGE_ELEMENT preElement
,
1801 FIXME("CM_First_Range(%p %p %p %p %lx)\n",
1802 rlh
, pullStart
, pullEnd
, preElement
, ulFlags
);
1803 return CR_CALL_NOT_IMPLEMENTED
;
1807 /***********************************************************************
1808 * CM_Free_Log_Conf [SETUPAPI.@]
1810 CONFIGRET WINAPI
CM_Free_Log_Conf(
1811 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
)
1813 TRACE("%lx %lx\n", lcLogConfToBeFreed
, ulFlags
);
1814 return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed
, ulFlags
, NULL
);
1818 /***********************************************************************
1819 * CM_Free_Log_Conf_Ex [SETUPAPI.@]
1821 CONFIGRET WINAPI
CM_Free_Log_Conf_Ex(
1822 LOG_CONF lcLogConfToBeFreed
, ULONG ulFlags
, HMACHINE hMachine
)
1824 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1825 HSTRING_TABLE StringTable
= NULL
;
1827 PLOG_CONF_INFO pLogConfInfo
;
1830 TRACE("%lx %lx %lx\n", lcLogConfToBeFreed
, ulFlags
, hMachine
);
1832 if (!pSetupIsUserAdmin())
1833 return CR_ACCESS_DENIED
;
1835 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConfToBeFreed
;
1836 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1837 return CR_INVALID_LOG_CONF
;
1840 return CR_INVALID_FLAG
;
1842 if (hMachine
!= NULL
)
1844 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
1845 if (BindingHandle
== NULL
)
1848 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
1849 if (StringTable
== 0)
1854 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
1858 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
1859 if (lpDevInst
== NULL
)
1860 return CR_INVALID_DEVNODE
;
1864 ret
= PNP_FreeLogConf(BindingHandle
, lpDevInst
, pLogConfInfo
->ulFlags
,
1865 pLogConfInfo
->ulTag
, 0);
1867 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1869 ret
= RpcStatusToCmStatus(RpcExceptionCode());
1877 /***********************************************************************
1878 * CM_Free_Log_Conf_Handle [SETUPAPI.@]
1880 CONFIGRET WINAPI
CM_Free_Log_Conf_Handle(
1883 PLOG_CONF_INFO pLogConfInfo
;
1885 TRACE("%lx\n", lcLogConf
);
1887 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
1888 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
1889 return CR_INVALID_LOG_CONF
;
1891 HeapFree(GetProcessHeap(), 0, pLogConfInfo
);
1897 /***********************************************************************
1898 * CM_Free_Range_List [SETUPAPI.@]
1903 _In_ RANGE_LIST RangeList
,
1906 PINTERNAL_RANGE_LIST pRangeList
;
1908 FIXME("CM_Free_Range_List(%p %lx)\n", RangeList
, ulFlags
);
1910 pRangeList
= (PINTERNAL_RANGE_LIST
)RangeList
;
1912 if (pRangeList
== NULL
|| pRangeList
->ulMagic
!= RANGE_LIST_MAGIC
)
1913 return CR_INVALID_RANGE_LIST
;
1916 return CR_INVALID_FLAG
;
1918 // TODO: Free the list of ranges
1920 HeapFree(GetProcessHeap(), 0, pRangeList
);
1926 /***********************************************************************
1927 * CM_Free_Res_Des [SETUPAPI.@]
1929 CONFIGRET WINAPI
CM_Free_Res_Des(
1930 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
)
1932 TRACE("%p %p %lx\n", prdResDes
, rdResDes
, ulFlags
);
1933 return CM_Free_Res_Des_Ex(prdResDes
, rdResDes
, ulFlags
, NULL
);
1937 /***********************************************************************
1938 * CM_Free_Res_Des_Ex [SETUPAPI.@]
1940 CONFIGRET WINAPI
CM_Free_Res_Des_Ex(
1941 PRES_DES prdResDes
, RES_DES rdResDes
, ULONG ulFlags
,
1944 FIXME("%p %p %lx %lx\n", prdResDes
, rdResDes
, ulFlags
, hMachine
);
1946 return CR_CALL_NOT_IMPLEMENTED
;
1950 /***********************************************************************
1951 * CM_Free_Res_Des_Handle [SETUPAPI.@]
1953 CONFIGRET WINAPI
CM_Free_Res_Des_Handle(
1956 FIXME("%p\n", rdResDes
);
1958 return CR_CALL_NOT_IMPLEMENTED
;
1962 /***********************************************************************
1963 * CM_Get_Child [SETUPAPI.@]
1965 CONFIGRET WINAPI
CM_Get_Child(
1966 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
1968 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
1969 return CM_Get_Child_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
1973 /***********************************************************************
1974 * CM_Get_Child_Ex [SETUPAPI.@]
1976 CONFIGRET WINAPI
CM_Get_Child_Ex(
1977 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
1979 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
1980 RPC_BINDING_HANDLE BindingHandle
= NULL
;
1981 HSTRING_TABLE StringTable
= NULL
;
1983 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
1986 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
1988 if (pdnDevInst
== NULL
)
1989 return CR_INVALID_POINTER
;
1992 return CR_INVALID_DEVINST
;
1995 return CR_INVALID_FLAG
;
1999 if (hMachine
!= NULL
)
2001 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2002 if (BindingHandle
== NULL
)
2005 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2006 if (StringTable
== 0)
2011 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2015 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2016 if (lpDevInst
== NULL
)
2017 return CR_INVALID_DEVNODE
;
2021 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
2022 PNP_GET_CHILD_DEVICE_INSTANCE
,
2028 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2030 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2034 if (ret
!= CR_SUCCESS
)
2037 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
2039 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
2043 *pdnDevInst
= dwIndex
;
2049 /***********************************************************************
2050 * CM_Get_Class_Key_NameA [SETUPAPI.@]
2052 CONFIGRET WINAPI
CM_Get_Class_Key_NameA(
2053 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
2055 TRACE("%p %p %p %lx\n",
2056 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2057 return CM_Get_Class_Key_Name_ExA(ClassGuid
, pszKeyName
, pulLength
,
2062 /***********************************************************************
2063 * CM_Get_Class_Key_NameW [SETUPAPI.@]
2065 CONFIGRET WINAPI
CM_Get_Class_Key_NameW(
2066 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
)
2068 TRACE("%p %p %p %lx\n",
2069 ClassGuid
, pszKeyName
, pulLength
, ulFlags
);
2070 return CM_Get_Class_Key_Name_ExW(ClassGuid
, pszKeyName
, pulLength
,
2075 /***********************************************************************
2076 * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
2078 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExA(
2079 LPGUID ClassGuid
, LPSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
2082 WCHAR szBuffer
[MAX_GUID_STRING_LEN
];
2083 CONFIGRET ret
= CR_SUCCESS
;
2087 TRACE("%p %p %p %lx %lx\n",
2088 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2090 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2091 return CR_INVALID_POINTER
;
2093 ulOrigLength
= *pulLength
;
2096 ulLength
= MAX_GUID_STRING_LEN
;
2097 ret
= CM_Get_Class_Key_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2099 if (ret
== CR_SUCCESS
)
2101 if (WideCharToMultiByte(CP_ACP
,
2111 *pulLength
= lstrlenA(pszKeyName
) + 1;
2118 /***********************************************************************
2119 * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
2121 CONFIGRET WINAPI
CM_Get_Class_Key_Name_ExW(
2122 LPGUID ClassGuid
, LPWSTR pszKeyName
, PULONG pulLength
, ULONG ulFlags
,
2125 TRACE("%p %p %p %lx %lx\n",
2126 ClassGuid
, pszKeyName
, pulLength
, ulFlags
, hMachine
);
2128 if (ClassGuid
== NULL
|| pszKeyName
== NULL
|| pulLength
== NULL
)
2129 return CR_INVALID_POINTER
;
2132 return CR_INVALID_FLAG
;
2134 if (*pulLength
< MAX_GUID_STRING_LEN
)
2137 return CR_BUFFER_SMALL
;
2140 if (!GuidToString(ClassGuid
, pszKeyName
))
2141 return CR_INVALID_DATA
;
2143 *pulLength
= MAX_GUID_STRING_LEN
;
2149 /***********************************************************************
2150 * CM_Get_Class_NameA [SETUPAPI.@]
2152 CONFIGRET WINAPI
CM_Get_Class_NameA(
2153 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
2155 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
2156 return CM_Get_Class_Name_ExA(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2161 /***********************************************************************
2162 * CM_Get_Class_NameW [SETUPAPI.@]
2164 CONFIGRET WINAPI
CM_Get_Class_NameW(
2165 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
)
2167 TRACE("%p %p %p %lx\n", ClassGuid
, Buffer
, pulLength
, ulFlags
);
2168 return CM_Get_Class_Name_ExW(ClassGuid
, Buffer
, pulLength
, ulFlags
,
2173 /***********************************************************************
2174 * CM_Get_Class_Name_ExA [SETUPAPI.@]
2176 CONFIGRET WINAPI
CM_Get_Class_Name_ExA(
2177 LPGUID ClassGuid
, PCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
2180 WCHAR szBuffer
[MAX_CLASS_NAME_LEN
];
2181 CONFIGRET ret
= CR_SUCCESS
;
2185 TRACE("%p %p %p %lx %lx\n",
2186 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2188 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2189 return CR_INVALID_POINTER
;
2191 ulOrigLength
= *pulLength
;
2194 ulLength
= MAX_CLASS_NAME_LEN
;
2195 ret
= CM_Get_Class_Name_ExW(ClassGuid
, szBuffer
, &ulLength
,
2197 if (ret
== CR_SUCCESS
)
2199 if (WideCharToMultiByte(CP_ACP
,
2209 *pulLength
= lstrlenA(Buffer
) + 1;
2216 /***********************************************************************
2217 * CM_Get_Class_Name_ExW [SETUPAPI.@]
2220 CM_Get_Class_Name_ExW(
2221 LPGUID ClassGuid
, PWCHAR Buffer
, PULONG pulLength
, ULONG ulFlags
,
2224 WCHAR szGuidString
[MAX_GUID_STRING_LEN
];
2225 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2228 TRACE("%p %p %p %lx %lx\n",
2229 ClassGuid
, Buffer
, pulLength
, ulFlags
, hMachine
);
2231 if (ClassGuid
== NULL
|| Buffer
== NULL
|| pulLength
== NULL
)
2232 return CR_INVALID_POINTER
;
2235 return CR_INVALID_FLAG
;
2237 if (!GuidToString(ClassGuid
, szGuidString
))
2238 return CR_INVALID_DATA
;
2240 TRACE("Guid %s\n", debugstr_w(szGuidString
));
2242 if (hMachine
!= NULL
)
2244 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2245 if (BindingHandle
== NULL
)
2250 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2256 ret
= PNP_GetClassName(BindingHandle
,
2262 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2264 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2272 /***********************************************************************
2273 * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
2275 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyA(
2276 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
2277 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2279 PWSTR BufferW
= NULL
;
2284 TRACE("%p %lu %p %p %p %lx %lx\n",
2285 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2288 if (pulLength
== NULL
)
2289 return CR_INVALID_POINTER
;
2291 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2292 return CR_INVALID_PROPERTY
;
2294 ulType
= GetRegistryPropertyType(ulProperty
);
2295 if (ulType
== REG_SZ
|| ulType
== REG_MULTI_SZ
)
2297 /* Get the required buffer size */
2298 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2299 NULL
, &ulLength
, ulFlags
, hMachine
);
2300 if (ret
!= CR_BUFFER_SMALL
)
2303 /* Allocate the unicode buffer */
2304 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLength
);
2305 if (BufferW
== NULL
)
2306 return CR_OUT_OF_MEMORY
;
2308 /* Get the property */
2309 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2310 BufferW
, &ulLength
, ulFlags
, hMachine
);
2311 if (ret
!= CR_SUCCESS
)
2313 HeapFree(GetProcessHeap(), 0, BufferW
);
2317 /* Do W->A conversion */
2318 *pulLength
= WideCharToMultiByte(CP_ACP
,
2321 lstrlenW(BufferW
) + 1,
2327 /* Release the unicode buffer */
2328 HeapFree(GetProcessHeap(), 0, BufferW
);
2330 if (*pulLength
== 0)
2335 /* Get the property */
2336 ret
= CM_Get_Class_Registry_PropertyW(ClassGuid
, ulProperty
, pulRegDataType
,
2337 Buffer
, pulLength
, ulFlags
, hMachine
);
2344 /***********************************************************************
2345 * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
2347 CONFIGRET WINAPI
CM_Get_Class_Registry_PropertyW(
2348 LPGUID ClassGuid
, ULONG ulProperty
, PULONG pulRegDataType
,
2349 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2351 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2352 WCHAR szGuidString
[PNP_MAX_GUID_STRING_LEN
+ 1];
2354 ULONG ulTransferLength
= 0;
2357 TRACE("%p %lu %p %p %p %lx %lx\n",
2358 ClassGuid
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2361 if (ClassGuid
== NULL
|| pulLength
== NULL
)
2362 return CR_INVALID_POINTER
;
2365 return CR_INVALID_FLAG
;
2367 if (pSetupStringFromGuid(ClassGuid
,
2369 PNP_MAX_GUID_STRING_LEN
) != 0)
2370 return CR_INVALID_DATA
;
2372 if (ulProperty
< CM_CRP_MIN
|| ulProperty
> CM_CRP_MAX
)
2373 return CR_INVALID_PROPERTY
;
2375 if (hMachine
!= NULL
)
2377 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2378 if (BindingHandle
== NULL
)
2383 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
2387 ulTransferLength
= *pulLength
;
2391 ret
= PNP_GetClassRegProp(BindingHandle
,
2400 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2402 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2406 if (ret
== CR_SUCCESS
)
2408 if (pulRegDataType
!= NULL
)
2409 *pulRegDataType
= ulType
;
2416 /***********************************************************************
2417 * CM_Get_Depth [SETUPAPI.@]
2419 CONFIGRET WINAPI
CM_Get_Depth(
2420 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
)
2422 TRACE("%p %lx %lx\n", pulDepth
, dnDevInst
, ulFlags
);
2423 return CM_Get_Depth_Ex(pulDepth
, dnDevInst
, ulFlags
, NULL
);
2427 /***********************************************************************
2428 * CM_Get_Depth_Ex [SETUPAPI.@]
2430 CONFIGRET WINAPI
CM_Get_Depth_Ex(
2431 PULONG pulDepth
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
2433 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2434 HSTRING_TABLE StringTable
= NULL
;
2438 TRACE("%p %lx %lx %lx\n",
2439 pulDepth
, dnDevInst
, ulFlags
, hMachine
);
2441 if (pulDepth
== NULL
)
2442 return CR_INVALID_POINTER
;
2445 return CR_INVALID_DEVINST
;
2448 return CR_INVALID_FLAG
;
2450 if (hMachine
!= NULL
)
2452 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2453 if (BindingHandle
== NULL
)
2456 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2457 if (StringTable
== 0)
2462 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2466 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2467 if (lpDevInst
== NULL
)
2468 return CR_INVALID_DEVNODE
;
2472 ret
= PNP_GetDepth(BindingHandle
,
2477 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2479 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2487 /***********************************************************************
2488 * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
2490 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyA(
2491 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2492 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2494 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, pszCustomPropertyName
,
2495 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2496 return CM_Get_DevNode_Custom_Property_ExA(dnDevInst
, pszCustomPropertyName
,
2497 pulRegDataType
, Buffer
,
2498 pulLength
, ulFlags
, NULL
);
2502 /***********************************************************************
2503 * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
2505 CONFIGRET WINAPI
CM_Get_DevNode_Custom_PropertyW(
2506 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2507 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2509 TRACE("%lx %s %p %p %p %lx\n", dnDevInst
, debugstr_w(pszCustomPropertyName
),
2510 pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2511 return CM_Get_DevNode_Custom_Property_ExW(dnDevInst
, pszCustomPropertyName
,
2512 pulRegDataType
, Buffer
,
2513 pulLength
, ulFlags
, NULL
);
2517 /***********************************************************************
2518 * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
2520 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExA(
2521 DEVINST dnDevInst
, PCSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2522 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2524 LPWSTR pszPropertyNameW
= NULL
;
2527 ULONG ulDataType
= REG_NONE
;
2530 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
, pszCustomPropertyName
,
2531 pulRegDataType
, Buffer
, pulLength
, ulFlags
, hMachine
);
2534 return CR_INVALID_POINTER
;
2536 ulLengthW
= *pulLength
* sizeof(WCHAR
);
2537 BufferW
= HeapAlloc(GetProcessHeap(), 0, ulLengthW
);
2539 return CR_OUT_OF_MEMORY
;
2541 pszPropertyNameW
= pSetupMultiByteToUnicode(pszCustomPropertyName
,
2543 if (pszPropertyNameW
== NULL
)
2545 HeapFree(GetProcessHeap(), 0, BufferW
);
2546 return CR_OUT_OF_MEMORY
;
2549 ret
= CM_Get_DevNode_Custom_Property_ExW(dnDevInst
,
2556 if (ret
== CR_SUCCESS
)
2558 if (ulDataType
== REG_SZ
||
2559 ulDataType
== REG_EXPAND_SZ
||
2560 ulDataType
== REG_MULTI_SZ
)
2562 /* Do W->A conversion */
2563 *pulLength
= WideCharToMultiByte(CP_ACP
,
2566 lstrlenW(BufferW
) + 1,
2571 if (*pulLength
== 0)
2576 /* Directly copy the value */
2577 if (ulLengthW
<= *pulLength
)
2578 memcpy(Buffer
, BufferW
, ulLengthW
);
2581 *pulLength
= ulLengthW
;
2582 ret
= CR_BUFFER_SMALL
;
2588 *pulRegDataType
= ulDataType
;
2590 HeapFree(GetProcessHeap(), 0, BufferW
);
2591 MyFree(pszPropertyNameW
);
2597 /***********************************************************************
2598 * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
2600 CONFIGRET WINAPI
CM_Get_DevNode_Custom_Property_ExW(
2601 DEVINST dnDevInst
, PCWSTR pszCustomPropertyName
, PULONG pulRegDataType
,
2602 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2604 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2605 HSTRING_TABLE StringTable
= NULL
;
2607 ULONG ulDataType
= REG_NONE
;
2608 ULONG ulTransferLength
;
2609 CONFIGRET ret
= CR_SUCCESS
;
2611 TRACE("%lx %s %p %p %p %lx %p\n", dnDevInst
,
2612 debugstr_w(pszCustomPropertyName
), pulRegDataType
, Buffer
,
2613 pulLength
, ulFlags
, hMachine
);
2616 return CR_INVALID_DEVNODE
;
2618 if (pszCustomPropertyName
== NULL
||
2619 pulLength
== NULL
||
2621 return CR_INVALID_POINTER
;
2623 if (ulFlags
& ~CM_CUSTOMDEVPROP_BITS
)
2624 return CR_INVALID_FLAG
;
2626 if (hMachine
!= NULL
)
2628 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2629 if (BindingHandle
== NULL
)
2632 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2633 if (StringTable
== 0)
2638 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2642 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2643 if (lpDevInst
== NULL
)
2644 return CR_INVALID_DEVNODE
;
2646 ulTransferLength
= *pulLength
;
2650 ret
= PNP_GetCustomDevProp(BindingHandle
,
2652 (LPWSTR
)pszCustomPropertyName
,
2659 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2661 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2665 if (ret
== CR_SUCCESS
)
2667 if (pulRegDataType
!= NULL
)
2668 *pulRegDataType
= ulDataType
;
2675 /***********************************************************************
2676 * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
2678 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyA(
2679 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2680 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2682 TRACE("%lx %lu %p %p %p %lx\n",
2683 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2685 return CM_Get_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
2686 pulRegDataType
, Buffer
,
2687 pulLength
, ulFlags
, NULL
);
2691 /***********************************************************************
2692 * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
2694 CONFIGRET WINAPI
CM_Get_DevNode_Registry_PropertyW(
2695 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2696 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
)
2698 TRACE("%lx %lu %p %p %p %lx\n",
2699 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
, ulFlags
);
2701 return CM_Get_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
2702 pulRegDataType
, Buffer
,
2703 pulLength
, ulFlags
, NULL
);
2707 /***********************************************************************
2708 * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
2710 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExA(
2711 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2712 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2716 ULONG ulDataType
= REG_NONE
;
2719 TRACE("%lx %lu %p %p %p %lx %lx\n",
2720 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2724 return CR_INVALID_POINTER
;
2726 LengthW
= *pulLength
* sizeof(WCHAR
);
2727 BufferW
= HeapAlloc(GetProcessHeap(), 0, LengthW
);
2730 return CR_OUT_OF_MEMORY
;
2732 ret
= CM_Get_DevNode_Registry_Property_ExW(dnDevInst
,
2740 if (ret
== CR_SUCCESS
)
2742 if (ulDataType
== REG_SZ
||
2743 ulDataType
== REG_EXPAND_SZ
||
2744 ulDataType
== REG_MULTI_SZ
)
2746 /* Do W->A conversion */
2747 *pulLength
= WideCharToMultiByte(CP_ACP
,
2750 lstrlenW(BufferW
) + 1,
2755 if (*pulLength
== 0)
2760 /* Directly copy the value */
2761 if (LengthW
<= *pulLength
)
2762 memcpy(Buffer
, BufferW
, LengthW
);
2765 *pulLength
= LengthW
;
2766 ret
= CR_BUFFER_SMALL
;
2772 *pulRegDataType
= ulDataType
;
2774 HeapFree(GetProcessHeap(), 0, BufferW
);
2780 /***********************************************************************
2781 * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
2783 CONFIGRET WINAPI
CM_Get_DevNode_Registry_Property_ExW(
2784 DEVINST dnDevInst
, ULONG ulProperty
, PULONG pulRegDataType
,
2785 PVOID Buffer
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
2787 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2788 HSTRING_TABLE StringTable
= NULL
;
2789 CONFIGRET ret
= CR_SUCCESS
;
2791 ULONG ulDataType
= REG_NONE
;
2792 ULONG ulTransferLength
= 0;
2794 TRACE("%lx %lu %p %p %p %lx %lx\n",
2795 dnDevInst
, ulProperty
, pulRegDataType
, Buffer
, pulLength
,
2799 return CR_INVALID_DEVNODE
;
2801 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
2802 return CR_INVALID_PROPERTY
;
2804 /* pulRegDataType is optional */
2806 /* Buffer is optional */
2808 if (pulLength
== NULL
)
2809 return CR_INVALID_POINTER
;
2811 if (*pulLength
== 0)
2812 return CR_INVALID_POINTER
;
2815 return CR_INVALID_FLAG
;
2817 if (hMachine
!= NULL
)
2819 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2820 if (BindingHandle
== NULL
)
2823 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2824 if (StringTable
== 0)
2829 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2833 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2834 if (lpDevInst
== NULL
)
2835 return CR_INVALID_DEVNODE
;
2837 ulTransferLength
= *pulLength
;
2841 ret
= PNP_GetDeviceRegProp(BindingHandle
,
2850 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2852 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2856 if (ret
== CR_SUCCESS
)
2858 if (pulRegDataType
!= NULL
)
2859 *pulRegDataType
= ulDataType
;
2866 /***********************************************************************
2867 * CM_Get_DevNode_Status [SETUPAPI.@]
2869 CONFIGRET WINAPI
CM_Get_DevNode_Status(
2870 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2873 TRACE("%p %p %lx %lx\n",
2874 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
);
2875 return CM_Get_DevNode_Status_Ex(pulStatus
, pulProblemNumber
, dnDevInst
,
2880 /***********************************************************************
2881 * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
2884 CM_Get_DevNode_Status_Ex(
2885 PULONG pulStatus
, PULONG pulProblemNumber
, DEVINST dnDevInst
,
2886 ULONG ulFlags
, HMACHINE hMachine
)
2888 RPC_BINDING_HANDLE BindingHandle
= NULL
;
2889 HSTRING_TABLE StringTable
= NULL
;
2893 TRACE("%p %p %lx %lx %lx\n",
2894 pulStatus
, pulProblemNumber
, dnDevInst
, ulFlags
, hMachine
);
2896 if (pulStatus
== NULL
|| pulProblemNumber
== NULL
)
2897 return CR_INVALID_POINTER
;
2900 return CR_INVALID_DEVINST
;
2903 return CR_INVALID_FLAG
;
2905 if (hMachine
!= NULL
)
2907 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
2908 if (BindingHandle
== NULL
)
2911 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
2912 if (StringTable
== 0)
2917 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
2921 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
2922 if (lpDevInst
== NULL
)
2923 return CR_INVALID_DEVNODE
;
2927 ret
= PNP_GetDeviceStatus(BindingHandle
,
2933 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2935 ret
= RpcStatusToCmStatus(RpcExceptionCode());
2943 /***********************************************************************
2944 * CM_Get_Device_IDA [SETUPAPI.@]
2946 CONFIGRET WINAPI
CM_Get_Device_IDA(
2947 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2949 TRACE("%lx %p %ld %ld\n",
2950 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2951 return CM_Get_Device_ID_ExA(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2955 /***********************************************************************
2956 * CM_Get_Device_IDW [SETUPAPI.@]
2958 CONFIGRET WINAPI
CM_Get_Device_IDW(
2959 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
2961 TRACE("%lx %p %ld %ld\n",
2962 dnDevInst
, Buffer
, BufferLen
, ulFlags
);
2963 return CM_Get_Device_ID_ExW(dnDevInst
, Buffer
, BufferLen
, ulFlags
, NULL
);
2967 /***********************************************************************
2968 * CM_Get_Device_ID_ExA [SETUPAPI.@]
2970 CONFIGRET WINAPI
CM_Get_Device_ID_ExA(
2971 DEVINST dnDevInst
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
2974 WCHAR szBufferW
[MAX_DEVICE_ID_LEN
];
2975 CONFIGRET ret
= CR_SUCCESS
;
2977 TRACE("%lx %p %ld %ld %lx\n",
2978 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
2981 return CR_INVALID_POINTER
;
2983 ret
= CM_Get_Device_ID_ExW(dnDevInst
,
2988 if (ret
== CR_SUCCESS
)
2990 if (WideCharToMultiByte(CP_ACP
,
2993 lstrlenW(szBufferW
) + 1,
3005 /***********************************************************************
3006 * CM_Get_Device_ID_ExW [SETUPAPI.@]
3008 CONFIGRET WINAPI
CM_Get_Device_ID_ExW(
3009 DEVINST dnDevInst
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3012 HSTRING_TABLE StringTable
= NULL
;
3014 TRACE("%lx %p %ld %ld %lx\n",
3015 dnDevInst
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3018 return CR_INVALID_DEVINST
;
3021 return CR_INVALID_POINTER
;
3024 return CR_INVALID_FLAG
;
3026 if (hMachine
!= NULL
)
3028 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3029 if (StringTable
== NULL
)
3034 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3038 if (!pSetupStringTableStringFromIdEx(StringTable
,
3048 /***********************************************************************
3049 * CM_Get_Device_ID_ListA [SETUPAPI.@]
3051 CONFIGRET WINAPI
CM_Get_Device_ID_ListA(
3052 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
3054 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
3055 return CM_Get_Device_ID_List_ExA(pszFilter
, Buffer
, BufferLen
,
3060 /***********************************************************************
3061 * CM_Get_Device_ID_ListW [SETUPAPI.@]
3063 CONFIGRET WINAPI
CM_Get_Device_ID_ListW(
3064 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
)
3066 TRACE("%p %p %ld %ld\n", pszFilter
, Buffer
, BufferLen
, ulFlags
);
3067 return CM_Get_Device_ID_List_ExW(pszFilter
, Buffer
, BufferLen
,
3072 /***********************************************************************
3073 * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
3075 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExA(
3076 PCSTR pszFilter
, PCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3079 LPWSTR BufferW
= NULL
;
3080 LPWSTR pszFilterW
= NULL
;
3081 CONFIGRET ret
= CR_SUCCESS
;
3083 TRACE("%p %p %ld %ld %lx\n",
3084 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3086 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
3087 if (BufferW
== NULL
)
3088 return CR_OUT_OF_MEMORY
;
3090 if (pszFilter
== NULL
)
3092 ret
= CM_Get_Device_ID_List_ExW(NULL
,
3100 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3102 ret
= CR_INVALID_DEVICE_ID
;
3106 ret
= CM_Get_Device_ID_List_ExW(pszFilterW
,
3115 if (WideCharToMultiByte(CP_ACP
,
3118 lstrlenW(BufferW
) + 1,
3132 /***********************************************************************
3133 * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
3135 CONFIGRET WINAPI
CM_Get_Device_ID_List_ExW(
3136 PCWSTR pszFilter
, PWCHAR Buffer
, ULONG BufferLen
, ULONG ulFlags
,
3139 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3142 TRACE("%p %p %ld %ld %lx\n",
3143 pszFilter
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3145 if (Buffer
== NULL
|| BufferLen
== 0)
3146 return CR_INVALID_POINTER
;
3148 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3149 return CR_INVALID_FLAG
;
3151 if (hMachine
!= NULL
)
3153 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3154 if (BindingHandle
== NULL
)
3159 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3167 ret
= PNP_GetDeviceList(BindingHandle
,
3173 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3175 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3183 /***********************************************************************
3184 * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
3186 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeA(
3187 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
)
3189 TRACE("%p %s %ld\n", pulLen
, pszFilter
, ulFlags
);
3190 return CM_Get_Device_ID_List_Size_ExA(pulLen
, pszFilter
, ulFlags
, NULL
);
3194 /***********************************************************************
3195 * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
3197 CONFIGRET WINAPI
CM_Get_Device_ID_List_SizeW(
3198 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
)
3200 TRACE("%p %s %ld\n", pulLen
, debugstr_w(pszFilter
), ulFlags
);
3201 return CM_Get_Device_ID_List_Size_ExW(pulLen
, pszFilter
, ulFlags
, NULL
);
3205 /***********************************************************************
3206 * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
3208 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExA(
3209 PULONG pulLen
, PCSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
3211 LPWSTR pszFilterW
= NULL
;
3212 CONFIGRET ret
= CR_SUCCESS
;
3214 FIXME("%p %s %lx %lx\n", pulLen
, pszFilter
, ulFlags
, hMachine
);
3216 if (pszFilter
== NULL
)
3218 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3225 if (pSetupCaptureAndConvertAnsiArg(pszFilter
, &pszFilterW
))
3226 return CR_INVALID_DEVICE_ID
;
3228 ret
= CM_Get_Device_ID_List_Size_ExW(pulLen
,
3240 /***********************************************************************
3241 * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
3243 CONFIGRET WINAPI
CM_Get_Device_ID_List_Size_ExW(
3244 PULONG pulLen
, PCWSTR pszFilter
, ULONG ulFlags
, HMACHINE hMachine
)
3246 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3249 FIXME("%p %s %ld %lx\n", pulLen
, debugstr_w(pszFilter
), ulFlags
, hMachine
);
3252 return CR_INVALID_POINTER
;
3254 if (ulFlags
& ~CM_GETIDLIST_FILTER_BITS
)
3255 return CR_INVALID_FLAG
;
3257 if (hMachine
!= NULL
)
3259 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3260 if (BindingHandle
== NULL
)
3265 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3273 ret
= PNP_GetDeviceListSize(BindingHandle
,
3278 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3280 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3288 /***********************************************************************
3289 * CM_Get_Device_ID_Size [SETUPAPI.@]
3291 CONFIGRET WINAPI
CM_Get_Device_ID_Size(
3292 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
)
3294 TRACE("%p %lx %lx\n", pulLen
, dnDevInst
, ulFlags
);
3295 return CM_Get_Device_ID_Size_Ex(pulLen
, dnDevInst
, ulFlags
, NULL
);
3299 /***********************************************************************
3300 * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
3302 CONFIGRET WINAPI
CM_Get_Device_ID_Size_Ex(
3303 PULONG pulLen
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3305 HSTRING_TABLE StringTable
= NULL
;
3308 TRACE("%p %lx %lx %lx\n", pulLen
, dnDevInst
, ulFlags
, hMachine
);
3311 return CR_INVALID_POINTER
;
3314 return CR_INVALID_DEVINST
;
3317 return CR_INVALID_FLAG
;
3319 if (hMachine
!= NULL
)
3321 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3322 if (StringTable
== NULL
)
3327 if (!PnpGetLocalHandles(NULL
, &StringTable
))
3331 DeviceId
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3332 if (DeviceId
== NULL
)
3338 *pulLen
= lstrlenW(DeviceId
);
3344 /***********************************************************************
3345 * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
3347 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasA(
3348 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
3349 LPSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
3351 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
3352 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3354 return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface
,
3355 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3360 /***********************************************************************
3361 * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
3363 CONFIGRET WINAPI
CM_Get_Device_Interface_AliasW(
3364 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
,
3365 LPWSTR pszAliasDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
3367 TRACE("%p %p %p %p %lu\n", pszDeviceInterface
, AliasInterfaceGuid
,
3368 pszAliasDeviceInterface
, pulLength
, ulFlags
);
3370 return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface
,
3371 AliasInterfaceGuid
, pszAliasDeviceInterface
, pulLength
,
3376 /***********************************************************************
3377 * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
3379 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExA(
3380 LPCSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPSTR pszAliasDeviceInterface
,
3381 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
3383 FIXME("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
3384 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
3386 return CR_CALL_NOT_IMPLEMENTED
;
3390 /***********************************************************************
3391 * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
3393 CONFIGRET WINAPI
CM_Get_Device_Interface_Alias_ExW(
3394 LPCWSTR pszDeviceInterface
, LPGUID AliasInterfaceGuid
, LPWSTR pszAliasDeviceInterface
,
3395 PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
3397 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3398 ULONG ulTransferLength
;
3399 CONFIGRET ret
= CR_SUCCESS
;
3401 TRACE("%p %p %p %p %lu %lx\n", pszDeviceInterface
, AliasInterfaceGuid
,
3402 pszAliasDeviceInterface
, pulLength
, ulFlags
, hMachine
);
3404 if (pszDeviceInterface
== NULL
||
3405 AliasInterfaceGuid
== NULL
||
3406 pszAliasDeviceInterface
== NULL
||
3408 return CR_INVALID_POINTER
;
3411 return CR_INVALID_FLAG
;
3413 if (hMachine
!= NULL
)
3415 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3416 if (BindingHandle
== NULL
)
3421 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3425 ulTransferLength
= *pulLength
;
3429 ret
= PNP_GetInterfaceDeviceAlias(BindingHandle
,
3430 (LPWSTR
)pszDeviceInterface
,
3432 pszAliasDeviceInterface
,
3437 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3439 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3447 /***********************************************************************
3448 * CM_Get_Device_Interface_ListA (SETUPAPI.@)
3450 CONFIGRET WINAPI
CM_Get_Device_Interface_ListA(
3451 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
3452 ULONG BufferLen
, ULONG ulFlags
)
3454 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
3455 pDeviceID
, Buffer
, BufferLen
, ulFlags
);
3457 return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid
, pDeviceID
,
3458 Buffer
, BufferLen
, ulFlags
, NULL
);
3462 /***********************************************************************
3463 * CM_Get_Device_Interface_ListW (SETUPAPI.@)
3465 CONFIGRET WINAPI
CM_Get_Device_Interface_ListW(
3466 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
3467 ULONG BufferLen
, ULONG ulFlags
)
3469 TRACE("%s %s %p %lu 0x%08lx\n", debugstr_guid(InterfaceClassGuid
),
3470 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
);
3472 return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceID
,
3473 Buffer
, BufferLen
, ulFlags
, NULL
);
3477 /***********************************************************************
3478 * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
3480 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExA(
3481 LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceID
, PCHAR Buffer
,
3482 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
3484 DEVINSTID_W pDeviceIdW
= NULL
;
3485 PWCHAR BufferW
= NULL
;
3486 CONFIGRET ret
= CR_SUCCESS
;
3488 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
3489 pDeviceID
, Buffer
, BufferLen
, ulFlags
, hMachine
);
3491 if (Buffer
== NULL
||
3493 return CR_INVALID_POINTER
;
3495 if (pDeviceID
!= NULL
)
3497 if (!pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDeviceIdW
))
3498 return CR_INVALID_DEVICE_ID
;
3501 BufferW
= MyMalloc(BufferLen
* sizeof(WCHAR
));
3502 if (BufferW
== NULL
)
3504 ret
= CR_OUT_OF_MEMORY
;
3508 ret
= CM_Get_Device_Interface_List_ExW(InterfaceClassGuid
, pDeviceIdW
,
3509 BufferW
, BufferLen
, ulFlags
,
3511 if (ret
!= CR_SUCCESS
)
3514 if (WideCharToMultiByte(CP_ACP
,
3517 lstrlenW(BufferW
) + 1,
3525 if (BufferW
!= NULL
)
3528 if (pDeviceIdW
!= NULL
)
3535 /***********************************************************************
3536 * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
3538 CONFIGRET WINAPI
CM_Get_Device_Interface_List_ExW(
3539 LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceID
, PWCHAR Buffer
,
3540 ULONG BufferLen
, ULONG ulFlags
, HMACHINE hMachine
)
3542 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3543 PNP_RPC_BUFFER_SIZE BufferSize
= 0;
3544 CONFIGRET ret
= CR_SUCCESS
;
3546 TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(InterfaceClassGuid
),
3547 debugstr_w(pDeviceID
), Buffer
, BufferLen
, ulFlags
, hMachine
);
3549 if (Buffer
== NULL
||
3551 return CR_INVALID_POINTER
;
3553 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
3554 return CR_INVALID_FLAG
;
3556 if (hMachine
!= NULL
)
3558 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3559 if (BindingHandle
== NULL
)
3564 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3569 BufferSize
= BufferLen
;
3573 ret
= PNP_GetInterfaceDeviceList(BindingHandle
,
3580 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3582 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3590 /***********************************************************************
3591 * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
3593 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeA(
3594 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
3597 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
3598 pDeviceId
, ulFlags
);
3600 return CM_Get_Device_Interface_List_Size_ExA(pulLen
, InterfaceClassGuid
,
3601 pDeviceId
, ulFlags
, NULL
);
3605 /***********************************************************************
3606 * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
3608 CONFIGRET WINAPI
CM_Get_Device_Interface_List_SizeW(
3609 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
3612 TRACE("%p %p %s 0x%08lx\n", pulLen
, InterfaceClassGuid
,
3613 debugstr_w(pDeviceId
), ulFlags
);
3615 return CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
3616 pDeviceId
, ulFlags
, NULL
);
3620 /***********************************************************************
3621 * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
3623 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExA(
3624 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_A pDeviceId
,
3625 ULONG ulFlags
, HMACHINE hMachine
)
3627 DEVINSTID_W pDeviceIdW
= NULL
;
3628 CONFIGRET ret
= CR_SUCCESS
;
3630 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
3631 pDeviceId
, ulFlags
, hMachine
);
3634 return CR_INVALID_POINTER
;
3636 if (pDeviceId
!= NULL
)
3638 if (!pSetupCaptureAndConvertAnsiArg(pDeviceId
, &pDeviceIdW
))
3639 return CR_INVALID_DEVICE_ID
;
3644 ret
= CM_Get_Device_Interface_List_Size_ExW(pulLen
, InterfaceClassGuid
,
3645 pDeviceIdW
, ulFlags
, hMachine
);
3647 if (pDeviceIdW
!= NULL
)
3654 /***********************************************************************
3655 * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
3657 CONFIGRET WINAPI
CM_Get_Device_Interface_List_Size_ExW(
3658 PULONG pulLen
, LPGUID InterfaceClassGuid
, DEVINSTID_W pDeviceId
,
3659 ULONG ulFlags
, HMACHINE hMachine
)
3661 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3662 CONFIGRET ret
= CR_SUCCESS
;
3664 TRACE("%p %p %s 0x%08lx %p\n", pulLen
, InterfaceClassGuid
,
3665 debugstr_w(pDeviceId
), ulFlags
, hMachine
);
3668 return CR_INVALID_POINTER
;
3670 if (ulFlags
& ~CM_GET_DEVICE_INTERFACE_LIST_BITS
)
3671 return CR_INVALID_FLAG
;
3673 if (hMachine
!= NULL
)
3675 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3676 if (BindingHandle
== NULL
)
3681 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3689 ret
= PNP_GetInterfaceDeviceListSize(BindingHandle
,
3695 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3697 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3705 /***********************************************************************
3706 * CM_Get_First_Log_Conf [SETUPAPI.@]
3708 CONFIGRET WINAPI
CM_Get_First_Log_Conf(
3709 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
)
3711 TRACE("%p %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
);
3712 return CM_Get_First_Log_Conf_Ex(plcLogConf
, dnDevInst
, ulFlags
, NULL
);
3716 /***********************************************************************
3717 * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
3719 CONFIGRET WINAPI
CM_Get_First_Log_Conf_Ex(
3720 PLOG_CONF plcLogConf
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
3722 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3723 HSTRING_TABLE StringTable
= NULL
;
3724 LPWSTR lpDevInst
= NULL
;
3725 CONFIGRET ret
= CR_SUCCESS
;
3727 PLOG_CONF_INFO pLogConfInfo
;
3729 FIXME("%p %lx %lx %lx\n", plcLogConf
, dnDevInst
, ulFlags
, hMachine
);
3732 return CR_INVALID_DEVINST
;
3734 if (ulFlags
& ~LOG_CONF_BITS
)
3735 return CR_INVALID_FLAG
;
3740 if (hMachine
!= NULL
)
3742 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3743 if (BindingHandle
== NULL
)
3746 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
3747 if (StringTable
== 0)
3752 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
3756 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
3757 if (lpDevInst
== NULL
)
3758 return CR_INVALID_DEVNODE
;
3762 ret
= PNP_GetFirstLogConf(BindingHandle
,
3768 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3770 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3774 if (ret
!= CR_SUCCESS
)
3779 pLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
3780 if (pLogConfInfo
== NULL
)
3781 return CR_OUT_OF_MEMORY
;
3783 pLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
3784 pLogConfInfo
->dnDevInst
= dnDevInst
;
3785 pLogConfInfo
->ulFlags
= ulFlags
;
3786 pLogConfInfo
->ulTag
= ulTag
;
3788 *plcLogConf
= (LOG_CONF
)pLogConfInfo
;
3795 /***********************************************************************
3796 * CM_Get_Global_State [SETUPAPI.@]
3798 CONFIGRET WINAPI
CM_Get_Global_State(
3799 PULONG pulState
, ULONG ulFlags
)
3801 TRACE("%p %lx\n", pulState
, ulFlags
);
3802 return CM_Get_Global_State_Ex(pulState
, ulFlags
, NULL
);
3806 /***********************************************************************
3807 * CM_Get_Global_State_Ex [SETUPAPI.@]
3809 CONFIGRET WINAPI
CM_Get_Global_State_Ex(
3810 PULONG pulState
, ULONG ulFlags
, HMACHINE hMachine
)
3812 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3815 TRACE("%p %lx %lx\n", pulState
, ulFlags
, hMachine
);
3817 if (pulState
== NULL
)
3818 return CR_INVALID_POINTER
;
3821 return CR_INVALID_FLAG
;
3823 if (hMachine
!= NULL
)
3825 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3826 if (BindingHandle
== NULL
)
3831 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3837 ret
= PNP_GetGlobalState(BindingHandle
, pulState
, ulFlags
);
3839 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3841 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3849 /***********************************************************************
3850 * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
3852 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsA(
3853 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3856 TRACE("%s %lu %p %lx\n", szDevInstName
,
3857 ulHardwareProfile
, pulValue
, ulFlags
);
3859 return CM_Get_HW_Prof_Flags_ExA(szDevInstName
, ulHardwareProfile
,
3860 pulValue
, ulFlags
, NULL
);
3864 /***********************************************************************
3865 * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
3867 CONFIGRET WINAPI
CM_Get_HW_Prof_FlagsW(
3868 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3871 TRACE("%s %lu %p %lx\n", debugstr_w(szDevInstName
),
3872 ulHardwareProfile
, pulValue
, ulFlags
);
3874 return CM_Get_HW_Prof_Flags_ExW(szDevInstName
, ulHardwareProfile
,
3875 pulValue
, ulFlags
, NULL
);
3879 /***********************************************************************
3880 * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
3882 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExA(
3883 DEVINSTID_A szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3884 ULONG ulFlags
, HMACHINE hMachine
)
3886 DEVINSTID_W pszDevIdW
= NULL
;
3887 CONFIGRET ret
= CR_SUCCESS
;
3889 TRACE("%s %lu %p %lx %lx\n", szDevInstName
,
3890 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3892 if (szDevInstName
!= NULL
)
3894 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
3895 return CR_INVALID_DEVICE_ID
;
3898 ret
= CM_Get_HW_Prof_Flags_ExW(pszDevIdW
, ulHardwareProfile
,
3899 pulValue
, ulFlags
, hMachine
);
3901 if (pszDevIdW
!= NULL
)
3908 /***********************************************************************
3909 * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
3911 CONFIGRET WINAPI
CM_Get_HW_Prof_Flags_ExW(
3912 DEVINSTID_W szDevInstName
, ULONG ulHardwareProfile
, PULONG pulValue
,
3913 ULONG ulFlags
, HMACHINE hMachine
)
3915 RPC_BINDING_HANDLE BindingHandle
= NULL
;
3918 FIXME("%s %lu %p %lx %lx\n", debugstr_w(szDevInstName
),
3919 ulHardwareProfile
, pulValue
, ulFlags
, hMachine
);
3921 if ((szDevInstName
== NULL
) || (pulValue
== NULL
))
3922 return CR_INVALID_POINTER
;
3925 return CR_INVALID_FLAG
;
3927 /* FIXME: Check whether szDevInstName is valid */
3929 if (hMachine
!= NULL
)
3931 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
3932 if (BindingHandle
== NULL
)
3937 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
3943 ret
= PNP_HwProfFlags(BindingHandle
, PNP_GET_HWPROFFLAGS
, szDevInstName
,
3944 ulHardwareProfile
, pulValue
, NULL
, NULL
, 0, 0);
3946 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
3948 ret
= RpcStatusToCmStatus(RpcExceptionCode());
3956 /***********************************************************************
3957 * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
3959 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoA(
3960 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
)
3962 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3964 return CM_Get_Hardware_Profile_Info_ExA(ulIndex
, pHWProfileInfo
,
3969 /***********************************************************************
3970 * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
3972 CONFIGRET WINAPI
CM_Get_Hardware_Profile_InfoW(
3973 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
)
3975 TRACE("%lu %p %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
);
3977 return CM_Get_Hardware_Profile_Info_ExW(ulIndex
, pHWProfileInfo
,
3982 /***********************************************************************
3983 * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
3985 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExA(
3986 ULONG ulIndex
, PHWPROFILEINFO_A pHWProfileInfo
, ULONG ulFlags
,
3989 HWPROFILEINFO_W LocalProfileInfo
;
3992 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
3994 if (pHWProfileInfo
== NULL
)
3995 return CR_INVALID_POINTER
;
3997 ret
= CM_Get_Hardware_Profile_Info_ExW(ulIndex
, &LocalProfileInfo
,
3999 if (ret
== CR_SUCCESS
)
4001 pHWProfileInfo
->HWPI_ulHWProfile
= LocalProfileInfo
.HWPI_ulHWProfile
;
4002 pHWProfileInfo
->HWPI_dwFlags
= LocalProfileInfo
.HWPI_dwFlags
;
4004 if (WideCharToMultiByte(CP_ACP
,
4006 LocalProfileInfo
.HWPI_szFriendlyName
,
4007 lstrlenW(LocalProfileInfo
.HWPI_szFriendlyName
) + 1,
4008 pHWProfileInfo
->HWPI_szFriendlyName
,
4019 /***********************************************************************
4020 * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
4022 CONFIGRET WINAPI
CM_Get_Hardware_Profile_Info_ExW(
4023 ULONG ulIndex
, PHWPROFILEINFO_W pHWProfileInfo
, ULONG ulFlags
,
4026 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4029 TRACE("%lu %p %lx %lx\n", ulIndex
, pHWProfileInfo
, ulFlags
, hMachine
);
4031 if (pHWProfileInfo
== NULL
)
4032 return CR_INVALID_POINTER
;
4035 return CR_INVALID_FLAG
;
4037 if (hMachine
!= NULL
)
4039 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4040 if (BindingHandle
== NULL
)
4045 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4051 ret
= PNP_GetHwProfInfo(BindingHandle
, ulIndex
, pHWProfileInfo
,
4052 sizeof(HWPROFILEINFO_W
), 0);
4054 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4056 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4064 /***********************************************************************
4065 * CM_Get_Log_Conf_Priority [SETUPAPI.@]
4067 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority(
4068 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
)
4070 TRACE("%p %p %lx\n", lcLogConf
, pPriority
, ulFlags
);
4071 return CM_Get_Log_Conf_Priority_Ex(lcLogConf
, pPriority
, ulFlags
, NULL
);
4075 /***********************************************************************
4076 * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
4078 CONFIGRET WINAPI
CM_Get_Log_Conf_Priority_Ex(
4079 LOG_CONF lcLogConf
, PPRIORITY pPriority
, ULONG ulFlags
,
4082 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4083 HSTRING_TABLE StringTable
= NULL
;
4084 PLOG_CONF_INFO pLogConfInfo
;
4088 FIXME("%p %p %lx %lx\n", lcLogConf
, pPriority
, ulFlags
, hMachine
);
4090 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4091 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
4092 return CR_INVALID_LOG_CONF
;
4094 if (pPriority
== NULL
)
4095 return CR_INVALID_POINTER
;
4098 return CR_INVALID_FLAG
;
4100 if (hMachine
!= NULL
)
4102 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4103 if (BindingHandle
== NULL
)
4106 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4107 if (StringTable
== 0)
4112 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4116 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4117 if (lpDevInst
== NULL
)
4118 return CR_INVALID_DEVNODE
;
4122 ret
= PNP_GetLogConfPriority(BindingHandle
,
4124 pLogConfInfo
->ulFlags
,
4125 pLogConfInfo
->ulTag
,
4129 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4131 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4139 /***********************************************************************
4140 * CM_Get_Next_Log_Conf [SETUPAPI.@]
4142 CONFIGRET WINAPI
CM_Get_Next_Log_Conf(
4143 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
)
4145 TRACE("%p %p %lx\n", plcLogConf
, lcLogConf
, ulFlags
);
4146 return CM_Get_Next_Log_Conf_Ex(plcLogConf
, lcLogConf
, ulFlags
, NULL
);
4150 /***********************************************************************
4151 * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
4153 CONFIGRET WINAPI
CM_Get_Next_Log_Conf_Ex(
4154 PLOG_CONF plcLogConf
, LOG_CONF lcLogConf
, ULONG ulFlags
,
4157 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4158 HSTRING_TABLE StringTable
= NULL
;
4159 PLOG_CONF_INFO pLogConfInfo
;
4160 PLOG_CONF_INFO pNewLogConfInfo
;
4165 FIXME("%p %p %lx %lx\n", plcLogConf
, lcLogConf
, ulFlags
, hMachine
);
4170 pLogConfInfo
= (PLOG_CONF_INFO
)lcLogConf
;
4171 if (pLogConfInfo
== NULL
|| pLogConfInfo
->ulMagic
!= LOG_CONF_MAGIC
)
4172 return CR_INVALID_LOG_CONF
;
4175 return CR_INVALID_FLAG
;
4177 if (hMachine
!= NULL
)
4179 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4180 if (BindingHandle
== NULL
)
4183 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4184 if (StringTable
== 0)
4189 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4193 lpDevInst
= pSetupStringTableStringFromId(StringTable
, pLogConfInfo
->dnDevInst
);
4194 if (lpDevInst
== NULL
)
4195 return CR_INVALID_DEVNODE
;
4199 ret
= PNP_GetNextLogConf(BindingHandle
,
4201 pLogConfInfo
->ulFlags
,
4202 pLogConfInfo
->ulTag
,
4206 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4208 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4212 if (ret
!= CR_SUCCESS
)
4217 pNewLogConfInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO
));
4218 if (pNewLogConfInfo
== NULL
)
4219 return CR_OUT_OF_MEMORY
;
4221 pNewLogConfInfo
->ulMagic
= LOG_CONF_MAGIC
;
4222 pNewLogConfInfo
->dnDevInst
= pLogConfInfo
->dnDevInst
;
4223 pNewLogConfInfo
->ulFlags
= pLogConfInfo
->ulFlags
;
4224 pNewLogConfInfo
->ulTag
= ulNewTag
;
4226 *plcLogConf
= (LOG_CONF
)pNewLogConfInfo
;
4233 /***********************************************************************
4234 * CM_Get_Next_Re_Des [SETUPAPI.@]
4236 CONFIGRET WINAPI
CM_Get_Next_Res_Des(
4237 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
4238 PRESOURCEID pResourceID
, ULONG ulFlags
)
4240 TRACE("%p %p %lu %p %lx\n", prdResDes
, rdResDes
, ForResource
,
4241 pResourceID
, ulFlags
);
4242 return CM_Get_Next_Res_Des_Ex(prdResDes
, rdResDes
, ForResource
,
4243 pResourceID
, ulFlags
, NULL
);
4247 /***********************************************************************
4248 * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
4250 CONFIGRET WINAPI
CM_Get_Next_Res_Des_Ex(
4251 PRES_DES prdResDes
, RES_DES rdResDes
, RESOURCEID ForResource
,
4252 PRESOURCEID pResourceID
, ULONG ulFlags
, HMACHINE hMachine
)
4254 FIXME("%p %p %lu %p %lx %lx\n", prdResDes
, rdResDes
, ForResource
,
4255 pResourceID
, ulFlags
, hMachine
);
4257 return CR_CALL_NOT_IMPLEMENTED
;
4261 /***********************************************************************
4262 * CM_Get_Parent [SETUPAPI.@]
4264 CONFIGRET WINAPI
CM_Get_Parent(
4265 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
4267 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
4268 return CM_Get_Parent_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
4272 /***********************************************************************
4273 * CM_Get_Parent_Ex [SETUPAPI.@]
4275 CONFIGRET WINAPI
CM_Get_Parent_Ex(
4276 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4278 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
4279 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4280 HSTRING_TABLE StringTable
= NULL
;
4282 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
4285 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
4287 if (pdnDevInst
== NULL
)
4288 return CR_INVALID_POINTER
;
4291 return CR_INVALID_DEVINST
;
4294 return CR_INVALID_FLAG
;
4298 if (hMachine
!= NULL
)
4300 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4301 if (BindingHandle
== NULL
)
4304 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4305 if (StringTable
== 0)
4310 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4314 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4315 if (lpDevInst
== NULL
)
4316 return CR_INVALID_DEVNODE
;
4320 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
4321 PNP_GET_PARENT_DEVICE_INSTANCE
,
4327 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4329 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4333 if (ret
!= CR_SUCCESS
)
4336 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
4338 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
4342 *pdnDevInst
= dwIndex
;
4348 /***********************************************************************
4349 * CM_Get_Res_Des_Data [SETUPAPI.@]
4351 CONFIGRET WINAPI
CM_Get_Res_Des_Data(
4352 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
)
4354 TRACE("%p %p %l %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
);
4355 return CM_Get_Res_Des_Data_Ex(rdResDes
, Buffer
, BufferLen
, ulFlags
, NULL
);
4359 /***********************************************************************
4360 * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
4362 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Ex(
4363 RES_DES rdResDes
, PVOID Buffer
, ULONG BufferLen
, ULONG ulFlags
,
4366 FIXME("%p %p %l %lx %lx\n", rdResDes
, Buffer
, BufferLen
, ulFlags
, hMachine
);
4367 return CR_CALL_NOT_IMPLEMENTED
;
4371 /***********************************************************************
4372 * CM_Get_Res_Des_Size [SETUPAPI.@]
4374 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size(
4375 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
)
4377 TRACE("%p %p %lx\n", pulSize
, rdResDes
, ulFlags
);
4378 return CM_Get_Res_Des_Data_Size_Ex(pulSize
, rdResDes
, ulFlags
, NULL
);
4382 /***********************************************************************
4383 * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
4385 CONFIGRET WINAPI
CM_Get_Res_Des_Data_Size_Ex(
4386 PULONG pulSize
, RES_DES rdResDes
, ULONG ulFlags
, HMACHINE hMachine
)
4388 TRACE("%p %p %lx %lx\n", pulSize
, rdResDes
, ulFlags
, hMachine
);
4389 return CR_CALL_NOT_IMPLEMENTED
;
4393 /***********************************************************************
4394 * CM_Get_Sibling [SETUPAPI.@]
4396 CONFIGRET WINAPI
CM_Get_Sibling(
4397 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
)
4399 TRACE("%p %p %lx\n", pdnDevInst
, dnDevInst
, ulFlags
);
4400 return CM_Get_Sibling_Ex(pdnDevInst
, dnDevInst
, ulFlags
, NULL
);
4404 /***********************************************************************
4405 * CM_Get_Sibling_Ex [SETUPAPI.@]
4407 CONFIGRET WINAPI
CM_Get_Sibling_Ex(
4408 PDEVINST pdnDevInst
, DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
4410 WCHAR szRelatedDevInst
[MAX_DEVICE_ID_LEN
];
4411 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4412 HSTRING_TABLE StringTable
= NULL
;
4414 DWORD dwIndex
, dwLength
= MAX_DEVICE_ID_LEN
;
4417 TRACE("%p %lx %lx %lx\n", pdnDevInst
, dnDevInst
, ulFlags
, hMachine
);
4419 if (pdnDevInst
== NULL
)
4420 return CR_INVALID_POINTER
;
4423 return CR_INVALID_DEVINST
;
4426 return CR_INVALID_FLAG
;
4430 if (hMachine
!= NULL
)
4432 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4433 if (BindingHandle
== NULL
)
4436 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4437 if (StringTable
== 0)
4442 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4446 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
4447 if (lpDevInst
== NULL
)
4448 return CR_INVALID_DEVNODE
;
4452 ret
= PNP_GetRelatedDeviceInstance(BindingHandle
,
4453 PNP_GET_SIBLING_DEVICE_INSTANCE
,
4459 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4461 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4465 if (ret
!= CR_SUCCESS
)
4468 TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst
));
4470 dwIndex
= pSetupStringTableAddString(StringTable
, szRelatedDevInst
, 1);
4474 *pdnDevInst
= dwIndex
;
4480 /***********************************************************************
4481 * CM_Get_Version [SETUPAPI.@]
4483 WORD WINAPI
CM_Get_Version(VOID
)
4486 return CM_Get_Version_Ex(NULL
);
4490 /***********************************************************************
4491 * CM_Get_Version_Ex [SETUPAPI.@]
4493 WORD WINAPI
CM_Get_Version_Ex(HMACHINE hMachine
)
4495 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4499 TRACE("%lx\n", hMachine
);
4501 if (hMachine
!= NULL
)
4503 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4504 if (BindingHandle
== NULL
)
4509 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4515 ret
= PNP_GetVersion(BindingHandle
, &Version
);
4517 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4519 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4523 if (ret
!= CR_SUCCESS
)
4530 /***********************************************************************
4531 * CM_Intersect_Range_List [SETUPAPI.@]
4535 CM_Intersect_Range_List(
4536 _In_ RANGE_LIST rlhOld1
,
4537 _In_ RANGE_LIST rlhOld2
,
4538 _In_ RANGE_LIST rlhNew
,
4541 FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
4542 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
4543 return CR_CALL_NOT_IMPLEMENTED
;
4547 /***********************************************************************
4548 * CM_Invert_Range_List [SETUPAPI.@]
4552 CM_Invert_Range_List(
4553 _In_ RANGE_LIST rlhOld
,
4554 _In_ RANGE_LIST rlhNew
,
4555 _In_ DWORDLONG ullMaxValue
,
4558 FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
4559 rlhOld
, rlhNew
, ullMaxValue
, ulFlags
);
4560 return CR_CALL_NOT_IMPLEMENTED
;
4564 /***********************************************************************
4565 * CM_Is_Dock_Station_Present [SETUPAPI.@]
4569 CM_Is_Dock_Station_Present(
4570 _Out_ PBOOL pbPresent
)
4572 TRACE("CM_Is_Dock_Station_Present(%p)\n",
4574 return CM_Is_Dock_Station_Present_Ex(pbPresent
, NULL
);
4578 /***********************************************************************
4579 * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
4583 CM_Is_Dock_Station_Present_Ex(
4584 _Out_ PBOOL pbPresent
,
4585 _In_opt_ HMACHINE hMachine
)
4587 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4590 TRACE("CM_Is_Dock_Station_Present_Ex(%p %lx)\n",
4591 pbPresent
, hMachine
);
4593 if (pbPresent
== NULL
)
4594 return CR_INVALID_POINTER
;
4598 if (hMachine
!= NULL
)
4600 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4601 if (BindingHandle
== NULL
)
4606 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4612 ret
= PNP_IsDockStationPresent(BindingHandle
,
4615 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4617 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4625 /***********************************************************************
4626 * CM_Is_Version_Available_Ex [SETUPAPI.@]
4630 CM_Is_Version_Available(
4633 TRACE("CM_Is_Version_Available(%hu)\n",
4635 return CM_Is_Version_Available_Ex(wVersion
, NULL
);
4639 /***********************************************************************
4640 * CM_Is_Version_Available_Ex [SETUPAPI.@]
4644 CM_Is_Version_Available_Ex(
4646 _In_opt_ HMACHINE hMachine
)
4648 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4649 WORD wServerVersion
;
4652 TRACE("CM_Is_Version_Available_Ex(%hu %lx)\n",
4653 wVersion
, hMachine
);
4655 if (wVersion
<= 0x400)
4658 if (hMachine
!= NULL
)
4660 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4661 if (BindingHandle
== NULL
)
4666 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
4672 ret
= PNP_GetVersion(BindingHandle
, &wServerVersion
);
4674 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4676 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4680 if (ret
!= CR_SUCCESS
)
4683 return (wServerVersion
>= wVersion
);
4687 /***********************************************************************
4688 * CM_Locate_DevNodeA [SETUPAPI.@]
4693 _Out_ PDEVINST pdnDevInst
,
4694 _In_opt_ DEVINSTID_A pDeviceID
,
4697 TRACE("CM_Locate_DevNodeA(%p %s %lu)\n",
4698 pdnDevInst
, pDeviceID
, ulFlags
);
4699 return CM_Locate_DevNode_ExA(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
4703 /***********************************************************************
4704 * CM_Locate_DevNodeW [SETUPAPI.@]
4709 _Out_ PDEVINST pdnDevInst
,
4710 _In_opt_ DEVINSTID_W pDeviceID
,
4713 TRACE("CM_Locate_DevNodeW(%p %s %lu)\n",
4714 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
);
4715 return CM_Locate_DevNode_ExW(pdnDevInst
, pDeviceID
, ulFlags
, NULL
);
4719 /***********************************************************************
4720 * CM_Locate_DevNode_ExA [SETUPAPI.@]
4724 CM_Locate_DevNode_ExA(
4725 _Out_ PDEVINST pdnDevInst
,
4726 _In_opt_ DEVINSTID_A pDeviceID
,
4728 _In_opt_ HMACHINE hMachine
)
4730 DEVINSTID_W pDevIdW
= NULL
;
4731 CONFIGRET ret
= CR_SUCCESS
;
4733 TRACE("CM_Locate_DevNode_ExA(%p %s %lu %lx)\n",
4734 pdnDevInst
, pDeviceID
, ulFlags
, hMachine
);
4736 if (pDeviceID
!= NULL
)
4738 if (pSetupCaptureAndConvertAnsiArg(pDeviceID
, &pDevIdW
))
4739 return CR_INVALID_DEVICE_ID
;
4742 ret
= CM_Locate_DevNode_ExW(pdnDevInst
, pDevIdW
, ulFlags
, hMachine
);
4744 if (pDevIdW
!= NULL
)
4751 /***********************************************************************
4752 * CM_Locate_DevNode_ExW [SETUPAPI.@]
4756 CM_Locate_DevNode_ExW(
4757 _Out_ PDEVINST pdnDevInst
,
4758 _In_opt_ DEVINSTID_W pDeviceID
,
4760 _In_opt_ HMACHINE hMachine
)
4762 WCHAR DeviceIdBuffer
[MAX_DEVICE_ID_LEN
];
4763 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4764 HSTRING_TABLE StringTable
= NULL
;
4765 CONFIGRET ret
= CR_SUCCESS
;
4767 TRACE("CM_Locate_DevNode_ExW(%p %s %lu %lx)\n",
4768 pdnDevInst
, debugstr_w(pDeviceID
), ulFlags
, hMachine
);
4770 if (pdnDevInst
== NULL
)
4771 return CR_INVALID_POINTER
;
4773 if (ulFlags
& ~CM_LOCATE_DEVNODE_BITS
)
4774 return CR_INVALID_FLAG
;
4776 if (hMachine
!= NULL
)
4778 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4779 if (BindingHandle
== NULL
)
4782 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4783 if (StringTable
== 0)
4788 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4792 if (pDeviceID
!= NULL
&& lstrlenW(pDeviceID
) != 0)
4794 lstrcpyW(DeviceIdBuffer
, pDeviceID
);
4800 /* Get the root device ID */
4801 ret
= PNP_GetRootDeviceInstance(BindingHandle
,
4805 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4807 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4811 if (ret
!= CR_SUCCESS
)
4814 TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer
));
4818 /* Validate the device ID */
4819 ret
= PNP_ValidateDeviceInstance(BindingHandle
,
4823 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4825 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4829 if (ret
== CR_SUCCESS
)
4831 *pdnDevInst
= pSetupStringTableAddString(StringTable
, DeviceIdBuffer
, 1);
4832 if (*pdnDevInst
== -1)
4840 /***********************************************************************
4841 * CM_Merge_Range_List [SETUPAPI.@]
4845 CM_Merge_Range_List(
4846 _In_ RANGE_LIST rlhOld1
,
4847 _In_ RANGE_LIST rlhOld2
,
4848 _In_ RANGE_LIST rlhNew
,
4851 FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
4852 rlhOld1
, rlhOld2
, rlhNew
, ulFlags
);
4853 return CR_CALL_NOT_IMPLEMENTED
;
4857 /***********************************************************************
4858 * CM_Modify_Res_Des [SETUPAPI.@]
4863 _Out_ PRES_DES prdResDes
,
4864 _In_ RES_DES rdResDes
,
4865 _In_ RESOURCEID ResourceID
,
4866 _In_ PCVOID ResourceData
,
4867 _In_ ULONG ResourceLen
,
4870 TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
4871 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4872 ResourceLen
, ulFlags
);
4873 return CM_Modify_Res_Des_Ex(prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4874 ResourceLen
, ulFlags
, NULL
);
4878 /***********************************************************************
4879 * CM_Modify_Res_Des_Ex [SETUPAPI.@]
4883 CM_Modify_Res_Des_Ex(
4884 _Out_ PRES_DES prdResDes
,
4885 _In_ RES_DES rdResDes
,
4886 _In_ RESOURCEID ResourceID
,
4887 _In_ PCVOID ResourceData
,
4888 _In_ ULONG ResourceLen
,
4890 _In_opt_ HMACHINE hMachine
)
4892 FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %lx)\n",
4893 prdResDes
, rdResDes
, ResourceID
, ResourceData
,
4894 ResourceLen
, ulFlags
, hMachine
);
4895 return CR_CALL_NOT_IMPLEMENTED
;
4899 /***********************************************************************
4900 * CM_Move_DevNode [SETUPAPI.@]
4905 _In_ DEVINST dnFromDevInst
,
4906 _In_ DEVINST dnToDevInst
,
4909 TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
4910 dnFromDevInst
, dnToDevInst
, ulFlags
);
4911 return CM_Move_DevNode_Ex(dnFromDevInst
, dnToDevInst
, ulFlags
, NULL
);
4915 /***********************************************************************
4916 * CM_Move_DevNode_Ex [SETUPAPI.@]
4921 _In_ DEVINST dnFromDevInst
,
4922 _In_ DEVINST dnToDevInst
,
4924 _In_opt_ HMACHINE hMachine
)
4926 RPC_BINDING_HANDLE BindingHandle
= NULL
;
4927 HSTRING_TABLE StringTable
= NULL
;
4928 LPWSTR lpFromDevInst
;
4932 FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %lx)\n",
4933 dnFromDevInst
, dnToDevInst
, ulFlags
, hMachine
);
4935 if (!pSetupIsUserAdmin())
4936 return CR_ACCESS_DENIED
;
4938 if (dnFromDevInst
== 0 || dnToDevInst
== 0)
4939 return CR_INVALID_DEVNODE
;
4942 return CR_INVALID_FLAG
;
4944 if (hMachine
!= NULL
)
4946 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
4947 if (BindingHandle
== NULL
)
4950 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
4951 if (StringTable
== 0)
4956 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
4960 lpFromDevInst
= pSetupStringTableStringFromId(StringTable
, dnFromDevInst
);
4961 if (lpFromDevInst
== NULL
)
4962 return CR_INVALID_DEVNODE
;
4964 lpToDevInst
= pSetupStringTableStringFromId(StringTable
, dnToDevInst
);
4965 if (lpToDevInst
== NULL
)
4966 return CR_INVALID_DEVNODE
;
4970 ret
= PNP_DeviceInstanceAction(BindingHandle
,
4976 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
4978 ret
= RpcStatusToCmStatus(RpcExceptionCode());
4986 /***********************************************************************
4987 * CM_Next_Range [SETUPAPI.@]
4992 _Inout_ PRANGE_ELEMENT preElement
,
4993 _Out_ PDWORDLONG pullStart
,
4994 _Out_ PDWORDLONG pullEnd
,
4997 FIXME("CM_Next_Range(%p %p %p %lx)\n",
4998 preElement
, pullStart
, pullEnd
, ulFlags
);
4999 return CR_CALL_NOT_IMPLEMENTED
;
5003 /***********************************************************************
5004 * CM_Open_Class_KeyA [SETUPAPI.@]
5009 _In_opt_ LPGUID pClassGuid
,
5010 _In_opt_ LPCSTR pszClassName
,
5011 _In_ REGSAM samDesired
,
5012 _In_ REGDISPOSITION Disposition
,
5013 _Out_ PHKEY phkClass
,
5016 TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
5017 debugstr_guid(pClassGuid
), pszClassName
,
5018 samDesired
, Disposition
, phkClass
, ulFlags
);
5020 return CM_Open_Class_Key_ExA(pClassGuid
, pszClassName
, samDesired
,
5021 Disposition
, phkClass
, ulFlags
, NULL
);
5025 /***********************************************************************
5026 * CM_Open_Class_KeyW [SETUPAPI.@]
5031 _In_opt_ LPGUID pClassGuid
,
5032 _In_opt_ LPCWSTR pszClassName
,
5033 _In_ REGSAM samDesired
,
5034 _In_ REGDISPOSITION Disposition
,
5035 _Out_ PHKEY phkClass
,
5038 TRACE("CM_Open_Class_KeyW%p %s %lx %lx %p %lx)\n",
5039 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
5040 samDesired
, Disposition
, phkClass
, ulFlags
);
5042 return CM_Open_Class_Key_ExW(pClassGuid
, pszClassName
, samDesired
,
5043 Disposition
, phkClass
, ulFlags
, NULL
);
5047 /***********************************************************************
5048 * CM_Open_Class_Key_ExA [SETUPAPI.@]
5052 CM_Open_Class_Key_ExA(
5053 _In_opt_ LPGUID pClassGuid
,
5054 _In_opt_ LPCSTR pszClassName
,
5055 _In_ REGSAM samDesired
,
5056 _In_ REGDISPOSITION Disposition
,
5057 _Out_ PHKEY phkClass
,
5059 _In_opt_ HMACHINE hMachine
)
5061 LPWSTR pszClassNameW
= NULL
;
5064 TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %lx)\n",
5065 debugstr_guid(pClassGuid
), pszClassName
,
5066 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
5068 if (pszClassName
!= NULL
)
5070 if (pSetupCaptureAndConvertAnsiArg(pszClassName
, &pszClassNameW
))
5071 return CR_INVALID_DATA
;
5074 ret
= CM_Open_Class_Key_ExW(pClassGuid
, pszClassNameW
, samDesired
,
5075 Disposition
, phkClass
, ulFlags
, hMachine
);
5077 if (pszClassNameW
!= NULL
)
5078 MyFree(pszClassNameW
);
5084 /***********************************************************************
5085 * CM_Open_Class_Key_ExW [SETUPAPI.@]
5089 CM_Open_Class_Key_ExW(
5090 _In_opt_ LPGUID pClassGuid
,
5091 _In_opt_ LPCWSTR pszClassName
,
5092 _In_ REGSAM samDesired
,
5093 _In_ REGDISPOSITION Disposition
,
5094 _Out_ PHKEY phkClass
,
5096 _In_opt_ HMACHINE hMachine
)
5098 WCHAR szKeyName
[MAX_PATH
];
5099 LPWSTR lpGuidString
;
5100 DWORD dwDisposition
;
5104 TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %lx)\n",
5105 debugstr_guid(pClassGuid
), debugstr_w(pszClassName
),
5106 samDesired
, Disposition
, phkClass
, ulFlags
, hMachine
);
5108 /* Check Disposition and ulFlags */
5109 if ((Disposition
& ~RegDisposition_Bits
) ||
5110 (ulFlags
& ~CM_OPEN_CLASS_KEY_BITS
))
5111 return CR_INVALID_FLAG
;
5113 /* Check phkClass */
5114 if (phkClass
== NULL
)
5115 return CR_INVALID_POINTER
;
5119 if (ulFlags
== CM_OPEN_CLASS_KEY_INTERFACE
&&
5120 pszClassName
!= NULL
)
5121 return CR_INVALID_DATA
;
5123 if (hMachine
== NULL
)
5125 hKey
= HKEY_LOCAL_MACHINE
;
5129 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
5132 return CR_REGISTRY_ERROR
;
5135 if (ulFlags
& CM_OPEN_CLASS_KEY_INTERFACE
)
5137 lstrcpyW(szKeyName
, DeviceClasses
);
5141 lstrcpyW(szKeyName
, ControlClass
);
5144 if (pClassGuid
!= NULL
)
5146 if (UuidToStringW((UUID
*)pClassGuid
, &lpGuidString
) != RPC_S_OK
)
5149 return CR_INVALID_DATA
;
5152 lstrcatW(szKeyName
, Backslash
);
5153 lstrcatW(szKeyName
, lpGuidString
);
5156 if (Disposition
== RegDisposition_OpenAlways
)
5158 dwError
= RegCreateKeyExW(hKey
, szKeyName
, 0, NULL
, 0, samDesired
,
5159 NULL
, phkClass
, &dwDisposition
);
5163 dwError
= RegOpenKeyExW(hKey
, szKeyName
, 0, samDesired
, phkClass
);
5168 if (pClassGuid
!= NULL
)
5169 RpcStringFreeW(&lpGuidString
);
5171 if (dwError
!= ERROR_SUCCESS
)
5174 return CR_NO_SUCH_REGISTRY_KEY
;
5177 if (pszClassName
!= NULL
)
5179 RegSetValueExW(*phkClass
, Class
, 0, REG_SZ
, (LPBYTE
)pszClassName
,
5180 (lstrlenW(pszClassName
) + 1) * sizeof(WCHAR
));
5187 /***********************************************************************
5188 * CM_Open_DevNode_Key [SETUPAPI.@]
5192 CM_Open_DevNode_Key(
5193 _In_ DEVINST dnDevNode
,
5194 _In_ REGSAM samDesired
,
5195 _In_ ULONG ulHardwareProfile
,
5196 _In_ REGDISPOSITION Disposition
,
5197 _Out_ PHKEY phkDevice
,
5200 TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
5201 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
);
5202 return CM_Open_DevNode_Key_Ex(dnDevNode
, samDesired
, ulHardwareProfile
,
5203 Disposition
, phkDevice
, ulFlags
, NULL
);
5207 /***********************************************************************
5208 * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
5212 CM_Open_DevNode_Key_Ex(
5213 _In_ DEVINST dnDevNode
,
5214 _In_ REGSAM samDesired
,
5215 _In_ ULONG ulHardwareProfile
,
5216 _In_ REGDISPOSITION Disposition
,
5217 _Out_ PHKEY phkDevice
,
5219 _In_opt_ HMACHINE hMachine
)
5221 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5222 HSTRING_TABLE StringTable
= NULL
;
5223 LPWSTR pszDevInst
, pszKeyPath
= NULL
, pszInstancePath
= NULL
;
5225 DWORD dwDisposition
;
5226 HKEY hRootKey
= NULL
;
5227 CONFIGRET ret
= CR_CALL_NOT_IMPLEMENTED
;
5229 FIXME("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %lx)\n",
5230 dnDevNode
, samDesired
, ulHardwareProfile
, Disposition
, phkDevice
, ulFlags
, hMachine
);
5232 if (phkDevice
== NULL
)
5233 return CR_INVALID_POINTER
;
5238 return CR_INVALID_DEVNODE
;
5240 if (ulFlags
& ~CM_REGISTRY_BITS
)
5241 return CR_INVALID_FLAG
;
5243 if (Disposition
& ~RegDisposition_Bits
)
5244 return CR_INVALID_DATA
;
5246 if (hMachine
!= NULL
)
5248 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5249 if (BindingHandle
== NULL
)
5252 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5253 if (StringTable
== 0)
5258 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5262 pszDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevNode
);
5263 if (pszDevInst
== NULL
)
5264 return CR_INVALID_DEVNODE
;
5266 TRACE("pszDevInst: %S\n", pszDevInst
);
5268 pszKeyPath
= MyMalloc(512 * sizeof(WCHAR
));
5269 if (pszKeyPath
== NULL
)
5271 ret
= CR_OUT_OF_MEMORY
;
5275 pszInstancePath
= MyMalloc(512 * sizeof(WCHAR
));
5276 if (pszInstancePath
== NULL
)
5278 ret
= CR_OUT_OF_MEMORY
;
5282 ret
= GetDeviceInstanceKeyPath(BindingHandle
,
5288 if (ret
!= CR_SUCCESS
)
5291 TRACE("pszKeyPath: %S\n", pszKeyPath
);
5292 TRACE("pszInstancePath: %S\n", pszInstancePath
);
5294 wcscat(pszKeyPath
, L
"\\");
5295 wcscat(pszKeyPath
, pszInstancePath
);
5297 TRACE("pszKeyPath: %S\n", pszKeyPath
);
5299 if (hMachine
== NULL
)
5301 hRootKey
= HKEY_LOCAL_MACHINE
;
5305 if (RegConnectRegistryW(((PMACHINE_INFO
)hMachine
)->szMachineName
,
5309 ret
= CR_REGISTRY_ERROR
;
5314 if (Disposition
== RegDisposition_OpenAlways
)
5316 lError
= RegCreateKeyExW(hRootKey
,
5328 lError
= RegOpenKeyExW(hRootKey
,
5335 if (lError
!= ERROR_SUCCESS
)
5338 ret
= CR_NO_SUCH_REGISTRY_KEY
;
5342 if ((hRootKey
!= NULL
) && (hRootKey
!= HKEY_LOCAL_MACHINE
))
5343 RegCloseKey(hRootKey
);
5345 if (pszInstancePath
!= NULL
)
5346 MyFree(pszInstancePath
);
5348 if (pszKeyPath
!= NULL
)
5355 /***********************************************************************
5356 * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
5358 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeA(
5359 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5360 ULONG ulNameLength
, ULONG ulFlags
)
5362 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
5363 ulNameLength
, ulFlags
);
5365 return CM_Query_And_Remove_SubTree_ExA(dnAncestor
, pVetoType
, pszVetoName
,
5366 ulNameLength
, ulFlags
, NULL
);
5370 /***********************************************************************
5371 * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
5373 CONFIGRET WINAPI
CM_Query_And_Remove_SubTreeW(
5374 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5375 ULONG ulNameLength
, ULONG ulFlags
)
5377 TRACE("%lx %p %s %lu %lx\n", dnAncestor
, pVetoType
,
5378 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
);
5380 return CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, pszVetoName
,
5381 ulNameLength
, ulFlags
, NULL
);
5385 /***********************************************************************
5386 * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
5388 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExA(
5389 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
5390 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5392 LPWSTR lpLocalVetoName
;
5395 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
, pszVetoName
,
5396 ulNameLength
, ulFlags
, hMachine
);
5398 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5399 return CR_INVALID_POINTER
;
5401 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
5402 if (lpLocalVetoName
== NULL
)
5403 return CR_OUT_OF_MEMORY
;
5405 ret
= CM_Query_And_Remove_SubTree_ExW(dnAncestor
, pVetoType
, lpLocalVetoName
,
5406 ulNameLength
, ulFlags
, hMachine
);
5407 if (ret
== CR_REMOVE_VETOED
)
5409 if (WideCharToMultiByte(CP_ACP
,
5420 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
5426 /***********************************************************************
5427 * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
5429 CONFIGRET WINAPI
CM_Query_And_Remove_SubTree_ExW(
5430 DEVINST dnAncestor
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
5431 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
5433 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5434 HSTRING_TABLE StringTable
= NULL
;
5438 TRACE("%lx %p %s %lu %lx %lx\n", dnAncestor
, pVetoType
,
5439 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
5441 if (dnAncestor
== 0)
5442 return CR_INVALID_DEVNODE
;
5444 if (ulFlags
& ~CM_REMOVE_BITS
)
5445 return CR_INVALID_FLAG
;
5447 if (pszVetoName
== NULL
&& ulNameLength
== 0)
5448 return CR_INVALID_POINTER
;
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
, dnAncestor
);
5467 if (lpDevInst
== NULL
)
5468 return CR_INVALID_DEVNODE
;
5472 ret
= PNP_QueryRemove(BindingHandle
,
5479 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5481 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5489 /***********************************************************************
5490 * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
5492 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data(
5493 PVOID pData
, ULONG DataLen
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
5496 TRACE("%p %lu %lx %lu 0x%08lx\n", pData
, DataLen
, dnDevInst
,
5497 ResourceID
, ulFlags
);
5499 return CM_Query_Arbitrator_Free_Data_Ex(pData
, DataLen
, dnDevInst
,
5500 ResourceID
, ulFlags
, NULL
);
5504 /***********************************************************************
5505 * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
5507 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Data_Ex(
5510 IN DEVINST dnDevInst
,
5511 IN RESOURCEID ResourceID
,
5513 IN HMACHINE hMachine
)
5515 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5516 HSTRING_TABLE StringTable
= NULL
;
5520 TRACE("%p %lu %lx %lu 0x%08lx %p\n", pData
, DataLen
, dnDevInst
,
5521 ResourceID
, ulFlags
, hMachine
);
5523 if (pData
== NULL
|| DataLen
== 0)
5524 return CR_INVALID_POINTER
;
5527 return CR_INVALID_DEVINST
;
5529 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
5530 return CR_INVALID_FLAG
;
5532 if (hMachine
!= NULL
)
5534 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5535 if (BindingHandle
== NULL
)
5538 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5539 if (StringTable
== 0)
5544 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5548 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5549 if (lpDevInst
== NULL
)
5550 return CR_INVALID_DEVNODE
;
5554 ret
= PNP_QueryArbitratorFreeData(BindingHandle
,
5561 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5563 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5571 /***********************************************************************
5572 * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
5574 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size(
5575 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
, ULONG ulFlags
)
5577 TRACE("%p %lu %lx 0x%08lx\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
);
5579 return CM_Query_Arbitrator_Free_Size_Ex(pulSize
, dnDevInst
, ResourceID
,
5584 /***********************************************************************
5585 * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
5587 CONFIGRET WINAPI
CM_Query_Arbitrator_Free_Size_Ex(
5588 PULONG pulSize
, DEVINST dnDevInst
, RESOURCEID ResourceID
,
5589 ULONG ulFlags
, HMACHINE hMachine
)
5591 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5592 HSTRING_TABLE StringTable
= NULL
;
5596 TRACE("%p %lu %lx 0x%08lx %p\n", pulSize
, dnDevInst
,ResourceID
, ulFlags
,
5599 if (pulSize
== NULL
)
5600 return CR_INVALID_POINTER
;
5603 return CR_INVALID_DEVINST
;
5605 if (ulFlags
& ~CM_QUERY_ARBITRATOR_BITS
)
5606 return CR_INVALID_FLAG
;
5608 if (hMachine
!= NULL
)
5610 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5611 if (BindingHandle
== NULL
)
5614 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5615 if (StringTable
== 0)
5620 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5624 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5625 if (lpDevInst
== NULL
)
5626 return CR_INVALID_DEVNODE
;
5630 ret
= PNP_QueryArbitratorFreeSize(BindingHandle
,
5636 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5638 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5646 /***********************************************************************
5647 * CM_Query_Remove_SubTree [SETUPAPI.@]
5649 * This function is obsolete in Windows XP and above.
5651 CONFIGRET WINAPI
CM_Query_Remove_SubTree(
5652 DEVINST dnAncestor
, ULONG ulFlags
)
5654 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
5655 return CR_CALL_NOT_IMPLEMENTED
;
5659 /***********************************************************************
5660 * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
5662 * This function is obsolete in Windows XP and above.
5664 CONFIGRET WINAPI
CM_Query_Remove_SubTree_Ex(
5665 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
5667 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
5668 return CR_CALL_NOT_IMPLEMENTED
;
5672 /***********************************************************************
5673 * CM_Reenumerate_DevNode [SETUPAPI.@]
5675 CONFIGRET WINAPI
CM_Reenumerate_DevNode(
5676 DEVINST dnDevInst
, ULONG ulFlags
)
5678 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
5679 return CM_Reenumerate_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
5683 /***********************************************************************
5684 * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
5687 CM_Reenumerate_DevNode_Ex(
5688 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5690 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5691 HSTRING_TABLE StringTable
= NULL
;
5695 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
5698 return CR_INVALID_DEVNODE
;
5700 if (ulFlags
& ~CM_REENUMERATE_BITS
)
5701 return CR_INVALID_FLAG
;
5703 if (hMachine
!= NULL
)
5705 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5706 if (BindingHandle
== NULL
)
5709 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5710 if (StringTable
== 0)
5715 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5719 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5720 if (lpDevInst
== NULL
)
5721 return CR_INVALID_DEVNODE
;
5725 ret
= PNP_DeviceInstanceAction(BindingHandle
,
5726 PNP_DEVINST_REENUMERATE
,
5731 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5733 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5741 /***********************************************************************
5742 * CM_Register_Device_InterfaceA [SETUPAPI.@]
5744 CONFIGRET WINAPI
CM_Register_Device_InterfaceA(
5745 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
5746 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
5748 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5749 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
);
5751 return CM_Register_Device_Interface_ExA(dnDevInst
, InterfaceClassGuid
,
5752 pszReference
, pszDeviceInterface
,
5753 pulLength
, ulFlags
, NULL
);
5757 /***********************************************************************
5758 * CM_Register_Device_InterfaceW [SETUPAPI.@]
5760 CONFIGRET WINAPI
CM_Register_Device_InterfaceW(
5761 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
5762 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
)
5764 TRACE("%lx %s %s %p %p %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5765 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
);
5767 return CM_Register_Device_Interface_ExW(dnDevInst
, InterfaceClassGuid
,
5768 pszReference
, pszDeviceInterface
,
5769 pulLength
, ulFlags
, NULL
);
5773 /***********************************************************************
5774 * CM_Register_Device_Interface_ExA [SETUPAPI.@]
5776 CONFIGRET WINAPI
CM_Register_Device_Interface_ExA(
5777 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCSTR pszReference
,
5778 LPSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
5780 LPWSTR pszReferenceW
= NULL
;
5781 LPWSTR pszDeviceInterfaceW
= NULL
;
5785 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5786 pszReference
, pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
5788 if (pulLength
== NULL
|| pszDeviceInterface
== NULL
)
5789 return CR_INVALID_POINTER
;
5791 if (pszReference
!= NULL
)
5793 if (pSetupCaptureAndConvertAnsiArg(pszReference
, &pszReferenceW
))
5794 return CR_INVALID_DATA
;
5797 ulLength
= *pulLength
;
5799 pszDeviceInterfaceW
= HeapAlloc(GetProcessHeap(), 0, ulLength
* sizeof(WCHAR
));
5800 if (pszDeviceInterfaceW
== NULL
)
5802 ret
= CR_OUT_OF_MEMORY
;
5806 ret
= CM_Register_Device_Interface_ExW(dnDevInst
,
5809 pszDeviceInterfaceW
,
5813 if (ret
== CR_SUCCESS
)
5815 if (WideCharToMultiByte(CP_ACP
,
5817 pszDeviceInterfaceW
,
5826 *pulLength
= ulLength
;
5829 if (pszDeviceInterfaceW
!= NULL
)
5830 HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW
);
5832 if (pszReferenceW
!= NULL
)
5833 MyFree(pszReferenceW
);
5839 /***********************************************************************
5840 * CM_Register_Device_Interface_ExW [SETUPAPI.@]
5842 CONFIGRET WINAPI
CM_Register_Device_Interface_ExW(
5843 DEVINST dnDevInst
, LPGUID InterfaceClassGuid
, LPCWSTR pszReference
,
5844 LPWSTR pszDeviceInterface
, PULONG pulLength
, ULONG ulFlags
, HMACHINE hMachine
)
5846 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5847 HSTRING_TABLE StringTable
= NULL
;
5849 ULONG ulTransferLength
;
5852 TRACE("%lx %s %s %p %p %lx %lx\n", dnDevInst
, debugstr_guid(InterfaceClassGuid
),
5853 debugstr_w(pszReference
), pszDeviceInterface
, pulLength
, ulFlags
, hMachine
);
5856 return CR_INVALID_DEVNODE
;
5858 if (InterfaceClassGuid
== NULL
||
5859 pszDeviceInterface
== NULL
||
5861 return CR_INVALID_POINTER
;
5864 return CR_INVALID_FLAG
;
5866 if (hMachine
!= NULL
)
5868 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5869 if (BindingHandle
== NULL
)
5872 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5873 if (StringTable
== 0)
5878 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5882 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5883 if (lpDevInst
== NULL
)
5884 return CR_INVALID_DEVNODE
;
5886 ulTransferLength
= *pulLength
;
5890 ret
= PNP_RegisterDeviceClassAssociation(BindingHandle
,
5893 (LPWSTR
)pszReference
,
5899 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5901 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5909 /***********************************************************************
5910 * CM_Register_Device_Driver [SETUPAPI.@]
5912 CONFIGRET WINAPI
CM_Register_Device_Driver(
5913 DEVINST dnDevInst
, ULONG ulFlags
)
5915 TRACE("%lx 0x%08lx\n", dnDevInst
, ulFlags
);
5916 return CM_Register_Device_Driver_Ex(dnDevInst
, ulFlags
, NULL
);
5920 /***********************************************************************
5921 * CM_Register_Device_Driver [SETUPAPI.@]
5923 CONFIGRET WINAPI
CM_Register_Device_Driver_Ex(
5924 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
5926 RPC_BINDING_HANDLE BindingHandle
= NULL
;
5927 HSTRING_TABLE StringTable
= NULL
;
5931 TRACE("%lx 0x%08lx %p\n", dnDevInst
, ulFlags
, hMachine
);
5934 return CR_INVALID_DEVNODE
;
5936 if (ulFlags
& ~CM_REGISTER_DEVICE_DRIVER_BITS
)
5937 return CR_INVALID_FLAG
;
5939 if (hMachine
!= NULL
)
5941 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
5942 if (BindingHandle
== NULL
)
5945 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
5946 if (StringTable
== 0)
5951 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
5955 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
5956 if (lpDevInst
== NULL
)
5957 return CR_INVALID_DEVNODE
;
5961 ret
= PNP_RegisterDriver(BindingHandle
,
5965 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
5967 ret
= RpcStatusToCmStatus(RpcExceptionCode());
5975 /***********************************************************************
5976 * CM_Remove_SubTree [SETUPAPI.@]
5978 * This function is obsolete in Windows XP and above.
5980 CONFIGRET WINAPI
CM_Remove_SubTree(
5981 DEVINST dnAncestor
, ULONG ulFlags
)
5983 TRACE("%lx %lx\n", dnAncestor
, ulFlags
);
5984 return CR_CALL_NOT_IMPLEMENTED
;
5988 /***********************************************************************
5989 * CM_Remove_SubTree_Ex [SETUPAPI.@]
5991 * This function is obsolete in Windows XP and above.
5993 CONFIGRET WINAPI
CM_Remove_SubTree_Ex(
5994 DEVINST dnAncestor
, ULONG ulFlags
, HMACHINE hMachine
)
5996 TRACE("%lx %lx %lx\n", dnAncestor
, ulFlags
, hMachine
);
5997 return CR_CALL_NOT_IMPLEMENTED
;
6001 /***********************************************************************
6002 * CM_Request_Device_EjectA [SETUPAPI.@]
6004 CONFIGRET WINAPI
CM_Request_Device_EjectA(
6005 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
6006 ULONG ulNameLength
, ULONG ulFlags
)
6008 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
6009 ulNameLength
, ulFlags
);
6010 return CM_Request_Device_Eject_ExA(dnDevInst
, pVetoType
, pszVetoName
,
6011 ulNameLength
, ulFlags
, NULL
);
6015 /***********************************************************************
6016 * CM_Request_Device_EjectW [SETUPAPI.@]
6018 CONFIGRET WINAPI
CM_Request_Device_EjectW(
6019 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
6020 ULONG ulNameLength
, ULONG ulFlags
)
6022 TRACE("%lx %p %s %lu %lx\n", dnDevInst
, pVetoType
, debugstr_w(pszVetoName
),
6023 ulNameLength
, ulFlags
);
6024 return CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, pszVetoName
,
6025 ulNameLength
, ulFlags
, NULL
);
6029 /***********************************************************************
6030 * CM_Request_Device_Eject_ExA [SETUPAPI.@]
6032 CONFIGRET WINAPI
CM_Request_Device_Eject_ExA(
6033 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPSTR pszVetoName
,
6034 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
6036 LPWSTR lpLocalVetoName
;
6039 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
, pszVetoName
,
6040 ulNameLength
, ulFlags
, hMachine
);
6042 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6043 return CR_INVALID_POINTER
;
6045 lpLocalVetoName
= HeapAlloc(GetProcessHeap(), 0, ulNameLength
* sizeof(WCHAR
));
6046 if (lpLocalVetoName
== NULL
)
6047 return CR_OUT_OF_MEMORY
;
6049 ret
= CM_Request_Device_Eject_ExW(dnDevInst
, pVetoType
, lpLocalVetoName
,
6050 ulNameLength
, ulFlags
, hMachine
);
6051 if (ret
== CR_REMOVE_VETOED
)
6053 if (WideCharToMultiByte(CP_ACP
,
6064 HeapFree(GetProcessHeap(), 0, lpLocalVetoName
);
6070 /***********************************************************************
6071 * CM_Request_Device_Eject_ExW [SETUPAPI.@]
6073 CONFIGRET WINAPI
CM_Request_Device_Eject_ExW(
6074 DEVINST dnDevInst
, PPNP_VETO_TYPE pVetoType
, LPWSTR pszVetoName
,
6075 ULONG ulNameLength
, ULONG ulFlags
, HMACHINE hMachine
)
6077 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6078 HSTRING_TABLE StringTable
= NULL
;
6082 TRACE("%lx %p %s %lu %lx %lx\n", dnDevInst
, pVetoType
,
6083 debugstr_w(pszVetoName
), ulNameLength
, ulFlags
, hMachine
);
6086 return CR_INVALID_DEVNODE
;
6089 return CR_INVALID_FLAG
;
6091 if (pszVetoName
== NULL
&& ulNameLength
== 0)
6092 return CR_INVALID_POINTER
;
6094 if (hMachine
!= NULL
)
6096 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6097 if (BindingHandle
== NULL
)
6100 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6101 if (StringTable
== 0)
6106 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6110 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6111 if (lpDevInst
== NULL
)
6112 return CR_INVALID_DEVNODE
;
6116 ret
= PNP_RequestDeviceEject(BindingHandle
,
6123 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6125 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6133 /***********************************************************************
6134 * CM_Request_Eject_PC [SETUPAPI.@]
6136 CONFIGRET WINAPI
CM_Request_Eject_PC(VOID
)
6139 return CM_Request_Eject_PC_Ex(NULL
);
6143 /***********************************************************************
6144 * CM_Request_Eject_PC_Ex [SETUPAPI.@]
6146 CONFIGRET WINAPI
CM_Request_Eject_PC_Ex(
6149 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6152 TRACE("%lx\n", hMachine
);
6154 if (hMachine
!= NULL
)
6156 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6157 if (BindingHandle
== NULL
)
6162 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6168 ret
= PNP_RequestEjectPC(BindingHandle
);
6170 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6172 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6180 /***********************************************************************
6181 * CM_Run_Detection [SETUPAPI.@]
6183 CONFIGRET WINAPI
CM_Run_Detection(
6186 TRACE("%lx\n", ulFlags
);
6187 return CM_Run_Detection_Ex(ulFlags
, NULL
);
6191 /***********************************************************************
6192 * CM_Run_Detection_Ex [SETUPAPI.@]
6194 CONFIGRET WINAPI
CM_Run_Detection_Ex(
6195 ULONG ulFlags
, HMACHINE hMachine
)
6197 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6200 TRACE("%lx %lx\n", ulFlags
, hMachine
);
6202 if (!pSetupIsUserAdmin())
6203 return CR_ACCESS_DENIED
;
6205 if (ulFlags
& ~CM_DETECT_BITS
)
6206 return CR_INVALID_FLAG
;
6208 if (hMachine
!= NULL
)
6210 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6211 if (BindingHandle
== NULL
)
6216 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6222 ret
= PNP_RunDetection(BindingHandle
,
6225 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6227 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6235 /***********************************************************************
6236 * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
6238 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyA(
6239 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6240 ULONG ulFlags
, HMACHINE hMachine
)
6242 FIXME("%p %lx %p %lu %lx %p\n",
6243 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6244 return CR_CALL_NOT_IMPLEMENTED
;
6248 /***********************************************************************
6249 * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
6251 CONFIGRET WINAPI
CM_Set_Class_Registry_PropertyW(
6252 LPGUID ClassGuid
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6253 ULONG ulFlags
, HMACHINE hMachine
)
6255 FIXME("%p %lx %p %lu %lx %p\n",
6256 ClassGuid
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6257 return CR_CALL_NOT_IMPLEMENTED
;
6261 /***********************************************************************
6262 * CM_Set_DevNode_Problem [SETUPAPI.@]
6264 CONFIGRET WINAPI
CM_Set_DevNode_Problem(
6265 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
)
6267 TRACE("%lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
);
6268 return CM_Set_DevNode_Problem_Ex(dnDevInst
, ulProblem
, ulFlags
, NULL
);
6272 /***********************************************************************
6273 * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
6275 CONFIGRET WINAPI
CM_Set_DevNode_Problem_Ex(
6276 DEVINST dnDevInst
, ULONG ulProblem
, ULONG ulFlags
, HMACHINE hMachine
)
6278 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6279 HSTRING_TABLE StringTable
= NULL
;
6283 TRACE("%lx %lx %lx %lx\n", dnDevInst
, ulProblem
, ulFlags
, hMachine
);
6286 return CR_INVALID_DEVNODE
;
6288 if (ulFlags
& ~CM_SET_DEVNODE_PROBLEM_BITS
)
6289 return CR_INVALID_FLAG
;
6291 if (hMachine
!= NULL
)
6293 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6294 if (BindingHandle
== NULL
)
6297 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6298 if (StringTable
== 0)
6303 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6307 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6308 if (lpDevInst
== NULL
)
6309 return CR_INVALID_DEVNODE
;
6313 ret
= PNP_SetDeviceProblem(BindingHandle
,
6318 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6320 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6328 /***********************************************************************
6329 * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
6331 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyA(
6332 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6335 TRACE("%lx %lu %p %lx %lx\n",
6336 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
6337 return CM_Set_DevNode_Registry_Property_ExA(dnDevInst
, ulProperty
,
6343 /***********************************************************************
6344 * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
6346 CONFIGRET WINAPI
CM_Set_DevNode_Registry_PropertyW(
6347 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6350 TRACE("%lx %lu %p %lx %lx\n",
6351 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
);
6352 return CM_Set_DevNode_Registry_Property_ExW(dnDevInst
, ulProperty
,
6358 /***********************************************************************
6359 * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
6361 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExA(
6362 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6363 ULONG ulFlags
, HMACHINE hMachine
)
6365 CONFIGRET ret
= CR_SUCCESS
;
6369 FIXME("%lx %lu %p %lx %lx %lx\n",
6370 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6372 if (Buffer
== NULL
&& ulLength
!= 0)
6373 return CR_INVALID_POINTER
;
6375 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
6376 return CR_INVALID_PROPERTY
;
6380 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
6389 /* Get property type */
6390 ulType
= GetRegistryPropertyType(ulProperty
);
6392 /* Allocate buffer if needed */
6393 if (ulType
== REG_SZ
||
6394 ulType
== REG_MULTI_SZ
)
6396 lpBuffer
= MyMalloc(ulLength
* sizeof(WCHAR
));
6397 if (lpBuffer
== NULL
)
6399 ret
= CR_OUT_OF_MEMORY
;
6403 if (!MultiByteToWideChar(CP_ACP
, 0, Buffer
,
6404 ulLength
, lpBuffer
, ulLength
))
6411 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
6414 ulLength
* sizeof(WCHAR
),
6423 ret
= CM_Set_DevNode_Registry_Property_ExW(dnDevInst
,
6431 ret
= CR_CALL_NOT_IMPLEMENTED
;
6438 /***********************************************************************
6439 * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
6441 CONFIGRET WINAPI
CM_Set_DevNode_Registry_Property_ExW(
6442 DEVINST dnDevInst
, ULONG ulProperty
, PCVOID Buffer
, ULONG ulLength
,
6443 ULONG ulFlags
, HMACHINE hMachine
)
6445 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6446 HSTRING_TABLE StringTable
= NULL
;
6451 TRACE("%lx %lu %p %lx %lx %lx\n",
6452 dnDevInst
, ulProperty
, Buffer
, ulLength
, ulFlags
, hMachine
);
6455 return CR_INVALID_DEVNODE
;
6457 if (ulProperty
< CM_DRP_MIN
|| ulProperty
> CM_DRP_MAX
)
6458 return CR_INVALID_PROPERTY
;
6460 if (Buffer
!= NULL
&& ulLength
== 0)
6461 return CR_INVALID_POINTER
;
6464 return CR_INVALID_FLAG
;
6466 if (hMachine
!= NULL
)
6468 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6469 if (BindingHandle
== NULL
)
6472 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6473 if (StringTable
== 0)
6478 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6482 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6483 if (lpDevInst
== NULL
)
6484 return CR_INVALID_DEVNODE
;
6486 /* Get property type */
6487 ulType
= GetRegistryPropertyType(ulProperty
);
6491 ret
= PNP_SetDeviceRegProp(BindingHandle
,
6499 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6501 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6509 /***********************************************************************
6510 * CM_Set_HW_Prof [SETUPAPI.@]
6512 CONFIGRET WINAPI
CM_Set_HW_Prof(
6513 ULONG ulHardwareProfile
, ULONG ulFlags
)
6515 TRACE("%lu %lu\n", ulHardwareProfile
, ulFlags
);
6516 return CM_Set_HW_Prof_Ex(ulHardwareProfile
, ulFlags
, NULL
);
6520 /***********************************************************************
6521 * CM_Set_HW_Prof_Ex [SETUPAPI.@]
6523 CONFIGRET WINAPI
CM_Set_HW_Prof_Ex(
6524 ULONG ulHardwareProfile
, ULONG ulFlags
, HMACHINE hMachine
)
6526 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6529 TRACE("%lu %lu %lx\n", ulHardwareProfile
, ulFlags
, hMachine
);
6531 if (!pSetupIsUserAdmin())
6532 return CR_ACCESS_DENIED
;
6535 return CR_INVALID_FLAG
;
6537 if (hMachine
!= NULL
)
6539 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6540 if (BindingHandle
== NULL
)
6545 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6551 ret
= PNP_SetHwProf(BindingHandle
, ulHardwareProfile
, ulFlags
);
6553 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6555 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6563 /***********************************************************************
6564 * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
6566 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsA(
6567 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6570 TRACE("%s %lu %lu %lx\n", szDevInstName
,
6571 ulConfig
, ulValue
, ulFlags
);
6572 return CM_Set_HW_Prof_Flags_ExA(szDevInstName
, ulConfig
, ulValue
,
6577 /***********************************************************************
6578 * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
6580 CONFIGRET WINAPI
CM_Set_HW_Prof_FlagsW(
6581 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6584 TRACE("%s %lu %lu %lx\n", debugstr_w(szDevInstName
),
6585 ulConfig
, ulValue
, ulFlags
);
6586 return CM_Set_HW_Prof_Flags_ExW(szDevInstName
, ulConfig
, ulValue
,
6591 /***********************************************************************
6592 * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
6594 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExA(
6595 DEVINSTID_A szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6596 ULONG ulFlags
, HMACHINE hMachine
)
6598 DEVINSTID_W pszDevIdW
= NULL
;
6599 CONFIGRET ret
= CR_SUCCESS
;
6601 TRACE("%s %lu %lu %lx %lx\n", szDevInstName
,
6602 ulConfig
, ulValue
, ulFlags
, hMachine
);
6604 if (szDevInstName
!= NULL
)
6606 if (pSetupCaptureAndConvertAnsiArg(szDevInstName
, &pszDevIdW
))
6607 return CR_INVALID_DEVICE_ID
;
6610 ret
= CM_Set_HW_Prof_Flags_ExW(pszDevIdW
, ulConfig
, ulValue
,
6613 if (pszDevIdW
!= NULL
)
6620 /***********************************************************************
6621 * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
6623 CONFIGRET WINAPI
CM_Set_HW_Prof_Flags_ExW(
6624 DEVINSTID_W szDevInstName
, ULONG ulConfig
, ULONG ulValue
,
6625 ULONG ulFlags
, HMACHINE hMachine
)
6627 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6630 FIXME("%s %lu %lu %lx %lx\n", debugstr_w(szDevInstName
),
6631 ulConfig
, ulValue
, ulFlags
, hMachine
);
6633 if (szDevInstName
== NULL
)
6634 return CR_INVALID_POINTER
;
6636 if (ulFlags
& ~ CM_SET_HW_PROF_FLAGS_BITS
)
6637 return CR_INVALID_FLAG
;
6639 /* FIXME: Check whether szDevInstName is valid */
6641 if (hMachine
!= NULL
)
6643 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6644 if (BindingHandle
== NULL
)
6649 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6655 ret
= PNP_HwProfFlags(BindingHandle
, PNP_SET_HWPROFFLAGS
, szDevInstName
,
6656 ulConfig
, &ulValue
, NULL
, NULL
, 0, 0);
6658 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6660 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6668 /***********************************************************************
6669 * CM_Setup_DevNode [SETUPAPI.@]
6671 CONFIGRET WINAPI
CM_Setup_DevNode(
6672 DEVINST dnDevInst
, ULONG ulFlags
)
6674 TRACE("%lx %lx\n", dnDevInst
, ulFlags
);
6675 return CM_Setup_DevNode_Ex(dnDevInst
, ulFlags
, NULL
);
6679 /***********************************************************************
6680 * CM_Setup_DevNode_Ex [SETUPAPI.@]
6682 CONFIGRET WINAPI
CM_Setup_DevNode_Ex(
6683 DEVINST dnDevInst
, ULONG ulFlags
, HMACHINE hMachine
)
6685 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6686 HSTRING_TABLE StringTable
= NULL
;
6690 FIXME("%lx %lx %lx\n", dnDevInst
, ulFlags
, hMachine
);
6692 if (!pSetupIsUserAdmin())
6693 return CR_ACCESS_DENIED
;
6696 return CR_INVALID_DEVNODE
;
6698 if (ulFlags
& ~CM_SETUP_BITS
)
6699 return CR_INVALID_FLAG
;
6701 if (hMachine
!= NULL
)
6703 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6704 if (BindingHandle
== NULL
)
6707 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6708 if (StringTable
== 0)
6713 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6717 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnDevInst
);
6718 if (lpDevInst
== NULL
)
6719 return CR_INVALID_DEVNODE
;
6723 ret
= PNP_DeviceInstanceAction(BindingHandle
,
6729 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6731 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6739 /***********************************************************************
6740 * CM_Test_Range_Available [SETUPAPI.@]
6744 CM_Test_Range_Available(
6745 _In_ DWORDLONG ullStartValue
,
6746 _In_ DWORDLONG ullEndValue
,
6747 _In_ RANGE_LIST rlh
,
6750 FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
6751 ullStartValue
, ullEndValue
, rlh
, ulFlags
);
6752 return CR_CALL_NOT_IMPLEMENTED
;
6756 /***********************************************************************
6757 * CM_Uninstall_DevNode [SETUPAPI.@]
6759 CONFIGRET WINAPI
CM_Uninstall_DevNode(
6760 DEVINST dnPhantom
, ULONG ulFlags
)
6762 TRACE("%lx %lx\n", dnPhantom
, ulFlags
);
6763 return CM_Uninstall_DevNode_Ex(dnPhantom
, ulFlags
, NULL
);
6767 /***********************************************************************
6768 * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
6770 CONFIGRET WINAPI
CM_Uninstall_DevNode_Ex(
6771 DEVINST dnPhantom
, ULONG ulFlags
, HMACHINE hMachine
)
6773 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6774 HSTRING_TABLE StringTable
= NULL
;
6778 TRACE("%lx %lx %lx\n", dnPhantom
, ulFlags
, hMachine
);
6781 return CR_INVALID_DEVNODE
;
6784 return CR_INVALID_FLAG
;
6786 if (hMachine
!= NULL
)
6788 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6789 if (BindingHandle
== NULL
)
6792 StringTable
= ((PMACHINE_INFO
)hMachine
)->StringTable
;
6793 if (StringTable
== 0)
6798 if (!PnpGetLocalHandles(&BindingHandle
, &StringTable
))
6802 lpDevInst
= pSetupStringTableStringFromId(StringTable
, dnPhantom
);
6803 if (lpDevInst
== NULL
)
6804 return CR_INVALID_DEVNODE
;
6808 ret
= PNP_UninstallDevInst(BindingHandle
,
6812 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6814 ret
= RpcStatusToCmStatus(RpcExceptionCode());
6822 /***********************************************************************
6823 * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
6825 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceA(
6826 LPCSTR pszDeviceInterface
, ULONG ulFlags
)
6828 TRACE("%s %lx\n", pszDeviceInterface
, ulFlags
);
6830 return CM_Unregister_Device_Interface_ExA(pszDeviceInterface
,
6835 /***********************************************************************
6836 * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
6838 CONFIGRET WINAPI
CM_Unregister_Device_InterfaceW(
6839 LPCWSTR pszDeviceInterface
, ULONG ulFlags
)
6841 TRACE("%s %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
);
6843 return CM_Unregister_Device_Interface_ExW(pszDeviceInterface
,
6848 /***********************************************************************
6849 * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
6851 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExA(
6852 LPCSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
6854 LPWSTR pszDeviceInterfaceW
= NULL
;
6857 TRACE("%s %lx %lx\n", pszDeviceInterface
, ulFlags
, hMachine
);
6859 if (pszDeviceInterface
== NULL
)
6860 return CR_INVALID_POINTER
;
6862 if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface
, &pszDeviceInterfaceW
))
6863 return CR_INVALID_DATA
;
6865 ret
= CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW
,
6868 if (pszDeviceInterfaceW
!= NULL
)
6869 MyFree(pszDeviceInterfaceW
);
6875 /***********************************************************************
6876 * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
6878 CONFIGRET WINAPI
CM_Unregister_Device_Interface_ExW(
6879 LPCWSTR pszDeviceInterface
, ULONG ulFlags
, HMACHINE hMachine
)
6881 RPC_BINDING_HANDLE BindingHandle
= NULL
;
6884 TRACE("%s %lx %lx\n", debugstr_w(pszDeviceInterface
), ulFlags
, hMachine
);
6886 if (pszDeviceInterface
== NULL
)
6887 return CR_INVALID_POINTER
;
6890 return CR_INVALID_FLAG
;
6892 if (hMachine
!= NULL
)
6894 BindingHandle
= ((PMACHINE_INFO
)hMachine
)->BindingHandle
;
6895 if (BindingHandle
== NULL
)
6900 if (!PnpGetLocalHandles(&BindingHandle
, NULL
))
6906 ret
= PNP_UnregisterDeviceClassAssociation(BindingHandle
,
6907 (LPWSTR
)pszDeviceInterface
,
6910 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
6912 ret
= RpcStatusToCmStatus(RpcExceptionCode());