1c2c66affSColin Finck /*
2c2c66affSColin Finck * Configuration manager functions
3c2c66affSColin Finck *
4c2c66affSColin Finck * Copyright 2000 James Hatheway
5c2c66affSColin Finck * Copyright 2005, 2006 Eric Kohl
6c2c66affSColin Finck *
7c2c66affSColin Finck * This library is free software; you can redistribute it and/or
8c2c66affSColin Finck * modify it under the terms of the GNU Lesser General Public
9c2c66affSColin Finck * License as published by the Free Software Foundation; either
10c2c66affSColin Finck * version 2.1 of the License, or (at your option) any later version.
11c2c66affSColin Finck *
12c2c66affSColin Finck * This library is distributed in the hope that it will be useful,
13c2c66affSColin Finck * but WITHOUT ANY WARRANTY; without even the implied warranty of
14c2c66affSColin Finck * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15c2c66affSColin Finck * Lesser General Public License for more details.
16c2c66affSColin Finck *
17c2c66affSColin Finck * You should have received a copy of the GNU Lesser General Public
18c2c66affSColin Finck * License along with this library; if not, write to the Free Software
19c2c66affSColin Finck * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20c2c66affSColin Finck */
21c2c66affSColin Finck
22c2c66affSColin Finck #include "setupapi_private.h"
23c2c66affSColin Finck
24c2c66affSColin Finck #include <dbt.h>
25c2c66affSColin Finck #include <pnp_c.h>
26ece54dcdSEric Kohl #include <winsvc.h>
27c2c66affSColin Finck
28e470b583SJérôme Gardou #include <pseh/pseh2.h>
29e470b583SJérôme Gardou
30c2c66affSColin Finck #include "rpc_private.h"
31c2c66affSColin Finck
32ece54dcdSEric Kohl DWORD
33ece54dcdSEric Kohl WINAPI
34ece54dcdSEric Kohl I_ScPnPGetServiceName(IN SERVICE_STATUS_HANDLE hServiceStatus,
35ece54dcdSEric Kohl OUT LPWSTR lpServiceName,
36ece54dcdSEric Kohl IN DWORD cchServiceName);
37ece54dcdSEric Kohl
38ece54dcdSEric Kohl
39c2c66affSColin Finck /* Registry key and value names */
408da00cd9SHervé Poussineau static const WCHAR BackslashOpenBrace[] = {'\\', '{', 0};
418da00cd9SHervé Poussineau static const WCHAR CloseBrace[] = {'}', 0};
42c2c66affSColin Finck static const WCHAR Class[] = {'C','l','a','s','s',0};
43c2c66affSColin Finck
44c2c66affSColin Finck static const WCHAR ControlClass[] = {'S','y','s','t','e','m','\\',
45c2c66affSColin Finck 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
46c2c66affSColin Finck 'C','o','n','t','r','o','l','\\',
47c2c66affSColin Finck 'C','l','a','s','s',0};
48c2c66affSColin Finck
49c2c66affSColin Finck static const WCHAR DeviceClasses[] = {'S','y','s','t','e','m','\\',
50c2c66affSColin Finck 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
51c2c66affSColin Finck 'C','o','n','t','r','o','l','\\',
52c2c66affSColin Finck 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
53c2c66affSColin Finck
54c2c66affSColin Finck typedef struct _MACHINE_INFO
55c2c66affSColin Finck {
56c2c66affSColin Finck WCHAR szMachineName[SP_MAX_MACHINENAME_LENGTH];
57c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle;
58c2c66affSColin Finck HSTRING_TABLE StringTable;
59c2c66affSColin Finck BOOL bLocal;
60c2c66affSColin Finck } MACHINE_INFO, *PMACHINE_INFO;
61c2c66affSColin Finck
62c2c66affSColin Finck
63c2c66affSColin Finck typedef struct _LOG_CONF_INFO
64c2c66affSColin Finck {
65c2c66affSColin Finck ULONG ulMagic;
66c2c66affSColin Finck DEVINST dnDevInst;
676efb3cbeSEric Kohl ULONG ulType;
68c2c66affSColin Finck ULONG ulTag;
69c2c66affSColin Finck } LOG_CONF_INFO, *PLOG_CONF_INFO;
70c2c66affSColin Finck
71c2c66affSColin Finck #define LOG_CONF_MAGIC 0x464E434C /* "LCNF" */
72c2c66affSColin Finck
73894ad4f1SEric Kohl typedef struct _RES_DES_INFO
74894ad4f1SEric Kohl {
75894ad4f1SEric Kohl ULONG ulMagic;
76894ad4f1SEric Kohl DEVINST dnDevInst;
77894ad4f1SEric Kohl ULONG ulLogConfType;
78894ad4f1SEric Kohl ULONG ulLogConfTag;
79894ad4f1SEric Kohl ULONG ulResDesType;
80894ad4f1SEric Kohl ULONG ulResDesTag;
81894ad4f1SEric Kohl } RES_DES_INFO, *PRES_DES_INFO;
82894ad4f1SEric Kohl
83894ad4f1SEric Kohl #define RES_DES_MAGIC 0x53445352 /* "RSDS" */
84c2c66affSColin Finck
85c2c66affSColin Finck typedef struct _NOTIFY_DATA
86c2c66affSColin Finck {
87c2c66affSColin Finck ULONG ulMagic;
88b0a73746SEric Kohl PVOID hNotifyHandle;
89c2c66affSColin Finck } NOTIFY_DATA, *PNOTIFY_DATA;
90c2c66affSColin Finck
91c2c66affSColin Finck #define NOTIFY_MAGIC 0x44556677
92c2c66affSColin Finck
93c2c66affSColin Finck
943ad5c7fdSEric Kohl typedef struct _INTERNAL_RANGE
95c2c66affSColin Finck {
963ad5c7fdSEric Kohl LIST_ENTRY ListEntry;
97e88a6b20SEric Kohl struct _INTERNAL_RANGE_LIST *pRangeList;
983ad5c7fdSEric Kohl DWORDLONG ullStart;
993ad5c7fdSEric Kohl DWORDLONG ullEnd;
1003ad5c7fdSEric Kohl } INTERNAL_RANGE, *PINTERNAL_RANGE;
101c2c66affSColin Finck
102c2c66affSColin Finck typedef struct _INTERNAL_RANGE_LIST
103c2c66affSColin Finck {
104c2c66affSColin Finck ULONG ulMagic;
1053ad5c7fdSEric Kohl HANDLE hMutex;
1063ad5c7fdSEric Kohl LIST_ENTRY ListHead;
107c2c66affSColin Finck } INTERNAL_RANGE_LIST, *PINTERNAL_RANGE_LIST;
108c2c66affSColin Finck
109c2c66affSColin Finck #define RANGE_LIST_MAGIC 0x33445566
110c2c66affSColin Finck
111cee1817eSEric Kohl typedef struct _CONFLICT_DATA
112cee1817eSEric Kohl {
113cee1817eSEric Kohl ULONG ulMagic;
114cee1817eSEric Kohl PPNP_CONFLICT_LIST pConflictList;
115cee1817eSEric Kohl } CONFLICT_DATA, *PCONFLICT_DATA;
116cee1817eSEric Kohl
117cee1817eSEric Kohl #define CONFLICT_MAGIC 0x11225588
118cee1817eSEric Kohl
119cee1817eSEric Kohl
120cee1817eSEric Kohl /* FUNCTIONS ****************************************************************/
121c2c66affSColin Finck
122d9a33981SEric Kohl static
123d9a33981SEric Kohl BOOL
GuidToString(_In_ LPGUID Guid,_Out_ LPWSTR String)124d9a33981SEric Kohl GuidToString(
125d9a33981SEric Kohl _In_ LPGUID Guid,
126d9a33981SEric Kohl _Out_ LPWSTR String)
127c2c66affSColin Finck {
128c2c66affSColin Finck LPWSTR lpString;
129c2c66affSColin Finck
130c2c66affSColin Finck if (UuidToStringW(Guid, &lpString) != RPC_S_OK)
131c2c66affSColin Finck return FALSE;
132c2c66affSColin Finck
133c2c66affSColin Finck lstrcpyW(&String[1], lpString);
134c2c66affSColin Finck
135c2c66affSColin Finck String[0] = '{';
136c2c66affSColin Finck String[MAX_GUID_STRING_LEN - 2] = '}';
137c2c66affSColin Finck String[MAX_GUID_STRING_LEN - 1] = UNICODE_NULL;
138c2c66affSColin Finck
139c2c66affSColin Finck RpcStringFreeW(&lpString);
140c2c66affSColin Finck
141c2c66affSColin Finck return TRUE;
142c2c66affSColin Finck }
143c2c66affSColin Finck
144c2c66affSColin Finck
145d9a33981SEric Kohl static
146d9a33981SEric Kohl CONFIGRET
RpcStatusToCmStatus(_In_ RPC_STATUS Status)147d9a33981SEric Kohl RpcStatusToCmStatus(
148d9a33981SEric Kohl _In_ RPC_STATUS Status)
149c2c66affSColin Finck {
150c2c66affSColin Finck return CR_FAILURE;
151c2c66affSColin Finck }
152c2c66affSColin Finck
153c2c66affSColin Finck
154c2c66affSColin Finck static
155c2c66affSColin Finck ULONG
GetRegistryPropertyType(_In_ ULONG ulProperty)156c2c66affSColin Finck GetRegistryPropertyType(
157d9a33981SEric Kohl _In_ ULONG ulProperty)
158c2c66affSColin Finck {
159c2c66affSColin Finck switch (ulProperty)
160c2c66affSColin Finck {
161c2c66affSColin Finck case CM_DRP_DEVICEDESC:
162c2c66affSColin Finck case CM_DRP_SERVICE:
163c2c66affSColin Finck case CM_DRP_CLASS:
164c2c66affSColin Finck case CM_DRP_CLASSGUID:
165c2c66affSColin Finck case CM_DRP_DRIVER:
166c2c66affSColin Finck case CM_DRP_MFG:
167c2c66affSColin Finck case CM_DRP_FRIENDLYNAME:
168c2c66affSColin Finck case CM_DRP_LOCATION_INFORMATION:
169c2c66affSColin Finck case CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME:
170c2c66affSColin Finck case CM_DRP_ENUMERATOR_NAME:
171c2c66affSColin Finck case CM_DRP_SECURITY_SDS:
172c2c66affSColin Finck case CM_DRP_UI_NUMBER_DESC_FORMAT:
173c2c66affSColin Finck return REG_SZ;
174c2c66affSColin Finck
175c2c66affSColin Finck case CM_DRP_HARDWAREID:
176c2c66affSColin Finck case CM_DRP_COMPATIBLEIDS:
177c2c66affSColin Finck case CM_DRP_UPPERFILTERS:
178c2c66affSColin Finck case CM_DRP_LOWERFILTERS:
179c2c66affSColin Finck return REG_MULTI_SZ;
180c2c66affSColin Finck
181c2c66affSColin Finck case CM_DRP_CONFIGFLAGS:
182c2c66affSColin Finck case CM_DRP_CAPABILITIES:
183c2c66affSColin Finck case CM_DRP_UI_NUMBER:
184c2c66affSColin Finck case CM_DRP_LEGACYBUSTYPE:
185c2c66affSColin Finck case CM_DRP_BUSNUMBER:
186c2c66affSColin Finck case CM_DRP_DEVTYPE:
187c2c66affSColin Finck case CM_DRP_EXCLUSIVE:
188c2c66affSColin Finck case CM_DRP_CHARACTERISTICS:
189c2c66affSColin Finck case CM_DRP_ADDRESS:
190c2c66affSColin Finck case CM_DRP_REMOVAL_POLICY:
191c2c66affSColin Finck case CM_DRP_REMOVAL_POLICY_HW_DEFAULT:
192c2c66affSColin Finck case CM_DRP_REMOVAL_POLICY_OVERRIDE:
193c2c66affSColin Finck case CM_DRP_INSTALL_STATE:
194c2c66affSColin Finck return REG_DWORD;
195c2c66affSColin Finck
196c2c66affSColin Finck case CM_DRP_BUSTYPEGUID:
197c2c66affSColin Finck case CM_DRP_SECURITY:
198c2c66affSColin Finck case CM_DRP_DEVICE_POWER_DATA:
199c2c66affSColin Finck default:
200c2c66affSColin Finck return REG_BINARY;
201c2c66affSColin Finck }
202c2c66affSColin Finck
203c2c66affSColin Finck return REG_NONE;
204c2c66affSColin Finck }
205c2c66affSColin Finck
206c2c66affSColin Finck
20778cf2a04SEric Kohl static
20878cf2a04SEric Kohl VOID
SplitDeviceInstanceId(_In_ PWSTR pszDeviceInstanceId,_Out_ PWSTR pszDeviceId,_Out_ PWSTR pszInstanceId)20978cf2a04SEric Kohl SplitDeviceInstanceId(
21078cf2a04SEric Kohl _In_ PWSTR pszDeviceInstanceId,
21178cf2a04SEric Kohl _Out_ PWSTR pszDeviceId,
21278cf2a04SEric Kohl _Out_ PWSTR pszInstanceId)
21378cf2a04SEric Kohl {
21478cf2a04SEric Kohl PWCHAR ptr;
21578cf2a04SEric Kohl
21678cf2a04SEric Kohl wcscpy(pszDeviceId, pszDeviceInstanceId);
21778cf2a04SEric Kohl
21878cf2a04SEric Kohl ptr = wcschr(pszDeviceId, L'\\');
21978cf2a04SEric Kohl if (ptr != NULL)
22078cf2a04SEric Kohl {
22178cf2a04SEric Kohl *ptr = UNICODE_NULL;
22278cf2a04SEric Kohl ptr++;
22378cf2a04SEric Kohl
22478cf2a04SEric Kohl wcscpy(pszInstanceId, ptr);
22578cf2a04SEric Kohl }
22678cf2a04SEric Kohl else
22778cf2a04SEric Kohl {
22878cf2a04SEric Kohl *pszInstanceId = UNICODE_NULL;
22978cf2a04SEric Kohl }
23078cf2a04SEric Kohl }
23178cf2a04SEric Kohl
23278cf2a04SEric Kohl
23378cf2a04SEric Kohl static
23478cf2a04SEric Kohl CONFIGRET
GetDeviceInstanceKeyPath(_In_ RPC_BINDING_HANDLE BindingHandle,_In_ PWSTR pszDeviceInst,_Out_ PWSTR pszKeyPath,_Out_ PWSTR pszInstancePath,_In_ ULONG ulHardwareProfile,_In_ ULONG ulFlags)23578cf2a04SEric Kohl GetDeviceInstanceKeyPath(
23678cf2a04SEric Kohl _In_ RPC_BINDING_HANDLE BindingHandle,
23778cf2a04SEric Kohl _In_ PWSTR pszDeviceInst,
23878cf2a04SEric Kohl _Out_ PWSTR pszKeyPath,
23978cf2a04SEric Kohl _Out_ PWSTR pszInstancePath,
24078cf2a04SEric Kohl _In_ ULONG ulHardwareProfile,
24178cf2a04SEric Kohl _In_ ULONG ulFlags)
24278cf2a04SEric Kohl {
24378cf2a04SEric Kohl PWSTR pszBuffer = NULL;
24478cf2a04SEric Kohl ULONG ulType = 0;
24578cf2a04SEric Kohl ULONG ulTransferLength, ulLength;
24678cf2a04SEric Kohl CONFIGRET ret = CR_SUCCESS;
24778cf2a04SEric Kohl
24878cf2a04SEric Kohl TRACE("GetDeviceInstanceKeyPath()\n");
24978cf2a04SEric Kohl
250d57b0ef9SEric Kohl /* Allocate a buffer for the device id */
251d57b0ef9SEric Kohl pszBuffer = MyMalloc(300 * sizeof(WCHAR));
252d57b0ef9SEric Kohl if (pszBuffer == NULL)
253d57b0ef9SEric Kohl {
254d57b0ef9SEric Kohl ERR("MyMalloc() failed\n");
255d57b0ef9SEric Kohl return CR_OUT_OF_MEMORY;
256d57b0ef9SEric Kohl }
257d57b0ef9SEric Kohl
25878cf2a04SEric Kohl if (ulFlags & CM_REGISTRY_SOFTWARE)
25978cf2a04SEric Kohl {
26078cf2a04SEric Kohl /* Software Key Path */
2618e850d19SEric Kohl
26278cf2a04SEric Kohl ulTransferLength = 300 * sizeof(WCHAR);
26378cf2a04SEric Kohl ulLength = 300 * sizeof(WCHAR);
264adc9bd48SEric Kohl
265adc9bd48SEric Kohl RpcTryExcept
266adc9bd48SEric Kohl {
26778cf2a04SEric Kohl ret = PNP_GetDeviceRegProp(BindingHandle,
26878cf2a04SEric Kohl pszDeviceInst,
26978cf2a04SEric Kohl CM_DRP_DRIVER,
27078cf2a04SEric Kohl &ulType,
27178cf2a04SEric Kohl (PVOID)pszBuffer,
27278cf2a04SEric Kohl &ulTransferLength,
27378cf2a04SEric Kohl &ulLength,
27478cf2a04SEric Kohl 0);
275adc9bd48SEric Kohl }
276adc9bd48SEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER)
277adc9bd48SEric Kohl {
278adc9bd48SEric Kohl ret = RpcStatusToCmStatus(RpcExceptionCode());
279adc9bd48SEric Kohl }
280adc9bd48SEric Kohl RpcEndExcept;
281adc9bd48SEric Kohl
28278cf2a04SEric Kohl if (ret != CR_SUCCESS)
28378cf2a04SEric Kohl {
284adc9bd48SEric Kohl RpcTryExcept
285adc9bd48SEric Kohl {
286adc9bd48SEric Kohl ret = PNP_GetClassInstance(BindingHandle,
287adc9bd48SEric Kohl pszDeviceInst,
288adc9bd48SEric Kohl (PVOID)pszBuffer,
289adc9bd48SEric Kohl 300);
290adc9bd48SEric Kohl }
291adc9bd48SEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER)
292adc9bd48SEric Kohl {
293adc9bd48SEric Kohl ret = RpcStatusToCmStatus(RpcExceptionCode());
294adc9bd48SEric Kohl }
295adc9bd48SEric Kohl RpcEndExcept;
296adc9bd48SEric Kohl
297adc9bd48SEric Kohl if (ret != CR_SUCCESS)
298adc9bd48SEric Kohl {
29978cf2a04SEric Kohl goto done;
30078cf2a04SEric Kohl }
301adc9bd48SEric Kohl }
30278cf2a04SEric Kohl
30378cf2a04SEric Kohl TRACE("szBuffer: %S\n", pszBuffer);
30478cf2a04SEric Kohl
30578cf2a04SEric Kohl SplitDeviceInstanceId(pszBuffer,
30678cf2a04SEric Kohl pszBuffer,
30778cf2a04SEric Kohl pszInstancePath);
30878cf2a04SEric Kohl
30978cf2a04SEric Kohl TRACE("szBuffer: %S\n", pszBuffer);
31078cf2a04SEric Kohl
31178cf2a04SEric Kohl if (ulFlags & CM_REGISTRY_CONFIG)
31278cf2a04SEric Kohl {
31378cf2a04SEric Kohl if (ulHardwareProfile == 0)
31478cf2a04SEric Kohl {
31578cf2a04SEric Kohl wsprintfW(pszKeyPath,
31678cf2a04SEric Kohl L"%s\\%s\\%s\\%s",
31778cf2a04SEric Kohl L"System\\CurrentControlSet\\Hardware Profiles",
31878cf2a04SEric Kohl L"Current",
31978cf2a04SEric Kohl L"System\\CurrentControlSet\\Control\\Class",
32078cf2a04SEric Kohl pszBuffer);
32178cf2a04SEric Kohl }
32278cf2a04SEric Kohl else
32378cf2a04SEric Kohl {
32478cf2a04SEric Kohl wsprintfW(pszKeyPath,
32578cf2a04SEric Kohl L"%s\\%04lu\\%s\\%s",
32678cf2a04SEric Kohl L"System\\CurrentControlSet\\Hardware Profiles",
32778cf2a04SEric Kohl ulHardwareProfile,
32878cf2a04SEric Kohl L"System\\CurrentControlSet\\Control\\Class",
32978cf2a04SEric Kohl pszBuffer);
33078cf2a04SEric Kohl }
33178cf2a04SEric Kohl }
33278cf2a04SEric Kohl else
33378cf2a04SEric Kohl {
33478cf2a04SEric Kohl wsprintfW(pszKeyPath,
33578cf2a04SEric Kohl L"%s\\%s",
33678cf2a04SEric Kohl L"System\\CurrentControlSet\\Control\\Class",
33778cf2a04SEric Kohl pszBuffer);
33878cf2a04SEric Kohl }
33978cf2a04SEric Kohl }
3402037bab6SEric Kohl else
3412037bab6SEric Kohl {
3422037bab6SEric Kohl /* Hardware Key Path */
3432037bab6SEric Kohl
3442037bab6SEric Kohl if (ulFlags & CM_REGISTRY_CONFIG)
3452037bab6SEric Kohl {
3462037bab6SEric Kohl SplitDeviceInstanceId(pszDeviceInst,
3472037bab6SEric Kohl pszBuffer,
3482037bab6SEric Kohl pszInstancePath);
3492037bab6SEric Kohl
3502037bab6SEric Kohl if (ulHardwareProfile == 0)
3512037bab6SEric Kohl {
3522037bab6SEric Kohl wsprintfW(pszKeyPath,
3532037bab6SEric Kohl L"%s\\%s\\%s\\%s",
3542037bab6SEric Kohl L"System\\CurrentControlSet\\Hardware Profiles",
3552037bab6SEric Kohl L"Current",
3562037bab6SEric Kohl L"System\\CurrentControlSet\\Enum",
3572037bab6SEric Kohl pszBuffer);
3582037bab6SEric Kohl }
3592037bab6SEric Kohl else
3602037bab6SEric Kohl {
3612037bab6SEric Kohl wsprintfW(pszKeyPath,
3622037bab6SEric Kohl L"%s\\%04lu\\%s\\%s",
3632037bab6SEric Kohl L"System\\CurrentControlSet\\Hardware Profiles",
3642037bab6SEric Kohl ulHardwareProfile,
3652037bab6SEric Kohl L"System\\CurrentControlSet\\Enum",
3662037bab6SEric Kohl pszBuffer);
3672037bab6SEric Kohl }
3682037bab6SEric Kohl }
3692037bab6SEric Kohl else if (ulFlags & CM_REGISTRY_USER)
3702037bab6SEric Kohl {
3712037bab6SEric Kohl wsprintfW(pszKeyPath,
3722037bab6SEric Kohl L"%s\\%s",
3732037bab6SEric Kohl L"System\\CurrentControlSet\\Enum",
3742037bab6SEric Kohl pszDeviceInst);
3752037bab6SEric Kohl
3762037bab6SEric Kohl wcscpy(pszInstancePath,
3772037bab6SEric Kohl L"Device Parameters");
3782037bab6SEric Kohl }
3792037bab6SEric Kohl else
3802037bab6SEric Kohl {
3812037bab6SEric Kohl SplitDeviceInstanceId(pszDeviceInst,
3822037bab6SEric Kohl pszBuffer,
3832037bab6SEric Kohl pszInstancePath);
3842037bab6SEric Kohl
3852037bab6SEric Kohl wsprintfW(pszKeyPath,
3862037bab6SEric Kohl L"%s\\%s",
3872037bab6SEric Kohl L"System\\CurrentControlSet\\Enum",
3882037bab6SEric Kohl pszBuffer);
3892037bab6SEric Kohl }
3902037bab6SEric Kohl }
39178cf2a04SEric Kohl
39278cf2a04SEric Kohl done:
39378cf2a04SEric Kohl if (pszBuffer != NULL)
39478cf2a04SEric Kohl MyFree(pszBuffer);
39578cf2a04SEric Kohl
39678cf2a04SEric Kohl return ret;
39778cf2a04SEric Kohl }
39878cf2a04SEric Kohl
39978cf2a04SEric Kohl
4003ad5c7fdSEric Kohl BOOL
IsValidRangeList(_In_opt_ PINTERNAL_RANGE_LIST pRangeList)4013ad5c7fdSEric Kohl IsValidRangeList(
40219fc20f2SEric Kohl _In_opt_ PINTERNAL_RANGE_LIST pRangeList)
4033ad5c7fdSEric Kohl {
4043ad5c7fdSEric Kohl BOOL bValid = TRUE;
4053ad5c7fdSEric Kohl
4063ad5c7fdSEric Kohl if (pRangeList == NULL)
4073ad5c7fdSEric Kohl return FALSE;
4083ad5c7fdSEric Kohl
4093ad5c7fdSEric Kohl _SEH2_TRY
4103ad5c7fdSEric Kohl {
4113ad5c7fdSEric Kohl if (pRangeList->ulMagic != RANGE_LIST_MAGIC)
4123ad5c7fdSEric Kohl bValid = FALSE;
4133ad5c7fdSEric Kohl }
4143ad5c7fdSEric Kohl _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
4153ad5c7fdSEric Kohl {
4163ad5c7fdSEric Kohl bValid = FALSE;
4173ad5c7fdSEric Kohl }
4183ad5c7fdSEric Kohl _SEH2_END;
4193ad5c7fdSEric Kohl
4203ad5c7fdSEric Kohl return bValid;
4213ad5c7fdSEric Kohl }
4223ad5c7fdSEric Kohl
4233ad5c7fdSEric Kohl
42419fc20f2SEric Kohl BOOL
IsValidLogConf(_In_opt_ PLOG_CONF_INFO pLogConfInfo)42519fc20f2SEric Kohl IsValidLogConf(
42619fc20f2SEric Kohl _In_opt_ PLOG_CONF_INFO pLogConfInfo)
42719fc20f2SEric Kohl {
42819fc20f2SEric Kohl BOOL bValid = TRUE;
42919fc20f2SEric Kohl
43019fc20f2SEric Kohl if (pLogConfInfo == NULL)
43119fc20f2SEric Kohl return FALSE;
43219fc20f2SEric Kohl
43319fc20f2SEric Kohl _SEH2_TRY
43419fc20f2SEric Kohl {
43519fc20f2SEric Kohl if (pLogConfInfo->ulMagic != LOG_CONF_MAGIC)
43619fc20f2SEric Kohl bValid = FALSE;
43719fc20f2SEric Kohl }
43819fc20f2SEric Kohl _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
43919fc20f2SEric Kohl {
44019fc20f2SEric Kohl bValid = FALSE;
44119fc20f2SEric Kohl }
44219fc20f2SEric Kohl _SEH2_END;
44319fc20f2SEric Kohl
44419fc20f2SEric Kohl return bValid;
44519fc20f2SEric Kohl }
44619fc20f2SEric Kohl
44719fc20f2SEric Kohl
448cee1817eSEric Kohl BOOL
IsValidResDes(_In_opt_ PRES_DES_INFO pResDesInfo)449894ad4f1SEric Kohl IsValidResDes(
450894ad4f1SEric Kohl _In_opt_ PRES_DES_INFO pResDesInfo)
451894ad4f1SEric Kohl {
452894ad4f1SEric Kohl BOOL bValid = TRUE;
453894ad4f1SEric Kohl
454894ad4f1SEric Kohl if (pResDesInfo == NULL)
455894ad4f1SEric Kohl return FALSE;
456894ad4f1SEric Kohl
457894ad4f1SEric Kohl _SEH2_TRY
458894ad4f1SEric Kohl {
459894ad4f1SEric Kohl if (pResDesInfo->ulMagic != RES_DES_MAGIC)
460894ad4f1SEric Kohl bValid = FALSE;
461894ad4f1SEric Kohl }
462894ad4f1SEric Kohl _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
463894ad4f1SEric Kohl {
464894ad4f1SEric Kohl bValid = FALSE;
465894ad4f1SEric Kohl }
466894ad4f1SEric Kohl _SEH2_END;
467894ad4f1SEric Kohl
468894ad4f1SEric Kohl return bValid;
469894ad4f1SEric Kohl }
470894ad4f1SEric Kohl
471894ad4f1SEric Kohl
472894ad4f1SEric Kohl BOOL
IsValidConflictData(_In_opt_ PCONFLICT_DATA pConflictData)473cee1817eSEric Kohl IsValidConflictData(
474cee1817eSEric Kohl _In_opt_ PCONFLICT_DATA pConflictData)
475cee1817eSEric Kohl {
476cee1817eSEric Kohl BOOL bValid = TRUE;
477cee1817eSEric Kohl
478cee1817eSEric Kohl if (pConflictData == NULL)
479cee1817eSEric Kohl return FALSE;
480cee1817eSEric Kohl
481cee1817eSEric Kohl _SEH2_TRY
482cee1817eSEric Kohl {
483cee1817eSEric Kohl if (pConflictData->ulMagic != CONFLICT_MAGIC)
484cee1817eSEric Kohl bValid = FALSE;
485cee1817eSEric Kohl }
486cee1817eSEric Kohl _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
487cee1817eSEric Kohl {
488cee1817eSEric Kohl bValid = FALSE;
489cee1817eSEric Kohl }
490cee1817eSEric Kohl _SEH2_END;
491cee1817eSEric Kohl
492cee1817eSEric Kohl return bValid;
493cee1817eSEric Kohl }
494cee1817eSEric Kohl
495cee1817eSEric Kohl
496c2c66affSColin Finck /***********************************************************************
497c2c66affSColin Finck * CMP_GetBlockedDriverInfo [SETUPAPI.@]
498c2c66affSColin Finck */
499c2c66affSColin Finck CONFIGRET
500c2c66affSColin Finck WINAPI
CMP_GetBlockedDriverInfo(_Out_opt_ LPWSTR pszNames,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)501c2c66affSColin Finck CMP_GetBlockedDriverInfo(
502c2c66affSColin Finck _Out_opt_ LPWSTR pszNames,
503c2c66affSColin Finck _Inout_ PULONG pulLength,
504c2c66affSColin Finck _In_ ULONG ulFlags,
505c2c66affSColin Finck _In_opt_ HMACHINE hMachine)
506c2c66affSColin Finck {
507c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
508c2c66affSColin Finck ULONG ulTransferLength;
509c2c66affSColin Finck CONFIGRET ret;
510c2c66affSColin Finck
511c2c66affSColin Finck TRACE("CMP_GetBlockedDriverInfo(%p %p %lx %p)\n",
512c2c66affSColin Finck pszNames, pulLength, ulFlags, hMachine);
513c2c66affSColin Finck
514c2c66affSColin Finck if (hMachine != NULL)
515c2c66affSColin Finck {
516c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
517c2c66affSColin Finck if (BindingHandle == NULL)
518c2c66affSColin Finck return CR_FAILURE;
519c2c66affSColin Finck }
520c2c66affSColin Finck else
521c2c66affSColin Finck {
522c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
523c2c66affSColin Finck return CR_FAILURE;
524c2c66affSColin Finck }
525c2c66affSColin Finck
526c2c66affSColin Finck ulTransferLength = *pulLength;
527c2c66affSColin Finck
528c2c66affSColin Finck RpcTryExcept
529c2c66affSColin Finck {
530c2c66affSColin Finck ret = PNP_GetBlockedDriverInfo(BindingHandle,
531c2c66affSColin Finck (PBYTE)pszNames,
532c2c66affSColin Finck &ulTransferLength,
533c2c66affSColin Finck pulLength,
534c2c66affSColin Finck ulFlags);
535c2c66affSColin Finck }
536c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
537c2c66affSColin Finck {
538c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
539c2c66affSColin Finck }
540c2c66affSColin Finck RpcEndExcept;
541c2c66affSColin Finck
542c2c66affSColin Finck return ret;
543c2c66affSColin Finck }
544c2c66affSColin Finck
545c2c66affSColin Finck
546c2c66affSColin Finck /***********************************************************************
547c2c66affSColin Finck * CMP_GetServerSideDeviceInstallFlags [SETUPAPI.@]
548c2c66affSColin Finck */
549c2c66affSColin Finck CONFIGRET
550c2c66affSColin Finck WINAPI
CMP_GetServerSideDeviceInstallFlags(_Out_ PULONG pulSSDIFlags,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)551c2c66affSColin Finck CMP_GetServerSideDeviceInstallFlags(
552c2c66affSColin Finck _Out_ PULONG pulSSDIFlags,
553c2c66affSColin Finck _In_ ULONG ulFlags,
554c2c66affSColin Finck _In_opt_ HMACHINE hMachine)
555c2c66affSColin Finck {
556c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
557c2c66affSColin Finck CONFIGRET ret;
558c2c66affSColin Finck
559c2c66affSColin Finck TRACE("CMP_GetServerSideDeviceInstallFlags(%p %lx %p)\n",
560c2c66affSColin Finck pulSSDIFlags, ulFlags, hMachine);
561c2c66affSColin Finck
562c2c66affSColin Finck if (pulSSDIFlags == NULL)
563c2c66affSColin Finck return CR_INVALID_POINTER;
564c2c66affSColin Finck
565c2c66affSColin Finck if (ulFlags != 0)
566c2c66affSColin Finck return CR_INVALID_FLAG;
567c2c66affSColin Finck
568c2c66affSColin Finck if (hMachine != NULL)
569c2c66affSColin Finck {
570c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
571c2c66affSColin Finck if (BindingHandle == NULL)
572c2c66affSColin Finck return CR_FAILURE;
573c2c66affSColin Finck }
574c2c66affSColin Finck else
575c2c66affSColin Finck {
576c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
577c2c66affSColin Finck return CR_FAILURE;
578c2c66affSColin Finck }
579c2c66affSColin Finck
580c2c66affSColin Finck RpcTryExcept
581c2c66affSColin Finck {
582c2c66affSColin Finck ret = PNP_GetServerSideDeviceInstallFlags(BindingHandle,
583c2c66affSColin Finck pulSSDIFlags,
584c2c66affSColin Finck ulFlags);
585c2c66affSColin Finck }
586c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
587c2c66affSColin Finck {
588c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
589c2c66affSColin Finck }
590c2c66affSColin Finck RpcEndExcept;
591c2c66affSColin Finck
592c2c66affSColin Finck return ret;
593c2c66affSColin Finck }
594c2c66affSColin Finck
595c2c66affSColin Finck
596c2c66affSColin Finck /***********************************************************************
597c2c66affSColin Finck * CMP_Init_Detection [SETUPAPI.@]
598c2c66affSColin Finck */
599c2c66affSColin Finck CONFIGRET
600c2c66affSColin Finck WINAPI
CMP_Init_Detection(_In_ ULONG ulMagic)601c2c66affSColin Finck CMP_Init_Detection(
602c2c66affSColin Finck _In_ ULONG ulMagic)
603c2c66affSColin Finck {
604c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
605c2c66affSColin Finck CONFIGRET ret;
606c2c66affSColin Finck
607c2c66affSColin Finck TRACE("CMP_Init_Detection(%lu)\n", ulMagic);
608c2c66affSColin Finck
609c2c66affSColin Finck if (ulMagic != CMP_MAGIC)
610c2c66affSColin Finck return CR_INVALID_DATA;
611c2c66affSColin Finck
612c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
613c2c66affSColin Finck return CR_FAILURE;
614c2c66affSColin Finck
615c2c66affSColin Finck RpcTryExcept
616c2c66affSColin Finck {
617c2c66affSColin Finck ret = PNP_InitDetection(BindingHandle);
618c2c66affSColin Finck }
619c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
620c2c66affSColin Finck {
621c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
622c2c66affSColin Finck }
623c2c66affSColin Finck RpcEndExcept;
624c2c66affSColin Finck
625c2c66affSColin Finck return ret;
626c2c66affSColin Finck }
627c2c66affSColin Finck
628c2c66affSColin Finck
629c2c66affSColin Finck /***********************************************************************
630c2c66affSColin Finck * CMP_RegisterNotification [SETUPAPI.@]
631c2c66affSColin Finck */
632c2c66affSColin Finck CONFIGRET
633c2c66affSColin Finck WINAPI
CMP_RegisterNotification(_In_ HANDLE hRecipient,_In_ LPVOID lpvNotificationFilter,_In_ ULONG ulFlags,_Out_ PHDEVNOTIFY phDevNotify)634c2c66affSColin Finck CMP_RegisterNotification(
635c2c66affSColin Finck _In_ HANDLE hRecipient,
636c2c66affSColin Finck _In_ LPVOID lpvNotificationFilter,
637c2c66affSColin Finck _In_ ULONG ulFlags,
638c2c66affSColin Finck _Out_ PHDEVNOTIFY phDevNotify)
639c2c66affSColin Finck {
640c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
6418943354dSSerge Gautherie PNOTIFY_DATA pNotifyData;
642ece54dcdSEric Kohl WCHAR szNameBuffer[256];
64386e8a477SEric Kohl INT nLength;
6447eb6e426SEric Kohl DWORD ulUnknown9 = 0;
64586e8a477SEric Kohl DWORD dwError;
646c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
647c2c66affSColin Finck
6487eb6e426SEric Kohl FIXME("CMP_RegisterNotification(%p %p %lu %p)\n",
649c2c66affSColin Finck hRecipient, lpvNotificationFilter, ulFlags, phDevNotify);
650c2c66affSColin Finck
651c2c66affSColin Finck if ((hRecipient == NULL) ||
652c2c66affSColin Finck (lpvNotificationFilter == NULL) ||
653c2c66affSColin Finck (phDevNotify == NULL))
654c2c66affSColin Finck return CR_INVALID_POINTER;
655c2c66affSColin Finck
656c2c66affSColin Finck if (ulFlags & ~0x7)
657c2c66affSColin Finck return CR_INVALID_FLAG;
658c2c66affSColin Finck
659c2c66affSColin Finck if (((PDEV_BROADCAST_HDR)lpvNotificationFilter)->dbch_size < sizeof(DEV_BROADCAST_HDR))
660c2c66affSColin Finck return CR_INVALID_DATA;
661c2c66affSColin Finck
662c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
663c2c66affSColin Finck return CR_FAILURE;
664c2c66affSColin Finck
665c2c66affSColin Finck pNotifyData = HeapAlloc(GetProcessHeap(),
666c2c66affSColin Finck HEAP_ZERO_MEMORY,
667c2c66affSColin Finck sizeof(NOTIFY_DATA));
668c2c66affSColin Finck if (pNotifyData == NULL)
669c2c66affSColin Finck return CR_OUT_OF_MEMORY;
670c2c66affSColin Finck
671c2c66affSColin Finck pNotifyData->ulMagic = NOTIFY_MAGIC;
672b0a73746SEric Kohl pNotifyData->hNotifyHandle = NULL;
673c2c66affSColin Finck
6749277f535SEric Kohl ZeroMemory(szNameBuffer, sizeof(szNameBuffer));
6759277f535SEric Kohl
676ece54dcdSEric Kohl if ((ulFlags & DEVICE_NOTIFY_SERVICE_HANDLE) == DEVICE_NOTIFY_WINDOW_HANDLE)
677c2c66affSColin Finck {
678ece54dcdSEric Kohl FIXME("Register a window\n");
679c2c66affSColin Finck
68086e8a477SEric Kohl nLength = GetWindowTextW((HWND)hRecipient,
68186e8a477SEric Kohl szNameBuffer,
68286e8a477SEric Kohl ARRAYSIZE(szNameBuffer));
68386e8a477SEric Kohl if (nLength == 0)
68486e8a477SEric Kohl {
6859277f535SEric Kohl szNameBuffer[0] = UNICODE_NULL;
68686e8a477SEric Kohl }
68786e8a477SEric Kohl
68886e8a477SEric Kohl FIXME("Register window: %S\n", szNameBuffer);
689c2c66affSColin Finck }
690ece54dcdSEric Kohl else if ((ulFlags & DEVICE_NOTIFY_SERVICE_HANDLE) == DEVICE_NOTIFY_SERVICE_HANDLE)
691c2c66affSColin Finck {
692ece54dcdSEric Kohl FIXME("Register a service\n");
693c2c66affSColin Finck
694ece54dcdSEric Kohl dwError = I_ScPnPGetServiceName((SERVICE_STATUS_HANDLE)hRecipient,
695ece54dcdSEric Kohl szNameBuffer,
696ece54dcdSEric Kohl ARRAYSIZE(szNameBuffer));
697ece54dcdSEric Kohl if (dwError != ERROR_SUCCESS)
698ece54dcdSEric Kohl {
699ece54dcdSEric Kohl HeapFree(GetProcessHeap(), 0, pNotifyData);
700ece54dcdSEric Kohl return CR_INVALID_DATA;
701c2c66affSColin Finck }
702ece54dcdSEric Kohl
703ece54dcdSEric Kohl FIXME("Register service: %S\n", szNameBuffer);
704ece54dcdSEric Kohl }
705c2c66affSColin Finck
706c2c66affSColin Finck RpcTryExcept
707c2c66affSColin Finck {
708c2c66affSColin Finck ret = PNP_RegisterNotification(BindingHandle,
70971df39b0SEric Kohl (DWORD_PTR)hRecipient,
710ece54dcdSEric Kohl szNameBuffer,
711ca040613SEric Kohl (BYTE*)lpvNotificationFilter,
712ca040613SEric Kohl ((DEV_BROADCAST_HDR*)lpvNotificationFilter)->dbch_size,
713c2c66affSColin Finck ulFlags,
714b0a73746SEric Kohl &pNotifyData->hNotifyHandle,
7157faca935SEric Kohl GetCurrentProcessId(),
716ece54dcdSEric Kohl &ulUnknown9); /* ??? */
717c2c66affSColin Finck }
718c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
719c2c66affSColin Finck {
720c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
721c2c66affSColin Finck }
722c2c66affSColin Finck RpcEndExcept;
723c2c66affSColin Finck
724c2c66affSColin Finck if (ret == CR_SUCCESS)
725c2c66affSColin Finck {
726b0a73746SEric Kohl TRACE("hNotifyHandle: %p\n", pNotifyData->hNotifyHandle);
727c2c66affSColin Finck *phDevNotify = (HDEVNOTIFY)pNotifyData;
728c2c66affSColin Finck }
729c2c66affSColin Finck else
730c2c66affSColin Finck {
731c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, pNotifyData);
732c2c66affSColin Finck
733c2c66affSColin Finck *phDevNotify = (HDEVNOTIFY)NULL;
734c2c66affSColin Finck }
735c2c66affSColin Finck
736c2c66affSColin Finck return ret;
737c2c66affSColin Finck }
738c2c66affSColin Finck
739c2c66affSColin Finck
740c2c66affSColin Finck /***********************************************************************
741c2c66affSColin Finck * CMP_Report_LogOn [SETUPAPI.@]
742c2c66affSColin Finck */
743c2c66affSColin Finck CONFIGRET
744c2c66affSColin Finck WINAPI
CMP_Report_LogOn(_In_ DWORD dwMagic,_In_ DWORD dwProcessId)745c2c66affSColin Finck CMP_Report_LogOn(
746c2c66affSColin Finck _In_ DWORD dwMagic,
747c2c66affSColin Finck _In_ DWORD dwProcessId)
748c2c66affSColin Finck {
749c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
750c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
751c2c66affSColin Finck BOOL bAdmin;
752c2c66affSColin Finck DWORD i;
753c2c66affSColin Finck
754c2c66affSColin Finck TRACE("CMP_Report_LogOn(%lu %lu)\n", dwMagic, dwProcessId);
755c2c66affSColin Finck
756c2c66affSColin Finck if (dwMagic != CMP_MAGIC)
757c2c66affSColin Finck return CR_INVALID_DATA;
758c2c66affSColin Finck
759c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
760c2c66affSColin Finck return CR_FAILURE;
761c2c66affSColin Finck
762c2c66affSColin Finck bAdmin = pSetupIsUserAdmin();
763c2c66affSColin Finck
764c2c66affSColin Finck for (i = 0; i < 30; i++)
765c2c66affSColin Finck {
766c2c66affSColin Finck RpcTryExcept
767c2c66affSColin Finck {
768c2c66affSColin Finck ret = PNP_ReportLogOn(BindingHandle,
769c2c66affSColin Finck bAdmin,
770c2c66affSColin Finck dwProcessId);
771c2c66affSColin Finck }
772c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
773c2c66affSColin Finck {
774c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
775c2c66affSColin Finck }
776c2c66affSColin Finck RpcEndExcept;
777c2c66affSColin Finck
778c2c66affSColin Finck if (ret == CR_SUCCESS)
779c2c66affSColin Finck break;
780c2c66affSColin Finck
781c2c66affSColin Finck Sleep(5000);
782c2c66affSColin Finck }
783c2c66affSColin Finck
784c2c66affSColin Finck return ret;
785c2c66affSColin Finck }
786c2c66affSColin Finck
787c2c66affSColin Finck
788c2c66affSColin Finck /***********************************************************************
789c2c66affSColin Finck * CMP_UnregisterNotification [SETUPAPI.@]
790c2c66affSColin Finck */
791c2c66affSColin Finck CONFIGRET
792c2c66affSColin Finck WINAPI
CMP_UnregisterNotification(_In_ HDEVNOTIFY hDevNotify)793c2c66affSColin Finck CMP_UnregisterNotification(
794c2c66affSColin Finck _In_ HDEVNOTIFY hDevNotify)
795c2c66affSColin Finck {
796c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
797c2c66affSColin Finck PNOTIFY_DATA pNotifyData;
798c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
799c2c66affSColin Finck
800c2c66affSColin Finck TRACE("CMP_UnregisterNotification(%p)\n", hDevNotify);
801c2c66affSColin Finck
802c2c66affSColin Finck pNotifyData = (PNOTIFY_DATA)hDevNotify;
803c2c66affSColin Finck
804c2c66affSColin Finck if ((pNotifyData == NULL) ||
805c2c66affSColin Finck (pNotifyData->ulMagic != NOTIFY_MAGIC))
806c2c66affSColin Finck return CR_INVALID_POINTER;
807c2c66affSColin Finck
808c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
809c2c66affSColin Finck return CR_FAILURE;
810c2c66affSColin Finck
811c2c66affSColin Finck RpcTryExcept
812c2c66affSColin Finck {
813c2c66affSColin Finck ret = PNP_UnregisterNotification(BindingHandle,
814b0a73746SEric Kohl &pNotifyData->hNotifyHandle);
815c2c66affSColin Finck }
816c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
817c2c66affSColin Finck {
818c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
819c2c66affSColin Finck }
820c2c66affSColin Finck RpcEndExcept;
821c2c66affSColin Finck
822c2c66affSColin Finck if (ret == CR_SUCCESS)
823b0a73746SEric Kohl {
824b0a73746SEric Kohl pNotifyData->hNotifyHandle = NULL;
825c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, pNotifyData);
826b0a73746SEric Kohl }
827c2c66affSColin Finck
828c2c66affSColin Finck return ret;
829c2c66affSColin Finck }
830c2c66affSColin Finck
831c2c66affSColin Finck
832c2c66affSColin Finck /***********************************************************************
833c2c66affSColin Finck * CMP_WaitNoPendingInstallEvents [SETUPAPI.@]
834c2c66affSColin Finck */
835c2c66affSColin Finck DWORD
836c2c66affSColin Finck WINAPI
CMP_WaitNoPendingInstallEvents(_In_ DWORD dwTimeout)837c2c66affSColin Finck CMP_WaitNoPendingInstallEvents(
838c2c66affSColin Finck _In_ DWORD dwTimeout)
839c2c66affSColin Finck {
840c2c66affSColin Finck HANDLE hEvent;
841c2c66affSColin Finck DWORD ret;
842c2c66affSColin Finck
843c2c66affSColin Finck TRACE("CMP_WaitNoPendingInstallEvents(%lu)\n", dwTimeout);
844c2c66affSColin Finck
845c2c66affSColin Finck hEvent = OpenEventW(SYNCHRONIZE, FALSE, L"Global\\PnP_No_Pending_Install_Events");
846c2c66affSColin Finck if (hEvent == NULL)
847c2c66affSColin Finck return WAIT_FAILED;
848c2c66affSColin Finck
849c2c66affSColin Finck ret = WaitForSingleObject(hEvent, dwTimeout);
850c2c66affSColin Finck CloseHandle(hEvent);
851c2c66affSColin Finck return ret;
852c2c66affSColin Finck }
853c2c66affSColin Finck
854c2c66affSColin Finck
855c2c66affSColin Finck /***********************************************************************
856c2c66affSColin Finck * CMP_WaitServicesAvailable [SETUPAPI.@]
857c2c66affSColin Finck */
858c2c66affSColin Finck CONFIGRET
859c2c66affSColin Finck WINAPI
CMP_WaitServicesAvailable(_In_opt_ HMACHINE hMachine)860c2c66affSColin Finck CMP_WaitServicesAvailable(
861c2c66affSColin Finck _In_opt_ HMACHINE hMachine)
862c2c66affSColin Finck {
863c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
864c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
865c2c66affSColin Finck WORD Version;
866c2c66affSColin Finck
867c2c66affSColin Finck TRACE("CMP_WaitServicesAvailable(%p)\n", hMachine);
868c2c66affSColin Finck
869c2c66affSColin Finck if (hMachine != NULL)
870c2c66affSColin Finck {
871c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
872c2c66affSColin Finck if (BindingHandle == NULL)
873c2c66affSColin Finck return CR_FAILURE;
874c2c66affSColin Finck }
875c2c66affSColin Finck else
876c2c66affSColin Finck {
877c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
878c2c66affSColin Finck return CR_FAILURE;
879c2c66affSColin Finck }
880c2c66affSColin Finck
881c2c66affSColin Finck RpcTryExcept
882c2c66affSColin Finck {
883c2c66affSColin Finck ret = PNP_GetVersion(BindingHandle, &Version);
884c2c66affSColin Finck }
885c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
886c2c66affSColin Finck {
887c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
888c2c66affSColin Finck }
889c2c66affSColin Finck RpcEndExcept;
890c2c66affSColin Finck
891c2c66affSColin Finck return ret;
892c2c66affSColin Finck }
893c2c66affSColin Finck
894c2c66affSColin Finck
895c2c66affSColin Finck /***********************************************************************
896c2c66affSColin Finck * CM_Add_Empty_Log_Conf [SETUPAPI.@]
897c2c66affSColin Finck */
898d9a33981SEric Kohl CONFIGRET
899d9a33981SEric Kohl WINAPI
CM_Add_Empty_Log_Conf(_Out_ PLOG_CONF plcLogConf,_In_ DEVINST dnDevInst,_In_ PRIORITY Priority,_In_ ULONG ulFlags)900d9a33981SEric Kohl CM_Add_Empty_Log_Conf(
901d9a33981SEric Kohl _Out_ PLOG_CONF plcLogConf,
902d9a33981SEric Kohl _In_ DEVINST dnDevInst,
903d9a33981SEric Kohl _In_ PRIORITY Priority,
904d9a33981SEric Kohl _In_ ULONG ulFlags)
905c2c66affSColin Finck {
906d9a33981SEric Kohl TRACE("CM_Add_Empty_Log_Conf(%p %p %lu %lx)\n",
907d9a33981SEric Kohl plcLogConf, dnDevInst, Priority, ulFlags);
90865d3bf74SEric Kohl
909c2c66affSColin Finck return CM_Add_Empty_Log_Conf_Ex(plcLogConf, dnDevInst, Priority,
910c2c66affSColin Finck ulFlags, NULL);
911c2c66affSColin Finck }
912c2c66affSColin Finck
913c2c66affSColin Finck
914c2c66affSColin Finck /***********************************************************************
915c2c66affSColin Finck * CM_Add_Empty_Log_Conf_Ex [SETUPAPI.@]
916c2c66affSColin Finck */
917d9a33981SEric Kohl CONFIGRET
918adc9bd48SEric Kohl WINAPI
CM_Add_Empty_Log_Conf_Ex(_Out_ PLOG_CONF plcLogConf,_In_ DEVINST dnDevInst,_In_ PRIORITY Priority,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)919adc9bd48SEric Kohl CM_Add_Empty_Log_Conf_Ex(
920d9a33981SEric Kohl _Out_ PLOG_CONF plcLogConf,
921d9a33981SEric Kohl _In_ DEVINST dnDevInst,
922d9a33981SEric Kohl _In_ PRIORITY Priority,
923d9a33981SEric Kohl _In_ ULONG ulFlags,
924d9a33981SEric Kohl _In_opt_ HMACHINE hMachine)
925c2c66affSColin Finck {
926c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
927c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
928c2c66affSColin Finck ULONG ulLogConfTag = 0;
929c2c66affSColin Finck LPWSTR lpDevInst;
930c2c66affSColin Finck PLOG_CONF_INFO pLogConfInfo;
931c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
932c2c66affSColin Finck
933d9a33981SEric Kohl FIXME("CM_Add_Empty_Log_Conf_Ex(%p %p %lu %lx %p)\n",
934c2c66affSColin Finck plcLogConf, dnDevInst, Priority, ulFlags, hMachine);
935c2c66affSColin Finck
936c2c66affSColin Finck if (!pSetupIsUserAdmin())
937c2c66affSColin Finck return CR_ACCESS_DENIED;
938c2c66affSColin Finck
939c2c66affSColin Finck if (plcLogConf == NULL)
940c2c66affSColin Finck return CR_INVALID_POINTER;
941c2c66affSColin Finck
942c2c66affSColin Finck if (dnDevInst == 0)
943c2c66affSColin Finck return CR_INVALID_DEVINST;
944c2c66affSColin Finck
945c2c66affSColin Finck if (Priority > 0xFFFF)
946c2c66affSColin Finck return CR_INVALID_PRIORITY;
947c2c66affSColin Finck
948c2c66affSColin Finck if (ulFlags & ~(LOG_CONF_BITS | PRIORITY_BIT))
949c2c66affSColin Finck return CR_INVALID_FLAG;
950c2c66affSColin Finck
951c2c66affSColin Finck if (hMachine != NULL)
952c2c66affSColin Finck {
953c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
954c2c66affSColin Finck if (BindingHandle == NULL)
955c2c66affSColin Finck return CR_FAILURE;
956c2c66affSColin Finck
957c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
958c2c66affSColin Finck if (StringTable == 0)
959c2c66affSColin Finck return CR_FAILURE;
960c2c66affSColin Finck }
961c2c66affSColin Finck else
962c2c66affSColin Finck {
963c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
964c2c66affSColin Finck return CR_FAILURE;
965c2c66affSColin Finck }
966c2c66affSColin Finck
967c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
968c2c66affSColin Finck if (lpDevInst == NULL)
969c2c66affSColin Finck return CR_INVALID_DEVNODE;
970c2c66affSColin Finck
971c2c66affSColin Finck RpcTryExcept
972c2c66affSColin Finck {
973c2c66affSColin Finck ret = PNP_AddEmptyLogConf(BindingHandle, lpDevInst, Priority,
974c2c66affSColin Finck &ulLogConfTag, ulFlags);
975c2c66affSColin Finck }
976c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
977c2c66affSColin Finck {
978c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
979c2c66affSColin Finck }
980c2c66affSColin Finck RpcEndExcept;
981c2c66affSColin Finck
982c2c66affSColin Finck if (ret == CR_SUCCESS)
983c2c66affSColin Finck {
984c2c66affSColin Finck pLogConfInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO));
985c2c66affSColin Finck if (pLogConfInfo == NULL)
986c2c66affSColin Finck {
987c2c66affSColin Finck ret = CR_OUT_OF_MEMORY;
988c2c66affSColin Finck }
989c2c66affSColin Finck else
990c2c66affSColin Finck {
991c2c66affSColin Finck pLogConfInfo->ulMagic = LOG_CONF_MAGIC;
992c2c66affSColin Finck pLogConfInfo->dnDevInst = dnDevInst;
9936efb3cbeSEric Kohl pLogConfInfo->ulType = ulFlags;
994c2c66affSColin Finck pLogConfInfo->ulTag = ulLogConfTag;
995c2c66affSColin Finck
996c2c66affSColin Finck *plcLogConf = (LOG_CONF)pLogConfInfo;
997c2c66affSColin Finck
998c2c66affSColin Finck ret = CR_SUCCESS;
999c2c66affSColin Finck }
1000c2c66affSColin Finck }
1001c2c66affSColin Finck
1002c2c66affSColin Finck return ret;
1003c2c66affSColin Finck }
1004c2c66affSColin Finck
1005c2c66affSColin Finck
1006c2c66affSColin Finck /***********************************************************************
1007c2c66affSColin Finck * CM_Add_IDA [SETUPAPI.@]
1008c2c66affSColin Finck */
1009d9a33981SEric Kohl CONFIGRET
1010d9a33981SEric Kohl WINAPI
CM_Add_IDA(_In_ DEVINST dnDevInst,_In_ PSTR pszID,_In_ ULONG ulFlags)1011d9a33981SEric Kohl CM_Add_IDA(
1012d9a33981SEric Kohl _In_ DEVINST dnDevInst,
1013d9a33981SEric Kohl _In_ PSTR pszID,
1014d9a33981SEric Kohl _In_ ULONG ulFlags)
1015c2c66affSColin Finck {
1016d9a33981SEric Kohl TRACE("CM_Add_IDA(%p %s %lx)\n",
101765d3bf74SEric Kohl dnDevInst, debugstr_a(pszID), ulFlags);
101865d3bf74SEric Kohl
1019c2c66affSColin Finck return CM_Add_ID_ExA(dnDevInst, pszID, ulFlags, NULL);
1020c2c66affSColin Finck }
1021c2c66affSColin Finck
1022c2c66affSColin Finck
1023c2c66affSColin Finck /***********************************************************************
1024c2c66affSColin Finck * CM_Add_IDW [SETUPAPI.@]
1025c2c66affSColin Finck */
1026d9a33981SEric Kohl CONFIGRET
1027d9a33981SEric Kohl WINAPI
CM_Add_IDW(_In_ DEVINST dnDevInst,_In_ PWSTR pszID,_In_ ULONG ulFlags)1028d9a33981SEric Kohl CM_Add_IDW(
1029d9a33981SEric Kohl _In_ DEVINST dnDevInst,
1030d9a33981SEric Kohl _In_ PWSTR pszID,
1031d9a33981SEric Kohl _In_ ULONG ulFlags)
1032c2c66affSColin Finck {
1033d9a33981SEric Kohl TRACE("CM_Add_IDW(%p %s %lx)\n",
1034d9a33981SEric Kohl dnDevInst, debugstr_w(pszID), ulFlags);
103565d3bf74SEric Kohl
1036c2c66affSColin Finck return CM_Add_ID_ExW(dnDevInst, pszID, ulFlags, NULL);
1037c2c66affSColin Finck }
1038c2c66affSColin Finck
1039c2c66affSColin Finck
1040c2c66affSColin Finck /***********************************************************************
1041c2c66affSColin Finck * CM_Add_ID_ExA [SETUPAPI.@]
1042c2c66affSColin Finck */
1043d9a33981SEric Kohl CONFIGRET
1044d9a33981SEric Kohl WINAPI
CM_Add_ID_ExA(_In_ DEVINST dnDevInst,_In_ PSTR pszID,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)1045d9a33981SEric Kohl CM_Add_ID_ExA(
1046d9a33981SEric Kohl _In_ DEVINST dnDevInst,
1047d9a33981SEric Kohl _In_ PSTR pszID,
1048d9a33981SEric Kohl _In_ ULONG ulFlags,
1049d9a33981SEric Kohl _In_opt_ HMACHINE hMachine)
1050c2c66affSColin Finck {
1051c2c66affSColin Finck PWSTR pszIDW;
1052c2c66affSColin Finck CONFIGRET ret;
1053c2c66affSColin Finck
1054d9a33981SEric Kohl TRACE("CM_Add_ID_ExA(%p %s %lx %p)\n",
105565d3bf74SEric Kohl dnDevInst, debugstr_a(pszID), ulFlags, hMachine);
1056c2c66affSColin Finck
1057c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(pszID, &pszIDW))
1058c2c66affSColin Finck return CR_INVALID_DATA;
1059c2c66affSColin Finck
1060c2c66affSColin Finck ret = CM_Add_ID_ExW(dnDevInst, pszIDW, ulFlags, hMachine);
1061c2c66affSColin Finck
1062c2c66affSColin Finck MyFree(pszIDW);
1063c2c66affSColin Finck
1064c2c66affSColin Finck return ret;
1065c2c66affSColin Finck }
1066c2c66affSColin Finck
1067c2c66affSColin Finck
1068c2c66affSColin Finck /***********************************************************************
1069c2c66affSColin Finck * CM_Add_ID_ExW [SETUPAPI.@]
1070c2c66affSColin Finck */
1071d9a33981SEric Kohl CONFIGRET
1072d9a33981SEric Kohl WINAPI
CM_Add_ID_ExW(_In_ DEVINST dnDevInst,_In_ PWSTR pszID,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)1073d9a33981SEric Kohl CM_Add_ID_ExW(
1074d9a33981SEric Kohl _In_ DEVINST dnDevInst,
1075d9a33981SEric Kohl _In_ PWSTR pszID,
1076d9a33981SEric Kohl _In_ ULONG ulFlags,
1077d9a33981SEric Kohl _In_opt_ HMACHINE hMachine)
1078c2c66affSColin Finck {
1079c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
1080c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
1081c2c66affSColin Finck LPWSTR lpDevInst;
1082c2c66affSColin Finck CONFIGRET ret;
1083c2c66affSColin Finck
1084d9a33981SEric Kohl TRACE("CM_Add_ID_ExW(%p %s %lx %p)\n",
1085d9a33981SEric Kohl dnDevInst, debugstr_w(pszID), ulFlags, hMachine);
1086c2c66affSColin Finck
1087c2c66affSColin Finck if (!pSetupIsUserAdmin())
1088c2c66affSColin Finck return CR_ACCESS_DENIED;
1089c2c66affSColin Finck
1090c2c66affSColin Finck if (dnDevInst == 0)
1091c2c66affSColin Finck return CR_INVALID_DEVINST;
1092c2c66affSColin Finck
1093c2c66affSColin Finck if (pszID == NULL)
1094c2c66affSColin Finck return CR_INVALID_POINTER;
1095c2c66affSColin Finck
1096c2c66affSColin Finck if (ulFlags & ~CM_ADD_ID_BITS)
1097c2c66affSColin Finck return CR_INVALID_FLAG;
1098c2c66affSColin Finck
1099c2c66affSColin Finck if (hMachine != NULL)
1100c2c66affSColin Finck {
1101c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
1102c2c66affSColin Finck if (BindingHandle == NULL)
1103c2c66affSColin Finck return CR_FAILURE;
1104c2c66affSColin Finck
1105c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
1106c2c66affSColin Finck if (StringTable == 0)
1107c2c66affSColin Finck return CR_FAILURE;
1108c2c66affSColin Finck }
1109c2c66affSColin Finck else
1110c2c66affSColin Finck {
1111c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
1112c2c66affSColin Finck return CR_FAILURE;
1113c2c66affSColin Finck }
1114c2c66affSColin Finck
1115c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
1116c2c66affSColin Finck if (lpDevInst == NULL)
1117c2c66affSColin Finck return CR_INVALID_DEVNODE;
1118c2c66affSColin Finck
1119c2c66affSColin Finck RpcTryExcept
1120c2c66affSColin Finck {
1121c2c66affSColin Finck ret = PNP_AddID(BindingHandle,
1122c2c66affSColin Finck lpDevInst,
1123c2c66affSColin Finck pszID,
1124c2c66affSColin Finck ulFlags);
1125c2c66affSColin Finck }
1126c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
1127c2c66affSColin Finck {
1128c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
1129c2c66affSColin Finck }
1130c2c66affSColin Finck RpcEndExcept;
1131c2c66affSColin Finck
1132c2c66affSColin Finck return ret;
1133c2c66affSColin Finck }
1134c2c66affSColin Finck
1135c2c66affSColin Finck
1136c2c66affSColin Finck /***********************************************************************
1137c2c66affSColin Finck * CM_Add_Range [SETUPAPI.@]
1138c2c66affSColin Finck */
1139c2c66affSColin Finck CONFIGRET
1140c2c66affSColin Finck WINAPI
CM_Add_Range(_In_ DWORDLONG ullStartValue,_In_ DWORDLONG ullEndValue,_In_ RANGE_LIST rlh,_In_ ULONG ulFlags)1141c2c66affSColin Finck CM_Add_Range(
1142c2c66affSColin Finck _In_ DWORDLONG ullStartValue,
1143c2c66affSColin Finck _In_ DWORDLONG ullEndValue,
1144c2c66affSColin Finck _In_ RANGE_LIST rlh,
1145c2c66affSColin Finck _In_ ULONG ulFlags)
1146c2c66affSColin Finck {
11473ad5c7fdSEric Kohl PINTERNAL_RANGE_LIST pRangeList;
11483ad5c7fdSEric Kohl PINTERNAL_RANGE pRange;
11493ad5c7fdSEric Kohl CONFIGRET ret = CR_SUCCESS;
11503ad5c7fdSEric Kohl
1151c2c66affSColin Finck FIXME("CM_Add_Range(%I64u %I64u %p %lx)\n",
1152c2c66affSColin Finck ullStartValue, ullEndValue, rlh, ulFlags);
11533ad5c7fdSEric Kohl
11543ad5c7fdSEric Kohl pRangeList = (PINTERNAL_RANGE_LIST)rlh;
11553ad5c7fdSEric Kohl
11563ad5c7fdSEric Kohl if (!IsValidRangeList(pRangeList))
11573ad5c7fdSEric Kohl return CR_INVALID_RANGE_LIST;
11583ad5c7fdSEric Kohl
11593ad5c7fdSEric Kohl if (ulFlags & ~CM_ADD_RANGE_BITS)
11603ad5c7fdSEric Kohl return CR_INVALID_FLAG;
11613ad5c7fdSEric Kohl
11623ad5c7fdSEric Kohl if (ullEndValue < ullStartValue)
11633ad5c7fdSEric Kohl return CR_INVALID_RANGE;
11643ad5c7fdSEric Kohl
11653ad5c7fdSEric Kohl /* Lock the range list */
11663ad5c7fdSEric Kohl WaitForSingleObject(pRangeList->hMutex, INFINITE);
11673ad5c7fdSEric Kohl
11683ad5c7fdSEric Kohl /* Allocate the new range */
11693ad5c7fdSEric Kohl pRange = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNAL_RANGE));
11703ad5c7fdSEric Kohl if (pRange == NULL)
11713ad5c7fdSEric Kohl {
11723ad5c7fdSEric Kohl ret = CR_OUT_OF_MEMORY;
11733ad5c7fdSEric Kohl goto done;
11743ad5c7fdSEric Kohl }
11753ad5c7fdSEric Kohl
1176e88a6b20SEric Kohl pRange->pRangeList = pRangeList;
11773ad5c7fdSEric Kohl pRange->ullStart = ullStartValue;
11783ad5c7fdSEric Kohl pRange->ullEnd = ullEndValue;
11793ad5c7fdSEric Kohl
11803ad5c7fdSEric Kohl /* Insert the range */
11813ad5c7fdSEric Kohl if (IsListEmpty(&pRangeList->ListHead))
11823ad5c7fdSEric Kohl {
11833ad5c7fdSEric Kohl InsertTailList(&pRangeList->ListHead, &pRange->ListEntry);
11843ad5c7fdSEric Kohl }
11853ad5c7fdSEric Kohl else
11863ad5c7fdSEric Kohl {
11870bc8e2a5SBișoc George HeapFree(GetProcessHeap(), 0, pRange);
11880bc8e2a5SBișoc George UNIMPLEMENTED;
11893ad5c7fdSEric Kohl }
11903ad5c7fdSEric Kohl
11913ad5c7fdSEric Kohl done:
11923ad5c7fdSEric Kohl /* Unlock the range list */
11933ad5c7fdSEric Kohl ReleaseMutex(pRangeList->hMutex);
11943ad5c7fdSEric Kohl
11953ad5c7fdSEric Kohl return ret;
1196c2c66affSColin Finck }
1197c2c66affSColin Finck
1198c2c66affSColin Finck
1199c2c66affSColin Finck /***********************************************************************
1200c2c66affSColin Finck * CM_Add_Res_Des [SETUPAPI.@]
1201c2c66affSColin Finck */
1202d9a33981SEric Kohl CONFIGRET
1203d9a33981SEric Kohl WINAPI
CM_Add_Res_Des(_Out_opt_ PRES_DES prdResDes,_In_ LOG_CONF lcLogConf,_In_ RESOURCEID ResourceID,_In_reads_bytes_ (ResourceLen)PCVOID ResourceData,_In_ ULONG ResourceLen,_In_ ULONG ulFlags)1204d9a33981SEric Kohl CM_Add_Res_Des(
1205d9a33981SEric Kohl _Out_opt_ PRES_DES prdResDes,
1206d9a33981SEric Kohl _In_ LOG_CONF lcLogConf,
1207d9a33981SEric Kohl _In_ RESOURCEID ResourceID,
120865d3bf74SEric Kohl _In_reads_bytes_(ResourceLen) PCVOID ResourceData,
1209d9a33981SEric Kohl _In_ ULONG ResourceLen,
1210d9a33981SEric Kohl _In_ ULONG ulFlags)
1211c2c66affSColin Finck {
1212d9a33981SEric Kohl TRACE("CM_Add_Res_Des(%p %p %lu %p %lu %lx)\n",
1213d9a33981SEric Kohl prdResDes, lcLogConf, ResourceID, ResourceData, ResourceLen, ulFlags);
121465d3bf74SEric Kohl
1215c2c66affSColin Finck return CM_Add_Res_Des_Ex(prdResDes, lcLogConf, ResourceID, ResourceData,
1216c2c66affSColin Finck ResourceLen, ulFlags, NULL);
1217c2c66affSColin Finck }
1218c2c66affSColin Finck
1219c2c66affSColin Finck
1220c2c66affSColin Finck /***********************************************************************
1221c2c66affSColin Finck * CM_Add_Res_Des_Ex [SETUPAPI.@]
1222c2c66affSColin Finck */
1223d9a33981SEric Kohl CONFIGRET
1224d9a33981SEric Kohl WINAPI
CM_Add_Res_Des_Ex(_Out_opt_ PRES_DES prdResDes,_In_ LOG_CONF lcLogConf,_In_ RESOURCEID ResourceID,_In_reads_bytes_ (ResourceLen)PCVOID ResourceData,_In_ ULONG ResourceLen,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)1225d9a33981SEric Kohl CM_Add_Res_Des_Ex(
1226d9a33981SEric Kohl _Out_opt_ PRES_DES prdResDes,
1227d9a33981SEric Kohl _In_ LOG_CONF lcLogConf,
1228d9a33981SEric Kohl _In_ RESOURCEID ResourceID,
122965d3bf74SEric Kohl _In_reads_bytes_(ResourceLen) PCVOID ResourceData,
1230d9a33981SEric Kohl _In_ ULONG ResourceLen,
1231d9a33981SEric Kohl _In_ ULONG ulFlags,
1232d9a33981SEric Kohl _In_opt_ HMACHINE hMachine)
1233c2c66affSColin Finck {
1234d9a33981SEric Kohl FIXME("CM_Add_Res_Des_Ex(%p %p %lu %p %lu %lx %p)\n",
1235d9a33981SEric Kohl prdResDes, lcLogConf, ResourceID,
1236c2c66affSColin Finck ResourceData, ResourceLen, ulFlags, hMachine);
1237c2c66affSColin Finck
1238c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
1239c2c66affSColin Finck }
1240c2c66affSColin Finck
1241c2c66affSColin Finck
1242c2c66affSColin Finck /***********************************************************************
1243c2c66affSColin Finck * CM_Connect_MachineA [SETUPAPI.@]
1244c2c66affSColin Finck */
1245d9a33981SEric Kohl CONFIGRET
1246d9a33981SEric Kohl WINAPI
CM_Connect_MachineA(_In_opt_ PCSTR UNCServerName,_Out_ PHMACHINE phMachine)1247d9a33981SEric Kohl CM_Connect_MachineA(
1248d9a33981SEric Kohl _In_opt_ PCSTR UNCServerName,
1249d9a33981SEric Kohl _Out_ PHMACHINE phMachine)
1250c2c66affSColin Finck {
1251c2c66affSColin Finck PWSTR pServerNameW;
1252c2c66affSColin Finck CONFIGRET ret;
1253c2c66affSColin Finck
1254d9a33981SEric Kohl TRACE("CM_Connect_MachineA(%s %p)\n",
125565d3bf74SEric Kohl debugstr_a(UNCServerName), phMachine);
1256c2c66affSColin Finck
1257c2c66affSColin Finck if (UNCServerName == NULL || *UNCServerName == 0)
1258c2c66affSColin Finck return CM_Connect_MachineW(NULL, phMachine);
1259c2c66affSColin Finck
1260c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(UNCServerName, &pServerNameW))
1261c2c66affSColin Finck return CR_INVALID_DATA;
1262c2c66affSColin Finck
1263c2c66affSColin Finck ret = CM_Connect_MachineW(pServerNameW, phMachine);
1264c2c66affSColin Finck
1265c2c66affSColin Finck MyFree(pServerNameW);
1266c2c66affSColin Finck
1267c2c66affSColin Finck return ret;
1268c2c66affSColin Finck }
1269c2c66affSColin Finck
1270c2c66affSColin Finck
1271c2c66affSColin Finck /***********************************************************************
1272c2c66affSColin Finck * CM_Connect_MachineW [SETUPAPI.@]
1273c2c66affSColin Finck */
1274d9a33981SEric Kohl CONFIGRET
1275d9a33981SEric Kohl WINAPI
CM_Connect_MachineW(_In_opt_ PCWSTR UNCServerName,_Out_ PHMACHINE phMachine)1276d9a33981SEric Kohl CM_Connect_MachineW(
1277d9a33981SEric Kohl _In_opt_ PCWSTR UNCServerName,
1278d9a33981SEric Kohl _Out_ PHMACHINE phMachine)
1279c2c66affSColin Finck {
1280c2c66affSColin Finck PMACHINE_INFO pMachine;
1281c2c66affSColin Finck
1282d9a33981SEric Kohl TRACE("CM_Connect_MachineW(%s %p)\n",
1283d9a33981SEric Kohl debugstr_w(UNCServerName), phMachine);
1284c2c66affSColin Finck
1285c2c66affSColin Finck if (phMachine == NULL)
1286c2c66affSColin Finck return CR_INVALID_POINTER;
1287c2c66affSColin Finck
1288c2c66affSColin Finck *phMachine = NULL;
1289c2c66affSColin Finck
1290c2c66affSColin Finck pMachine = HeapAlloc(GetProcessHeap(), 0, sizeof(MACHINE_INFO));
1291c2c66affSColin Finck if (pMachine == NULL)
1292c2c66affSColin Finck return CR_OUT_OF_MEMORY;
1293c2c66affSColin Finck
1294c2c66affSColin Finck if (UNCServerName == NULL || *UNCServerName == 0)
1295c2c66affSColin Finck {
1296c2c66affSColin Finck pMachine->bLocal = TRUE;
1297c2c66affSColin Finck
1298c2c66affSColin Finck /* FIXME: store the computers name in pMachine->szMachineName */
1299c2c66affSColin Finck
1300c2c66affSColin Finck if (!PnpGetLocalHandles(&pMachine->BindingHandle,
1301c2c66affSColin Finck &pMachine->StringTable))
1302c2c66affSColin Finck {
1303c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, pMachine);
1304c2c66affSColin Finck return CR_FAILURE;
1305c2c66affSColin Finck }
1306c2c66affSColin Finck }
1307c2c66affSColin Finck else
1308c2c66affSColin Finck {
1309c2c66affSColin Finck pMachine->bLocal = FALSE;
1310c2c66affSColin Finck if (wcslen(UNCServerName) >= SP_MAX_MACHINENAME_LENGTH - 1)
1311c2c66affSColin Finck {
1312c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, pMachine);
1313c2c66affSColin Finck return CR_INVALID_MACHINENAME;
1314c2c66affSColin Finck }
1315c2c66affSColin Finck lstrcpyW(pMachine->szMachineName, UNCServerName);
1316c2c66affSColin Finck
1317c2c66affSColin Finck pMachine->StringTable = pSetupStringTableInitialize();
1318c2c66affSColin Finck if (pMachine->StringTable == NULL)
1319c2c66affSColin Finck {
1320c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, pMachine);
1321c2c66affSColin Finck return CR_FAILURE;
1322c2c66affSColin Finck }
1323c2c66affSColin Finck
1324c2c66affSColin Finck pSetupStringTableAddString(pMachine->StringTable, L"PLT", 1);
1325c2c66affSColin Finck
1326c2c66affSColin Finck if (!PnpBindRpc(UNCServerName, &pMachine->BindingHandle))
1327c2c66affSColin Finck {
1328c2c66affSColin Finck pSetupStringTableDestroy(pMachine->StringTable);
1329c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, pMachine);
1330c2c66affSColin Finck return CR_INVALID_MACHINENAME;
1331c2c66affSColin Finck }
1332c2c66affSColin Finck }
1333c2c66affSColin Finck
1334c2c66affSColin Finck *phMachine = (PHMACHINE)pMachine;
1335c2c66affSColin Finck
1336c2c66affSColin Finck return CR_SUCCESS;
1337c2c66affSColin Finck }
1338c2c66affSColin Finck
1339c2c66affSColin Finck
1340c2c66affSColin Finck /***********************************************************************
1341c2c66affSColin Finck * CM_Create_DevNodeA [SETUPAPI.@]
1342c2c66affSColin Finck */
1343d9a33981SEric Kohl CONFIGRET
1344d9a33981SEric Kohl WINAPI
CM_Create_DevNodeA(_Out_ PDEVINST pdnDevInst,_In_ DEVINSTID_A pDeviceID,_In_ DEVINST dnParent,_In_ ULONG ulFlags)1345d9a33981SEric Kohl CM_Create_DevNodeA(
1346d9a33981SEric Kohl _Out_ PDEVINST pdnDevInst,
1347d9a33981SEric Kohl _In_ DEVINSTID_A pDeviceID,
1348d9a33981SEric Kohl _In_ DEVINST dnParent,
1349d9a33981SEric Kohl _In_ ULONG ulFlags)
1350c2c66affSColin Finck {
1351d9a33981SEric Kohl TRACE("CM_Create_DevNodeA(%p %s %p %lx)\n",
1352c2c66affSColin Finck pdnDevInst, debugstr_a(pDeviceID), dnParent, ulFlags);
135365d3bf74SEric Kohl
1354c2c66affSColin Finck return CM_Create_DevNode_ExA(pdnDevInst, pDeviceID, dnParent,
1355c2c66affSColin Finck ulFlags, NULL);
1356c2c66affSColin Finck }
1357c2c66affSColin Finck
1358c2c66affSColin Finck
1359c2c66affSColin Finck /***********************************************************************
1360c2c66affSColin Finck * CM_Create_DevNodeW [SETUPAPI.@]
1361c2c66affSColin Finck */
1362d9a33981SEric Kohl CONFIGRET
1363d9a33981SEric Kohl WINAPI
CM_Create_DevNodeW(_Out_ PDEVINST pdnDevInst,_In_ DEVINSTID_W pDeviceID,_In_ DEVINST dnParent,_In_ ULONG ulFlags)1364d9a33981SEric Kohl CM_Create_DevNodeW(
1365d9a33981SEric Kohl _Out_ PDEVINST pdnDevInst,
1366d9a33981SEric Kohl _In_ DEVINSTID_W pDeviceID,
1367d9a33981SEric Kohl _In_ DEVINST dnParent,
1368d9a33981SEric Kohl _In_ ULONG ulFlags)
1369c2c66affSColin Finck {
1370d9a33981SEric Kohl TRACE("CM_Create_DevNodeW(%p %s %p %lx)\n",
1371c2c66affSColin Finck pdnDevInst, debugstr_w(pDeviceID), dnParent, ulFlags);
137265d3bf74SEric Kohl
1373c2c66affSColin Finck return CM_Create_DevNode_ExW(pdnDevInst, pDeviceID, dnParent,
1374c2c66affSColin Finck ulFlags, NULL);
1375c2c66affSColin Finck }
1376c2c66affSColin Finck
1377c2c66affSColin Finck
1378c2c66affSColin Finck /***********************************************************************
1379c2c66affSColin Finck * CM_Create_DevNode_ExA [SETUPAPI.@]
1380c2c66affSColin Finck */
1381d9a33981SEric Kohl CONFIGRET
1382d9a33981SEric Kohl WINAPI
CM_Create_DevNode_ExA(_Out_ PDEVINST pdnDevInst,_In_ DEVINSTID_A pDeviceID,_In_ DEVINST dnParent,_In_ ULONG ulFlags,_In_opt_ HANDLE hMachine)1383d9a33981SEric Kohl CM_Create_DevNode_ExA(
1384d9a33981SEric Kohl _Out_ PDEVINST pdnDevInst,
1385d9a33981SEric Kohl _In_ DEVINSTID_A pDeviceID,
1386d9a33981SEric Kohl _In_ DEVINST dnParent,
1387d9a33981SEric Kohl _In_ ULONG ulFlags,
1388d9a33981SEric Kohl _In_opt_ HANDLE hMachine)
1389c2c66affSColin Finck {
1390c2c66affSColin Finck DEVINSTID_W pDeviceIDW;
1391c2c66affSColin Finck CONFIGRET ret;
1392c2c66affSColin Finck
1393d9a33981SEric Kohl TRACE("CM_Create_DevNode_ExA(%p %s %p %lx %p)\n",
1394c2c66affSColin Finck pdnDevInst, debugstr_a(pDeviceID), dnParent, ulFlags, hMachine);
1395c2c66affSColin Finck
1396c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(pDeviceID, &pDeviceIDW))
1397c2c66affSColin Finck return CR_INVALID_DATA;
1398c2c66affSColin Finck
1399c2c66affSColin Finck ret = CM_Create_DevNode_ExW(pdnDevInst, pDeviceIDW, dnParent, ulFlags,
1400c2c66affSColin Finck hMachine);
1401c2c66affSColin Finck
1402c2c66affSColin Finck MyFree(pDeviceIDW);
1403c2c66affSColin Finck
1404c2c66affSColin Finck return ret;
1405c2c66affSColin Finck }
1406c2c66affSColin Finck
1407c2c66affSColin Finck
1408c2c66affSColin Finck /***********************************************************************
1409c2c66affSColin Finck * CM_Create_DevNode_ExW [SETUPAPI.@]
1410c2c66affSColin Finck */
1411d9a33981SEric Kohl CONFIGRET
1412d9a33981SEric Kohl WINAPI
CM_Create_DevNode_ExW(_Out_ PDEVINST pdnDevInst,_In_ DEVINSTID_W pDeviceID,_In_ DEVINST dnParent,_In_ ULONG ulFlags,_In_opt_ HANDLE hMachine)1413d9a33981SEric Kohl CM_Create_DevNode_ExW(
1414d9a33981SEric Kohl _Out_ PDEVINST pdnDevInst,
1415d9a33981SEric Kohl _In_ DEVINSTID_W pDeviceID,
1416d9a33981SEric Kohl _In_ DEVINST dnParent,
1417d9a33981SEric Kohl _In_ ULONG ulFlags,
1418d9a33981SEric Kohl _In_opt_ HANDLE hMachine)
1419c2c66affSColin Finck {
1420c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
1421c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
1422c2c66affSColin Finck LPWSTR lpParentDevInst;
1423c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
1424c2c66affSColin Finck WCHAR szLocalDeviceID[MAX_DEVICE_ID_LEN];
1425c2c66affSColin Finck
1426d9a33981SEric Kohl TRACE("CM_Create_DevNode_ExW(%p %s %p %lx %p)\n",
1427c2c66affSColin Finck pdnDevInst, debugstr_w(pDeviceID), dnParent, ulFlags, hMachine);
1428c2c66affSColin Finck
1429c2c66affSColin Finck if (!pSetupIsUserAdmin())
1430c2c66affSColin Finck return CR_ACCESS_DENIED;
1431c2c66affSColin Finck
1432c2c66affSColin Finck if (pdnDevInst == NULL)
1433c2c66affSColin Finck return CR_INVALID_POINTER;
1434c2c66affSColin Finck
1435c2c66affSColin Finck if (pDeviceID == NULL || wcslen(pDeviceID) == 0 || wcslen(pDeviceID) >= MAX_DEVICE_ID_LEN)
1436c2c66affSColin Finck return CR_INVALID_DEVICE_ID;
1437c2c66affSColin Finck
1438c2c66affSColin Finck if (dnParent == 0)
1439c2c66affSColin Finck return CR_INVALID_DEVNODE;
1440c2c66affSColin Finck
1441c2c66affSColin Finck if (ulFlags & ~CM_CREATE_DEVNODE_BITS)
1442c2c66affSColin Finck return CR_INVALID_FLAG;
1443c2c66affSColin Finck
1444c2c66affSColin Finck if (hMachine != NULL)
1445c2c66affSColin Finck {
1446c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
1447c2c66affSColin Finck if (BindingHandle == NULL)
1448c2c66affSColin Finck return CR_FAILURE;
1449c2c66affSColin Finck
1450c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
1451c2c66affSColin Finck if (StringTable == 0)
1452c2c66affSColin Finck return CR_FAILURE;
1453c2c66affSColin Finck }
1454c2c66affSColin Finck else
1455c2c66affSColin Finck {
1456c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
1457c2c66affSColin Finck return CR_FAILURE;
1458c2c66affSColin Finck }
1459c2c66affSColin Finck
1460c2c66affSColin Finck lpParentDevInst = pSetupStringTableStringFromId(StringTable, dnParent);
1461c2c66affSColin Finck if (lpParentDevInst == NULL)
1462c2c66affSColin Finck return CR_INVALID_DEVNODE;
1463c2c66affSColin Finck
1464c2c66affSColin Finck wcscpy(szLocalDeviceID, pDeviceID);
1465c2c66affSColin Finck
1466c2c66affSColin Finck RpcTryExcept
1467c2c66affSColin Finck {
1468c2c66affSColin Finck ret = PNP_CreateDevInst(BindingHandle,
1469c2c66affSColin Finck szLocalDeviceID,
1470c2c66affSColin Finck lpParentDevInst,
1471c2c66affSColin Finck MAX_DEVICE_ID_LEN,
1472c2c66affSColin Finck ulFlags);
1473c2c66affSColin Finck }
1474c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
1475c2c66affSColin Finck {
1476c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
1477c2c66affSColin Finck }
1478c2c66affSColin Finck RpcEndExcept;
1479c2c66affSColin Finck
1480c2c66affSColin Finck if (ret == CR_SUCCESS)
1481c2c66affSColin Finck {
1482c2c66affSColin Finck /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst
1483c2c66affSColin Finck * will return the generated device ID in szLocalDeviceID */
1484c2c66affSColin Finck *pdnDevInst = pSetupStringTableAddString(StringTable, szLocalDeviceID, 1);
1485c2c66affSColin Finck if (*pdnDevInst == 0)
1486c2c66affSColin Finck ret = CR_NO_SUCH_DEVNODE;
1487c2c66affSColin Finck }
1488c2c66affSColin Finck
1489c2c66affSColin Finck return ret;
1490c2c66affSColin Finck }
1491c2c66affSColin Finck
1492c2c66affSColin Finck
1493c2c66affSColin Finck /***********************************************************************
1494c2c66affSColin Finck * CM_Create_Range_List [SETUPAPI.@]
1495c2c66affSColin Finck */
1496c2c66affSColin Finck CONFIGRET
1497c2c66affSColin Finck WINAPI
CM_Create_Range_List(_Out_ PRANGE_LIST prlh,_In_ ULONG ulFlags)1498c2c66affSColin Finck CM_Create_Range_List(
1499c2c66affSColin Finck _Out_ PRANGE_LIST prlh,
1500c2c66affSColin Finck _In_ ULONG ulFlags)
1501c2c66affSColin Finck {
15028943354dSSerge Gautherie PINTERNAL_RANGE_LIST pRangeList;
1503c2c66affSColin Finck
150465d3bf74SEric Kohl FIXME("CM_Create_Range_List(%p %lx)\n",
150565d3bf74SEric Kohl prlh, ulFlags);
1506c2c66affSColin Finck
1507c2c66affSColin Finck if (ulFlags != 0)
1508c2c66affSColin Finck return CR_INVALID_FLAG;
1509c2c66affSColin Finck
1510c2c66affSColin Finck if (prlh == NULL)
1511c2c66affSColin Finck return CR_INVALID_POINTER;
1512c2c66affSColin Finck
15133ad5c7fdSEric Kohl /* Allocate the range list */
1514c2c66affSColin Finck pRangeList = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(INTERNAL_RANGE_LIST));
1515c2c66affSColin Finck if (pRangeList == NULL)
1516c2c66affSColin Finck return CR_OUT_OF_MEMORY;
1517c2c66affSColin Finck
15183ad5c7fdSEric Kohl /* Set the magic value */
1519c2c66affSColin Finck pRangeList->ulMagic = RANGE_LIST_MAGIC;
1520c2c66affSColin Finck
15213ad5c7fdSEric Kohl /* Initialize the mutex for synchonized access */
15223ad5c7fdSEric Kohl pRangeList->hMutex = CreateMutex(NULL, FALSE, NULL);
15233ad5c7fdSEric Kohl if (pRangeList->hMutex == NULL)
15243ad5c7fdSEric Kohl {
15253ad5c7fdSEric Kohl HeapFree(GetProcessHeap(), 0, pRangeList);
15263ad5c7fdSEric Kohl return CR_FAILURE;
15273ad5c7fdSEric Kohl }
15283ad5c7fdSEric Kohl
15293ad5c7fdSEric Kohl InitializeListHead(&pRangeList->ListHead);
1530c2c66affSColin Finck
1531c2c66affSColin Finck *prlh = (RANGE_LIST)pRangeList;
1532c2c66affSColin Finck
1533c2c66affSColin Finck return CR_SUCCESS;
1534c2c66affSColin Finck }
1535c2c66affSColin Finck
1536c2c66affSColin Finck
1537c2c66affSColin Finck /***********************************************************************
1538c2c66affSColin Finck * CM_Delete_Class_Key [SETUPAPI.@]
1539c2c66affSColin Finck */
1540d9a33981SEric Kohl CONFIGRET
1541d9a33981SEric Kohl WINAPI
CM_Delete_Class_Key(_In_ LPGUID ClassGuid,_In_ ULONG ulFlags)1542d9a33981SEric Kohl CM_Delete_Class_Key(
1543d9a33981SEric Kohl _In_ LPGUID ClassGuid,
1544d9a33981SEric Kohl _In_ ULONG ulFlags)
1545c2c66affSColin Finck {
1546d9a33981SEric Kohl TRACE("CM_Delete_Class_Key(%p %lx)\n",
1547d9a33981SEric Kohl ClassGuid, ulFlags);
154865d3bf74SEric Kohl
1549c2c66affSColin Finck return CM_Delete_Class_Key_Ex(ClassGuid, ulFlags, NULL);
1550c2c66affSColin Finck }
1551c2c66affSColin Finck
1552c2c66affSColin Finck
1553c2c66affSColin Finck /***********************************************************************
1554c2c66affSColin Finck * CM_Delete_Class_Key_Ex [SETUPAPI.@]
1555c2c66affSColin Finck */
1556d9a33981SEric Kohl CONFIGRET
1557d9a33981SEric Kohl WINAPI
CM_Delete_Class_Key_Ex(_In_ LPGUID ClassGuid,_In_ ULONG ulFlags,_In_opt_ HANDLE hMachine)1558d9a33981SEric Kohl CM_Delete_Class_Key_Ex(
1559d9a33981SEric Kohl _In_ LPGUID ClassGuid,
1560d9a33981SEric Kohl _In_ ULONG ulFlags,
1561d9a33981SEric Kohl _In_opt_ HANDLE hMachine)
1562c2c66affSColin Finck {
1563c2c66affSColin Finck WCHAR szGuidString[MAX_GUID_STRING_LEN];
1564c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
1565c2c66affSColin Finck CONFIGRET ret;
1566c2c66affSColin Finck
156760a21894SEric Kohl TRACE("CM_Delete_Class_Key_Ex(%p %lx %p)\n",
1568d9a33981SEric Kohl ClassGuid, ulFlags, hMachine);
1569c2c66affSColin Finck
1570c2c66affSColin Finck if (ClassGuid == NULL)
1571c2c66affSColin Finck return CR_INVALID_POINTER;
1572c2c66affSColin Finck
1573c2c66affSColin Finck if (ulFlags & ~CM_DELETE_CLASS_BITS)
1574c2c66affSColin Finck return CR_INVALID_FLAG;
1575c2c66affSColin Finck
1576c2c66affSColin Finck if (!GuidToString(ClassGuid, szGuidString))
1577c2c66affSColin Finck return CR_INVALID_DATA;
1578c2c66affSColin Finck
1579c2c66affSColin Finck if (hMachine != NULL)
1580c2c66affSColin Finck {
1581c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
1582c2c66affSColin Finck if (BindingHandle == NULL)
1583c2c66affSColin Finck return CR_FAILURE;
1584c2c66affSColin Finck }
1585c2c66affSColin Finck else
1586c2c66affSColin Finck {
1587c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
1588c2c66affSColin Finck return CR_FAILURE;
1589c2c66affSColin Finck }
1590c2c66affSColin Finck
1591c2c66affSColin Finck RpcTryExcept
1592c2c66affSColin Finck {
1593c2c66affSColin Finck ret = PNP_DeleteClassKey(BindingHandle,
1594c2c66affSColin Finck szGuidString,
1595c2c66affSColin Finck ulFlags);
1596c2c66affSColin Finck }
1597c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
1598c2c66affSColin Finck {
1599c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
1600c2c66affSColin Finck }
1601c2c66affSColin Finck RpcEndExcept;
1602c2c66affSColin Finck
1603c2c66affSColin Finck return ret;
1604c2c66affSColin Finck }
1605c2c66affSColin Finck
1606c2c66affSColin Finck
1607c2c66affSColin Finck /***********************************************************************
1608c2c66affSColin Finck * CM_Delete_DevNode_Key [SETUPAPI.@]
1609c2c66affSColin Finck */
1610d9a33981SEric Kohl CONFIGRET
1611d9a33981SEric Kohl WINAPI
CM_Delete_DevNode_Key(_In_ DEVINST dnDevInst,_In_ ULONG ulHardwareProfile,_In_ ULONG ulFlags)1612d9a33981SEric Kohl CM_Delete_DevNode_Key(
161393f77f26SEric Kohl _In_ DEVINST dnDevInst,
1614d9a33981SEric Kohl _In_ ULONG ulHardwareProfile,
1615d9a33981SEric Kohl _In_ ULONG ulFlags)
1616c2c66affSColin Finck {
1617d9a33981SEric Kohl TRACE("CM_Delete_DevNode_Key(%p %lu %lx)\n",
161893f77f26SEric Kohl dnDevInst, ulHardwareProfile, ulFlags);
161965d3bf74SEric Kohl
162093f77f26SEric Kohl return CM_Delete_DevNode_Key_Ex(dnDevInst, ulHardwareProfile, ulFlags,
1621c2c66affSColin Finck NULL);
1622c2c66affSColin Finck }
1623c2c66affSColin Finck
1624c2c66affSColin Finck
1625c2c66affSColin Finck /***********************************************************************
1626c2c66affSColin Finck * CM_Delete_DevNode_Key_Ex [SETUPAPI.@]
1627c2c66affSColin Finck */
1628d9a33981SEric Kohl CONFIGRET
1629d9a33981SEric Kohl WINAPI
CM_Delete_DevNode_Key_Ex(_In_ DEVINST dnDevInst,_In_ ULONG ulHardwareProfile,_In_ ULONG ulFlags,_In_opt_ HANDLE hMachine)1630d9a33981SEric Kohl CM_Delete_DevNode_Key_Ex(
163193f77f26SEric Kohl _In_ DEVINST dnDevInst,
1632d9a33981SEric Kohl _In_ ULONG ulHardwareProfile,
1633d9a33981SEric Kohl _In_ ULONG ulFlags,
1634d9a33981SEric Kohl _In_opt_ HANDLE hMachine)
1635c2c66affSColin Finck {
1636433c9d32SEric Kohl RPC_BINDING_HANDLE BindingHandle = NULL;
1637433c9d32SEric Kohl HSTRING_TABLE StringTable = NULL;
1638433c9d32SEric Kohl PWSTR pszDevInst, pszKeyPath = NULL, pszInstancePath = NULL;
1639433c9d32SEric Kohl CONFIGRET ret;
1640433c9d32SEric Kohl
1641d9a33981SEric Kohl FIXME("CM_Delete_DevNode_Key_Ex(%p %lu %lx %p)\n",
164293f77f26SEric Kohl dnDevInst, ulHardwareProfile, ulFlags, hMachine);
1643c2c66affSColin Finck
1644433c9d32SEric Kohl if (dnDevInst == 0)
1645433c9d32SEric Kohl return CR_INVALID_DEVINST;
1646433c9d32SEric Kohl
1647433c9d32SEric Kohl if (ulFlags & ~CM_REGISTRY_BITS)
1648433c9d32SEric Kohl return CR_INVALID_FLAG;
1649433c9d32SEric Kohl
1650433c9d32SEric Kohl if ((ulFlags & CM_REGISTRY_USER) && (ulFlags & CM_REGISTRY_CONFIG))
1651433c9d32SEric Kohl return CR_INVALID_FLAG;
1652433c9d32SEric Kohl
1653433c9d32SEric Kohl if (hMachine != NULL)
1654433c9d32SEric Kohl {
1655433c9d32SEric Kohl BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
1656433c9d32SEric Kohl if (BindingHandle == NULL)
1657433c9d32SEric Kohl return CR_FAILURE;
1658433c9d32SEric Kohl
1659433c9d32SEric Kohl StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
1660433c9d32SEric Kohl if (StringTable == 0)
1661433c9d32SEric Kohl return CR_FAILURE;
1662433c9d32SEric Kohl }
1663433c9d32SEric Kohl else
1664433c9d32SEric Kohl {
1665433c9d32SEric Kohl if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
1666433c9d32SEric Kohl return CR_FAILURE;
1667433c9d32SEric Kohl }
1668433c9d32SEric Kohl
1669433c9d32SEric Kohl pszDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
1670433c9d32SEric Kohl if (pszDevInst == NULL)
1671433c9d32SEric Kohl return CR_INVALID_DEVNODE;
1672433c9d32SEric Kohl
1673433c9d32SEric Kohl TRACE("pszDevInst: %S\n", pszDevInst);
1674433c9d32SEric Kohl
1675433c9d32SEric Kohl pszKeyPath = MyMalloc(512 * sizeof(WCHAR));
1676433c9d32SEric Kohl if (pszKeyPath == NULL)
1677433c9d32SEric Kohl {
1678433c9d32SEric Kohl ret = CR_OUT_OF_MEMORY;
1679433c9d32SEric Kohl goto done;
1680433c9d32SEric Kohl }
1681433c9d32SEric Kohl
1682433c9d32SEric Kohl pszInstancePath = MyMalloc(512 * sizeof(WCHAR));
1683433c9d32SEric Kohl if (pszInstancePath == NULL)
1684433c9d32SEric Kohl {
1685433c9d32SEric Kohl ret = CR_OUT_OF_MEMORY;
1686433c9d32SEric Kohl goto done;
1687433c9d32SEric Kohl }
1688433c9d32SEric Kohl
1689433c9d32SEric Kohl ret = GetDeviceInstanceKeyPath(BindingHandle,
1690433c9d32SEric Kohl pszDevInst,
1691433c9d32SEric Kohl pszKeyPath,
1692433c9d32SEric Kohl pszInstancePath,
1693433c9d32SEric Kohl ulHardwareProfile,
1694433c9d32SEric Kohl ulFlags);
1695433c9d32SEric Kohl if (ret != CR_SUCCESS)
1696433c9d32SEric Kohl goto done;
1697433c9d32SEric Kohl
1698433c9d32SEric Kohl TRACE("pszKeyPath: %S\n", pszKeyPath);
1699433c9d32SEric Kohl TRACE("pszInstancePath: %S\n", pszInstancePath);
1700433c9d32SEric Kohl
1701433c9d32SEric Kohl if (ulFlags & CM_REGISTRY_USER)
1702433c9d32SEric Kohl {
1703433c9d32SEric Kohl FIXME("The CM_REGISTRY_USER flag is not supported yet!\n");
1704433c9d32SEric Kohl }
1705433c9d32SEric Kohl else
1706433c9d32SEric Kohl {
1707433c9d32SEric Kohl #if 0
1708433c9d32SEric Kohl if (!pSetupIsUserAdmin())
1709433c9d32SEric Kohl {
1710433c9d32SEric Kohl ret = CR_ACCESS_DENIED;
1711433c9d32SEric Kohl goto done;
1712433c9d32SEric Kohl }
1713433c9d32SEric Kohl #endif
1714433c9d32SEric Kohl
1715433c9d32SEric Kohl if (!(ulFlags & CM_REGISTRY_CONFIG))
1716433c9d32SEric Kohl ulHardwareProfile = 0;
1717433c9d32SEric Kohl
1718433c9d32SEric Kohl RpcTryExcept
1719433c9d32SEric Kohl {
1720433c9d32SEric Kohl ret = PNP_DeleteRegistryKey(BindingHandle,
1721433c9d32SEric Kohl pszDevInst,
1722433c9d32SEric Kohl pszKeyPath,
1723433c9d32SEric Kohl pszInstancePath,
1724433c9d32SEric Kohl ulHardwareProfile);
1725433c9d32SEric Kohl }
1726433c9d32SEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER)
1727433c9d32SEric Kohl {
1728433c9d32SEric Kohl ret = RpcStatusToCmStatus(RpcExceptionCode());
1729433c9d32SEric Kohl }
1730433c9d32SEric Kohl RpcEndExcept;
1731433c9d32SEric Kohl }
1732433c9d32SEric Kohl
1733433c9d32SEric Kohl done:
1734433c9d32SEric Kohl if (pszInstancePath != NULL)
1735433c9d32SEric Kohl MyFree(pszInstancePath);
1736433c9d32SEric Kohl
1737433c9d32SEric Kohl if (pszKeyPath != NULL)
1738433c9d32SEric Kohl MyFree(pszKeyPath);
1739433c9d32SEric Kohl
1740433c9d32SEric Kohl return ret;
1741c2c66affSColin Finck }
1742c2c66affSColin Finck
1743c2c66affSColin Finck
1744c2c66affSColin Finck /***********************************************************************
1745c2c66affSColin Finck * CM_Delete_Range [SETUPAPI.@]
1746c2c66affSColin Finck */
1747c2c66affSColin Finck CONFIGRET
1748c2c66affSColin Finck WINAPI
CM_Delete_Range(_In_ DWORDLONG ullStartValue,_In_ DWORDLONG ullEndValue,_In_ RANGE_LIST rlh,_In_ ULONG ulFlags)1749c2c66affSColin Finck CM_Delete_Range(
1750c2c66affSColin Finck _In_ DWORDLONG ullStartValue,
1751c2c66affSColin Finck _In_ DWORDLONG ullEndValue,
1752c2c66affSColin Finck _In_ RANGE_LIST rlh,
1753c2c66affSColin Finck _In_ ULONG ulFlags)
1754c2c66affSColin Finck {
1755c2c66affSColin Finck FIXME("CM_Delete_Range(%I64u %I64u %p %lx)\n",
1756c2c66affSColin Finck ullStartValue, ullEndValue, rlh, ulFlags);
175765d3bf74SEric Kohl
1758c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
1759c2c66affSColin Finck }
1760c2c66affSColin Finck
1761c2c66affSColin Finck
1762c2c66affSColin Finck /***********************************************************************
17630fbaea84SEric Kohl * CM_Detect_Resource_Conflict [SETUPAPI.@]
17640fbaea84SEric Kohl */
17650fbaea84SEric Kohl CONFIGRET
17660fbaea84SEric Kohl WINAPI
CM_Detect_Resource_Conflict(_In_ DEVINST dnDevInst,_In_ RESOURCEID ResourceID,_In_reads_bytes_ (ResourceLen)PCVOID ResourceData,_In_ ULONG ResourceLen,_Out_ PBOOL pbConflictDetected,_In_ ULONG ulFlags)17670fbaea84SEric Kohl CM_Detect_Resource_Conflict(
17680fbaea84SEric Kohl _In_ DEVINST dnDevInst,
17690fbaea84SEric Kohl _In_ RESOURCEID ResourceID,
17700fbaea84SEric Kohl _In_reads_bytes_(ResourceLen) PCVOID ResourceData,
17710fbaea84SEric Kohl _In_ ULONG ResourceLen,
17720fbaea84SEric Kohl _Out_ PBOOL pbConflictDetected,
17730fbaea84SEric Kohl _In_ ULONG ulFlags)
17740fbaea84SEric Kohl {
17750fbaea84SEric Kohl TRACE("CM_Detect_Resource_Conflict(%p %lu %p %lu %p 0x%lx)\n",
17760fbaea84SEric Kohl dnDevInst, ResourceID, ResourceData, ResourceLen,
17770fbaea84SEric Kohl pbConflictDetected, ulFlags);
17780fbaea84SEric Kohl
17790fbaea84SEric Kohl return CM_Detect_Resource_Conflict_Ex(dnDevInst,
17800fbaea84SEric Kohl ResourceID,
17810fbaea84SEric Kohl ResourceData,
17820fbaea84SEric Kohl ResourceLen,
17830fbaea84SEric Kohl pbConflictDetected,
17840fbaea84SEric Kohl ulFlags,
17850fbaea84SEric Kohl NULL);
17860fbaea84SEric Kohl }
17870fbaea84SEric Kohl
17880fbaea84SEric Kohl
17890fbaea84SEric Kohl /***********************************************************************
17900fbaea84SEric Kohl * CM_Detect_Resource_Conflict_Ex [SETUPAPI.@]
17910fbaea84SEric Kohl */
17920fbaea84SEric Kohl CONFIGRET
17930fbaea84SEric Kohl WINAPI
CM_Detect_Resource_Conflict_Ex(_In_ DEVINST dnDevInst,_In_ RESOURCEID ResourceID,_In_reads_bytes_ (ResourceLen)PCVOID ResourceData,_In_ ULONG ResourceLen,_Out_ PBOOL pbConflictDetected,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)17940fbaea84SEric Kohl CM_Detect_Resource_Conflict_Ex(
17950fbaea84SEric Kohl _In_ DEVINST dnDevInst,
17960fbaea84SEric Kohl _In_ RESOURCEID ResourceID,
17970fbaea84SEric Kohl _In_reads_bytes_(ResourceLen) PCVOID ResourceData,
17980fbaea84SEric Kohl _In_ ULONG ResourceLen,
17990fbaea84SEric Kohl _Out_ PBOOL pbConflictDetected,
18000fbaea84SEric Kohl _In_ ULONG ulFlags,
18010fbaea84SEric Kohl _In_opt_ HMACHINE hMachine)
18020fbaea84SEric Kohl {
18030fbaea84SEric Kohl FIXME("CM_Detect_Resource_Conflict_Ex(%p %lu %p %lu %p 0x%lx %p)\n",
18040fbaea84SEric Kohl dnDevInst, ResourceID, ResourceData, ResourceLen,
18050fbaea84SEric Kohl pbConflictDetected, ulFlags, hMachine);
18060fbaea84SEric Kohl
18070fbaea84SEric Kohl return CR_CALL_NOT_IMPLEMENTED;
18080fbaea84SEric Kohl }
18090fbaea84SEric Kohl
18100fbaea84SEric Kohl
18110fbaea84SEric Kohl /***********************************************************************
1812c2c66affSColin Finck * CM_Disable_DevNode [SETUPAPI.@]
1813c2c66affSColin Finck */
1814c7fc2ef4SEric Kohl CONFIGRET
1815c7fc2ef4SEric Kohl WINAPI
CM_Disable_DevNode(_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)1816c7fc2ef4SEric Kohl CM_Disable_DevNode(
1817c7fc2ef4SEric Kohl _In_ DEVINST dnDevInst,
1818c7fc2ef4SEric Kohl _In_ ULONG ulFlags)
1819c2c66affSColin Finck {
1820c7fc2ef4SEric Kohl TRACE("CM_Disable_DevNode(%p %lx)\n",
1821c7fc2ef4SEric Kohl dnDevInst, ulFlags);
182265d3bf74SEric Kohl
1823c2c66affSColin Finck return CM_Disable_DevNode_Ex(dnDevInst, ulFlags, NULL);
1824c2c66affSColin Finck }
1825c2c66affSColin Finck
1826c2c66affSColin Finck
1827c2c66affSColin Finck /***********************************************************************
1828c2c66affSColin Finck * CM_Disable_DevNode_Ex [SETUPAPI.@]
1829c2c66affSColin Finck */
1830c7fc2ef4SEric Kohl CONFIGRET
1831c7fc2ef4SEric Kohl WINAPI
CM_Disable_DevNode_Ex(_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)1832c7fc2ef4SEric Kohl CM_Disable_DevNode_Ex(
1833c7fc2ef4SEric Kohl _In_ DEVINST dnDevInst,
1834c7fc2ef4SEric Kohl _In_ ULONG ulFlags,
1835c7fc2ef4SEric Kohl _In_opt_ HMACHINE hMachine)
1836c2c66affSColin Finck {
1837c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
1838c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
1839c2c66affSColin Finck LPWSTR lpDevInst;
1840c2c66affSColin Finck CONFIGRET ret;
1841c2c66affSColin Finck
184235cb8f13SHervé Poussineau TRACE("CM_Disable_DevNode_Ex(%p %lx %p)\n",
1843c7fc2ef4SEric Kohl dnDevInst, ulFlags, hMachine);
1844c2c66affSColin Finck
1845c2c66affSColin Finck if (!pSetupIsUserAdmin())
1846c2c66affSColin Finck return CR_ACCESS_DENIED;
1847c2c66affSColin Finck
1848c2c66affSColin Finck if (dnDevInst == 0)
1849c2c66affSColin Finck return CR_INVALID_DEVINST;
1850c2c66affSColin Finck
1851c2c66affSColin Finck if (ulFlags != 0)
1852c2c66affSColin Finck return CR_INVALID_FLAG;
1853c2c66affSColin Finck
1854c2c66affSColin Finck if (hMachine != NULL)
1855c2c66affSColin Finck {
1856c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
1857c2c66affSColin Finck if (BindingHandle == NULL)
1858c2c66affSColin Finck return CR_FAILURE;
1859c2c66affSColin Finck
1860c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
1861c2c66affSColin Finck if (StringTable == 0)
1862c2c66affSColin Finck return CR_FAILURE;
1863c2c66affSColin Finck }
1864c2c66affSColin Finck else
1865c2c66affSColin Finck {
1866c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
1867c2c66affSColin Finck return CR_FAILURE;
1868c2c66affSColin Finck }
1869c2c66affSColin Finck
1870c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
1871c2c66affSColin Finck if (lpDevInst == NULL)
1872c2c66affSColin Finck return CR_INVALID_DEVNODE;
1873c2c66affSColin Finck
1874c2c66affSColin Finck RpcTryExcept
1875c2c66affSColin Finck {
18763909ebcfSEric Kohl ret = PNP_DisableDevInst(BindingHandle,
1877c2c66affSColin Finck lpDevInst,
18783909ebcfSEric Kohl NULL,
18793909ebcfSEric Kohl NULL,
18803909ebcfSEric Kohl 0,
18813909ebcfSEric Kohl ulFlags);
1882c2c66affSColin Finck }
1883c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
1884c2c66affSColin Finck {
1885c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
1886c2c66affSColin Finck }
1887c2c66affSColin Finck RpcEndExcept;
1888c2c66affSColin Finck
1889c2c66affSColin Finck return ret;
1890c2c66affSColin Finck }
1891c2c66affSColin Finck
1892c2c66affSColin Finck
1893c2c66affSColin Finck /***********************************************************************
1894c2c66affSColin Finck * CM_Disconnect_Machine [SETUPAPI.@]
1895c2c66affSColin Finck */
1896c7fc2ef4SEric Kohl CONFIGRET
1897c7fc2ef4SEric Kohl WINAPI
CM_Disconnect_Machine(_In_opt_ HMACHINE hMachine)1898c7fc2ef4SEric Kohl CM_Disconnect_Machine(
1899c7fc2ef4SEric Kohl _In_opt_ HMACHINE hMachine)
1900c2c66affSColin Finck {
1901c2c66affSColin Finck PMACHINE_INFO pMachine;
1902c2c66affSColin Finck
190360a21894SEric Kohl TRACE("CM_Disconnect_Machine(%p)\n", hMachine);
1904c2c66affSColin Finck
1905c2c66affSColin Finck pMachine = (PMACHINE_INFO)hMachine;
1906c2c66affSColin Finck if (pMachine == NULL)
1907c2c66affSColin Finck return CR_SUCCESS;
1908c2c66affSColin Finck
1909c2c66affSColin Finck if (pMachine->bLocal == FALSE)
1910c2c66affSColin Finck {
1911c2c66affSColin Finck if (pMachine->StringTable != NULL)
1912c2c66affSColin Finck pSetupStringTableDestroy(pMachine->StringTable);
1913c2c66affSColin Finck
1914c2c66affSColin Finck if (!PnpUnbindRpc(pMachine->BindingHandle))
1915c2c66affSColin Finck return CR_ACCESS_DENIED;
1916c2c66affSColin Finck }
1917c2c66affSColin Finck
1918c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, pMachine);
1919c2c66affSColin Finck
1920c2c66affSColin Finck return CR_SUCCESS;
1921c2c66affSColin Finck }
1922c2c66affSColin Finck
1923c2c66affSColin Finck
1924c2c66affSColin Finck /***********************************************************************
1925c2c66affSColin Finck * CM_Dup_Range_List [SETUPAPI.@]
1926c2c66affSColin Finck */
1927c2c66affSColin Finck CONFIGRET
1928c2c66affSColin Finck WINAPI
CM_Dup_Range_List(_In_ RANGE_LIST rlhOld,_In_ RANGE_LIST rlhNew,_In_ ULONG ulFlags)1929c2c66affSColin Finck CM_Dup_Range_List(
1930c2c66affSColin Finck _In_ RANGE_LIST rlhOld,
1931c2c66affSColin Finck _In_ RANGE_LIST rlhNew,
1932c2c66affSColin Finck _In_ ULONG ulFlags)
1933c2c66affSColin Finck {
1934f24fbb65SEric Kohl PINTERNAL_RANGE_LIST pOldRangeList, pNewRangeList;
1935f24fbb65SEric Kohl PINTERNAL_RANGE pOldRange, pNewRange;
1936f24fbb65SEric Kohl PLIST_ENTRY ListEntry;
1937f24fbb65SEric Kohl CONFIGRET ret = CR_SUCCESS;
1938f24fbb65SEric Kohl
1939c2c66affSColin Finck FIXME("CM_Dup_Range_List(%p %p %lx)\n",
1940c2c66affSColin Finck rlhOld, rlhNew, ulFlags);
194165d3bf74SEric Kohl
1942f24fbb65SEric Kohl pOldRangeList = (PINTERNAL_RANGE_LIST)rlhOld;
1943f24fbb65SEric Kohl pNewRangeList = (PINTERNAL_RANGE_LIST)rlhNew;
1944f24fbb65SEric Kohl
1945f24fbb65SEric Kohl if (!IsValidRangeList(pOldRangeList))
1946f24fbb65SEric Kohl return CR_INVALID_RANGE_LIST;
1947f24fbb65SEric Kohl
1948f24fbb65SEric Kohl if (!IsValidRangeList(pNewRangeList))
1949f24fbb65SEric Kohl return CR_INVALID_RANGE_LIST;
1950f24fbb65SEric Kohl
1951f24fbb65SEric Kohl if (ulFlags != 0)
1952f24fbb65SEric Kohl return CR_INVALID_FLAG;
1953f24fbb65SEric Kohl
1954f24fbb65SEric Kohl /* Lock the range lists */
1955f24fbb65SEric Kohl WaitForSingleObject(pOldRangeList->hMutex, INFINITE);
1956f24fbb65SEric Kohl WaitForSingleObject(pNewRangeList->hMutex, INFINITE);
1957f24fbb65SEric Kohl
1958f24fbb65SEric Kohl /* Delete the new range list, if ist is not empty */
1959f24fbb65SEric Kohl while (!IsListEmpty(&pNewRangeList->ListHead))
1960f24fbb65SEric Kohl {
1961f24fbb65SEric Kohl ListEntry = RemoveHeadList(&pNewRangeList->ListHead);
1962f24fbb65SEric Kohl pNewRange = CONTAINING_RECORD(ListEntry, INTERNAL_RANGE, ListEntry);
1963f24fbb65SEric Kohl HeapFree(GetProcessHeap(), 0, pNewRange);
1964f24fbb65SEric Kohl }
1965f24fbb65SEric Kohl
1966f24fbb65SEric Kohl /* Copy the old range list into the new range list */
1967f24fbb65SEric Kohl ListEntry = &pOldRangeList->ListHead;
1968f24fbb65SEric Kohl while (ListEntry->Flink == &pOldRangeList->ListHead)
1969f24fbb65SEric Kohl {
1970f24fbb65SEric Kohl pOldRange = CONTAINING_RECORD(ListEntry, INTERNAL_RANGE, ListEntry);
1971f24fbb65SEric Kohl
1972f24fbb65SEric Kohl pNewRange = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNAL_RANGE));
1973f24fbb65SEric Kohl if (pNewRange == NULL)
1974f24fbb65SEric Kohl {
1975f24fbb65SEric Kohl ret = CR_OUT_OF_MEMORY;
1976f24fbb65SEric Kohl goto done;
1977f24fbb65SEric Kohl }
1978f24fbb65SEric Kohl
1979f24fbb65SEric Kohl pNewRange->pRangeList = pNewRangeList;
1980f24fbb65SEric Kohl pNewRange->ullStart = pOldRange->ullStart;
1981f24fbb65SEric Kohl pNewRange->ullEnd = pOldRange->ullEnd;
1982f24fbb65SEric Kohl
1983f24fbb65SEric Kohl InsertTailList(&pNewRangeList->ListHead, &pNewRange->ListEntry);
1984f24fbb65SEric Kohl
1985f24fbb65SEric Kohl ListEntry = ListEntry->Flink;
1986f24fbb65SEric Kohl }
1987f24fbb65SEric Kohl
1988f24fbb65SEric Kohl done:
1989f24fbb65SEric Kohl /* Unlock the range lists */
1990f24fbb65SEric Kohl ReleaseMutex(pNewRangeList->hMutex);
1991f24fbb65SEric Kohl ReleaseMutex(pOldRangeList->hMutex);
1992f24fbb65SEric Kohl
1993f24fbb65SEric Kohl return ret;
1994c2c66affSColin Finck }
1995c2c66affSColin Finck
1996c2c66affSColin Finck
1997c2c66affSColin Finck /***********************************************************************
1998c2c66affSColin Finck * CM_Enable_DevNode [SETUPAPI.@]
1999c2c66affSColin Finck */
2000c7fc2ef4SEric Kohl CONFIGRET
2001c7fc2ef4SEric Kohl WINAPI
CM_Enable_DevNode(_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)2002c7fc2ef4SEric Kohl CM_Enable_DevNode(
2003c7fc2ef4SEric Kohl _In_ DEVINST dnDevInst,
2004c7fc2ef4SEric Kohl _In_ ULONG ulFlags)
2005c2c66affSColin Finck {
200665d3bf74SEric Kohl TRACE("CM_Enable_DevNode(%p %lx)\n",
200765d3bf74SEric Kohl dnDevInst, ulFlags);
200865d3bf74SEric Kohl
2009c2c66affSColin Finck return CM_Enable_DevNode_Ex(dnDevInst, ulFlags, NULL);
2010c2c66affSColin Finck }
2011c2c66affSColin Finck
2012c2c66affSColin Finck
2013c2c66affSColin Finck /***********************************************************************
2014c2c66affSColin Finck * CM_Enable_DevNode_Ex [SETUPAPI.@]
2015c2c66affSColin Finck */
2016c7fc2ef4SEric Kohl CONFIGRET
2017c7fc2ef4SEric Kohl WINAPI
CM_Enable_DevNode_Ex(_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)2018c7fc2ef4SEric Kohl CM_Enable_DevNode_Ex(
2019c7fc2ef4SEric Kohl _In_ DEVINST dnDevInst,
2020c7fc2ef4SEric Kohl _In_ ULONG ulFlags,
2021c7fc2ef4SEric Kohl _In_opt_ HMACHINE hMachine)
2022c2c66affSColin Finck {
2023c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
2024c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
2025c2c66affSColin Finck LPWSTR lpDevInst;
2026c2c66affSColin Finck CONFIGRET ret;
2027c2c66affSColin Finck
202865d3bf74SEric Kohl TRACE("CM_Enable_DevNode_Ex(%p %lx %p)\n",
202965d3bf74SEric Kohl dnDevInst, ulFlags, hMachine);
2030c2c66affSColin Finck
2031c2c66affSColin Finck if (!pSetupIsUserAdmin())
2032c2c66affSColin Finck return CR_ACCESS_DENIED;
2033c2c66affSColin Finck
2034c2c66affSColin Finck if (dnDevInst == 0)
2035c2c66affSColin Finck return CR_INVALID_DEVINST;
2036c2c66affSColin Finck
2037c2c66affSColin Finck if (ulFlags != 0)
2038c2c66affSColin Finck return CR_INVALID_FLAG;
2039c2c66affSColin Finck
2040c2c66affSColin Finck if (hMachine != NULL)
2041c2c66affSColin Finck {
2042c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
2043c2c66affSColin Finck if (BindingHandle == NULL)
2044c2c66affSColin Finck return CR_FAILURE;
2045c2c66affSColin Finck
2046c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
2047c2c66affSColin Finck if (StringTable == 0)
2048c2c66affSColin Finck return CR_FAILURE;
2049c2c66affSColin Finck }
2050c2c66affSColin Finck else
2051c2c66affSColin Finck {
2052c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
2053c2c66affSColin Finck return CR_FAILURE;
2054c2c66affSColin Finck }
2055c2c66affSColin Finck
2056c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
2057c2c66affSColin Finck if (lpDevInst == NULL)
2058c2c66affSColin Finck return CR_INVALID_DEVNODE;
2059c2c66affSColin Finck
2060c2c66affSColin Finck RpcTryExcept
2061c2c66affSColin Finck {
2062c2c66affSColin Finck ret = PNP_DeviceInstanceAction(BindingHandle,
2063c2c66affSColin Finck PNP_DEVINST_ENABLE,
2064c2c66affSColin Finck ulFlags,
2065c2c66affSColin Finck lpDevInst,
2066c2c66affSColin Finck NULL);
2067c2c66affSColin Finck }
2068c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
2069c2c66affSColin Finck {
2070c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
2071c2c66affSColin Finck }
2072c2c66affSColin Finck RpcEndExcept;
2073c2c66affSColin Finck
2074c2c66affSColin Finck return ret;
2075c2c66affSColin Finck }
2076c2c66affSColin Finck
2077c2c66affSColin Finck
2078c2c66affSColin Finck /***********************************************************************
2079c2c66affSColin Finck * CM_Enumerate_Classes [SETUPAPI.@]
2080c2c66affSColin Finck */
2081c7fc2ef4SEric Kohl CONFIGRET
2082c7fc2ef4SEric Kohl WINAPI
CM_Enumerate_Classes(_In_ ULONG ulClassIndex,_Out_ LPGUID ClassGuid,_In_ ULONG ulFlags)2083c7fc2ef4SEric Kohl CM_Enumerate_Classes(
2084c7fc2ef4SEric Kohl _In_ ULONG ulClassIndex,
2085c7fc2ef4SEric Kohl _Out_ LPGUID ClassGuid,
2086c7fc2ef4SEric Kohl _In_ ULONG ulFlags)
2087c2c66affSColin Finck {
2088c7fc2ef4SEric Kohl TRACE("CM_Enumerate_Classes(%lx %p %lx)\n",
2089c7fc2ef4SEric Kohl ulClassIndex, ClassGuid, ulFlags);
2090c7fc2ef4SEric Kohl
2091c2c66affSColin Finck return CM_Enumerate_Classes_Ex(ulClassIndex, ClassGuid, ulFlags, NULL);
2092c2c66affSColin Finck }
2093c2c66affSColin Finck
2094c2c66affSColin Finck
2095c2c66affSColin Finck /***********************************************************************
2096c2c66affSColin Finck * CM_Enumerate_Classes_Ex [SETUPAPI.@]
2097c2c66affSColin Finck */
2098c7fc2ef4SEric Kohl CONFIGRET
2099c7fc2ef4SEric Kohl WINAPI
CM_Enumerate_Classes_Ex(_In_ ULONG ulClassIndex,_Out_ LPGUID ClassGuid,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)2100c7fc2ef4SEric Kohl CM_Enumerate_Classes_Ex(
2101c7fc2ef4SEric Kohl _In_ ULONG ulClassIndex,
2102c7fc2ef4SEric Kohl _Out_ LPGUID ClassGuid,
2103c7fc2ef4SEric Kohl _In_ ULONG ulFlags,
2104c7fc2ef4SEric Kohl _In_opt_ HMACHINE hMachine)
2105c2c66affSColin Finck {
2106c2c66affSColin Finck WCHAR szBuffer[MAX_GUID_STRING_LEN];
2107c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
2108c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
2109c2c66affSColin Finck ULONG ulLength = MAX_GUID_STRING_LEN;
2110c2c66affSColin Finck
2111c7fc2ef4SEric Kohl TRACE("CM_Enumerate_Classes_Ex(%lx %p %lx %p)\n",
2112c7fc2ef4SEric Kohl ulClassIndex, ClassGuid, ulFlags, hMachine);
2113c2c66affSColin Finck
2114c2c66affSColin Finck if (ClassGuid == NULL)
2115c2c66affSColin Finck return CR_INVALID_POINTER;
2116c2c66affSColin Finck
2117c2c66affSColin Finck if (ulFlags != 0)
2118c2c66affSColin Finck return CR_INVALID_FLAG;
2119c2c66affSColin Finck
2120c2c66affSColin Finck if (hMachine != NULL)
2121c2c66affSColin Finck {
2122c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
2123c2c66affSColin Finck if (BindingHandle == NULL)
2124c2c66affSColin Finck return CR_FAILURE;
2125c2c66affSColin Finck }
2126c2c66affSColin Finck else
2127c2c66affSColin Finck {
2128c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
2129c2c66affSColin Finck return CR_FAILURE;
2130c2c66affSColin Finck }
2131c2c66affSColin Finck
2132c2c66affSColin Finck RpcTryExcept
2133c2c66affSColin Finck {
2134c2c66affSColin Finck ret = PNP_EnumerateSubKeys(BindingHandle,
2135c2c66affSColin Finck PNP_CLASS_SUBKEYS,
2136c2c66affSColin Finck ulClassIndex,
2137c2c66affSColin Finck szBuffer,
2138c2c66affSColin Finck MAX_GUID_STRING_LEN,
2139c2c66affSColin Finck &ulLength,
2140c2c66affSColin Finck ulFlags);
2141c2c66affSColin Finck }
2142c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
2143c2c66affSColin Finck {
2144c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
2145c2c66affSColin Finck }
2146c2c66affSColin Finck RpcEndExcept;
2147c2c66affSColin Finck
2148c2c66affSColin Finck if (ret == CR_SUCCESS)
2149c2c66affSColin Finck {
2150c2c66affSColin Finck /* Remove the {} */
2151c2c66affSColin Finck szBuffer[MAX_GUID_STRING_LEN - 2] = UNICODE_NULL;
2152c2c66affSColin Finck
2153c2c66affSColin Finck /* Convert the buffer to a GUID */
2154c2c66affSColin Finck if (UuidFromStringW(&szBuffer[1], ClassGuid) != RPC_S_OK)
2155c2c66affSColin Finck return CR_FAILURE;
2156c2c66affSColin Finck }
2157c2c66affSColin Finck
2158c2c66affSColin Finck return ret;
2159c2c66affSColin Finck }
2160c2c66affSColin Finck
2161c2c66affSColin Finck
2162c2c66affSColin Finck /***********************************************************************
2163c2c66affSColin Finck * CM_Enumerate_EnumeratorsA [SETUPAPI.@]
2164c2c66affSColin Finck */
2165c7fc2ef4SEric Kohl CONFIGRET
2166c7fc2ef4SEric Kohl WINAPI
CM_Enumerate_EnumeratorsA(_In_ ULONG ulEnumIndex,_Out_writes_ (* pulLength)PCHAR Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)2167c7fc2ef4SEric Kohl CM_Enumerate_EnumeratorsA(
2168c7fc2ef4SEric Kohl _In_ ULONG ulEnumIndex,
216965d3bf74SEric Kohl _Out_writes_(*pulLength) PCHAR Buffer,
2170c7fc2ef4SEric Kohl _Inout_ PULONG pulLength,
2171c7fc2ef4SEric Kohl _In_ ULONG ulFlags)
2172c2c66affSColin Finck {
2173c7fc2ef4SEric Kohl TRACE("CM_Enumerate_EnumeratorsA(%lu %p %p %lx)\n",
2174c7fc2ef4SEric Kohl ulEnumIndex, Buffer, pulLength, ulFlags);
2175c7fc2ef4SEric Kohl
2176c2c66affSColin Finck return CM_Enumerate_Enumerators_ExA(ulEnumIndex, Buffer, pulLength,
2177c2c66affSColin Finck ulFlags, NULL);
2178c2c66affSColin Finck }
2179c2c66affSColin Finck
2180c2c66affSColin Finck
2181c2c66affSColin Finck /***********************************************************************
2182c2c66affSColin Finck * CM_Enumerate_EnumeratorsW [SETUPAPI.@]
2183c2c66affSColin Finck */
2184c7fc2ef4SEric Kohl CONFIGRET
2185c7fc2ef4SEric Kohl WINAPI
CM_Enumerate_EnumeratorsW(_In_ ULONG ulEnumIndex,_Out_writes_ (* pulLength)PWCHAR Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)2186c7fc2ef4SEric Kohl CM_Enumerate_EnumeratorsW(
2187c7fc2ef4SEric Kohl _In_ ULONG ulEnumIndex,
218865d3bf74SEric Kohl _Out_writes_(*pulLength) PWCHAR Buffer,
2189c7fc2ef4SEric Kohl _Inout_ PULONG pulLength,
2190c7fc2ef4SEric Kohl _In_ ULONG ulFlags)
2191c2c66affSColin Finck {
2192c7fc2ef4SEric Kohl TRACE("CM_Enumerate_EnumeratorsW(%lu %p %p %lx)\n",
2193c7fc2ef4SEric Kohl ulEnumIndex, Buffer, pulLength, ulFlags);
2194c7fc2ef4SEric Kohl
2195c2c66affSColin Finck return CM_Enumerate_Enumerators_ExW(ulEnumIndex, Buffer, pulLength,
2196c2c66affSColin Finck ulFlags, NULL);
2197c2c66affSColin Finck }
2198c2c66affSColin Finck
2199c2c66affSColin Finck
2200c2c66affSColin Finck /***********************************************************************
2201c2c66affSColin Finck * CM_Enumerate_Enumerators_ExA [SETUPAPI.@]
2202c2c66affSColin Finck */
2203c7fc2ef4SEric Kohl CONFIGRET
2204c7fc2ef4SEric Kohl WINAPI
CM_Enumerate_Enumerators_ExA(_In_ ULONG ulEnumIndex,_Out_writes_ (* pulLength)PCHAR Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)2205c7fc2ef4SEric Kohl CM_Enumerate_Enumerators_ExA(
2206c7fc2ef4SEric Kohl _In_ ULONG ulEnumIndex,
220765d3bf74SEric Kohl _Out_writes_(*pulLength) PCHAR Buffer,
2208c7fc2ef4SEric Kohl _Inout_ PULONG pulLength,
2209c7fc2ef4SEric Kohl _In_ ULONG ulFlags,
2210c7fc2ef4SEric Kohl _In_opt_ HMACHINE hMachine)
2211c2c66affSColin Finck {
2212c2c66affSColin Finck WCHAR szBuffer[MAX_DEVICE_ID_LEN];
2213c2c66affSColin Finck ULONG ulOrigLength;
2214c2c66affSColin Finck ULONG ulLength;
2215c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
2216c2c66affSColin Finck
221760a21894SEric Kohl TRACE("CM_Enumerate_Enumerators_ExA(%lu %p %p %lx %p)\n",
2218c7fc2ef4SEric Kohl ulEnumIndex, Buffer, pulLength, ulFlags, hMachine);
2219c2c66affSColin Finck
2220c2c66affSColin Finck if (Buffer == NULL || pulLength == NULL)
2221c2c66affSColin Finck return CR_INVALID_POINTER;
2222c2c66affSColin Finck
2223c2c66affSColin Finck if (ulFlags != 0)
2224c2c66affSColin Finck return CR_INVALID_FLAG;
2225c2c66affSColin Finck
2226c2c66affSColin Finck ulOrigLength = *pulLength;
2227c2c66affSColin Finck *pulLength = 0;
2228c2c66affSColin Finck
2229c2c66affSColin Finck ulLength = MAX_DEVICE_ID_LEN;
2230c2c66affSColin Finck ret = CM_Enumerate_Enumerators_ExW(ulEnumIndex, szBuffer, &ulLength,
2231c2c66affSColin Finck ulFlags, hMachine);
2232c2c66affSColin Finck if (ret == CR_SUCCESS)
2233c2c66affSColin Finck {
2234c2c66affSColin Finck if (WideCharToMultiByte(CP_ACP,
2235c2c66affSColin Finck 0,
2236c2c66affSColin Finck szBuffer,
2237c2c66affSColin Finck ulLength,
2238c2c66affSColin Finck Buffer,
2239c2c66affSColin Finck ulOrigLength,
2240c2c66affSColin Finck NULL,
2241c2c66affSColin Finck NULL) == 0)
2242c2c66affSColin Finck ret = CR_FAILURE;
2243c2c66affSColin Finck else
2244c2c66affSColin Finck *pulLength = lstrlenA(Buffer) + 1;
2245c2c66affSColin Finck }
2246c2c66affSColin Finck
2247c2c66affSColin Finck return ret;
2248c2c66affSColin Finck }
2249c2c66affSColin Finck
2250c2c66affSColin Finck
2251c2c66affSColin Finck /***********************************************************************
2252c2c66affSColin Finck * CM_Enumerate_Enumerators_ExW [SETUPAPI.@]
2253c2c66affSColin Finck */
2254c7fc2ef4SEric Kohl CONFIGRET
2255c7fc2ef4SEric Kohl WINAPI
CM_Enumerate_Enumerators_ExW(_In_ ULONG ulEnumIndex,_Out_writes_ (* pulLength)PWCHAR Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)2256c7fc2ef4SEric Kohl CM_Enumerate_Enumerators_ExW(
2257c7fc2ef4SEric Kohl _In_ ULONG ulEnumIndex,
225865d3bf74SEric Kohl _Out_writes_(*pulLength) PWCHAR Buffer,
2259c7fc2ef4SEric Kohl _Inout_ PULONG pulLength,
2260c7fc2ef4SEric Kohl _In_ ULONG ulFlags,
2261c7fc2ef4SEric Kohl _In_opt_ HMACHINE hMachine)
2262c2c66affSColin Finck {
2263c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
2264c2c66affSColin Finck CONFIGRET ret;
2265c2c66affSColin Finck
226660a21894SEric Kohl TRACE("CM_Enumerate_Enumerators_ExW(%lu %p %p %lx %p)\n",
2267c7fc2ef4SEric Kohl ulEnumIndex, Buffer, pulLength, ulFlags, hMachine);
2268c2c66affSColin Finck
2269c2c66affSColin Finck if (Buffer == NULL || pulLength == NULL)
2270c2c66affSColin Finck return CR_INVALID_POINTER;
2271c2c66affSColin Finck
2272c2c66affSColin Finck if (ulFlags != 0)
2273c2c66affSColin Finck return CR_INVALID_FLAG;
2274c2c66affSColin Finck
2275c2c66affSColin Finck *Buffer = UNICODE_NULL;
2276c2c66affSColin Finck
2277c2c66affSColin Finck if (hMachine != NULL)
2278c2c66affSColin Finck {
2279c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
2280c2c66affSColin Finck if (BindingHandle == NULL)
2281c2c66affSColin Finck return CR_FAILURE;
2282c2c66affSColin Finck }
2283c2c66affSColin Finck else
2284c2c66affSColin Finck {
2285c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
2286c2c66affSColin Finck return CR_FAILURE;
2287c2c66affSColin Finck }
2288c2c66affSColin Finck
2289c2c66affSColin Finck RpcTryExcept
2290c2c66affSColin Finck {
2291c2c66affSColin Finck ret = PNP_EnumerateSubKeys(BindingHandle,
2292c2c66affSColin Finck PNP_ENUMERATOR_SUBKEYS,
2293c2c66affSColin Finck ulEnumIndex,
2294c2c66affSColin Finck Buffer,
2295c2c66affSColin Finck *pulLength,
2296c2c66affSColin Finck pulLength,
2297c2c66affSColin Finck ulFlags);
2298c2c66affSColin Finck }
2299c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
2300c2c66affSColin Finck {
2301c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
2302c2c66affSColin Finck }
2303c2c66affSColin Finck RpcEndExcept;
2304c2c66affSColin Finck
2305c2c66affSColin Finck return ret;
2306c2c66affSColin Finck }
2307c2c66affSColin Finck
2308c2c66affSColin Finck
2309c2c66affSColin Finck /***********************************************************************
2310c2c66affSColin Finck * CM_Find_Range [SETUPAPI.@]
2311c2c66affSColin Finck */
2312c2c66affSColin Finck CONFIGRET
2313c2c66affSColin Finck WINAPI
CM_Find_Range(_Out_ PDWORDLONG pullStart,_In_ DWORDLONG ullStart,_In_ ULONG ulLength,_In_ DWORDLONG ullAlignment,_In_ DWORDLONG ullEnd,_In_ RANGE_LIST rlh,_In_ ULONG ulFlags)2314c2c66affSColin Finck CM_Find_Range(
2315c2c66affSColin Finck _Out_ PDWORDLONG pullStart,
2316c2c66affSColin Finck _In_ DWORDLONG ullStart,
2317c2c66affSColin Finck _In_ ULONG ulLength,
2318c2c66affSColin Finck _In_ DWORDLONG ullAlignment,
2319c2c66affSColin Finck _In_ DWORDLONG ullEnd,
2320c2c66affSColin Finck _In_ RANGE_LIST rlh,
2321c2c66affSColin Finck _In_ ULONG ulFlags)
2322c2c66affSColin Finck {
2323c2c66affSColin Finck FIXME("CM_Find_Range(%p %I64u %lu %I64u %I64u %p %lx)\n",
2324c2c66affSColin Finck pullStart, ullStart, ulLength, ullAlignment, ullEnd, rlh, ulFlags);
232565d3bf74SEric Kohl
2326c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
2327c2c66affSColin Finck }
2328c2c66affSColin Finck
2329c2c66affSColin Finck
2330c2c66affSColin Finck /***********************************************************************
2331c2c66affSColin Finck * CM_First_Range [SETUPAPI.@]
2332c2c66affSColin Finck */
2333c2c66affSColin Finck CONFIGRET
2334c2c66affSColin Finck WINAPI
CM_First_Range(_In_ RANGE_LIST rlh,_Out_ PDWORDLONG pullStart,_Out_ PDWORDLONG pullEnd,_Out_ PRANGE_ELEMENT preElement,_In_ ULONG ulFlags)2335c2c66affSColin Finck CM_First_Range(
2336c2c66affSColin Finck _In_ RANGE_LIST rlh,
2337c2c66affSColin Finck _Out_ PDWORDLONG pullStart,
2338c2c66affSColin Finck _Out_ PDWORDLONG pullEnd,
2339c2c66affSColin Finck _Out_ PRANGE_ELEMENT preElement,
2340c2c66affSColin Finck _In_ ULONG ulFlags)
2341c2c66affSColin Finck {
23423ad5c7fdSEric Kohl PINTERNAL_RANGE_LIST pRangeList;
23433ad5c7fdSEric Kohl PINTERNAL_RANGE pRange;
23443ad5c7fdSEric Kohl PLIST_ENTRY ListEntry;
23453ad5c7fdSEric Kohl CONFIGRET ret = CR_SUCCESS;
23463ad5c7fdSEric Kohl
2347c2c66affSColin Finck FIXME("CM_First_Range(%p %p %p %p %lx)\n",
2348c2c66affSColin Finck rlh, pullStart, pullEnd, preElement, ulFlags);
23493ad5c7fdSEric Kohl
23503ad5c7fdSEric Kohl pRangeList = (PINTERNAL_RANGE_LIST)rlh;
23513ad5c7fdSEric Kohl
23523ad5c7fdSEric Kohl if (!IsValidRangeList(pRangeList))
23533ad5c7fdSEric Kohl return CR_INVALID_RANGE_LIST;
23543ad5c7fdSEric Kohl
23553ad5c7fdSEric Kohl if (pullStart == NULL || pullEnd == NULL || preElement == NULL)
23563ad5c7fdSEric Kohl return CR_INVALID_POINTER;
23573ad5c7fdSEric Kohl
23583ad5c7fdSEric Kohl if (ulFlags != 0)
23593ad5c7fdSEric Kohl return CR_INVALID_FLAG;
23603ad5c7fdSEric Kohl
23613ad5c7fdSEric Kohl /* Lock the range list */
23623ad5c7fdSEric Kohl WaitForSingleObject(pRangeList->hMutex, INFINITE);
23633ad5c7fdSEric Kohl
23643ad5c7fdSEric Kohl /* Fail, if the list is empty */
23653ad5c7fdSEric Kohl if (IsListEmpty(&pRangeList->ListHead))
23663ad5c7fdSEric Kohl {
23673ad5c7fdSEric Kohl ret = CR_FAILURE;
23683ad5c7fdSEric Kohl goto done;
23693ad5c7fdSEric Kohl }
23703ad5c7fdSEric Kohl
23713ad5c7fdSEric Kohl /* Get the first range */
23723ad5c7fdSEric Kohl ListEntry = pRangeList->ListHead.Flink;
23733ad5c7fdSEric Kohl pRange = CONTAINING_RECORD(ListEntry, INTERNAL_RANGE, ListEntry);
23743ad5c7fdSEric Kohl
23753ad5c7fdSEric Kohl /* Return the range data */
23763ad5c7fdSEric Kohl *pullStart = pRange->ullStart;
23773ad5c7fdSEric Kohl *pullEnd = pRange->ullEnd;
23783ad5c7fdSEric Kohl *preElement = (RANGE_ELEMENT)pRange;
23793ad5c7fdSEric Kohl
23803ad5c7fdSEric Kohl done:
23813ad5c7fdSEric Kohl /* Unlock the range list */
23823ad5c7fdSEric Kohl ReleaseMutex(pRangeList->hMutex);
23833ad5c7fdSEric Kohl
23843ad5c7fdSEric Kohl return ret;
2385c2c66affSColin Finck }
2386c2c66affSColin Finck
2387c2c66affSColin Finck
2388c2c66affSColin Finck /***********************************************************************
2389c2c66affSColin Finck * CM_Free_Log_Conf [SETUPAPI.@]
2390c2c66affSColin Finck */
2391c7fc2ef4SEric Kohl CONFIGRET
2392c7fc2ef4SEric Kohl WINAPI
CM_Free_Log_Conf(_In_ LOG_CONF lcLogConfToBeFreed,_In_ ULONG ulFlags)2393c7fc2ef4SEric Kohl CM_Free_Log_Conf(
2394c7fc2ef4SEric Kohl _In_ LOG_CONF lcLogConfToBeFreed,
2395c7fc2ef4SEric Kohl _In_ ULONG ulFlags)
2396c2c66affSColin Finck {
2397c7fc2ef4SEric Kohl TRACE("CM_Free_Log_Conf(%lx %lx)\n",
2398c7fc2ef4SEric Kohl lcLogConfToBeFreed, ulFlags);
2399c7fc2ef4SEric Kohl
2400c2c66affSColin Finck return CM_Free_Log_Conf_Ex(lcLogConfToBeFreed, ulFlags, NULL);
2401c2c66affSColin Finck }
2402c2c66affSColin Finck
2403c2c66affSColin Finck
2404c2c66affSColin Finck /***********************************************************************
2405c2c66affSColin Finck * CM_Free_Log_Conf_Ex [SETUPAPI.@]
2406c2c66affSColin Finck */
2407c7fc2ef4SEric Kohl CONFIGRET
2408c7fc2ef4SEric Kohl WINAPI
CM_Free_Log_Conf_Ex(_In_ LOG_CONF lcLogConfToBeFreed,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)2409c7fc2ef4SEric Kohl CM_Free_Log_Conf_Ex(
2410c7fc2ef4SEric Kohl _In_ LOG_CONF lcLogConfToBeFreed,
2411c7fc2ef4SEric Kohl _In_ ULONG ulFlags,
2412c7fc2ef4SEric Kohl _In_opt_ HMACHINE hMachine)
2413c2c66affSColin Finck {
2414c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
2415c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
2416c2c66affSColin Finck LPWSTR lpDevInst;
2417c2c66affSColin Finck PLOG_CONF_INFO pLogConfInfo;
2418c2c66affSColin Finck CONFIGRET ret;
2419c2c66affSColin Finck
242060a21894SEric Kohl TRACE("CM_Free_Log_Conf_Ex(%lx %lx %p)\n",
2421c7fc2ef4SEric Kohl lcLogConfToBeFreed, ulFlags, hMachine);
2422c2c66affSColin Finck
2423c2c66affSColin Finck if (!pSetupIsUserAdmin())
2424c2c66affSColin Finck return CR_ACCESS_DENIED;
2425c2c66affSColin Finck
2426c2c66affSColin Finck pLogConfInfo = (PLOG_CONF_INFO)lcLogConfToBeFreed;
242719fc20f2SEric Kohl if (!IsValidLogConf(pLogConfInfo))
2428c2c66affSColin Finck return CR_INVALID_LOG_CONF;
2429c2c66affSColin Finck
2430c2c66affSColin Finck if (ulFlags != 0)
2431c2c66affSColin Finck return CR_INVALID_FLAG;
2432c2c66affSColin Finck
2433c2c66affSColin Finck if (hMachine != NULL)
2434c2c66affSColin Finck {
2435c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
2436c2c66affSColin Finck if (BindingHandle == NULL)
2437c2c66affSColin Finck return CR_FAILURE;
2438c2c66affSColin Finck
2439c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
2440c2c66affSColin Finck if (StringTable == 0)
2441c2c66affSColin Finck return CR_FAILURE;
2442c2c66affSColin Finck }
2443c2c66affSColin Finck else
2444c2c66affSColin Finck {
2445c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
2446c2c66affSColin Finck return CR_FAILURE;
2447c2c66affSColin Finck }
2448c2c66affSColin Finck
2449c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, pLogConfInfo->dnDevInst);
2450c2c66affSColin Finck if (lpDevInst == NULL)
2451c2c66affSColin Finck return CR_INVALID_DEVNODE;
2452c2c66affSColin Finck
2453c2c66affSColin Finck RpcTryExcept
2454c2c66affSColin Finck {
24556efb3cbeSEric Kohl ret = PNP_FreeLogConf(BindingHandle,
24566efb3cbeSEric Kohl lpDevInst,
24576efb3cbeSEric Kohl pLogConfInfo->ulType,
24586efb3cbeSEric Kohl pLogConfInfo->ulTag,
24596efb3cbeSEric Kohl 0);
2460c2c66affSColin Finck }
2461c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
2462c2c66affSColin Finck {
2463c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
2464c2c66affSColin Finck }
2465c2c66affSColin Finck RpcEndExcept;
2466c2c66affSColin Finck
2467c2c66affSColin Finck return ret;
2468c2c66affSColin Finck }
2469c2c66affSColin Finck
2470c2c66affSColin Finck
2471c2c66affSColin Finck /***********************************************************************
2472c2c66affSColin Finck * CM_Free_Log_Conf_Handle [SETUPAPI.@]
2473c2c66affSColin Finck */
2474c7fc2ef4SEric Kohl CONFIGRET
2475c7fc2ef4SEric Kohl WINAPI
CM_Free_Log_Conf_Handle(_In_ LOG_CONF lcLogConf)2476c7fc2ef4SEric Kohl CM_Free_Log_Conf_Handle(
2477c7fc2ef4SEric Kohl _In_ LOG_CONF lcLogConf)
2478c2c66affSColin Finck {
2479c2c66affSColin Finck PLOG_CONF_INFO pLogConfInfo;
2480c2c66affSColin Finck
2481c7fc2ef4SEric Kohl TRACE("CM_Free_Log_Conf_Handle(%lx)\n", lcLogConf);
2482c2c66affSColin Finck
2483c2c66affSColin Finck pLogConfInfo = (PLOG_CONF_INFO)lcLogConf;
248419fc20f2SEric Kohl if (!IsValidLogConf(pLogConfInfo))
2485c2c66affSColin Finck return CR_INVALID_LOG_CONF;
2486c2c66affSColin Finck
2487c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, pLogConfInfo);
2488c2c66affSColin Finck
2489c2c66affSColin Finck return CR_SUCCESS;
2490c2c66affSColin Finck }
2491c2c66affSColin Finck
2492c2c66affSColin Finck
2493c2c66affSColin Finck /***********************************************************************
2494c2c66affSColin Finck * CM_Free_Range_List [SETUPAPI.@]
2495c2c66affSColin Finck */
2496c2c66affSColin Finck CONFIGRET
2497c2c66affSColin Finck WINAPI
CM_Free_Range_List(_In_ RANGE_LIST RangeList,_In_ ULONG ulFlags)2498c2c66affSColin Finck CM_Free_Range_List(
2499c2c66affSColin Finck _In_ RANGE_LIST RangeList,
2500c2c66affSColin Finck _In_ ULONG ulFlags)
2501c2c66affSColin Finck {
2502c2c66affSColin Finck PINTERNAL_RANGE_LIST pRangeList;
25033ad5c7fdSEric Kohl PINTERNAL_RANGE pRange;
25043ad5c7fdSEric Kohl PLIST_ENTRY ListEntry;
2505c2c66affSColin Finck
25063ad5c7fdSEric Kohl FIXME("CM_Free_Range_List(%p %lx)\n",
25073ad5c7fdSEric Kohl RangeList, ulFlags);
2508c2c66affSColin Finck
2509c2c66affSColin Finck pRangeList = (PINTERNAL_RANGE_LIST)RangeList;
2510c2c66affSColin Finck
25113ad5c7fdSEric Kohl if (!IsValidRangeList(pRangeList))
2512c2c66affSColin Finck return CR_INVALID_RANGE_LIST;
2513c2c66affSColin Finck
2514c2c66affSColin Finck if (ulFlags != 0)
2515c2c66affSColin Finck return CR_INVALID_FLAG;
2516c2c66affSColin Finck
25173ad5c7fdSEric Kohl /* Lock the range list */
25183ad5c7fdSEric Kohl WaitForSingleObject(pRangeList->hMutex, INFINITE);
2519c2c66affSColin Finck
25203ad5c7fdSEric Kohl /* Free the list of ranges */
25213ad5c7fdSEric Kohl while (!IsListEmpty(&pRangeList->ListHead))
25223ad5c7fdSEric Kohl {
25233ad5c7fdSEric Kohl ListEntry = RemoveHeadList(&pRangeList->ListHead);
25243ad5c7fdSEric Kohl pRange = CONTAINING_RECORD(ListEntry, INTERNAL_RANGE, ListEntry);
25253ad5c7fdSEric Kohl HeapFree(GetProcessHeap(), 0, pRange);
25263ad5c7fdSEric Kohl }
25273ad5c7fdSEric Kohl
25283ad5c7fdSEric Kohl /* Unlock the range list */
25293ad5c7fdSEric Kohl ReleaseMutex(pRangeList->hMutex);
25303ad5c7fdSEric Kohl
25313ad5c7fdSEric Kohl /* Close the mutex */
25323ad5c7fdSEric Kohl CloseHandle(pRangeList->hMutex);
25333ad5c7fdSEric Kohl
25343ad5c7fdSEric Kohl /* Free the range list */
2535c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, pRangeList);
2536c2c66affSColin Finck
2537c2c66affSColin Finck return CR_SUCCESS;
2538c2c66affSColin Finck }
2539c2c66affSColin Finck
2540c2c66affSColin Finck
2541c2c66affSColin Finck /***********************************************************************
2542c2c66affSColin Finck * CM_Free_Res_Des [SETUPAPI.@]
2543c2c66affSColin Finck */
2544c7fc2ef4SEric Kohl CONFIGRET
2545c7fc2ef4SEric Kohl WINAPI
CM_Free_Res_Des(_Out_ PRES_DES prdResDes,_In_ RES_DES rdResDes,_In_ ULONG ulFlags)2546c7fc2ef4SEric Kohl CM_Free_Res_Des(
2547c7fc2ef4SEric Kohl _Out_ PRES_DES prdResDes,
2548c7fc2ef4SEric Kohl _In_ RES_DES rdResDes,
2549c7fc2ef4SEric Kohl _In_ ULONG ulFlags)
2550c2c66affSColin Finck {
2551c7fc2ef4SEric Kohl TRACE("CM_Free_Res_Des(%p %p %lx)\n",
2552c7fc2ef4SEric Kohl prdResDes, rdResDes, ulFlags);
2553c7fc2ef4SEric Kohl
2554c2c66affSColin Finck return CM_Free_Res_Des_Ex(prdResDes, rdResDes, ulFlags, NULL);
2555c2c66affSColin Finck }
2556c2c66affSColin Finck
2557c2c66affSColin Finck
2558c2c66affSColin Finck /***********************************************************************
2559c2c66affSColin Finck * CM_Free_Res_Des_Ex [SETUPAPI.@]
2560c2c66affSColin Finck */
2561c7fc2ef4SEric Kohl CONFIGRET
2562c7fc2ef4SEric Kohl WINAPI
CM_Free_Res_Des_Ex(_Out_ PRES_DES prdResDes,_In_ RES_DES rdResDes,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)2563c7fc2ef4SEric Kohl CM_Free_Res_Des_Ex(
2564c7fc2ef4SEric Kohl _Out_ PRES_DES prdResDes,
2565c7fc2ef4SEric Kohl _In_ RES_DES rdResDes,
2566c7fc2ef4SEric Kohl _In_ ULONG ulFlags,
2567c7fc2ef4SEric Kohl _In_opt_ HMACHINE hMachine)
2568c2c66affSColin Finck {
256960a21894SEric Kohl FIXME("CM_Free_Res_Des_Ex(%p %p %lx %p)\n",
2570c7fc2ef4SEric Kohl prdResDes, rdResDes, ulFlags, hMachine);
2571c2c66affSColin Finck
2572c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
2573c2c66affSColin Finck }
2574c2c66affSColin Finck
2575c2c66affSColin Finck
2576c2c66affSColin Finck /***********************************************************************
2577c2c66affSColin Finck * CM_Free_Res_Des_Handle [SETUPAPI.@]
2578c2c66affSColin Finck */
2579c7fc2ef4SEric Kohl CONFIGRET
2580c7fc2ef4SEric Kohl WINAPI
CM_Free_Res_Des_Handle(_In_ RES_DES rdResDes)2581c7fc2ef4SEric Kohl CM_Free_Res_Des_Handle(
2582c7fc2ef4SEric Kohl _In_ RES_DES rdResDes)
2583c2c66affSColin Finck {
2584894ad4f1SEric Kohl PRES_DES_INFO pResDesInfo;
2585894ad4f1SEric Kohl
2586c7fc2ef4SEric Kohl FIXME("CM_Free_Res_Des_Handle(%p)\n", rdResDes);
2587c2c66affSColin Finck
2588894ad4f1SEric Kohl pResDesInfo = (PRES_DES_INFO)rdResDes;
2589894ad4f1SEric Kohl if (!IsValidResDes(pResDesInfo))
2590894ad4f1SEric Kohl return CR_INVALID_RES_DES;
2591894ad4f1SEric Kohl
2592894ad4f1SEric Kohl HeapFree(GetProcessHeap(), 0, pResDesInfo);
2593894ad4f1SEric Kohl
2594894ad4f1SEric Kohl return CR_SUCCESS;
2595c2c66affSColin Finck }
2596c2c66affSColin Finck
2597c2c66affSColin Finck
2598c2c66affSColin Finck /***********************************************************************
2599d7e40954SEric Kohl * CM_Free_Resource_Conflict_Handle [SETUPAPI.@]
2600d7e40954SEric Kohl */
2601d7e40954SEric Kohl CONFIGRET
2602d7e40954SEric Kohl WINAPI
CM_Free_Resource_Conflict_Handle(_In_ CONFLICT_LIST clConflictList)2603d7e40954SEric Kohl CM_Free_Resource_Conflict_Handle(
2604d7e40954SEric Kohl _In_ CONFLICT_LIST clConflictList)
2605d7e40954SEric Kohl {
2606cee1817eSEric Kohl PCONFLICT_DATA pConflictData;
2607d7e40954SEric Kohl
2608cee1817eSEric Kohl FIXME("CM_Free_Resource_Conflict_Handle(%p)\n",
2609cee1817eSEric Kohl clConflictList);
2610cee1817eSEric Kohl
2611cee1817eSEric Kohl pConflictData = (PCONFLICT_DATA)clConflictList;
2612cee1817eSEric Kohl if (!IsValidConflictData(pConflictData))
2613cee1817eSEric Kohl return CR_INVALID_CONFLICT_LIST;
2614cee1817eSEric Kohl
2615cee1817eSEric Kohl if (pConflictData->pConflictList != NULL)
2616cee1817eSEric Kohl MyFree(pConflictData->pConflictList);
2617cee1817eSEric Kohl
2618cee1817eSEric Kohl MyFree(pConflictData);
2619cee1817eSEric Kohl
2620cee1817eSEric Kohl return CR_SUCCESS;
2621d7e40954SEric Kohl }
2622d7e40954SEric Kohl
2623d7e40954SEric Kohl
2624d7e40954SEric Kohl /***********************************************************************
2625c2c66affSColin Finck * CM_Get_Child [SETUPAPI.@]
2626c2c66affSColin Finck */
2627c7fc2ef4SEric Kohl CONFIGRET
2628c7fc2ef4SEric Kohl WINAPI
CM_Get_Child(_Out_ PDEVINST pdnDevInst,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)2629c7fc2ef4SEric Kohl CM_Get_Child(
2630c7fc2ef4SEric Kohl _Out_ PDEVINST pdnDevInst,
2631c7fc2ef4SEric Kohl _In_ DEVINST dnDevInst,
2632c7fc2ef4SEric Kohl _In_ ULONG ulFlags)
2633c2c66affSColin Finck {
2634c7fc2ef4SEric Kohl TRACE("CM_Get_Child(%p %p %lx)\n",
2635c7fc2ef4SEric Kohl pdnDevInst, dnDevInst, ulFlags);
2636c7fc2ef4SEric Kohl
2637c2c66affSColin Finck return CM_Get_Child_Ex(pdnDevInst, dnDevInst, ulFlags, NULL);
2638c2c66affSColin Finck }
2639c2c66affSColin Finck
2640c2c66affSColin Finck
2641c2c66affSColin Finck /***********************************************************************
2642c2c66affSColin Finck * CM_Get_Child_Ex [SETUPAPI.@]
2643c2c66affSColin Finck */
2644c7fc2ef4SEric Kohl CONFIGRET
2645c7fc2ef4SEric Kohl WINAPI
CM_Get_Child_Ex(_Out_ PDEVINST pdnDevInst,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)2646c7fc2ef4SEric Kohl CM_Get_Child_Ex(
2647c7fc2ef4SEric Kohl _Out_ PDEVINST pdnDevInst,
2648c7fc2ef4SEric Kohl _In_ DEVINST dnDevInst,
2649c7fc2ef4SEric Kohl _In_ ULONG ulFlags,
2650c7fc2ef4SEric Kohl _In_opt_ HMACHINE hMachine)
2651c2c66affSColin Finck {
2652c2c66affSColin Finck WCHAR szRelatedDevInst[MAX_DEVICE_ID_LEN];
2653c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
2654c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
2655c2c66affSColin Finck LPWSTR lpDevInst;
2656c2c66affSColin Finck DWORD dwIndex, dwLength = MAX_DEVICE_ID_LEN;
2657c2c66affSColin Finck CONFIGRET ret;
2658c2c66affSColin Finck
265960a21894SEric Kohl TRACE("CM_Get_Child_Ex(%p %lx %lx %p)\n",
2660c7fc2ef4SEric Kohl pdnDevInst, dnDevInst, ulFlags, hMachine);
2661c2c66affSColin Finck
2662c2c66affSColin Finck if (pdnDevInst == NULL)
2663c2c66affSColin Finck return CR_INVALID_POINTER;
2664c2c66affSColin Finck
2665c2c66affSColin Finck if (dnDevInst == 0)
2666c2c66affSColin Finck return CR_INVALID_DEVINST;
2667c2c66affSColin Finck
2668c2c66affSColin Finck if (ulFlags != 0)
2669c2c66affSColin Finck return CR_INVALID_FLAG;
2670c2c66affSColin Finck
2671c2c66affSColin Finck *pdnDevInst = -1;
2672c2c66affSColin Finck
2673c2c66affSColin Finck if (hMachine != NULL)
2674c2c66affSColin Finck {
2675c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
2676c2c66affSColin Finck if (BindingHandle == NULL)
2677c2c66affSColin Finck return CR_FAILURE;
2678c2c66affSColin Finck
2679c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
2680c2c66affSColin Finck if (StringTable == 0)
2681c2c66affSColin Finck return CR_FAILURE;
2682c2c66affSColin Finck }
2683c2c66affSColin Finck else
2684c2c66affSColin Finck {
2685c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
2686c2c66affSColin Finck return CR_FAILURE;
2687c2c66affSColin Finck }
2688c2c66affSColin Finck
2689c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
2690c2c66affSColin Finck if (lpDevInst == NULL)
2691c2c66affSColin Finck return CR_INVALID_DEVNODE;
2692c2c66affSColin Finck
2693c2c66affSColin Finck RpcTryExcept
2694c2c66affSColin Finck {
2695c2c66affSColin Finck ret = PNP_GetRelatedDeviceInstance(BindingHandle,
2696c2c66affSColin Finck PNP_GET_CHILD_DEVICE_INSTANCE,
2697c2c66affSColin Finck lpDevInst,
2698c2c66affSColin Finck szRelatedDevInst,
2699c2c66affSColin Finck &dwLength,
2700c2c66affSColin Finck 0);
2701c2c66affSColin Finck }
2702c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
2703c2c66affSColin Finck {
2704c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
2705c2c66affSColin Finck }
2706c2c66affSColin Finck RpcEndExcept;
2707c2c66affSColin Finck
2708c2c66affSColin Finck if (ret != CR_SUCCESS)
2709c2c66affSColin Finck return ret;
2710c2c66affSColin Finck
2711c2c66affSColin Finck TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst));
2712c2c66affSColin Finck
2713c2c66affSColin Finck dwIndex = pSetupStringTableAddString(StringTable, szRelatedDevInst, 1);
2714c2c66affSColin Finck if (dwIndex == -1)
2715c2c66affSColin Finck return CR_FAILURE;
2716c2c66affSColin Finck
2717c2c66affSColin Finck *pdnDevInst = dwIndex;
2718c2c66affSColin Finck
2719c2c66affSColin Finck return CR_SUCCESS;
2720c2c66affSColin Finck }
2721c2c66affSColin Finck
2722c2c66affSColin Finck
2723c2c66affSColin Finck /***********************************************************************
2724c2c66affSColin Finck * CM_Get_Class_Key_NameA [SETUPAPI.@]
2725c2c66affSColin Finck */
272665d3bf74SEric Kohl CONFIGRET
272765d3bf74SEric Kohl WINAPI
CM_Get_Class_Key_NameA(_In_ LPGUID ClassGuid,_Out_writes_opt_ (* pulLength)LPSTR pszKeyName,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)272865d3bf74SEric Kohl CM_Get_Class_Key_NameA(
272965d3bf74SEric Kohl _In_ LPGUID ClassGuid,
273065d3bf74SEric Kohl _Out_writes_opt_(*pulLength) LPSTR pszKeyName,
273165d3bf74SEric Kohl _Inout_ PULONG pulLength,
273265d3bf74SEric Kohl _In_ ULONG ulFlags)
2733c2c66affSColin Finck {
273465d3bf74SEric Kohl TRACE("CM_Get_Class_Key_NameA(%p %p %p %lx)\n",
2735c2c66affSColin Finck ClassGuid, pszKeyName, pulLength, ulFlags);
273665d3bf74SEric Kohl
2737c2c66affSColin Finck return CM_Get_Class_Key_Name_ExA(ClassGuid, pszKeyName, pulLength,
2738c2c66affSColin Finck ulFlags, NULL);
2739c2c66affSColin Finck }
2740c2c66affSColin Finck
2741c2c66affSColin Finck
2742c2c66affSColin Finck /***********************************************************************
2743c2c66affSColin Finck * CM_Get_Class_Key_NameW [SETUPAPI.@]
2744c2c66affSColin Finck */
274565d3bf74SEric Kohl CONFIGRET
274665d3bf74SEric Kohl WINAPI
CM_Get_Class_Key_NameW(_In_ LPGUID ClassGuid,_Out_writes_opt_ (* pulLength)LPWSTR pszKeyName,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)274765d3bf74SEric Kohl CM_Get_Class_Key_NameW(
274865d3bf74SEric Kohl _In_ LPGUID ClassGuid,
274965d3bf74SEric Kohl _Out_writes_opt_(*pulLength) LPWSTR pszKeyName,
275065d3bf74SEric Kohl _Inout_ PULONG pulLength,
275165d3bf74SEric Kohl _In_ ULONG ulFlags)
2752c2c66affSColin Finck {
275365d3bf74SEric Kohl TRACE("CM_Get_Class_Key_NameW(%p %p %p %lx)\n",
2754c2c66affSColin Finck ClassGuid, pszKeyName, pulLength, ulFlags);
275565d3bf74SEric Kohl
2756c2c66affSColin Finck return CM_Get_Class_Key_Name_ExW(ClassGuid, pszKeyName, pulLength,
2757c2c66affSColin Finck ulFlags, NULL);
2758c2c66affSColin Finck }
2759c2c66affSColin Finck
2760c2c66affSColin Finck
2761c2c66affSColin Finck /***********************************************************************
2762c2c66affSColin Finck * CM_Get_Class_Key_Name_ExA [SETUPAPI.@]
2763c2c66affSColin Finck */
276465d3bf74SEric Kohl CONFIGRET
276565d3bf74SEric Kohl WINAPI
CM_Get_Class_Key_Name_ExA(_In_ LPGUID ClassGuid,_Out_writes_opt_ (* pulLength)LPSTR pszKeyName,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)276665d3bf74SEric Kohl CM_Get_Class_Key_Name_ExA(
276765d3bf74SEric Kohl _In_ LPGUID ClassGuid,
276865d3bf74SEric Kohl _Out_writes_opt_(*pulLength) LPSTR pszKeyName,
276965d3bf74SEric Kohl _Inout_ PULONG pulLength,
277065d3bf74SEric Kohl _In_ ULONG ulFlags,
277165d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
2772c2c66affSColin Finck {
2773c2c66affSColin Finck WCHAR szBuffer[MAX_GUID_STRING_LEN];
2774c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
2775c2c66affSColin Finck ULONG ulLength;
2776c2c66affSColin Finck ULONG ulOrigLength;
2777c2c66affSColin Finck
277860a21894SEric Kohl TRACE("CM_Get_Class_Key_Name_ExA(%p %p %p %lx %p)\n",
2779c2c66affSColin Finck ClassGuid, pszKeyName, pulLength, ulFlags, hMachine);
2780c2c66affSColin Finck
2781c2c66affSColin Finck if (ClassGuid == NULL || pszKeyName == NULL || pulLength == NULL)
2782c2c66affSColin Finck return CR_INVALID_POINTER;
2783c2c66affSColin Finck
2784c2c66affSColin Finck ulOrigLength = *pulLength;
2785c2c66affSColin Finck *pulLength = 0;
2786c2c66affSColin Finck
2787c2c66affSColin Finck ulLength = MAX_GUID_STRING_LEN;
2788c2c66affSColin Finck ret = CM_Get_Class_Key_Name_ExW(ClassGuid, szBuffer, &ulLength,
2789c2c66affSColin Finck ulFlags, hMachine);
2790c2c66affSColin Finck if (ret == CR_SUCCESS)
2791c2c66affSColin Finck {
2792c2c66affSColin Finck if (WideCharToMultiByte(CP_ACP,
2793c2c66affSColin Finck 0,
2794c2c66affSColin Finck szBuffer,
2795c2c66affSColin Finck ulLength,
2796c2c66affSColin Finck pszKeyName,
2797c2c66affSColin Finck ulOrigLength,
2798c2c66affSColin Finck NULL,
2799c2c66affSColin Finck NULL) == 0)
2800c2c66affSColin Finck ret = CR_FAILURE;
2801c2c66affSColin Finck else
2802c2c66affSColin Finck *pulLength = lstrlenA(pszKeyName) + 1;
2803c2c66affSColin Finck }
2804c2c66affSColin Finck
2805c2c66affSColin Finck return CR_SUCCESS;
2806c2c66affSColin Finck }
2807c2c66affSColin Finck
2808c2c66affSColin Finck
2809c2c66affSColin Finck /***********************************************************************
2810c2c66affSColin Finck * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
2811c2c66affSColin Finck */
281265d3bf74SEric Kohl CONFIGRET
281365d3bf74SEric Kohl WINAPI
CM_Get_Class_Key_Name_ExW(_In_ LPGUID ClassGuid,_Out_writes_opt_ (* pulLength)LPWSTR pszKeyName,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)281465d3bf74SEric Kohl CM_Get_Class_Key_Name_ExW(
281565d3bf74SEric Kohl _In_ LPGUID ClassGuid,
281665d3bf74SEric Kohl _Out_writes_opt_(*pulLength) LPWSTR pszKeyName,
281765d3bf74SEric Kohl _Inout_ PULONG pulLength,
281865d3bf74SEric Kohl _In_ ULONG ulFlags,
281965d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
2820c2c66affSColin Finck {
282160a21894SEric Kohl TRACE("CM_Get_Class_Key_Name_ExW(%p %p %p %lx %p)\n",
2822c2c66affSColin Finck ClassGuid, pszKeyName, pulLength, ulFlags, hMachine);
2823c2c66affSColin Finck
2824c2c66affSColin Finck if (ClassGuid == NULL || pszKeyName == NULL || pulLength == NULL)
2825c2c66affSColin Finck return CR_INVALID_POINTER;
2826c2c66affSColin Finck
2827c2c66affSColin Finck if (ulFlags != 0)
2828c2c66affSColin Finck return CR_INVALID_FLAG;
2829c2c66affSColin Finck
2830c2c66affSColin Finck if (*pulLength < MAX_GUID_STRING_LEN)
2831c2c66affSColin Finck {
2832c2c66affSColin Finck *pulLength = 0;
2833c2c66affSColin Finck return CR_BUFFER_SMALL;
2834c2c66affSColin Finck }
2835c2c66affSColin Finck
2836c2c66affSColin Finck if (!GuidToString(ClassGuid, pszKeyName))
2837c2c66affSColin Finck return CR_INVALID_DATA;
2838c2c66affSColin Finck
2839c2c66affSColin Finck *pulLength = MAX_GUID_STRING_LEN;
2840c2c66affSColin Finck
2841c2c66affSColin Finck return CR_SUCCESS;
2842c2c66affSColin Finck }
2843c2c66affSColin Finck
2844c2c66affSColin Finck
2845c2c66affSColin Finck /***********************************************************************
2846c2c66affSColin Finck * CM_Get_Class_NameA [SETUPAPI.@]
2847c2c66affSColin Finck */
284865d3bf74SEric Kohl CONFIGRET
284965d3bf74SEric Kohl WINAPI
CM_Get_Class_NameA(_In_ LPGUID ClassGuid,_Out_writes_opt_ (* pulLength)PCHAR Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)285065d3bf74SEric Kohl CM_Get_Class_NameA(
285165d3bf74SEric Kohl _In_ LPGUID ClassGuid,
285265d3bf74SEric Kohl _Out_writes_opt_(*pulLength) PCHAR Buffer,
285365d3bf74SEric Kohl _Inout_ PULONG pulLength,
285465d3bf74SEric Kohl _In_ ULONG ulFlags)
2855c2c66affSColin Finck {
285665d3bf74SEric Kohl TRACE("CM_Get_Class_NameA(%p %p %p %lx)\n",
285765d3bf74SEric Kohl ClassGuid, Buffer, pulLength, ulFlags);
285865d3bf74SEric Kohl
2859c2c66affSColin Finck return CM_Get_Class_Name_ExA(ClassGuid, Buffer, pulLength, ulFlags,
2860c2c66affSColin Finck NULL);
2861c2c66affSColin Finck }
2862c2c66affSColin Finck
2863c2c66affSColin Finck
2864c2c66affSColin Finck /***********************************************************************
2865c2c66affSColin Finck * CM_Get_Class_NameW [SETUPAPI.@]
2866c2c66affSColin Finck */
286765d3bf74SEric Kohl CONFIGRET
286865d3bf74SEric Kohl WINAPI
CM_Get_Class_NameW(_In_ LPGUID ClassGuid,_Out_writes_opt_ (* pulLength)PWCHAR Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)286965d3bf74SEric Kohl CM_Get_Class_NameW(
287065d3bf74SEric Kohl _In_ LPGUID ClassGuid,
287165d3bf74SEric Kohl _Out_writes_opt_(*pulLength) PWCHAR Buffer,
287265d3bf74SEric Kohl _Inout_ PULONG pulLength,
287365d3bf74SEric Kohl _In_ ULONG ulFlags)
2874c2c66affSColin Finck {
287565d3bf74SEric Kohl TRACE("CM_Get_Class_NameW(%p %p %p %lx)\n",
287665d3bf74SEric Kohl ClassGuid, Buffer, pulLength, ulFlags);
287765d3bf74SEric Kohl
2878c2c66affSColin Finck return CM_Get_Class_Name_ExW(ClassGuid, Buffer, pulLength, ulFlags,
2879c2c66affSColin Finck NULL);
2880c2c66affSColin Finck }
2881c2c66affSColin Finck
2882c2c66affSColin Finck
2883c2c66affSColin Finck /***********************************************************************
2884c2c66affSColin Finck * CM_Get_Class_Name_ExA [SETUPAPI.@]
2885c2c66affSColin Finck */
288665d3bf74SEric Kohl CONFIGRET
288765d3bf74SEric Kohl WINAPI
CM_Get_Class_Name_ExA(_In_ LPGUID ClassGuid,_Out_writes_opt_ (* pulLength)PCHAR Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)288865d3bf74SEric Kohl CM_Get_Class_Name_ExA(
288965d3bf74SEric Kohl _In_ LPGUID ClassGuid,
289065d3bf74SEric Kohl _Out_writes_opt_(*pulLength) PCHAR Buffer,
289165d3bf74SEric Kohl _Inout_ PULONG pulLength,
289265d3bf74SEric Kohl _In_ ULONG ulFlags,
289365d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
2894c2c66affSColin Finck {
2895c2c66affSColin Finck WCHAR szBuffer[MAX_CLASS_NAME_LEN];
2896c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
2897c2c66affSColin Finck ULONG ulLength;
2898c2c66affSColin Finck ULONG ulOrigLength;
2899c2c66affSColin Finck
290060a21894SEric Kohl TRACE("CM_Get_Class_Name_ExA(%p %p %p %lx %p)\n",
2901c2c66affSColin Finck ClassGuid, Buffer, pulLength, ulFlags, hMachine);
2902c2c66affSColin Finck
2903c2c66affSColin Finck if (ClassGuid == NULL || Buffer == NULL || pulLength == NULL)
2904c2c66affSColin Finck return CR_INVALID_POINTER;
2905c2c66affSColin Finck
2906c2c66affSColin Finck ulOrigLength = *pulLength;
2907c2c66affSColin Finck *pulLength = 0;
2908c2c66affSColin Finck
2909c2c66affSColin Finck ulLength = MAX_CLASS_NAME_LEN;
2910c2c66affSColin Finck ret = CM_Get_Class_Name_ExW(ClassGuid, szBuffer, &ulLength,
2911c2c66affSColin Finck ulFlags, hMachine);
2912c2c66affSColin Finck if (ret == CR_SUCCESS)
2913c2c66affSColin Finck {
2914c2c66affSColin Finck if (WideCharToMultiByte(CP_ACP,
2915c2c66affSColin Finck 0,
2916c2c66affSColin Finck szBuffer,
2917c2c66affSColin Finck ulLength,
2918c2c66affSColin Finck Buffer,
2919c2c66affSColin Finck ulOrigLength,
2920c2c66affSColin Finck NULL,
2921c2c66affSColin Finck NULL) == 0)
2922c2c66affSColin Finck ret = CR_FAILURE;
2923c2c66affSColin Finck else
2924c2c66affSColin Finck *pulLength = lstrlenA(Buffer) + 1;
2925c2c66affSColin Finck }
2926c2c66affSColin Finck
2927c2c66affSColin Finck return ret;
2928c2c66affSColin Finck }
2929c2c66affSColin Finck
2930c2c66affSColin Finck
2931c2c66affSColin Finck /***********************************************************************
2932c2c66affSColin Finck * CM_Get_Class_Name_ExW [SETUPAPI.@]
2933c2c66affSColin Finck */
293465d3bf74SEric Kohl CONFIGRET
293565d3bf74SEric Kohl WINAPI
CM_Get_Class_Name_ExW(_In_ LPGUID ClassGuid,_Out_writes_opt_ (* pulLength)PWCHAR Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)2936c2c66affSColin Finck CM_Get_Class_Name_ExW(
293765d3bf74SEric Kohl _In_ LPGUID ClassGuid,
293865d3bf74SEric Kohl _Out_writes_opt_(*pulLength) PWCHAR Buffer,
293965d3bf74SEric Kohl _Inout_ PULONG pulLength,
294065d3bf74SEric Kohl _In_ ULONG ulFlags,
294165d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
2942c2c66affSColin Finck {
2943c2c66affSColin Finck WCHAR szGuidString[MAX_GUID_STRING_LEN];
2944c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
2945c2c66affSColin Finck CONFIGRET ret;
2946c2c66affSColin Finck
294760a21894SEric Kohl TRACE("CM_Get_Class_Name_ExW(%p %p %p %lx %p\n",
2948c2c66affSColin Finck ClassGuid, Buffer, pulLength, ulFlags, hMachine);
2949c2c66affSColin Finck
2950c2c66affSColin Finck if (ClassGuid == NULL || Buffer == NULL || pulLength == NULL)
2951c2c66affSColin Finck return CR_INVALID_POINTER;
2952c2c66affSColin Finck
2953c2c66affSColin Finck if (ulFlags != 0)
2954c2c66affSColin Finck return CR_INVALID_FLAG;
2955c2c66affSColin Finck
2956c2c66affSColin Finck if (!GuidToString(ClassGuid, szGuidString))
2957c2c66affSColin Finck return CR_INVALID_DATA;
2958c2c66affSColin Finck
2959c2c66affSColin Finck TRACE("Guid %s\n", debugstr_w(szGuidString));
2960c2c66affSColin Finck
2961c2c66affSColin Finck if (hMachine != NULL)
2962c2c66affSColin Finck {
2963c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
2964c2c66affSColin Finck if (BindingHandle == NULL)
2965c2c66affSColin Finck return CR_FAILURE;
2966c2c66affSColin Finck }
2967c2c66affSColin Finck else
2968c2c66affSColin Finck {
2969c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
2970c2c66affSColin Finck return CR_FAILURE;
2971c2c66affSColin Finck }
2972c2c66affSColin Finck
2973c2c66affSColin Finck RpcTryExcept
2974c2c66affSColin Finck {
2975c2c66affSColin Finck ret = PNP_GetClassName(BindingHandle,
2976c2c66affSColin Finck szGuidString,
2977c2c66affSColin Finck Buffer,
2978c2c66affSColin Finck pulLength,
2979c2c66affSColin Finck ulFlags);
2980c2c66affSColin Finck }
2981c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
2982c2c66affSColin Finck {
2983c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
2984c2c66affSColin Finck }
2985c2c66affSColin Finck RpcEndExcept;
2986c2c66affSColin Finck
2987c2c66affSColin Finck return ret;
2988c2c66affSColin Finck }
2989c2c66affSColin Finck
2990c2c66affSColin Finck
2991c2c66affSColin Finck /***********************************************************************
2992c2c66affSColin Finck * CM_Get_Class_Registry_PropertyA [SETUPAPI.@]
2993c2c66affSColin Finck */
299465d3bf74SEric Kohl CONFIGRET
299565d3bf74SEric Kohl WINAPI
CM_Get_Class_Registry_PropertyA(LPGUID ClassGuid,ULONG ulProperty,PULONG pulRegDataType,PVOID Buffer,PULONG pulLength,ULONG ulFlags,HMACHINE hMachine)299665d3bf74SEric Kohl CM_Get_Class_Registry_PropertyA(
299765d3bf74SEric Kohl LPGUID ClassGuid,
299865d3bf74SEric Kohl ULONG ulProperty,
299965d3bf74SEric Kohl PULONG pulRegDataType,
300065d3bf74SEric Kohl PVOID Buffer,
300165d3bf74SEric Kohl PULONG pulLength,
300265d3bf74SEric Kohl ULONG ulFlags,
300365d3bf74SEric Kohl HMACHINE hMachine)
3004c2c66affSColin Finck {
30058943354dSSerge Gautherie PWSTR BufferW;
3006c2c66affSColin Finck ULONG ulLength = 0;
3007c2c66affSColin Finck ULONG ulType;
3008c2c66affSColin Finck CONFIGRET ret;
3009c2c66affSColin Finck
301060a21894SEric Kohl TRACE("CM_Get_Class_Registry_PropertyA(%p %lu %p %p %p %lx %p)\n",
3011c2c66affSColin Finck ClassGuid, ulProperty, pulRegDataType, Buffer, pulLength,
3012c2c66affSColin Finck ulFlags, hMachine);
3013c2c66affSColin Finck
3014c2c66affSColin Finck if (pulLength == NULL)
3015c2c66affSColin Finck return CR_INVALID_POINTER;
3016c2c66affSColin Finck
3017c2c66affSColin Finck if (ulProperty < CM_CRP_MIN || ulProperty > CM_CRP_MAX)
3018c2c66affSColin Finck return CR_INVALID_PROPERTY;
3019c2c66affSColin Finck
3020c2c66affSColin Finck ulType = GetRegistryPropertyType(ulProperty);
3021c2c66affSColin Finck if (ulType == REG_SZ || ulType == REG_MULTI_SZ)
3022c2c66affSColin Finck {
3023c2c66affSColin Finck /* Get the required buffer size */
3024c2c66affSColin Finck ret = CM_Get_Class_Registry_PropertyW(ClassGuid, ulProperty, pulRegDataType,
3025c2c66affSColin Finck NULL, &ulLength, ulFlags, hMachine);
3026c2c66affSColin Finck if (ret != CR_BUFFER_SMALL)
3027c2c66affSColin Finck return ret;
3028c2c66affSColin Finck
3029c2c66affSColin Finck /* Allocate the unicode buffer */
3030c2c66affSColin Finck BufferW = HeapAlloc(GetProcessHeap(), 0, ulLength);
3031c2c66affSColin Finck if (BufferW == NULL)
3032c2c66affSColin Finck return CR_OUT_OF_MEMORY;
3033c2c66affSColin Finck
3034c2c66affSColin Finck /* Get the property */
3035c2c66affSColin Finck ret = CM_Get_Class_Registry_PropertyW(ClassGuid, ulProperty, pulRegDataType,
3036c2c66affSColin Finck BufferW, &ulLength, ulFlags, hMachine);
3037c2c66affSColin Finck if (ret != CR_SUCCESS)
3038c2c66affSColin Finck {
3039c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, BufferW);
3040c2c66affSColin Finck return ret;
3041c2c66affSColin Finck }
3042c2c66affSColin Finck
3043c2c66affSColin Finck /* Do W->A conversion */
3044c2c66affSColin Finck *pulLength = WideCharToMultiByte(CP_ACP,
3045c2c66affSColin Finck 0,
3046c2c66affSColin Finck BufferW,
3047aa056499SVictor Perevertkin ulLength,
3048c2c66affSColin Finck Buffer,
3049c2c66affSColin Finck *pulLength,
3050c2c66affSColin Finck NULL,
3051c2c66affSColin Finck NULL);
3052c2c66affSColin Finck
3053c2c66affSColin Finck /* Release the unicode buffer */
3054c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, BufferW);
3055c2c66affSColin Finck
3056c2c66affSColin Finck if (*pulLength == 0)
3057c2c66affSColin Finck ret = CR_FAILURE;
3058c2c66affSColin Finck }
3059c2c66affSColin Finck else
3060c2c66affSColin Finck {
3061c2c66affSColin Finck /* Get the property */
3062c2c66affSColin Finck ret = CM_Get_Class_Registry_PropertyW(ClassGuid, ulProperty, pulRegDataType,
3063c2c66affSColin Finck Buffer, pulLength, ulFlags, hMachine);
3064c2c66affSColin Finck }
3065c2c66affSColin Finck
3066c2c66affSColin Finck return ret;
3067c2c66affSColin Finck }
3068c2c66affSColin Finck
3069c2c66affSColin Finck
3070c2c66affSColin Finck /***********************************************************************
3071c2c66affSColin Finck * CM_Get_Class_Registry_PropertyW [SETUPAPI.@]
3072c2c66affSColin Finck */
307365d3bf74SEric Kohl CONFIGRET
307465d3bf74SEric Kohl WINAPI
CM_Get_Class_Registry_PropertyW(LPGUID ClassGuid,ULONG ulProperty,PULONG pulRegDataType,PVOID Buffer,PULONG pulLength,ULONG ulFlags,HMACHINE hMachine)307565d3bf74SEric Kohl CM_Get_Class_Registry_PropertyW(
307665d3bf74SEric Kohl LPGUID ClassGuid,
307765d3bf74SEric Kohl ULONG ulProperty,
307865d3bf74SEric Kohl PULONG pulRegDataType,
307965d3bf74SEric Kohl PVOID Buffer,
308065d3bf74SEric Kohl PULONG pulLength,
308165d3bf74SEric Kohl ULONG ulFlags,
308265d3bf74SEric Kohl HMACHINE hMachine)
3083c2c66affSColin Finck {
3084c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
3085c2c66affSColin Finck WCHAR szGuidString[PNP_MAX_GUID_STRING_LEN + 1];
3086c2c66affSColin Finck ULONG ulType = 0;
3087c2c66affSColin Finck ULONG ulTransferLength = 0;
3088c2c66affSColin Finck CONFIGRET ret;
3089c2c66affSColin Finck
309060a21894SEric Kohl TRACE("CM_Get_Class_Registry_PropertyW(%p %lu %p %p %p %lx %p)\n",
3091c2c66affSColin Finck ClassGuid, ulProperty, pulRegDataType, Buffer, pulLength,
3092c2c66affSColin Finck ulFlags, hMachine);
3093c2c66affSColin Finck
3094c2c66affSColin Finck if (ClassGuid == NULL || pulLength == NULL)
3095c2c66affSColin Finck return CR_INVALID_POINTER;
3096c2c66affSColin Finck
3097c2c66affSColin Finck if (ulFlags != 0)
3098c2c66affSColin Finck return CR_INVALID_FLAG;
3099c2c66affSColin Finck
3100c2c66affSColin Finck if (pSetupStringFromGuid(ClassGuid,
3101c2c66affSColin Finck szGuidString,
3102c2c66affSColin Finck PNP_MAX_GUID_STRING_LEN) != 0)
3103c2c66affSColin Finck return CR_INVALID_DATA;
3104c2c66affSColin Finck
3105c2c66affSColin Finck if (ulProperty < CM_CRP_MIN || ulProperty > CM_CRP_MAX)
3106c2c66affSColin Finck return CR_INVALID_PROPERTY;
3107c2c66affSColin Finck
3108c2c66affSColin Finck if (hMachine != NULL)
3109c2c66affSColin Finck {
3110c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
3111c2c66affSColin Finck if (BindingHandle == NULL)
3112c2c66affSColin Finck return CR_FAILURE;
3113c2c66affSColin Finck }
3114c2c66affSColin Finck else
3115c2c66affSColin Finck {
3116c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
3117c2c66affSColin Finck return CR_FAILURE;
3118c2c66affSColin Finck }
3119c2c66affSColin Finck
3120c2c66affSColin Finck ulTransferLength = *pulLength;
3121c2c66affSColin Finck
3122c2c66affSColin Finck RpcTryExcept
3123c2c66affSColin Finck {
3124c2c66affSColin Finck ret = PNP_GetClassRegProp(BindingHandle,
3125c2c66affSColin Finck szGuidString,
3126c2c66affSColin Finck ulProperty,
3127c2c66affSColin Finck &ulType,
3128c2c66affSColin Finck Buffer,
3129c2c66affSColin Finck &ulTransferLength,
3130c2c66affSColin Finck pulLength,
3131c2c66affSColin Finck ulFlags);
3132c2c66affSColin Finck }
3133c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
3134c2c66affSColin Finck {
3135c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
3136c2c66affSColin Finck }
3137c2c66affSColin Finck RpcEndExcept;
3138c2c66affSColin Finck
3139c2c66affSColin Finck if (ret == CR_SUCCESS)
3140c2c66affSColin Finck {
3141c2c66affSColin Finck if (pulRegDataType != NULL)
3142c2c66affSColin Finck *pulRegDataType = ulType;
3143c2c66affSColin Finck }
3144c2c66affSColin Finck
3145c2c66affSColin Finck return ret;
3146c2c66affSColin Finck }
3147c2c66affSColin Finck
3148c2c66affSColin Finck
3149c2c66affSColin Finck /***********************************************************************
3150c2c66affSColin Finck * CM_Get_Depth [SETUPAPI.@]
3151c2c66affSColin Finck */
315265d3bf74SEric Kohl CONFIGRET
315365d3bf74SEric Kohl WINAPI
CM_Get_Depth(_Out_ PULONG pulDepth,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)315465d3bf74SEric Kohl CM_Get_Depth(
315565d3bf74SEric Kohl _Out_ PULONG pulDepth,
315665d3bf74SEric Kohl _In_ DEVINST dnDevInst,
315765d3bf74SEric Kohl _In_ ULONG ulFlags)
3158c2c66affSColin Finck {
315965d3bf74SEric Kohl TRACE("CM_Get_Depth(%p %lx %lx)\n",
316065d3bf74SEric Kohl pulDepth, dnDevInst, ulFlags);
316165d3bf74SEric Kohl
3162c2c66affSColin Finck return CM_Get_Depth_Ex(pulDepth, dnDevInst, ulFlags, NULL);
3163c2c66affSColin Finck }
3164c2c66affSColin Finck
3165c2c66affSColin Finck
3166c2c66affSColin Finck /***********************************************************************
3167c2c66affSColin Finck * CM_Get_Depth_Ex [SETUPAPI.@]
3168c2c66affSColin Finck */
316965d3bf74SEric Kohl CONFIGRET
317065d3bf74SEric Kohl WINAPI
CM_Get_Depth_Ex(_Out_ PULONG pulDepth,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)317165d3bf74SEric Kohl CM_Get_Depth_Ex(
317265d3bf74SEric Kohl _Out_ PULONG pulDepth,
317365d3bf74SEric Kohl _In_ DEVINST dnDevInst,
317465d3bf74SEric Kohl _In_ ULONG ulFlags,
317565d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
3176c2c66affSColin Finck {
3177c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
3178c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
3179c2c66affSColin Finck LPWSTR lpDevInst;
3180c2c66affSColin Finck CONFIGRET ret;
3181c2c66affSColin Finck
318260a21894SEric Kohl TRACE("CM_Get_Depth_Ex(%p %lx %lx %p)\n",
3183c2c66affSColin Finck pulDepth, dnDevInst, ulFlags, hMachine);
3184c2c66affSColin Finck
3185c2c66affSColin Finck if (pulDepth == NULL)
3186c2c66affSColin Finck return CR_INVALID_POINTER;
3187c2c66affSColin Finck
3188c2c66affSColin Finck if (dnDevInst == 0)
3189c2c66affSColin Finck return CR_INVALID_DEVINST;
3190c2c66affSColin Finck
3191c2c66affSColin Finck if (ulFlags != 0)
3192c2c66affSColin Finck return CR_INVALID_FLAG;
3193c2c66affSColin Finck
3194c2c66affSColin Finck if (hMachine != NULL)
3195c2c66affSColin Finck {
3196c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
3197c2c66affSColin Finck if (BindingHandle == NULL)
3198c2c66affSColin Finck return CR_FAILURE;
3199c2c66affSColin Finck
3200c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
3201c2c66affSColin Finck if (StringTable == 0)
3202c2c66affSColin Finck return CR_FAILURE;
3203c2c66affSColin Finck }
3204c2c66affSColin Finck else
3205c2c66affSColin Finck {
3206c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
3207c2c66affSColin Finck return CR_FAILURE;
3208c2c66affSColin Finck }
3209c2c66affSColin Finck
3210c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
3211c2c66affSColin Finck if (lpDevInst == NULL)
3212c2c66affSColin Finck return CR_INVALID_DEVNODE;
3213c2c66affSColin Finck
3214c2c66affSColin Finck RpcTryExcept
3215c2c66affSColin Finck {
3216c2c66affSColin Finck ret = PNP_GetDepth(BindingHandle,
3217c2c66affSColin Finck lpDevInst,
3218c2c66affSColin Finck pulDepth,
3219c2c66affSColin Finck ulFlags);
3220c2c66affSColin Finck }
3221c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
3222c2c66affSColin Finck {
3223c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
3224c2c66affSColin Finck }
3225c2c66affSColin Finck RpcEndExcept;
3226c2c66affSColin Finck
3227c2c66affSColin Finck return ret;
3228c2c66affSColin Finck }
3229c2c66affSColin Finck
3230c2c66affSColin Finck
3231c2c66affSColin Finck /***********************************************************************
3232c2c66affSColin Finck * CM_Get_DevNode_Custom_PropertyA [SETUPAPI.@]
3233c2c66affSColin Finck */
323465d3bf74SEric Kohl CONFIGRET
323565d3bf74SEric Kohl WINAPI
CM_Get_DevNode_Custom_PropertyA(_In_ DEVINST dnDevInst,_In_ PCSTR pszCustomPropertyName,_Out_opt_ PULONG pulRegDataType,_Out_writes_bytes_opt_ (* pulLength)PVOID Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)323665d3bf74SEric Kohl CM_Get_DevNode_Custom_PropertyA(
323765d3bf74SEric Kohl _In_ DEVINST dnDevInst,
323865d3bf74SEric Kohl _In_ PCSTR pszCustomPropertyName,
323965d3bf74SEric Kohl _Out_opt_ PULONG pulRegDataType,
324065d3bf74SEric Kohl _Out_writes_bytes_opt_(*pulLength) PVOID Buffer,
324165d3bf74SEric Kohl _Inout_ PULONG pulLength,
324265d3bf74SEric Kohl _In_ ULONG ulFlags)
3243c2c66affSColin Finck {
324465d3bf74SEric Kohl TRACE("CM_Get_DevNode_Custom_PropertyA(%lx %s %p %p %p %lx)\n",
324565d3bf74SEric Kohl dnDevInst, pszCustomPropertyName, pulRegDataType,
324665d3bf74SEric Kohl Buffer, pulLength, ulFlags);
324765d3bf74SEric Kohl
3248c2c66affSColin Finck return CM_Get_DevNode_Custom_Property_ExA(dnDevInst, pszCustomPropertyName,
3249c2c66affSColin Finck pulRegDataType, Buffer,
3250c2c66affSColin Finck pulLength, ulFlags, NULL);
3251c2c66affSColin Finck }
3252c2c66affSColin Finck
3253c2c66affSColin Finck
3254c2c66affSColin Finck /***********************************************************************
3255c2c66affSColin Finck * CM_Get_DevNode_Custom_PropertyW [SETUPAPI.@]
3256c2c66affSColin Finck */
325765d3bf74SEric Kohl CONFIGRET
325865d3bf74SEric Kohl WINAPI
CM_Get_DevNode_Custom_PropertyW(_In_ DEVINST dnDevInst,_In_ PCWSTR pszCustomPropertyName,_Out_opt_ PULONG pulRegDataType,_Out_writes_bytes_opt_ (* pulLength)PVOID Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)325965d3bf74SEric Kohl CM_Get_DevNode_Custom_PropertyW(
326065d3bf74SEric Kohl _In_ DEVINST dnDevInst,
326165d3bf74SEric Kohl _In_ PCWSTR pszCustomPropertyName,
326265d3bf74SEric Kohl _Out_opt_ PULONG pulRegDataType,
326365d3bf74SEric Kohl _Out_writes_bytes_opt_(*pulLength) PVOID Buffer,
326465d3bf74SEric Kohl _Inout_ PULONG pulLength,
326565d3bf74SEric Kohl _In_ ULONG ulFlags)
3266c2c66affSColin Finck {
326765d3bf74SEric Kohl TRACE("CM_Get_DevNode_Custom_PropertyW(%lx %s %p %p %p %lx)\n",
326865d3bf74SEric Kohl dnDevInst, debugstr_w(pszCustomPropertyName), pulRegDataType,
326965d3bf74SEric Kohl Buffer, pulLength, ulFlags);
327065d3bf74SEric Kohl
3271c2c66affSColin Finck return CM_Get_DevNode_Custom_Property_ExW(dnDevInst, pszCustomPropertyName,
3272c2c66affSColin Finck pulRegDataType, Buffer,
3273c2c66affSColin Finck pulLength, ulFlags, NULL);
3274c2c66affSColin Finck }
3275c2c66affSColin Finck
3276c2c66affSColin Finck
3277c2c66affSColin Finck /***********************************************************************
3278c2c66affSColin Finck * CM_Get_DevNode_Custom_Property_ExA [SETUPAPI.@]
3279c2c66affSColin Finck */
328065d3bf74SEric Kohl CONFIGRET
328165d3bf74SEric Kohl WINAPI
CM_Get_DevNode_Custom_Property_ExA(_In_ DEVINST dnDevInst,_In_ PCSTR pszCustomPropertyName,_Out_opt_ PULONG pulRegDataType,_Out_writes_bytes_opt_ (* pulLength)PVOID Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)328265d3bf74SEric Kohl CM_Get_DevNode_Custom_Property_ExA(
328365d3bf74SEric Kohl _In_ DEVINST dnDevInst,
328465d3bf74SEric Kohl _In_ PCSTR pszCustomPropertyName,
328565d3bf74SEric Kohl _Out_opt_ PULONG pulRegDataType,
328665d3bf74SEric Kohl _Out_writes_bytes_opt_(*pulLength) PVOID Buffer,
328765d3bf74SEric Kohl _Inout_ PULONG pulLength,
328865d3bf74SEric Kohl _In_ ULONG ulFlags,
328965d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
3290c2c66affSColin Finck {
32918943354dSSerge Gautherie LPWSTR pszPropertyNameW;
3292c2c66affSColin Finck PVOID BufferW;
3293c2c66affSColin Finck ULONG ulLengthW;
3294c2c66affSColin Finck ULONG ulDataType = REG_NONE;
3295c2c66affSColin Finck CONFIGRET ret;
3296c2c66affSColin Finck
329765d3bf74SEric Kohl TRACE("CM_Get_DevNode_Custom_Property_ExA(%lx %s %p %p %p %lx %p)\n",
329865d3bf74SEric Kohl dnDevInst, pszCustomPropertyName, pulRegDataType,
329965d3bf74SEric Kohl Buffer, pulLength, ulFlags, hMachine);
3300c2c66affSColin Finck
3301c2c66affSColin Finck if (!pulLength)
3302c2c66affSColin Finck return CR_INVALID_POINTER;
3303c2c66affSColin Finck
3304c2c66affSColin Finck ulLengthW = *pulLength * sizeof(WCHAR);
3305c2c66affSColin Finck BufferW = HeapAlloc(GetProcessHeap(), 0, ulLengthW);
3306c2c66affSColin Finck if (!BufferW)
3307c2c66affSColin Finck return CR_OUT_OF_MEMORY;
3308c2c66affSColin Finck
3309c2c66affSColin Finck pszPropertyNameW = pSetupMultiByteToUnicode(pszCustomPropertyName,
3310c2c66affSColin Finck CP_ACP);
3311c2c66affSColin Finck if (pszPropertyNameW == NULL)
3312c2c66affSColin Finck {
3313c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, BufferW);
3314c2c66affSColin Finck return CR_OUT_OF_MEMORY;
3315c2c66affSColin Finck }
3316c2c66affSColin Finck
3317c2c66affSColin Finck ret = CM_Get_DevNode_Custom_Property_ExW(dnDevInst,
3318c2c66affSColin Finck pszPropertyNameW,
3319c2c66affSColin Finck &ulDataType,
3320c2c66affSColin Finck BufferW,
3321c2c66affSColin Finck &ulLengthW,
3322c2c66affSColin Finck ulFlags,
3323c2c66affSColin Finck hMachine);
3324c2c66affSColin Finck if (ret == CR_SUCCESS)
3325c2c66affSColin Finck {
3326c2c66affSColin Finck if (ulDataType == REG_SZ ||
3327c2c66affSColin Finck ulDataType == REG_EXPAND_SZ ||
3328c2c66affSColin Finck ulDataType == REG_MULTI_SZ)
3329c2c66affSColin Finck {
3330c2c66affSColin Finck /* Do W->A conversion */
3331c2c66affSColin Finck *pulLength = WideCharToMultiByte(CP_ACP,
3332c2c66affSColin Finck 0,
3333c2c66affSColin Finck BufferW,
3334c2c66affSColin Finck lstrlenW(BufferW) + 1,
3335c2c66affSColin Finck Buffer,
3336c2c66affSColin Finck *pulLength,
3337c2c66affSColin Finck NULL,
3338c2c66affSColin Finck NULL);
3339c2c66affSColin Finck if (*pulLength == 0)
3340c2c66affSColin Finck ret = CR_FAILURE;
3341c2c66affSColin Finck }
3342c2c66affSColin Finck else
3343c2c66affSColin Finck {
3344c2c66affSColin Finck /* Directly copy the value */
3345c2c66affSColin Finck if (ulLengthW <= *pulLength)
3346c2c66affSColin Finck memcpy(Buffer, BufferW, ulLengthW);
3347c2c66affSColin Finck else
3348c2c66affSColin Finck {
3349c2c66affSColin Finck *pulLength = ulLengthW;
3350c2c66affSColin Finck ret = CR_BUFFER_SMALL;
3351c2c66affSColin Finck }
3352c2c66affSColin Finck }
3353c2c66affSColin Finck }
3354c2c66affSColin Finck
3355c2c66affSColin Finck if (pulRegDataType)
3356c2c66affSColin Finck *pulRegDataType = ulDataType;
3357c2c66affSColin Finck
3358c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, BufferW);
3359c2c66affSColin Finck MyFree(pszPropertyNameW);
3360c2c66affSColin Finck
3361c2c66affSColin Finck return ret;
3362c2c66affSColin Finck }
3363c2c66affSColin Finck
3364c2c66affSColin Finck
3365c2c66affSColin Finck /***********************************************************************
3366c2c66affSColin Finck * CM_Get_DevNode_Custom_Property_ExW [SETUPAPI.@]
3367c2c66affSColin Finck */
336865d3bf74SEric Kohl CONFIGRET
336965d3bf74SEric Kohl WINAPI
CM_Get_DevNode_Custom_Property_ExW(_In_ DEVINST dnDevInst,_In_ PCWSTR pszCustomPropertyName,_Out_opt_ PULONG pulRegDataType,_Out_writes_bytes_opt_ (* pulLength)PVOID Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)337065d3bf74SEric Kohl CM_Get_DevNode_Custom_Property_ExW(
337165d3bf74SEric Kohl _In_ DEVINST dnDevInst,
337265d3bf74SEric Kohl _In_ PCWSTR pszCustomPropertyName,
337365d3bf74SEric Kohl _Out_opt_ PULONG pulRegDataType,
337465d3bf74SEric Kohl _Out_writes_bytes_opt_(*pulLength) PVOID Buffer,
337565d3bf74SEric Kohl _Inout_ PULONG pulLength,
337665d3bf74SEric Kohl _In_ ULONG ulFlags,
337765d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
3378c2c66affSColin Finck {
3379c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
3380c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
3381c2c66affSColin Finck LPWSTR lpDevInst;
3382c2c66affSColin Finck ULONG ulDataType = REG_NONE;
3383c2c66affSColin Finck ULONG ulTransferLength;
3384c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
3385c2c66affSColin Finck
338665d3bf74SEric Kohl TRACE("CM_Get_DevNode_Custom_Property_ExW(%lx %s %p %p %p %lx %p)\n",
338765d3bf74SEric Kohl dnDevInst, debugstr_w(pszCustomPropertyName), pulRegDataType,
338865d3bf74SEric Kohl Buffer, pulLength, ulFlags, hMachine);
3389c2c66affSColin Finck
3390c2c66affSColin Finck if (dnDevInst == 0)
3391c2c66affSColin Finck return CR_INVALID_DEVNODE;
3392c2c66affSColin Finck
3393c2c66affSColin Finck if (pszCustomPropertyName == NULL ||
3394c2c66affSColin Finck pulLength == NULL ||
3395c2c66affSColin Finck *pulLength == 0)
3396c2c66affSColin Finck return CR_INVALID_POINTER;
3397c2c66affSColin Finck
3398c2c66affSColin Finck if (ulFlags & ~CM_CUSTOMDEVPROP_BITS)
3399c2c66affSColin Finck return CR_INVALID_FLAG;
3400c2c66affSColin Finck
3401c2c66affSColin Finck if (hMachine != NULL)
3402c2c66affSColin Finck {
3403c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
3404c2c66affSColin Finck if (BindingHandle == NULL)
3405c2c66affSColin Finck return CR_FAILURE;
3406c2c66affSColin Finck
3407c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
3408c2c66affSColin Finck if (StringTable == 0)
3409c2c66affSColin Finck return CR_FAILURE;
3410c2c66affSColin Finck }
3411c2c66affSColin Finck else
3412c2c66affSColin Finck {
3413c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
3414c2c66affSColin Finck return CR_FAILURE;
3415c2c66affSColin Finck }
3416c2c66affSColin Finck
3417c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
3418c2c66affSColin Finck if (lpDevInst == NULL)
3419c2c66affSColin Finck return CR_INVALID_DEVNODE;
3420c2c66affSColin Finck
3421c2c66affSColin Finck ulTransferLength = *pulLength;
3422c2c66affSColin Finck
3423c2c66affSColin Finck RpcTryExcept
3424c2c66affSColin Finck {
3425c2c66affSColin Finck ret = PNP_GetCustomDevProp(BindingHandle,
3426c2c66affSColin Finck lpDevInst,
3427c2c66affSColin Finck (LPWSTR)pszCustomPropertyName,
3428c2c66affSColin Finck &ulDataType,
3429c2c66affSColin Finck Buffer,
3430c2c66affSColin Finck &ulTransferLength,
3431c2c66affSColin Finck pulLength,
3432c2c66affSColin Finck ulFlags);
3433c2c66affSColin Finck }
3434c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
3435c2c66affSColin Finck {
3436c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
3437c2c66affSColin Finck }
3438c2c66affSColin Finck RpcEndExcept;
3439c2c66affSColin Finck
3440c2c66affSColin Finck if (ret == CR_SUCCESS)
3441c2c66affSColin Finck {
3442c2c66affSColin Finck if (pulRegDataType != NULL)
3443c2c66affSColin Finck *pulRegDataType = ulDataType;
3444c2c66affSColin Finck }
3445c2c66affSColin Finck
3446c2c66affSColin Finck return ret;
3447c2c66affSColin Finck }
3448c2c66affSColin Finck
3449c2c66affSColin Finck
3450c2c66affSColin Finck /***********************************************************************
3451c2c66affSColin Finck * CM_Get_DevNode_Registry_PropertyA [SETUPAPI.@]
3452c2c66affSColin Finck */
345365d3bf74SEric Kohl CONFIGRET
345465d3bf74SEric Kohl WINAPI
CM_Get_DevNode_Registry_PropertyA(_In_ DEVINST dnDevInst,_In_ ULONG ulProperty,_Out_opt_ PULONG pulRegDataType,_Out_writes_bytes_opt_ (* pulLength)PVOID Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)345565d3bf74SEric Kohl CM_Get_DevNode_Registry_PropertyA(
345665d3bf74SEric Kohl _In_ DEVINST dnDevInst,
345765d3bf74SEric Kohl _In_ ULONG ulProperty,
345865d3bf74SEric Kohl _Out_opt_ PULONG pulRegDataType,
345965d3bf74SEric Kohl _Out_writes_bytes_opt_(*pulLength) PVOID Buffer,
346065d3bf74SEric Kohl _Inout_ PULONG pulLength,
346165d3bf74SEric Kohl _In_ ULONG ulFlags)
3462c2c66affSColin Finck {
346365d3bf74SEric Kohl TRACE("CM_Get_DevNode_Registry_PropertyA(%lx %lu %p %p %p %lx)\n",
3464c2c66affSColin Finck dnDevInst, ulProperty, pulRegDataType, Buffer, pulLength, ulFlags);
3465c2c66affSColin Finck
3466c2c66affSColin Finck return CM_Get_DevNode_Registry_Property_ExA(dnDevInst, ulProperty,
3467c2c66affSColin Finck pulRegDataType, Buffer,
3468c2c66affSColin Finck pulLength, ulFlags, NULL);
3469c2c66affSColin Finck }
3470c2c66affSColin Finck
3471c2c66affSColin Finck
3472c2c66affSColin Finck /***********************************************************************
3473c2c66affSColin Finck * CM_Get_DevNode_Registry_PropertyW [SETUPAPI.@]
3474c2c66affSColin Finck */
347565d3bf74SEric Kohl CONFIGRET
347665d3bf74SEric Kohl WINAPI
CM_Get_DevNode_Registry_PropertyW(_In_ DEVINST dnDevInst,_In_ ULONG ulProperty,_Out_opt_ PULONG pulRegDataType,_Out_writes_bytes_opt_ (* pulLength)PVOID Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)347765d3bf74SEric Kohl CM_Get_DevNode_Registry_PropertyW(
347865d3bf74SEric Kohl _In_ DEVINST dnDevInst,
347965d3bf74SEric Kohl _In_ ULONG ulProperty,
348065d3bf74SEric Kohl _Out_opt_ PULONG pulRegDataType,
348165d3bf74SEric Kohl _Out_writes_bytes_opt_(*pulLength) PVOID Buffer,
348265d3bf74SEric Kohl _Inout_ PULONG pulLength,
348365d3bf74SEric Kohl _In_ ULONG ulFlags)
3484c2c66affSColin Finck {
348565d3bf74SEric Kohl TRACE("CM_Get_DevNode_Registry_PropertyW(%lx %lu %p %p %p %lx)\n",
3486c2c66affSColin Finck dnDevInst, ulProperty, pulRegDataType, Buffer, pulLength, ulFlags);
3487c2c66affSColin Finck
3488c2c66affSColin Finck return CM_Get_DevNode_Registry_Property_ExW(dnDevInst, ulProperty,
3489c2c66affSColin Finck pulRegDataType, Buffer,
3490c2c66affSColin Finck pulLength, ulFlags, NULL);
3491c2c66affSColin Finck }
3492c2c66affSColin Finck
3493c2c66affSColin Finck
3494c2c66affSColin Finck /***********************************************************************
3495c2c66affSColin Finck * CM_Get_DevNode_Registry_Property_ExA [SETUPAPI.@]
3496c2c66affSColin Finck */
349765d3bf74SEric Kohl CONFIGRET
349865d3bf74SEric Kohl WINAPI
CM_Get_DevNode_Registry_Property_ExA(_In_ DEVINST dnDevInst,_In_ ULONG ulProperty,_Out_opt_ PULONG pulRegDataType,_Out_writes_bytes_opt_ (* pulLength)PVOID Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)349965d3bf74SEric Kohl CM_Get_DevNode_Registry_Property_ExA(
350065d3bf74SEric Kohl _In_ DEVINST dnDevInst,
350165d3bf74SEric Kohl _In_ ULONG ulProperty,
350265d3bf74SEric Kohl _Out_opt_ PULONG pulRegDataType,
350365d3bf74SEric Kohl _Out_writes_bytes_opt_(*pulLength) PVOID Buffer,
350465d3bf74SEric Kohl _Inout_ PULONG pulLength,
350565d3bf74SEric Kohl _In_ ULONG ulFlags,
350665d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
3507c2c66affSColin Finck {
3508c2c66affSColin Finck PVOID BufferW;
3509c2c66affSColin Finck ULONG LengthW;
3510c2c66affSColin Finck ULONG ulDataType = REG_NONE;
3511c2c66affSColin Finck CONFIGRET ret;
3512c2c66affSColin Finck
351360a21894SEric Kohl TRACE("CM_Get_DevNode_Registry_Property_ExA(%lx %lu %p %p %p %lx %p)\n",
3514c2c66affSColin Finck dnDevInst, ulProperty, pulRegDataType, Buffer, pulLength,
3515c2c66affSColin Finck ulFlags, hMachine);
3516c2c66affSColin Finck
3517c2c66affSColin Finck if (!pulLength)
3518c2c66affSColin Finck return CR_INVALID_POINTER;
3519c2c66affSColin Finck
3520c2c66affSColin Finck LengthW = *pulLength * sizeof(WCHAR);
3521c2c66affSColin Finck BufferW = HeapAlloc(GetProcessHeap(), 0, LengthW);
3522c2c66affSColin Finck if (!BufferW)
3523c2c66affSColin Finck return CR_OUT_OF_MEMORY;
3524c2c66affSColin Finck
3525c2c66affSColin Finck ret = CM_Get_DevNode_Registry_Property_ExW(dnDevInst,
3526c2c66affSColin Finck ulProperty,
3527c2c66affSColin Finck &ulDataType,
3528c2c66affSColin Finck BufferW,
3529c2c66affSColin Finck &LengthW,
3530c2c66affSColin Finck ulFlags,
3531c2c66affSColin Finck hMachine);
3532c2c66affSColin Finck
3533c2c66affSColin Finck if (ret == CR_SUCCESS)
3534c2c66affSColin Finck {
3535c2c66affSColin Finck if (ulDataType == REG_SZ ||
3536c2c66affSColin Finck ulDataType == REG_EXPAND_SZ ||
3537c2c66affSColin Finck ulDataType == REG_MULTI_SZ)
3538c2c66affSColin Finck {
3539c2c66affSColin Finck /* Do W->A conversion */
3540c2c66affSColin Finck *pulLength = WideCharToMultiByte(CP_ACP,
3541c2c66affSColin Finck 0,
3542c2c66affSColin Finck BufferW,
3543c2c66affSColin Finck lstrlenW(BufferW) + 1,
3544c2c66affSColin Finck Buffer,
3545c2c66affSColin Finck *pulLength,
3546c2c66affSColin Finck NULL,
3547c2c66affSColin Finck NULL);
3548c2c66affSColin Finck if (*pulLength == 0)
3549c2c66affSColin Finck ret = CR_FAILURE;
3550c2c66affSColin Finck }
3551c2c66affSColin Finck else
3552c2c66affSColin Finck {
3553c2c66affSColin Finck /* Directly copy the value */
3554c2c66affSColin Finck if (LengthW <= *pulLength)
3555c2c66affSColin Finck memcpy(Buffer, BufferW, LengthW);
3556c2c66affSColin Finck else
3557c2c66affSColin Finck {
3558c2c66affSColin Finck *pulLength = LengthW;
3559c2c66affSColin Finck ret = CR_BUFFER_SMALL;
3560c2c66affSColin Finck }
3561c2c66affSColin Finck }
3562c2c66affSColin Finck }
3563c2c66affSColin Finck
3564c2c66affSColin Finck if (pulRegDataType)
3565c2c66affSColin Finck *pulRegDataType = ulDataType;
3566c2c66affSColin Finck
3567c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, BufferW);
3568c2c66affSColin Finck
3569c2c66affSColin Finck return ret;
3570c2c66affSColin Finck }
3571c2c66affSColin Finck
3572c2c66affSColin Finck
3573c2c66affSColin Finck /***********************************************************************
3574c2c66affSColin Finck * CM_Get_DevNode_Registry_Property_ExW [SETUPAPI.@]
3575c2c66affSColin Finck */
357665d3bf74SEric Kohl CONFIGRET
357765d3bf74SEric Kohl WINAPI
CM_Get_DevNode_Registry_Property_ExW(_In_ DEVINST dnDevInst,_In_ ULONG ulProperty,_Out_opt_ PULONG pulRegDataType,_Out_writes_bytes_opt_ (* pulLength)PVOID Buffer,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)357865d3bf74SEric Kohl CM_Get_DevNode_Registry_Property_ExW(
357965d3bf74SEric Kohl _In_ DEVINST dnDevInst,
358065d3bf74SEric Kohl _In_ ULONG ulProperty,
358165d3bf74SEric Kohl _Out_opt_ PULONG pulRegDataType,
358265d3bf74SEric Kohl _Out_writes_bytes_opt_(*pulLength) PVOID Buffer,
358365d3bf74SEric Kohl _Inout_ PULONG pulLength,
358465d3bf74SEric Kohl _In_ ULONG ulFlags,
358565d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
3586c2c66affSColin Finck {
3587c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
3588c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
3589c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
3590c2c66affSColin Finck LPWSTR lpDevInst;
3591c2c66affSColin Finck ULONG ulDataType = REG_NONE;
3592c2c66affSColin Finck ULONG ulTransferLength = 0;
3593c2c66affSColin Finck
359460a21894SEric Kohl TRACE("CM_Get_DevNode_Registry_Property_ExW(%lx %lu %p %p %p %lx %p)\n",
3595c2c66affSColin Finck dnDevInst, ulProperty, pulRegDataType, Buffer, pulLength,
3596c2c66affSColin Finck ulFlags, hMachine);
3597c2c66affSColin Finck
3598c2c66affSColin Finck if (dnDevInst == 0)
3599c2c66affSColin Finck return CR_INVALID_DEVNODE;
3600c2c66affSColin Finck
3601c2c66affSColin Finck if (ulProperty < CM_DRP_MIN || ulProperty > CM_DRP_MAX)
3602c2c66affSColin Finck return CR_INVALID_PROPERTY;
3603c2c66affSColin Finck
3604c2c66affSColin Finck /* pulRegDataType is optional */
3605c2c66affSColin Finck
3606c2c66affSColin Finck /* Buffer is optional */
3607c2c66affSColin Finck
3608c2c66affSColin Finck if (pulLength == NULL)
3609c2c66affSColin Finck return CR_INVALID_POINTER;
3610c2c66affSColin Finck
3611c2c66affSColin Finck if (*pulLength == 0)
3612c2c66affSColin Finck return CR_INVALID_POINTER;
3613c2c66affSColin Finck
3614c2c66affSColin Finck if (ulFlags != 0)
3615c2c66affSColin Finck return CR_INVALID_FLAG;
3616c2c66affSColin Finck
3617c2c66affSColin Finck if (hMachine != NULL)
3618c2c66affSColin Finck {
3619c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
3620c2c66affSColin Finck if (BindingHandle == NULL)
3621c2c66affSColin Finck return CR_FAILURE;
3622c2c66affSColin Finck
3623c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
3624c2c66affSColin Finck if (StringTable == 0)
3625c2c66affSColin Finck return CR_FAILURE;
3626c2c66affSColin Finck }
3627c2c66affSColin Finck else
3628c2c66affSColin Finck {
3629c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
3630c2c66affSColin Finck return CR_FAILURE;
3631c2c66affSColin Finck }
3632c2c66affSColin Finck
3633c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
3634c2c66affSColin Finck if (lpDevInst == NULL)
3635c2c66affSColin Finck return CR_INVALID_DEVNODE;
3636c2c66affSColin Finck
3637c2c66affSColin Finck ulTransferLength = *pulLength;
3638c2c66affSColin Finck
3639c2c66affSColin Finck RpcTryExcept
3640c2c66affSColin Finck {
3641c2c66affSColin Finck ret = PNP_GetDeviceRegProp(BindingHandle,
3642c2c66affSColin Finck lpDevInst,
3643c2c66affSColin Finck ulProperty,
3644c2c66affSColin Finck &ulDataType,
3645c2c66affSColin Finck Buffer,
3646c2c66affSColin Finck &ulTransferLength,
3647c2c66affSColin Finck pulLength,
3648c2c66affSColin Finck ulFlags);
3649c2c66affSColin Finck }
3650c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
3651c2c66affSColin Finck {
3652c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
3653c2c66affSColin Finck }
3654c2c66affSColin Finck RpcEndExcept;
3655c2c66affSColin Finck
3656c2c66affSColin Finck if (ret == CR_SUCCESS)
3657c2c66affSColin Finck {
3658c2c66affSColin Finck if (pulRegDataType != NULL)
3659c2c66affSColin Finck *pulRegDataType = ulDataType;
3660c2c66affSColin Finck }
3661c2c66affSColin Finck
3662c2c66affSColin Finck return ret;
3663c2c66affSColin Finck }
3664c2c66affSColin Finck
3665c2c66affSColin Finck
3666c2c66affSColin Finck /***********************************************************************
3667c2c66affSColin Finck * CM_Get_DevNode_Status [SETUPAPI.@]
3668c2c66affSColin Finck */
366965d3bf74SEric Kohl CONFIGRET
367065d3bf74SEric Kohl WINAPI
CM_Get_DevNode_Status(_Out_ PULONG pulStatus,_Out_ PULONG pulProblemNumber,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)367165d3bf74SEric Kohl CM_Get_DevNode_Status(
367265d3bf74SEric Kohl _Out_ PULONG pulStatus,
367365d3bf74SEric Kohl _Out_ PULONG pulProblemNumber,
367465d3bf74SEric Kohl _In_ DEVINST dnDevInst,
367565d3bf74SEric Kohl _In_ ULONG ulFlags)
3676c2c66affSColin Finck {
367765d3bf74SEric Kohl TRACE("CM_Get_DevNode_Status(%p %p %lx %lx)\n",
3678c2c66affSColin Finck pulStatus, pulProblemNumber, dnDevInst, ulFlags);
367965d3bf74SEric Kohl
3680c2c66affSColin Finck return CM_Get_DevNode_Status_Ex(pulStatus, pulProblemNumber, dnDevInst,
3681c2c66affSColin Finck ulFlags, NULL);
3682c2c66affSColin Finck }
3683c2c66affSColin Finck
3684c2c66affSColin Finck
3685c2c66affSColin Finck /***********************************************************************
3686c2c66affSColin Finck * CM_Get_DevNode_Status_Ex [SETUPAPI.@]
3687c2c66affSColin Finck */
368865d3bf74SEric Kohl CONFIGRET
368965d3bf74SEric Kohl WINAPI
CM_Get_DevNode_Status_Ex(_Out_ PULONG pulStatus,_Out_ PULONG pulProblemNumber,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)3690c2c66affSColin Finck CM_Get_DevNode_Status_Ex(
369165d3bf74SEric Kohl _Out_ PULONG pulStatus,
369265d3bf74SEric Kohl _Out_ PULONG pulProblemNumber,
369365d3bf74SEric Kohl _In_ DEVINST dnDevInst,
369465d3bf74SEric Kohl _In_ ULONG ulFlags,
369565d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
3696c2c66affSColin Finck {
3697c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
3698c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
3699c2c66affSColin Finck LPWSTR lpDevInst;
3700c2c66affSColin Finck CONFIGRET ret;
3701c2c66affSColin Finck
370260a21894SEric Kohl TRACE("CM_Get_DevNode_Status_Ex(%p %p %lx %lx %p)\n",
3703c2c66affSColin Finck pulStatus, pulProblemNumber, dnDevInst, ulFlags, hMachine);
3704c2c66affSColin Finck
3705c2c66affSColin Finck if (pulStatus == NULL || pulProblemNumber == NULL)
3706c2c66affSColin Finck return CR_INVALID_POINTER;
3707c2c66affSColin Finck
3708c2c66affSColin Finck if (dnDevInst == 0)
3709c2c66affSColin Finck return CR_INVALID_DEVINST;
3710c2c66affSColin Finck
3711c2c66affSColin Finck if (ulFlags != 0)
3712c2c66affSColin Finck return CR_INVALID_FLAG;
3713c2c66affSColin Finck
3714c2c66affSColin Finck if (hMachine != NULL)
3715c2c66affSColin Finck {
3716c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
3717c2c66affSColin Finck if (BindingHandle == NULL)
3718c2c66affSColin Finck return CR_FAILURE;
3719c2c66affSColin Finck
3720c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
3721c2c66affSColin Finck if (StringTable == 0)
3722c2c66affSColin Finck return CR_FAILURE;
3723c2c66affSColin Finck }
3724c2c66affSColin Finck else
3725c2c66affSColin Finck {
3726c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
3727c2c66affSColin Finck return CR_FAILURE;
3728c2c66affSColin Finck }
3729c2c66affSColin Finck
3730c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
3731c2c66affSColin Finck if (lpDevInst == NULL)
3732c2c66affSColin Finck return CR_INVALID_DEVNODE;
3733c2c66affSColin Finck
3734c2c66affSColin Finck RpcTryExcept
3735c2c66affSColin Finck {
3736c2c66affSColin Finck ret = PNP_GetDeviceStatus(BindingHandle,
3737c2c66affSColin Finck lpDevInst,
3738c2c66affSColin Finck pulStatus,
3739c2c66affSColin Finck pulProblemNumber,
3740c2c66affSColin Finck ulFlags);
3741c2c66affSColin Finck }
3742c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
3743c2c66affSColin Finck {
3744c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
3745c2c66affSColin Finck }
3746c2c66affSColin Finck RpcEndExcept;
3747c2c66affSColin Finck
3748c2c66affSColin Finck return ret;
3749c2c66affSColin Finck }
3750c2c66affSColin Finck
3751c2c66affSColin Finck
3752c2c66affSColin Finck /***********************************************************************
3753c2c66affSColin Finck * CM_Get_Device_IDA [SETUPAPI.@]
3754c2c66affSColin Finck */
375565d3bf74SEric Kohl CONFIGRET
375665d3bf74SEric Kohl WINAPI
CM_Get_Device_IDA(_In_ DEVINST dnDevInst,_Out_writes_ (BufferLen)PCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags)375765d3bf74SEric Kohl CM_Get_Device_IDA(
375865d3bf74SEric Kohl _In_ DEVINST dnDevInst,
375965d3bf74SEric Kohl _Out_writes_(BufferLen) PCHAR Buffer,
376065d3bf74SEric Kohl _In_ ULONG BufferLen,
376165d3bf74SEric Kohl _In_ ULONG ulFlags)
3762c2c66affSColin Finck {
376360a21894SEric Kohl TRACE("CM_Get_Device_IDA(%lx %p %lu %lx)\n",
3764c2c66affSColin Finck dnDevInst, Buffer, BufferLen, ulFlags);
376565d3bf74SEric Kohl
3766c2c66affSColin Finck return CM_Get_Device_ID_ExA(dnDevInst, Buffer, BufferLen, ulFlags, NULL);
3767c2c66affSColin Finck }
3768c2c66affSColin Finck
3769c2c66affSColin Finck
3770c2c66affSColin Finck /***********************************************************************
3771c2c66affSColin Finck * CM_Get_Device_IDW [SETUPAPI.@]
3772c2c66affSColin Finck */
377365d3bf74SEric Kohl CONFIGRET
377465d3bf74SEric Kohl WINAPI
CM_Get_Device_IDW(_In_ DEVINST dnDevInst,_Out_writes_ (BufferLen)PWCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags)377565d3bf74SEric Kohl CM_Get_Device_IDW(
377665d3bf74SEric Kohl _In_ DEVINST dnDevInst,
377765d3bf74SEric Kohl _Out_writes_(BufferLen) PWCHAR Buffer,
377865d3bf74SEric Kohl _In_ ULONG BufferLen,
377965d3bf74SEric Kohl _In_ ULONG ulFlags)
3780c2c66affSColin Finck {
378160a21894SEric Kohl TRACE("CM_Get_Device_IDW(%lx %p %lu %lx)\n",
3782c2c66affSColin Finck dnDevInst, Buffer, BufferLen, ulFlags);
378365d3bf74SEric Kohl
3784c2c66affSColin Finck return CM_Get_Device_ID_ExW(dnDevInst, Buffer, BufferLen, ulFlags, NULL);
3785c2c66affSColin Finck }
3786c2c66affSColin Finck
3787c2c66affSColin Finck
3788c2c66affSColin Finck /***********************************************************************
3789c2c66affSColin Finck * CM_Get_Device_ID_ExA [SETUPAPI.@]
3790c2c66affSColin Finck */
379165d3bf74SEric Kohl CONFIGRET
379265d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_ExA(_In_ DEVINST dnDevInst,_Out_writes_ (BufferLen)PCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)379365d3bf74SEric Kohl CM_Get_Device_ID_ExA(
379465d3bf74SEric Kohl _In_ DEVINST dnDevInst,
379565d3bf74SEric Kohl _Out_writes_(BufferLen) PCHAR Buffer,
379665d3bf74SEric Kohl _In_ ULONG BufferLen,
379765d3bf74SEric Kohl _In_ ULONG ulFlags,
379865d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
3799c2c66affSColin Finck {
3800c2c66affSColin Finck WCHAR szBufferW[MAX_DEVICE_ID_LEN];
3801c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
3802c2c66affSColin Finck
380360a21894SEric Kohl TRACE("CM_Get_Device_ID_ExA(%lx %p %lu %lx %p)\n",
3804c2c66affSColin Finck dnDevInst, Buffer, BufferLen, ulFlags, hMachine);
3805c2c66affSColin Finck
3806c2c66affSColin Finck if (Buffer == NULL)
3807c2c66affSColin Finck return CR_INVALID_POINTER;
3808c2c66affSColin Finck
3809c2c66affSColin Finck ret = CM_Get_Device_ID_ExW(dnDevInst,
3810c2c66affSColin Finck szBufferW,
3811c2c66affSColin Finck MAX_DEVICE_ID_LEN,
3812c2c66affSColin Finck ulFlags,
3813c2c66affSColin Finck hMachine);
3814c2c66affSColin Finck if (ret == CR_SUCCESS)
3815c2c66affSColin Finck {
3816c2c66affSColin Finck if (WideCharToMultiByte(CP_ACP,
3817c2c66affSColin Finck 0,
3818c2c66affSColin Finck szBufferW,
3819c2c66affSColin Finck lstrlenW(szBufferW) + 1,
3820c2c66affSColin Finck Buffer,
3821c2c66affSColin Finck BufferLen,
3822c2c66affSColin Finck NULL,
3823c2c66affSColin Finck NULL) == 0)
3824c2c66affSColin Finck ret = CR_FAILURE;
3825c2c66affSColin Finck }
3826c2c66affSColin Finck
3827c2c66affSColin Finck return ret;
3828c2c66affSColin Finck }
3829c2c66affSColin Finck
3830c2c66affSColin Finck
3831c2c66affSColin Finck /***********************************************************************
3832c2c66affSColin Finck * CM_Get_Device_ID_ExW [SETUPAPI.@]
3833c2c66affSColin Finck */
383465d3bf74SEric Kohl CONFIGRET
383565d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_ExW(_In_ DEVINST dnDevInst,_Out_writes_ (BufferLen)PWCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)383665d3bf74SEric Kohl CM_Get_Device_ID_ExW(
383765d3bf74SEric Kohl _In_ DEVINST dnDevInst,
383865d3bf74SEric Kohl _Out_writes_(BufferLen) PWCHAR Buffer,
383965d3bf74SEric Kohl _In_ ULONG BufferLen,
384065d3bf74SEric Kohl _In_ ULONG ulFlags,
384165d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
3842c2c66affSColin Finck {
3843c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
3844c2c66affSColin Finck
384560a21894SEric Kohl TRACE("CM_Get_Device_ID_ExW(%lx %p %lu %lx %p)\n",
3846c2c66affSColin Finck dnDevInst, Buffer, BufferLen, ulFlags, hMachine);
3847c2c66affSColin Finck
3848c2c66affSColin Finck if (dnDevInst == 0)
3849c2c66affSColin Finck return CR_INVALID_DEVINST;
3850c2c66affSColin Finck
3851c2c66affSColin Finck if (Buffer == NULL)
3852c2c66affSColin Finck return CR_INVALID_POINTER;
3853c2c66affSColin Finck
3854c2c66affSColin Finck if (ulFlags != 0)
3855c2c66affSColin Finck return CR_INVALID_FLAG;
3856c2c66affSColin Finck
3857c2c66affSColin Finck if (hMachine != NULL)
3858c2c66affSColin Finck {
3859c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
3860c2c66affSColin Finck if (StringTable == NULL)
3861c2c66affSColin Finck return CR_FAILURE;
3862c2c66affSColin Finck }
3863c2c66affSColin Finck else
3864c2c66affSColin Finck {
3865c2c66affSColin Finck if (!PnpGetLocalHandles(NULL, &StringTable))
3866c2c66affSColin Finck return CR_FAILURE;
3867c2c66affSColin Finck }
3868c2c66affSColin Finck
3869c2c66affSColin Finck if (!pSetupStringTableStringFromIdEx(StringTable,
3870c2c66affSColin Finck dnDevInst,
3871c2c66affSColin Finck Buffer,
3872c2c66affSColin Finck &BufferLen))
3873c2c66affSColin Finck return CR_FAILURE;
3874c2c66affSColin Finck
3875c2c66affSColin Finck return CR_SUCCESS;
3876c2c66affSColin Finck }
3877c2c66affSColin Finck
3878c2c66affSColin Finck
3879c2c66affSColin Finck /***********************************************************************
3880c2c66affSColin Finck * CM_Get_Device_ID_ListA [SETUPAPI.@]
3881c2c66affSColin Finck */
388265d3bf74SEric Kohl CONFIGRET
388365d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_ListA(_In_ PCSTR pszFilter,_Out_writes_ (BufferLen)PCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags)388465d3bf74SEric Kohl CM_Get_Device_ID_ListA(
388565d3bf74SEric Kohl _In_ PCSTR pszFilter,
388665d3bf74SEric Kohl _Out_writes_(BufferLen) PCHAR Buffer,
388765d3bf74SEric Kohl _In_ ULONG BufferLen,
388865d3bf74SEric Kohl _In_ ULONG ulFlags)
3889c2c66affSColin Finck {
389060a21894SEric Kohl TRACE("CM_Get_Device_ID_ListA(%p %p %lu %lx)\n",
389165d3bf74SEric Kohl pszFilter, Buffer, BufferLen, ulFlags);
389265d3bf74SEric Kohl
3893c2c66affSColin Finck return CM_Get_Device_ID_List_ExA(pszFilter, Buffer, BufferLen,
3894c2c66affSColin Finck ulFlags, NULL);
3895c2c66affSColin Finck }
3896c2c66affSColin Finck
3897c2c66affSColin Finck
3898c2c66affSColin Finck /***********************************************************************
3899c2c66affSColin Finck * CM_Get_Device_ID_ListW [SETUPAPI.@]
3900c2c66affSColin Finck */
390165d3bf74SEric Kohl CONFIGRET
390265d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_ListW(_In_ PCWSTR pszFilter,_Out_writes_ (BufferLen)PWCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags)390365d3bf74SEric Kohl CM_Get_Device_ID_ListW(
390465d3bf74SEric Kohl _In_ PCWSTR pszFilter,
390565d3bf74SEric Kohl _Out_writes_(BufferLen) PWCHAR Buffer,
390665d3bf74SEric Kohl _In_ ULONG BufferLen,
390765d3bf74SEric Kohl _In_ ULONG ulFlags)
3908c2c66affSColin Finck {
390960a21894SEric Kohl TRACE("CM_Get_Device_ID_ListW(%p %p %lu %lx)\n",
391065d3bf74SEric Kohl pszFilter, Buffer, BufferLen, ulFlags);
391165d3bf74SEric Kohl
3912c2c66affSColin Finck return CM_Get_Device_ID_List_ExW(pszFilter, Buffer, BufferLen,
3913c2c66affSColin Finck ulFlags, NULL);
3914c2c66affSColin Finck }
3915c2c66affSColin Finck
3916c2c66affSColin Finck
3917c2c66affSColin Finck /***********************************************************************
3918c2c66affSColin Finck * CM_Get_Device_ID_List_ExA [SETUPAPI.@]
3919c2c66affSColin Finck */
392065d3bf74SEric Kohl CONFIGRET
392165d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_List_ExA(_In_ PCSTR pszFilter,_Out_writes_ (BufferLen)PCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)392265d3bf74SEric Kohl CM_Get_Device_ID_List_ExA(
392365d3bf74SEric Kohl _In_ PCSTR pszFilter,
392465d3bf74SEric Kohl _Out_writes_(BufferLen) PCHAR Buffer,
392565d3bf74SEric Kohl _In_ ULONG BufferLen,
392665d3bf74SEric Kohl _In_ ULONG ulFlags,
392765d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
3928c2c66affSColin Finck {
3929c2c66affSColin Finck LPWSTR BufferW = NULL;
3930c2c66affSColin Finck LPWSTR pszFilterW = NULL;
3931c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
3932c2c66affSColin Finck
393360a21894SEric Kohl TRACE("CM_Get_Device_ID_List_ExA(%p %p %lu %lx %p)\n",
3934c2c66affSColin Finck pszFilter, Buffer, BufferLen, ulFlags, hMachine);
3935c2c66affSColin Finck
3936c2c66affSColin Finck BufferW = MyMalloc(BufferLen * sizeof(WCHAR));
3937c2c66affSColin Finck if (BufferW == NULL)
3938c2c66affSColin Finck return CR_OUT_OF_MEMORY;
3939c2c66affSColin Finck
3940c2c66affSColin Finck if (pszFilter == NULL)
3941c2c66affSColin Finck {
3942c2c66affSColin Finck ret = CM_Get_Device_ID_List_ExW(NULL,
3943c2c66affSColin Finck BufferW,
3944c2c66affSColin Finck BufferLen,
3945c2c66affSColin Finck ulFlags,
3946c2c66affSColin Finck hMachine);
3947c2c66affSColin Finck }
3948c2c66affSColin Finck else
3949c2c66affSColin Finck {
3950c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(pszFilter, &pszFilterW))
3951c2c66affSColin Finck {
3952c2c66affSColin Finck ret = CR_INVALID_DEVICE_ID;
3953c2c66affSColin Finck goto Done;
3954c2c66affSColin Finck }
3955c2c66affSColin Finck
3956c2c66affSColin Finck ret = CM_Get_Device_ID_List_ExW(pszFilterW,
3957c2c66affSColin Finck BufferW,
3958c2c66affSColin Finck BufferLen,
3959c2c66affSColin Finck ulFlags,
3960c2c66affSColin Finck hMachine);
3961c2c66affSColin Finck
3962c2c66affSColin Finck MyFree(pszFilterW);
3963c2c66affSColin Finck }
3964c2c66affSColin Finck
3965c2c66affSColin Finck if (WideCharToMultiByte(CP_ACP,
3966c2c66affSColin Finck 0,
3967c2c66affSColin Finck BufferW,
3968aa056499SVictor Perevertkin BufferLen,
3969c2c66affSColin Finck Buffer,
3970c2c66affSColin Finck BufferLen,
3971c2c66affSColin Finck NULL,
3972c2c66affSColin Finck NULL) == 0)
3973c2c66affSColin Finck ret = CR_FAILURE;
3974c2c66affSColin Finck
3975c2c66affSColin Finck Done:
3976c2c66affSColin Finck MyFree(BufferW);
3977c2c66affSColin Finck
3978c2c66affSColin Finck return ret;
3979c2c66affSColin Finck }
3980c2c66affSColin Finck
3981c2c66affSColin Finck
3982c2c66affSColin Finck /***********************************************************************
3983c2c66affSColin Finck * CM_Get_Device_ID_List_ExW [SETUPAPI.@]
3984c2c66affSColin Finck */
398565d3bf74SEric Kohl CONFIGRET
398665d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_List_ExW(_In_ PCWSTR pszFilter,_Out_writes_ (BufferLen)PWCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)398765d3bf74SEric Kohl CM_Get_Device_ID_List_ExW(
398865d3bf74SEric Kohl _In_ PCWSTR pszFilter,
398965d3bf74SEric Kohl _Out_writes_(BufferLen) PWCHAR Buffer,
399065d3bf74SEric Kohl _In_ ULONG BufferLen,
399165d3bf74SEric Kohl _In_ ULONG ulFlags,
399265d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
3993c2c66affSColin Finck {
3994c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
3995c2c66affSColin Finck CONFIGRET ret;
3996c2c66affSColin Finck
399760a21894SEric Kohl TRACE("CM_Get_Device_ID_List_ExW(%p %p %lu %lx %p)\n",
3998c2c66affSColin Finck pszFilter, Buffer, BufferLen, ulFlags, hMachine);
3999c2c66affSColin Finck
4000c2c66affSColin Finck if (Buffer == NULL || BufferLen == 0)
4001c2c66affSColin Finck return CR_INVALID_POINTER;
4002c2c66affSColin Finck
4003c2c66affSColin Finck if (ulFlags & ~CM_GETIDLIST_FILTER_BITS)
4004c2c66affSColin Finck return CR_INVALID_FLAG;
4005c2c66affSColin Finck
4006c2c66affSColin Finck if (hMachine != NULL)
4007c2c66affSColin Finck {
4008c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
4009c2c66affSColin Finck if (BindingHandle == NULL)
4010c2c66affSColin Finck return CR_FAILURE;
4011c2c66affSColin Finck }
4012c2c66affSColin Finck else
4013c2c66affSColin Finck {
4014c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
4015c2c66affSColin Finck return CR_FAILURE;
4016c2c66affSColin Finck }
4017c2c66affSColin Finck
4018c2c66affSColin Finck *Buffer = 0;
4019c2c66affSColin Finck
4020c2c66affSColin Finck RpcTryExcept
4021c2c66affSColin Finck {
4022c2c66affSColin Finck ret = PNP_GetDeviceList(BindingHandle,
4023c2c66affSColin Finck (LPWSTR)pszFilter,
4024c2c66affSColin Finck Buffer,
4025c2c66affSColin Finck &BufferLen,
4026c2c66affSColin Finck ulFlags);
4027c2c66affSColin Finck }
4028c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
4029c2c66affSColin Finck {
4030c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
4031c2c66affSColin Finck }
4032c2c66affSColin Finck RpcEndExcept;
4033c2c66affSColin Finck
4034c2c66affSColin Finck return ret;
4035c2c66affSColin Finck }
4036c2c66affSColin Finck
4037c2c66affSColin Finck
4038c2c66affSColin Finck /***********************************************************************
4039c2c66affSColin Finck * CM_Get_Device_ID_List_SizeA [SETUPAPI.@]
4040c2c66affSColin Finck */
404165d3bf74SEric Kohl CONFIGRET
404265d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_List_SizeA(_Out_ PULONG pulLen,_In_opt_ PCSTR pszFilter,_In_ ULONG ulFlags)404365d3bf74SEric Kohl CM_Get_Device_ID_List_SizeA(
404465d3bf74SEric Kohl _Out_ PULONG pulLen,
404565d3bf74SEric Kohl _In_opt_ PCSTR pszFilter,
404665d3bf74SEric Kohl _In_ ULONG ulFlags)
4047c2c66affSColin Finck {
404865d3bf74SEric Kohl TRACE("CM_Get_Device_ID_List_SizeA(%p %s %lx)\n",
404965d3bf74SEric Kohl pulLen, debugstr_a(pszFilter), ulFlags);
405065d3bf74SEric Kohl
4051c2c66affSColin Finck return CM_Get_Device_ID_List_Size_ExA(pulLen, pszFilter, ulFlags, NULL);
4052c2c66affSColin Finck }
4053c2c66affSColin Finck
4054c2c66affSColin Finck
4055c2c66affSColin Finck /***********************************************************************
4056c2c66affSColin Finck * CM_Get_Device_ID_List_SizeW [SETUPAPI.@]
4057c2c66affSColin Finck */
405865d3bf74SEric Kohl CONFIGRET
405965d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_List_SizeW(_Out_ PULONG pulLen,_In_opt_ PCWSTR pszFilter,_In_ ULONG ulFlags)406065d3bf74SEric Kohl CM_Get_Device_ID_List_SizeW(
406165d3bf74SEric Kohl _Out_ PULONG pulLen,
406265d3bf74SEric Kohl _In_opt_ PCWSTR pszFilter,
406365d3bf74SEric Kohl _In_ ULONG ulFlags)
4064c2c66affSColin Finck {
406565d3bf74SEric Kohl TRACE("CM_Get_Device_ID_List_SizeW(%p %s %lx)\n",
406665d3bf74SEric Kohl pulLen, debugstr_w(pszFilter), ulFlags);
406765d3bf74SEric Kohl
4068c2c66affSColin Finck return CM_Get_Device_ID_List_Size_ExW(pulLen, pszFilter, ulFlags, NULL);
4069c2c66affSColin Finck }
4070c2c66affSColin Finck
4071c2c66affSColin Finck
4072c2c66affSColin Finck /***********************************************************************
4073c2c66affSColin Finck * CM_Get_Device_ID_List_Size_ExA [SETUPAPI.@]
4074c2c66affSColin Finck */
407565d3bf74SEric Kohl CONFIGRET
407665d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_List_Size_ExA(_Out_ PULONG pulLen,_In_opt_ PCSTR pszFilter,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)407765d3bf74SEric Kohl CM_Get_Device_ID_List_Size_ExA(
407865d3bf74SEric Kohl _Out_ PULONG pulLen,
407965d3bf74SEric Kohl _In_opt_ PCSTR pszFilter,
408065d3bf74SEric Kohl _In_ ULONG ulFlags,
408165d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4082c2c66affSColin Finck {
4083c2c66affSColin Finck LPWSTR pszFilterW = NULL;
4084c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
4085c2c66affSColin Finck
408660a21894SEric Kohl FIXME("CM_Get_Device_ID_List_Size_ExA(%p %s %lx %p)\n",
408765d3bf74SEric Kohl pulLen, debugstr_a(pszFilter), ulFlags, hMachine);
4088c2c66affSColin Finck
4089c2c66affSColin Finck if (pszFilter == NULL)
4090c2c66affSColin Finck {
4091c2c66affSColin Finck ret = CM_Get_Device_ID_List_Size_ExW(pulLen,
4092c2c66affSColin Finck NULL,
4093c2c66affSColin Finck ulFlags,
4094c2c66affSColin Finck hMachine);
4095c2c66affSColin Finck }
4096c2c66affSColin Finck else
4097c2c66affSColin Finck {
4098c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(pszFilter, &pszFilterW))
4099c2c66affSColin Finck return CR_INVALID_DEVICE_ID;
4100c2c66affSColin Finck
4101c2c66affSColin Finck ret = CM_Get_Device_ID_List_Size_ExW(pulLen,
4102c2c66affSColin Finck pszFilterW,
4103c2c66affSColin Finck ulFlags,
4104c2c66affSColin Finck hMachine);
4105c2c66affSColin Finck
4106c2c66affSColin Finck MyFree(pszFilterW);
4107c2c66affSColin Finck }
4108c2c66affSColin Finck
4109c2c66affSColin Finck return ret;
4110c2c66affSColin Finck }
4111c2c66affSColin Finck
4112c2c66affSColin Finck
4113c2c66affSColin Finck /***********************************************************************
4114c2c66affSColin Finck * CM_Get_Device_ID_List_Size_ExW [SETUPAPI.@]
4115c2c66affSColin Finck */
411665d3bf74SEric Kohl CONFIGRET
411765d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_List_Size_ExW(_Out_ PULONG pulLen,_In_opt_ PCWSTR pszFilter,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)411865d3bf74SEric Kohl CM_Get_Device_ID_List_Size_ExW(
411965d3bf74SEric Kohl _Out_ PULONG pulLen,
412065d3bf74SEric Kohl _In_opt_ PCWSTR pszFilter,
412165d3bf74SEric Kohl _In_ ULONG ulFlags,
412265d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4123c2c66affSColin Finck {
4124c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
4125c2c66affSColin Finck CONFIGRET ret;
4126c2c66affSColin Finck
412760a21894SEric Kohl FIXME("CM_Get_Device_ID_List_Size_ExW(%p %s %lx %p)\n",
412865d3bf74SEric Kohl pulLen, debugstr_w(pszFilter), ulFlags, hMachine);
4129c2c66affSColin Finck
4130c2c66affSColin Finck if (pulLen == NULL)
4131c2c66affSColin Finck return CR_INVALID_POINTER;
4132c2c66affSColin Finck
4133c2c66affSColin Finck if (ulFlags & ~CM_GETIDLIST_FILTER_BITS)
4134c2c66affSColin Finck return CR_INVALID_FLAG;
4135c2c66affSColin Finck
4136c2c66affSColin Finck if (hMachine != NULL)
4137c2c66affSColin Finck {
4138c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
4139c2c66affSColin Finck if (BindingHandle == NULL)
4140c2c66affSColin Finck return CR_FAILURE;
4141c2c66affSColin Finck }
4142c2c66affSColin Finck else
4143c2c66affSColin Finck {
4144c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
4145c2c66affSColin Finck return CR_FAILURE;
4146c2c66affSColin Finck }
4147c2c66affSColin Finck
4148c2c66affSColin Finck *pulLen = 0;
4149c2c66affSColin Finck
4150c2c66affSColin Finck RpcTryExcept
4151c2c66affSColin Finck {
4152c2c66affSColin Finck ret = PNP_GetDeviceListSize(BindingHandle,
4153c2c66affSColin Finck (LPWSTR)pszFilter,
4154c2c66affSColin Finck pulLen,
4155c2c66affSColin Finck ulFlags);
4156c2c66affSColin Finck }
4157c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
4158c2c66affSColin Finck {
4159c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
4160c2c66affSColin Finck }
4161c2c66affSColin Finck RpcEndExcept;
4162c2c66affSColin Finck
4163c2c66affSColin Finck return ret;
4164c2c66affSColin Finck }
4165c2c66affSColin Finck
4166c2c66affSColin Finck
4167c2c66affSColin Finck /***********************************************************************
4168c2c66affSColin Finck * CM_Get_Device_ID_Size [SETUPAPI.@]
4169c2c66affSColin Finck */
417065d3bf74SEric Kohl CONFIGRET
417165d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_Size(_Out_ PULONG pulLen,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)417265d3bf74SEric Kohl CM_Get_Device_ID_Size(
417365d3bf74SEric Kohl _Out_ PULONG pulLen,
417465d3bf74SEric Kohl _In_ DEVINST dnDevInst,
417565d3bf74SEric Kohl _In_ ULONG ulFlags)
4176c2c66affSColin Finck {
417765d3bf74SEric Kohl TRACE("CM_Get_Device_ID_Size(%p %lx %lx)\n",
417865d3bf74SEric Kohl pulLen, dnDevInst, ulFlags);
417965d3bf74SEric Kohl
4180c2c66affSColin Finck return CM_Get_Device_ID_Size_Ex(pulLen, dnDevInst, ulFlags, NULL);
4181c2c66affSColin Finck }
4182c2c66affSColin Finck
4183c2c66affSColin Finck
4184c2c66affSColin Finck /***********************************************************************
4185c2c66affSColin Finck * CM_Get_Device_ID_Size_Ex [SETUPAPI.@]
4186c2c66affSColin Finck */
418765d3bf74SEric Kohl CONFIGRET
418865d3bf74SEric Kohl WINAPI
CM_Get_Device_ID_Size_Ex(_Out_ PULONG pulLen,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)418965d3bf74SEric Kohl CM_Get_Device_ID_Size_Ex(
419065d3bf74SEric Kohl _Out_ PULONG pulLen,
419165d3bf74SEric Kohl _In_ DEVINST dnDevInst,
419265d3bf74SEric Kohl _In_ ULONG ulFlags,
419365d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4194c2c66affSColin Finck {
4195c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
4196c2c66affSColin Finck LPWSTR DeviceId;
4197c2c66affSColin Finck
419860a21894SEric Kohl TRACE("CM_Get_Device_ID_Size_Ex(%p %lx %lx %p)\n",
419965d3bf74SEric Kohl pulLen, dnDevInst, ulFlags, hMachine);
4200c2c66affSColin Finck
4201c2c66affSColin Finck if (pulLen == NULL)
4202c2c66affSColin Finck return CR_INVALID_POINTER;
4203c2c66affSColin Finck
4204c2c66affSColin Finck if (dnDevInst == 0)
4205c2c66affSColin Finck return CR_INVALID_DEVINST;
4206c2c66affSColin Finck
4207c2c66affSColin Finck if (ulFlags != 0)
4208c2c66affSColin Finck return CR_INVALID_FLAG;
4209c2c66affSColin Finck
4210c2c66affSColin Finck if (hMachine != NULL)
4211c2c66affSColin Finck {
4212c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
4213c2c66affSColin Finck if (StringTable == NULL)
4214c2c66affSColin Finck return CR_FAILURE;
4215c2c66affSColin Finck }
4216c2c66affSColin Finck else
4217c2c66affSColin Finck {
4218c2c66affSColin Finck if (!PnpGetLocalHandles(NULL, &StringTable))
4219c2c66affSColin Finck return CR_FAILURE;
4220c2c66affSColin Finck }
4221c2c66affSColin Finck
4222c2c66affSColin Finck DeviceId = pSetupStringTableStringFromId(StringTable, dnDevInst);
4223c2c66affSColin Finck if (DeviceId == NULL)
4224c2c66affSColin Finck {
4225c2c66affSColin Finck *pulLen = 0;
4226c2c66affSColin Finck return CR_SUCCESS;
4227c2c66affSColin Finck }
4228c2c66affSColin Finck
4229c2c66affSColin Finck *pulLen = lstrlenW(DeviceId);
4230c2c66affSColin Finck
4231c2c66affSColin Finck return CR_SUCCESS;
4232c2c66affSColin Finck }
4233c2c66affSColin Finck
4234c2c66affSColin Finck
4235c2c66affSColin Finck /***********************************************************************
4236c2c66affSColin Finck * CM_Get_Device_Interface_AliasA [SETUPAPI.@]
4237c2c66affSColin Finck */
423865d3bf74SEric Kohl CONFIGRET
423965d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_AliasA(_In_ LPCSTR pszDeviceInterface,_In_ LPGUID AliasInterfaceGuid,_Out_writes_ (* pulLength)LPSTR pszAliasDeviceInterface,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)424065d3bf74SEric Kohl CM_Get_Device_Interface_AliasA(
424165d3bf74SEric Kohl _In_ LPCSTR pszDeviceInterface,
424265d3bf74SEric Kohl _In_ LPGUID AliasInterfaceGuid,
424365d3bf74SEric Kohl _Out_writes_(*pulLength) LPSTR pszAliasDeviceInterface,
424465d3bf74SEric Kohl _Inout_ PULONG pulLength,
424565d3bf74SEric Kohl _In_ ULONG ulFlags)
4246c2c66affSColin Finck {
424765d3bf74SEric Kohl TRACE("CM_Get_Device_Interface_AliasA(%p %p %p %p %lx)\n",
424865d3bf74SEric Kohl pszDeviceInterface, AliasInterfaceGuid,
4249c2c66affSColin Finck pszAliasDeviceInterface, pulLength, ulFlags);
4250c2c66affSColin Finck
4251c2c66affSColin Finck return CM_Get_Device_Interface_Alias_ExA(pszDeviceInterface,
4252c2c66affSColin Finck AliasInterfaceGuid, pszAliasDeviceInterface, pulLength,
4253c2c66affSColin Finck ulFlags, NULL);
4254c2c66affSColin Finck }
4255c2c66affSColin Finck
4256c2c66affSColin Finck
4257c2c66affSColin Finck /***********************************************************************
4258c2c66affSColin Finck * CM_Get_Device_Interface_AliasW [SETUPAPI.@]
4259c2c66affSColin Finck */
426065d3bf74SEric Kohl CONFIGRET
426165d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_AliasW(_In_ LPCWSTR pszDeviceInterface,_In_ LPGUID AliasInterfaceGuid,_Out_writes_ (* pulLength)LPWSTR pszAliasDeviceInterface,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)426265d3bf74SEric Kohl CM_Get_Device_Interface_AliasW(
426365d3bf74SEric Kohl _In_ LPCWSTR pszDeviceInterface,
426465d3bf74SEric Kohl _In_ LPGUID AliasInterfaceGuid,
426565d3bf74SEric Kohl _Out_writes_(*pulLength) LPWSTR pszAliasDeviceInterface,
426665d3bf74SEric Kohl _Inout_ PULONG pulLength,
426765d3bf74SEric Kohl _In_ ULONG ulFlags)
4268c2c66affSColin Finck {
426965d3bf74SEric Kohl TRACE("CM_Get_Device_Interface_AliasW(%p %p %p %p %lx)\n",
427065d3bf74SEric Kohl pszDeviceInterface, AliasInterfaceGuid,
4271c2c66affSColin Finck pszAliasDeviceInterface, pulLength, ulFlags);
4272c2c66affSColin Finck
4273c2c66affSColin Finck return CM_Get_Device_Interface_Alias_ExW(pszDeviceInterface,
4274c2c66affSColin Finck AliasInterfaceGuid, pszAliasDeviceInterface, pulLength,
4275c2c66affSColin Finck ulFlags, NULL);
4276c2c66affSColin Finck }
4277c2c66affSColin Finck
4278c2c66affSColin Finck
4279c2c66affSColin Finck /***********************************************************************
4280c2c66affSColin Finck * CM_Get_Device_Interface_Alias_ExA [SETUPAPI.@]
4281c2c66affSColin Finck */
428265d3bf74SEric Kohl CONFIGRET
428365d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_Alias_ExA(_In_ LPCSTR pszDeviceInterface,_In_ LPGUID AliasInterfaceGuid,_Out_writes_ (* pulLength)LPSTR pszAliasDeviceInterface,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)428465d3bf74SEric Kohl CM_Get_Device_Interface_Alias_ExA(
428565d3bf74SEric Kohl _In_ LPCSTR pszDeviceInterface,
428665d3bf74SEric Kohl _In_ LPGUID AliasInterfaceGuid,
428765d3bf74SEric Kohl _Out_writes_(*pulLength) LPSTR pszAliasDeviceInterface,
428865d3bf74SEric Kohl _Inout_ PULONG pulLength,
428965d3bf74SEric Kohl _In_ ULONG ulFlags,
429065d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4291c2c66affSColin Finck {
429260a21894SEric Kohl FIXME("CM_Get_Device_Interface_Alias_ExA(%p %p %p %p %lx %p)\n",
429365d3bf74SEric Kohl pszDeviceInterface, AliasInterfaceGuid,
4294c2c66affSColin Finck pszAliasDeviceInterface, pulLength, ulFlags, hMachine);
4295c2c66affSColin Finck
4296c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
4297c2c66affSColin Finck }
4298c2c66affSColin Finck
4299c2c66affSColin Finck
4300c2c66affSColin Finck /***********************************************************************
4301c2c66affSColin Finck * CM_Get_Device_Interface_Alias_ExW [SETUPAPI.@]
4302c2c66affSColin Finck */
430365d3bf74SEric Kohl CONFIGRET
430465d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_Alias_ExW(_In_ LPCWSTR pszDeviceInterface,_In_ LPGUID AliasInterfaceGuid,_Out_writes_ (* pulLength)LPWSTR pszAliasDeviceInterface,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)430565d3bf74SEric Kohl CM_Get_Device_Interface_Alias_ExW(
430665d3bf74SEric Kohl _In_ LPCWSTR pszDeviceInterface,
430765d3bf74SEric Kohl _In_ LPGUID AliasInterfaceGuid,
430865d3bf74SEric Kohl _Out_writes_(*pulLength) LPWSTR pszAliasDeviceInterface,
430965d3bf74SEric Kohl _Inout_ PULONG pulLength,
431065d3bf74SEric Kohl _In_ ULONG ulFlags,
431165d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4312c2c66affSColin Finck {
4313c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
4314c2c66affSColin Finck ULONG ulTransferLength;
4315c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
4316c2c66affSColin Finck
431760a21894SEric Kohl TRACE("CM_Get_Device_Interface_Alias_ExW(%p %p %p %p %lx %p)\n",
431865d3bf74SEric Kohl pszDeviceInterface, AliasInterfaceGuid,
4319c2c66affSColin Finck pszAliasDeviceInterface, pulLength, ulFlags, hMachine);
4320c2c66affSColin Finck
4321c2c66affSColin Finck if (pszDeviceInterface == NULL ||
4322c2c66affSColin Finck AliasInterfaceGuid == NULL ||
4323c2c66affSColin Finck pszAliasDeviceInterface == NULL ||
4324c2c66affSColin Finck pulLength == NULL)
4325c2c66affSColin Finck return CR_INVALID_POINTER;
4326c2c66affSColin Finck
4327c2c66affSColin Finck if (ulFlags != 0)
4328c2c66affSColin Finck return CR_INVALID_FLAG;
4329c2c66affSColin Finck
4330c2c66affSColin Finck if (hMachine != NULL)
4331c2c66affSColin Finck {
4332c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
4333c2c66affSColin Finck if (BindingHandle == NULL)
4334c2c66affSColin Finck return CR_FAILURE;
4335c2c66affSColin Finck }
4336c2c66affSColin Finck else
4337c2c66affSColin Finck {
4338c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
4339c2c66affSColin Finck return CR_FAILURE;
4340c2c66affSColin Finck }
4341c2c66affSColin Finck
4342c2c66affSColin Finck ulTransferLength = *pulLength;
4343c2c66affSColin Finck
4344c2c66affSColin Finck RpcTryExcept
4345c2c66affSColin Finck {
4346c2c66affSColin Finck ret = PNP_GetInterfaceDeviceAlias(BindingHandle,
4347c2c66affSColin Finck (LPWSTR)pszDeviceInterface,
4348c2c66affSColin Finck AliasInterfaceGuid,
4349c2c66affSColin Finck pszAliasDeviceInterface,
4350c2c66affSColin Finck pulLength,
4351c2c66affSColin Finck &ulTransferLength,
4352c2c66affSColin Finck 0);
4353c2c66affSColin Finck }
4354c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
4355c2c66affSColin Finck {
4356c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
4357c2c66affSColin Finck }
4358c2c66affSColin Finck RpcEndExcept;
4359c2c66affSColin Finck
4360c2c66affSColin Finck return ret;
4361c2c66affSColin Finck }
4362c2c66affSColin Finck
4363c2c66affSColin Finck
4364c2c66affSColin Finck /***********************************************************************
4365c2c66affSColin Finck * CM_Get_Device_Interface_ListA (SETUPAPI.@)
4366c2c66affSColin Finck */
436765d3bf74SEric Kohl CONFIGRET
436865d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_ListA(_In_ LPGUID InterfaceClassGuid,_In_opt_ DEVINSTID_A pDeviceID,_Out_writes_ (BufferLen)PCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags)436965d3bf74SEric Kohl CM_Get_Device_Interface_ListA(
437065d3bf74SEric Kohl _In_ LPGUID InterfaceClassGuid,
437165d3bf74SEric Kohl _In_opt_ DEVINSTID_A pDeviceID,
437265d3bf74SEric Kohl _Out_writes_(BufferLen) PCHAR Buffer,
437365d3bf74SEric Kohl _In_ ULONG BufferLen,
437465d3bf74SEric Kohl _In_ ULONG ulFlags)
4375c2c66affSColin Finck {
437665d3bf74SEric Kohl TRACE("CM_Get_Device_Interface_ListA(%s %s %p %lu 0x%08lx)\n",
437765d3bf74SEric Kohl debugstr_guid(InterfaceClassGuid), debugstr_a(pDeviceID),
437865d3bf74SEric Kohl Buffer, BufferLen, ulFlags);
4379c2c66affSColin Finck
4380c2c66affSColin Finck return CM_Get_Device_Interface_List_ExA(InterfaceClassGuid, pDeviceID,
4381c2c66affSColin Finck Buffer, BufferLen, ulFlags, NULL);
4382c2c66affSColin Finck }
4383c2c66affSColin Finck
4384c2c66affSColin Finck
4385c2c66affSColin Finck /***********************************************************************
4386c2c66affSColin Finck * CM_Get_Device_Interface_ListW (SETUPAPI.@)
4387c2c66affSColin Finck */
438865d3bf74SEric Kohl CONFIGRET
438965d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_ListW(_In_ LPGUID InterfaceClassGuid,_In_opt_ DEVINSTID_W pDeviceID,_Out_writes_ (BufferLen)PWCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags)439065d3bf74SEric Kohl CM_Get_Device_Interface_ListW(
439165d3bf74SEric Kohl _In_ LPGUID InterfaceClassGuid,
439265d3bf74SEric Kohl _In_opt_ DEVINSTID_W pDeviceID,
439365d3bf74SEric Kohl _Out_writes_(BufferLen) PWCHAR Buffer,
439465d3bf74SEric Kohl _In_ ULONG BufferLen,
439565d3bf74SEric Kohl _In_ ULONG ulFlags)
4396c2c66affSColin Finck {
439765d3bf74SEric Kohl TRACE("CM_Get_Device_Interface_ListW(%s %s %p %lu 0x%08lx)\n",
439865d3bf74SEric Kohl debugstr_guid(InterfaceClassGuid), debugstr_w(pDeviceID),
439965d3bf74SEric Kohl Buffer, BufferLen, ulFlags);
4400c2c66affSColin Finck
4401c2c66affSColin Finck return CM_Get_Device_Interface_List_ExW(InterfaceClassGuid, pDeviceID,
4402c2c66affSColin Finck Buffer, BufferLen, ulFlags, NULL);
4403c2c66affSColin Finck }
4404c2c66affSColin Finck
4405c2c66affSColin Finck
4406c2c66affSColin Finck /***********************************************************************
4407c2c66affSColin Finck * CM_Get_Device_Interface_List_ExA (SETUPAPI.@)
4408c2c66affSColin Finck */
440965d3bf74SEric Kohl CONFIGRET
441065d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_List_ExA(_In_ LPGUID InterfaceClassGuid,_In_opt_ DEVINSTID_A pDeviceID,_Out_writes_ (BufferLen)PCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)441165d3bf74SEric Kohl CM_Get_Device_Interface_List_ExA(
441265d3bf74SEric Kohl _In_ LPGUID InterfaceClassGuid,
441365d3bf74SEric Kohl _In_opt_ DEVINSTID_A pDeviceID,
441465d3bf74SEric Kohl _Out_writes_(BufferLen) PCHAR Buffer,
441565d3bf74SEric Kohl _In_ ULONG BufferLen,
441665d3bf74SEric Kohl _In_ ULONG ulFlags,
441765d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4418c2c66affSColin Finck {
4419c2c66affSColin Finck DEVINSTID_W pDeviceIdW = NULL;
4420c2c66affSColin Finck PWCHAR BufferW = NULL;
4421c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
4422c2c66affSColin Finck
442365d3bf74SEric Kohl TRACE("CM_Get_Device_Interface_List_ExA(%s %s %p %lu 0x%08lx %p)\n",
442465d3bf74SEric Kohl debugstr_guid(InterfaceClassGuid), debugstr_a(pDeviceID),
442565d3bf74SEric Kohl Buffer, BufferLen, ulFlags, hMachine);
4426c2c66affSColin Finck
4427c2c66affSColin Finck if (Buffer == NULL ||
4428c2c66affSColin Finck BufferLen == 0)
4429c2c66affSColin Finck return CR_INVALID_POINTER;
4430c2c66affSColin Finck
4431c2c66affSColin Finck if (pDeviceID != NULL)
4432c2c66affSColin Finck {
4433c2c66affSColin Finck if (!pSetupCaptureAndConvertAnsiArg(pDeviceID, &pDeviceIdW))
4434c2c66affSColin Finck return CR_INVALID_DEVICE_ID;
4435c2c66affSColin Finck }
4436c2c66affSColin Finck
4437c2c66affSColin Finck BufferW = MyMalloc(BufferLen * sizeof(WCHAR));
4438c2c66affSColin Finck if (BufferW == NULL)
4439c2c66affSColin Finck {
4440c2c66affSColin Finck ret = CR_OUT_OF_MEMORY;
4441c2c66affSColin Finck goto Done;
4442c2c66affSColin Finck }
4443c2c66affSColin Finck
4444c2c66affSColin Finck ret = CM_Get_Device_Interface_List_ExW(InterfaceClassGuid, pDeviceIdW,
4445c2c66affSColin Finck BufferW, BufferLen, ulFlags,
4446c2c66affSColin Finck hMachine);
4447c2c66affSColin Finck if (ret != CR_SUCCESS)
4448c2c66affSColin Finck goto Done;
4449c2c66affSColin Finck
4450c2c66affSColin Finck if (WideCharToMultiByte(CP_ACP,
4451c2c66affSColin Finck 0,
4452c2c66affSColin Finck BufferW,
4453aa056499SVictor Perevertkin BufferLen,
4454c2c66affSColin Finck Buffer,
4455c2c66affSColin Finck BufferLen,
4456c2c66affSColin Finck NULL,
4457c2c66affSColin Finck NULL) == 0)
4458c2c66affSColin Finck ret = CR_FAILURE;
4459c2c66affSColin Finck
4460c2c66affSColin Finck Done:
4461c2c66affSColin Finck if (BufferW != NULL)
4462c2c66affSColin Finck MyFree(BufferW);
4463c2c66affSColin Finck
4464c2c66affSColin Finck if (pDeviceIdW != NULL)
4465c2c66affSColin Finck MyFree(pDeviceIdW);
4466c2c66affSColin Finck
4467c2c66affSColin Finck return ret;
4468c2c66affSColin Finck }
4469c2c66affSColin Finck
4470c2c66affSColin Finck
4471c2c66affSColin Finck /***********************************************************************
4472c2c66affSColin Finck * CM_Get_Device_Interface_List_ExW (SETUPAPI.@)
4473c2c66affSColin Finck */
447465d3bf74SEric Kohl CONFIGRET
447565d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_List_ExW(_In_ LPGUID InterfaceClassGuid,_In_opt_ DEVINSTID_W pDeviceID,_Out_writes_ (BufferLen)PWCHAR Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)447665d3bf74SEric Kohl CM_Get_Device_Interface_List_ExW(
447765d3bf74SEric Kohl _In_ LPGUID InterfaceClassGuid,
447865d3bf74SEric Kohl _In_opt_ DEVINSTID_W pDeviceID,
447965d3bf74SEric Kohl _Out_writes_(BufferLen) PWCHAR Buffer,
448065d3bf74SEric Kohl _In_ ULONG BufferLen,
448165d3bf74SEric Kohl _In_ ULONG ulFlags,
448265d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4483c2c66affSColin Finck {
4484c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
4485c2c66affSColin Finck PNP_RPC_BUFFER_SIZE BufferSize = 0;
4486c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
4487c2c66affSColin Finck
448865d3bf74SEric Kohl TRACE("CM_Get_Device_Interface_List_ExW(%s %s %p %lu 0x%08lx %p)\n",
448965d3bf74SEric Kohl debugstr_guid(InterfaceClassGuid), debugstr_w(pDeviceID),
449065d3bf74SEric Kohl Buffer, BufferLen, ulFlags, hMachine);
4491c2c66affSColin Finck
4492c2c66affSColin Finck if (Buffer == NULL ||
4493c2c66affSColin Finck BufferLen == 0)
4494c2c66affSColin Finck return CR_INVALID_POINTER;
4495c2c66affSColin Finck
4496c2c66affSColin Finck if (ulFlags & ~CM_GET_DEVICE_INTERFACE_LIST_BITS)
4497c2c66affSColin Finck return CR_INVALID_FLAG;
4498c2c66affSColin Finck
4499c2c66affSColin Finck if (hMachine != NULL)
4500c2c66affSColin Finck {
4501c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
4502c2c66affSColin Finck if (BindingHandle == NULL)
4503c2c66affSColin Finck return CR_FAILURE;
4504c2c66affSColin Finck }
4505c2c66affSColin Finck else
4506c2c66affSColin Finck {
4507c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
4508c2c66affSColin Finck return CR_FAILURE;
4509c2c66affSColin Finck }
4510c2c66affSColin Finck
4511c2c66affSColin Finck *Buffer = 0;
4512c2c66affSColin Finck BufferSize = BufferLen;
4513c2c66affSColin Finck
4514c2c66affSColin Finck RpcTryExcept
4515c2c66affSColin Finck {
4516c2c66affSColin Finck ret = PNP_GetInterfaceDeviceList(BindingHandle,
4517c2c66affSColin Finck InterfaceClassGuid,
4518c2c66affSColin Finck pDeviceID,
4519c2c66affSColin Finck (LPBYTE)Buffer,
4520c2c66affSColin Finck &BufferSize,
4521c2c66affSColin Finck ulFlags);
4522c2c66affSColin Finck }
4523c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
4524c2c66affSColin Finck {
4525c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
4526c2c66affSColin Finck }
4527c2c66affSColin Finck RpcEndExcept;
4528c2c66affSColin Finck
4529c2c66affSColin Finck return ret;
4530c2c66affSColin Finck }
4531c2c66affSColin Finck
4532c2c66affSColin Finck
4533c2c66affSColin Finck /***********************************************************************
4534c2c66affSColin Finck * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@)
4535c2c66affSColin Finck */
453665d3bf74SEric Kohl CONFIGRET
453765d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_List_SizeA(_Out_ PULONG pulLen,_In_ LPGUID InterfaceClassGuid,_In_opt_ DEVINSTID_A pDeviceID,_In_ ULONG ulFlags)453865d3bf74SEric Kohl CM_Get_Device_Interface_List_SizeA(
453965d3bf74SEric Kohl _Out_ PULONG pulLen,
454065d3bf74SEric Kohl _In_ LPGUID InterfaceClassGuid,
454165d3bf74SEric Kohl _In_opt_ DEVINSTID_A pDeviceID,
454265d3bf74SEric Kohl _In_ ULONG ulFlags)
4543c2c66affSColin Finck {
454465d3bf74SEric Kohl TRACE("CM_Get_Device_Interface_List_SizeA(%p %p %s 0x%08lx)\n",
454565d3bf74SEric Kohl pulLen, InterfaceClassGuid, debugstr_a(pDeviceID), ulFlags);
4546c2c66affSColin Finck
4547c2c66affSColin Finck return CM_Get_Device_Interface_List_Size_ExA(pulLen, InterfaceClassGuid,
454865d3bf74SEric Kohl pDeviceID, ulFlags, NULL);
4549c2c66affSColin Finck }
4550c2c66affSColin Finck
4551c2c66affSColin Finck
4552c2c66affSColin Finck /***********************************************************************
4553c2c66affSColin Finck * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@)
4554c2c66affSColin Finck */
455565d3bf74SEric Kohl CONFIGRET
455665d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_List_SizeW(_Out_ PULONG pulLen,_In_ LPGUID InterfaceClassGuid,_In_opt_ DEVINSTID_W pDeviceID,_In_ ULONG ulFlags)455765d3bf74SEric Kohl CM_Get_Device_Interface_List_SizeW(
455865d3bf74SEric Kohl _Out_ PULONG pulLen,
455965d3bf74SEric Kohl _In_ LPGUID InterfaceClassGuid,
456065d3bf74SEric Kohl _In_opt_ DEVINSTID_W pDeviceID,
456165d3bf74SEric Kohl _In_ ULONG ulFlags)
4562c2c66affSColin Finck {
456365d3bf74SEric Kohl TRACE("CM_Get_Device_Interface_List_SizeW(%p %p %s 0x%08lx)\n",
456465d3bf74SEric Kohl pulLen, InterfaceClassGuid, debugstr_w(pDeviceID), ulFlags);
4565c2c66affSColin Finck
4566c2c66affSColin Finck return CM_Get_Device_Interface_List_Size_ExW(pulLen, InterfaceClassGuid,
456765d3bf74SEric Kohl pDeviceID, ulFlags, NULL);
4568c2c66affSColin Finck }
4569c2c66affSColin Finck
4570c2c66affSColin Finck
4571c2c66affSColin Finck /***********************************************************************
4572c2c66affSColin Finck * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@)
4573c2c66affSColin Finck */
457465d3bf74SEric Kohl CONFIGRET
457565d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_List_Size_ExA(_Out_ PULONG pulLen,_In_ LPGUID InterfaceClassGuid,_In_opt_ DEVINSTID_A pDeviceID,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)457665d3bf74SEric Kohl CM_Get_Device_Interface_List_Size_ExA(
457765d3bf74SEric Kohl _Out_ PULONG pulLen,
457865d3bf74SEric Kohl _In_ LPGUID InterfaceClassGuid,
457965d3bf74SEric Kohl _In_opt_ DEVINSTID_A pDeviceID,
458065d3bf74SEric Kohl _In_ ULONG ulFlags,
458165d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4582c2c66affSColin Finck {
4583c2c66affSColin Finck DEVINSTID_W pDeviceIdW = NULL;
4584c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
4585c2c66affSColin Finck
458665d3bf74SEric Kohl TRACE("CM_Get_Device_Interface_List_Size_ExA(%p %p %s 0x%08lx %p)\n",
458765d3bf74SEric Kohl pulLen, InterfaceClassGuid, debugstr_a(pDeviceID), ulFlags, hMachine);
4588c2c66affSColin Finck
4589c2c66affSColin Finck if (pulLen == NULL)
4590c2c66affSColin Finck return CR_INVALID_POINTER;
4591c2c66affSColin Finck
459265d3bf74SEric Kohl if (pDeviceID != NULL)
4593c2c66affSColin Finck {
459465d3bf74SEric Kohl if (!pSetupCaptureAndConvertAnsiArg(pDeviceID, &pDeviceIdW))
4595c2c66affSColin Finck return CR_INVALID_DEVICE_ID;
4596c2c66affSColin Finck }
4597c2c66affSColin Finck
4598c2c66affSColin Finck *pulLen = 0;
4599c2c66affSColin Finck
4600c2c66affSColin Finck ret = CM_Get_Device_Interface_List_Size_ExW(pulLen, InterfaceClassGuid,
4601c2c66affSColin Finck pDeviceIdW, ulFlags, hMachine);
4602c2c66affSColin Finck
4603c2c66affSColin Finck if (pDeviceIdW != NULL)
4604c2c66affSColin Finck MyFree(pDeviceIdW);
4605c2c66affSColin Finck
4606c2c66affSColin Finck return ret;
4607c2c66affSColin Finck }
4608c2c66affSColin Finck
4609c2c66affSColin Finck
4610c2c66affSColin Finck /***********************************************************************
4611c2c66affSColin Finck * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@)
4612c2c66affSColin Finck */
461365d3bf74SEric Kohl CONFIGRET
461465d3bf74SEric Kohl WINAPI
CM_Get_Device_Interface_List_Size_ExW(_Out_ PULONG pulLen,_In_ LPGUID InterfaceClassGuid,_In_opt_ DEVINSTID_W pDeviceID,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)461565d3bf74SEric Kohl CM_Get_Device_Interface_List_Size_ExW(
461665d3bf74SEric Kohl _Out_ PULONG pulLen,
461765d3bf74SEric Kohl _In_ LPGUID InterfaceClassGuid,
461865d3bf74SEric Kohl _In_opt_ DEVINSTID_W pDeviceID,
461965d3bf74SEric Kohl _In_ ULONG ulFlags,
462065d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4621c2c66affSColin Finck {
4622c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
4623c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
4624c2c66affSColin Finck
462565d3bf74SEric Kohl TRACE("CM_Get_Device_Interface_List_Size_ExW(%p %p %s 0x%08lx %p)\n",
462665d3bf74SEric Kohl pulLen, InterfaceClassGuid, debugstr_w(pDeviceID), ulFlags, hMachine);
4627c2c66affSColin Finck
4628c2c66affSColin Finck if (pulLen == NULL)
4629c2c66affSColin Finck return CR_INVALID_POINTER;
4630c2c66affSColin Finck
4631c2c66affSColin Finck if (ulFlags & ~CM_GET_DEVICE_INTERFACE_LIST_BITS)
4632c2c66affSColin Finck return CR_INVALID_FLAG;
4633c2c66affSColin Finck
4634c2c66affSColin Finck if (hMachine != NULL)
4635c2c66affSColin Finck {
4636c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
4637c2c66affSColin Finck if (BindingHandle == NULL)
4638c2c66affSColin Finck return CR_FAILURE;
4639c2c66affSColin Finck }
4640c2c66affSColin Finck else
4641c2c66affSColin Finck {
4642c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
4643c2c66affSColin Finck return CR_FAILURE;
4644c2c66affSColin Finck }
4645c2c66affSColin Finck
4646c2c66affSColin Finck *pulLen = 0;
4647c2c66affSColin Finck
4648c2c66affSColin Finck RpcTryExcept
4649c2c66affSColin Finck {
4650c2c66affSColin Finck ret = PNP_GetInterfaceDeviceListSize(BindingHandle,
4651c2c66affSColin Finck pulLen,
4652c2c66affSColin Finck InterfaceClassGuid,
465365d3bf74SEric Kohl pDeviceID,
4654c2c66affSColin Finck ulFlags);
4655c2c66affSColin Finck }
4656c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
4657c2c66affSColin Finck {
4658c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
4659c2c66affSColin Finck }
4660c2c66affSColin Finck RpcEndExcept;
4661c2c66affSColin Finck
4662c2c66affSColin Finck return ret;
4663c2c66affSColin Finck }
4664c2c66affSColin Finck
4665c2c66affSColin Finck
4666c2c66affSColin Finck /***********************************************************************
4667c2c66affSColin Finck * CM_Get_First_Log_Conf [SETUPAPI.@]
4668c2c66affSColin Finck */
466965d3bf74SEric Kohl CONFIGRET
467065d3bf74SEric Kohl WINAPI
CM_Get_First_Log_Conf(_Out_opt_ PLOG_CONF plcLogConf,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)467165d3bf74SEric Kohl CM_Get_First_Log_Conf(
467265d3bf74SEric Kohl _Out_opt_ PLOG_CONF plcLogConf,
467365d3bf74SEric Kohl _In_ DEVINST dnDevInst,
467465d3bf74SEric Kohl _In_ ULONG ulFlags)
4675c2c66affSColin Finck {
467665d3bf74SEric Kohl TRACE("CM_Get_First_Log_Conf(%p %lx %lx)\n",
467765d3bf74SEric Kohl plcLogConf, dnDevInst, ulFlags);
467865d3bf74SEric Kohl
4679c2c66affSColin Finck return CM_Get_First_Log_Conf_Ex(plcLogConf, dnDevInst, ulFlags, NULL);
4680c2c66affSColin Finck }
4681c2c66affSColin Finck
4682c2c66affSColin Finck
4683c2c66affSColin Finck /***********************************************************************
4684c2c66affSColin Finck * CM_Get_First_Log_Conf_Ex [SETUPAPI.@]
4685c2c66affSColin Finck */
468665d3bf74SEric Kohl CONFIGRET
468765d3bf74SEric Kohl WINAPI
CM_Get_First_Log_Conf_Ex(_Out_opt_ PLOG_CONF plcLogConf,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)468865d3bf74SEric Kohl CM_Get_First_Log_Conf_Ex(
468965d3bf74SEric Kohl _Out_opt_ PLOG_CONF plcLogConf,
469065d3bf74SEric Kohl _In_ DEVINST dnDevInst,
469165d3bf74SEric Kohl _In_ ULONG ulFlags,
469265d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4693c2c66affSColin Finck {
4694c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
4695c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
4696c2c66affSColin Finck LPWSTR lpDevInst = NULL;
4697c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
4698c2c66affSColin Finck ULONG ulTag;
4699c2c66affSColin Finck PLOG_CONF_INFO pLogConfInfo;
4700c2c66affSColin Finck
470160a21894SEric Kohl FIXME("CM_Get_First_Log_Conf_Ex(%p %lx %lx %p)\n",
470265d3bf74SEric Kohl plcLogConf, dnDevInst, ulFlags, hMachine);
4703c2c66affSColin Finck
4704c2c66affSColin Finck if (dnDevInst == 0)
4705c2c66affSColin Finck return CR_INVALID_DEVINST;
4706c2c66affSColin Finck
4707c2c66affSColin Finck if (ulFlags & ~LOG_CONF_BITS)
4708c2c66affSColin Finck return CR_INVALID_FLAG;
4709c2c66affSColin Finck
4710c2c66affSColin Finck if (plcLogConf)
4711c2c66affSColin Finck *plcLogConf = 0;
4712c2c66affSColin Finck
4713c2c66affSColin Finck if (hMachine != NULL)
4714c2c66affSColin Finck {
4715c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
4716c2c66affSColin Finck if (BindingHandle == NULL)
4717c2c66affSColin Finck return CR_FAILURE;
4718c2c66affSColin Finck
4719c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
4720c2c66affSColin Finck if (StringTable == 0)
4721c2c66affSColin Finck return CR_FAILURE;
4722c2c66affSColin Finck }
4723c2c66affSColin Finck else
4724c2c66affSColin Finck {
4725c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
4726c2c66affSColin Finck return CR_FAILURE;
4727c2c66affSColin Finck }
4728c2c66affSColin Finck
4729c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
4730c2c66affSColin Finck if (lpDevInst == NULL)
4731c2c66affSColin Finck return CR_INVALID_DEVNODE;
4732c2c66affSColin Finck
4733c2c66affSColin Finck RpcTryExcept
4734c2c66affSColin Finck {
4735c2c66affSColin Finck ret = PNP_GetFirstLogConf(BindingHandle,
4736c2c66affSColin Finck lpDevInst,
4737c2c66affSColin Finck ulFlags,
4738c2c66affSColin Finck &ulTag,
4739c2c66affSColin Finck ulFlags);
4740c2c66affSColin Finck }
4741c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
4742c2c66affSColin Finck {
4743c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
4744c2c66affSColin Finck }
4745c2c66affSColin Finck RpcEndExcept;
4746c2c66affSColin Finck
4747c2c66affSColin Finck if (ret != CR_SUCCESS)
4748c2c66affSColin Finck return ret;
4749c2c66affSColin Finck
4750c2c66affSColin Finck if (plcLogConf)
4751c2c66affSColin Finck {
4752c2c66affSColin Finck pLogConfInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO));
4753c2c66affSColin Finck if (pLogConfInfo == NULL)
4754c2c66affSColin Finck return CR_OUT_OF_MEMORY;
4755c2c66affSColin Finck
4756c2c66affSColin Finck pLogConfInfo->ulMagic = LOG_CONF_MAGIC;
4757c2c66affSColin Finck pLogConfInfo->dnDevInst = dnDevInst;
47586efb3cbeSEric Kohl pLogConfInfo->ulType = ulFlags;
4759c2c66affSColin Finck pLogConfInfo->ulTag = ulTag;
4760c2c66affSColin Finck
4761c2c66affSColin Finck *plcLogConf = (LOG_CONF)pLogConfInfo;
4762c2c66affSColin Finck }
4763c2c66affSColin Finck
4764c2c66affSColin Finck return CR_SUCCESS;
4765c2c66affSColin Finck }
4766c2c66affSColin Finck
4767c2c66affSColin Finck
4768c2c66affSColin Finck /***********************************************************************
4769c2c66affSColin Finck * CM_Get_Global_State [SETUPAPI.@]
4770c2c66affSColin Finck */
477165d3bf74SEric Kohl CONFIGRET
477265d3bf74SEric Kohl WINAPI
CM_Get_Global_State(_Out_ PULONG pulState,_In_ ULONG ulFlags)477365d3bf74SEric Kohl CM_Get_Global_State(
477465d3bf74SEric Kohl _Out_ PULONG pulState,
477565d3bf74SEric Kohl _In_ ULONG ulFlags)
4776c2c66affSColin Finck {
477765d3bf74SEric Kohl TRACE("CM_Get_Global_State(%p %lx)\n",
477865d3bf74SEric Kohl pulState, ulFlags);
477965d3bf74SEric Kohl
4780c2c66affSColin Finck return CM_Get_Global_State_Ex(pulState, ulFlags, NULL);
4781c2c66affSColin Finck }
4782c2c66affSColin Finck
4783c2c66affSColin Finck
4784c2c66affSColin Finck /***********************************************************************
4785c2c66affSColin Finck * CM_Get_Global_State_Ex [SETUPAPI.@]
4786c2c66affSColin Finck */
478765d3bf74SEric Kohl CONFIGRET
478865d3bf74SEric Kohl WINAPI
CM_Get_Global_State_Ex(_Out_ PULONG pulState,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)478965d3bf74SEric Kohl CM_Get_Global_State_Ex(
479065d3bf74SEric Kohl _Out_ PULONG pulState,
479165d3bf74SEric Kohl _In_ ULONG ulFlags,
479265d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4793c2c66affSColin Finck {
4794c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
4795c2c66affSColin Finck CONFIGRET ret;
4796c2c66affSColin Finck
479760a21894SEric Kohl TRACE("CM_Get_Global_State_Ex(%p %lx %p)\n",
479865d3bf74SEric Kohl pulState, ulFlags, hMachine);
4799c2c66affSColin Finck
4800c2c66affSColin Finck if (pulState == NULL)
4801c2c66affSColin Finck return CR_INVALID_POINTER;
4802c2c66affSColin Finck
4803c2c66affSColin Finck if (ulFlags != 0)
4804c2c66affSColin Finck return CR_INVALID_FLAG;
4805c2c66affSColin Finck
4806c2c66affSColin Finck if (hMachine != NULL)
4807c2c66affSColin Finck {
4808c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
4809c2c66affSColin Finck if (BindingHandle == NULL)
4810c2c66affSColin Finck return CR_FAILURE;
4811c2c66affSColin Finck }
4812c2c66affSColin Finck else
4813c2c66affSColin Finck {
4814c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
4815c2c66affSColin Finck return CR_FAILURE;
4816c2c66affSColin Finck }
4817c2c66affSColin Finck
4818c2c66affSColin Finck RpcTryExcept
4819c2c66affSColin Finck {
4820c2c66affSColin Finck ret = PNP_GetGlobalState(BindingHandle, pulState, ulFlags);
4821c2c66affSColin Finck }
4822c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
4823c2c66affSColin Finck {
4824c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
4825c2c66affSColin Finck }
4826c2c66affSColin Finck RpcEndExcept;
4827c2c66affSColin Finck
4828c2c66affSColin Finck return ret;
4829c2c66affSColin Finck }
4830c2c66affSColin Finck
4831c2c66affSColin Finck
4832c2c66affSColin Finck /***********************************************************************
4833c2c66affSColin Finck * CM_Get_HW_Prof_FlagsA [SETUPAPI.@]
4834c2c66affSColin Finck */
483565d3bf74SEric Kohl CONFIGRET
483665d3bf74SEric Kohl WINAPI
CM_Get_HW_Prof_FlagsA(_In_ DEVINSTID_A szDevInstName,_In_ ULONG ulHardwareProfile,_Out_ PULONG pulValue,_In_ ULONG ulFlags)483765d3bf74SEric Kohl CM_Get_HW_Prof_FlagsA(
483865d3bf74SEric Kohl _In_ DEVINSTID_A szDevInstName,
483965d3bf74SEric Kohl _In_ ULONG ulHardwareProfile,
484065d3bf74SEric Kohl _Out_ PULONG pulValue,
484165d3bf74SEric Kohl _In_ ULONG ulFlags)
4842c2c66affSColin Finck {
484365d3bf74SEric Kohl TRACE("CM_Get_HW_Prof_FlagsA(%s %lu %p %lx)\n",
484465d3bf74SEric Kohl debugstr_a(szDevInstName), ulHardwareProfile, pulValue, ulFlags);
4845c2c66affSColin Finck
4846c2c66affSColin Finck return CM_Get_HW_Prof_Flags_ExA(szDevInstName, ulHardwareProfile,
4847c2c66affSColin Finck pulValue, ulFlags, NULL);
4848c2c66affSColin Finck }
4849c2c66affSColin Finck
4850c2c66affSColin Finck
4851c2c66affSColin Finck /***********************************************************************
4852c2c66affSColin Finck * CM_Get_HW_Prof_FlagsW [SETUPAPI.@]
4853c2c66affSColin Finck */
485465d3bf74SEric Kohl CONFIGRET
485565d3bf74SEric Kohl WINAPI
CM_Get_HW_Prof_FlagsW(_In_ DEVINSTID_W szDevInstName,_In_ ULONG ulHardwareProfile,_Out_ PULONG pulValue,_In_ ULONG ulFlags)485665d3bf74SEric Kohl CM_Get_HW_Prof_FlagsW(
485765d3bf74SEric Kohl _In_ DEVINSTID_W szDevInstName,
485865d3bf74SEric Kohl _In_ ULONG ulHardwareProfile,
485965d3bf74SEric Kohl _Out_ PULONG pulValue,
486065d3bf74SEric Kohl _In_ ULONG ulFlags)
4861c2c66affSColin Finck {
486265d3bf74SEric Kohl TRACE("CM_Get_HW_Prof_FlagsW(%s %lu %p %lx)\n",
486365d3bf74SEric Kohl debugstr_w(szDevInstName), ulHardwareProfile, pulValue, ulFlags);
4864c2c66affSColin Finck
4865c2c66affSColin Finck return CM_Get_HW_Prof_Flags_ExW(szDevInstName, ulHardwareProfile,
4866c2c66affSColin Finck pulValue, ulFlags, NULL);
4867c2c66affSColin Finck }
4868c2c66affSColin Finck
4869c2c66affSColin Finck
4870c2c66affSColin Finck /***********************************************************************
4871c2c66affSColin Finck * CM_Get_HW_Prof_Flags_ExA [SETUPAPI.@]
4872c2c66affSColin Finck */
487365d3bf74SEric Kohl CONFIGRET
487465d3bf74SEric Kohl WINAPI
CM_Get_HW_Prof_Flags_ExA(_In_ DEVINSTID_A szDevInstName,_In_ ULONG ulHardwareProfile,_Out_ PULONG pulValue,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)487565d3bf74SEric Kohl CM_Get_HW_Prof_Flags_ExA(
487665d3bf74SEric Kohl _In_ DEVINSTID_A szDevInstName,
487765d3bf74SEric Kohl _In_ ULONG ulHardwareProfile,
487865d3bf74SEric Kohl _Out_ PULONG pulValue,
487965d3bf74SEric Kohl _In_ ULONG ulFlags,
488065d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4881c2c66affSColin Finck {
4882c2c66affSColin Finck DEVINSTID_W pszDevIdW = NULL;
4883c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
4884c2c66affSColin Finck
488560a21894SEric Kohl TRACE("CM_Get_HW_Prof_Flags_ExA(%s %lu %p %lx %p)\n",
488665d3bf74SEric Kohl debugstr_a(szDevInstName), ulHardwareProfile, pulValue, ulFlags, hMachine);
4887c2c66affSColin Finck
4888c2c66affSColin Finck if (szDevInstName != NULL)
4889c2c66affSColin Finck {
4890c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(szDevInstName, &pszDevIdW))
4891c2c66affSColin Finck return CR_INVALID_DEVICE_ID;
4892c2c66affSColin Finck }
4893c2c66affSColin Finck
4894c2c66affSColin Finck ret = CM_Get_HW_Prof_Flags_ExW(pszDevIdW, ulHardwareProfile,
4895c2c66affSColin Finck pulValue, ulFlags, hMachine);
4896c2c66affSColin Finck
4897c2c66affSColin Finck if (pszDevIdW != NULL)
4898c2c66affSColin Finck MyFree(pszDevIdW);
4899c2c66affSColin Finck
4900c2c66affSColin Finck return ret;
4901c2c66affSColin Finck }
4902c2c66affSColin Finck
4903c2c66affSColin Finck
4904c2c66affSColin Finck /***********************************************************************
4905c2c66affSColin Finck * CM_Get_HW_Prof_Flags_ExW [SETUPAPI.@]
4906c2c66affSColin Finck */
490765d3bf74SEric Kohl CONFIGRET
490865d3bf74SEric Kohl WINAPI
CM_Get_HW_Prof_Flags_ExW(_In_ DEVINSTID_W szDevInstName,_In_ ULONG ulHardwareProfile,_Out_ PULONG pulValue,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)490965d3bf74SEric Kohl CM_Get_HW_Prof_Flags_ExW(
491065d3bf74SEric Kohl _In_ DEVINSTID_W szDevInstName,
491165d3bf74SEric Kohl _In_ ULONG ulHardwareProfile,
491265d3bf74SEric Kohl _Out_ PULONG pulValue,
491365d3bf74SEric Kohl _In_ ULONG ulFlags,
491465d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
4915c2c66affSColin Finck {
4916c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
4917c2c66affSColin Finck CONFIGRET ret;
4918c2c66affSColin Finck
491960a21894SEric Kohl FIXME("CM_Get_HW_Prof_Flags_ExW(%s %lu %p %lx %p)\n",
492065d3bf74SEric Kohl debugstr_w(szDevInstName), ulHardwareProfile, pulValue, ulFlags, hMachine);
4921c2c66affSColin Finck
4922c2c66affSColin Finck if ((szDevInstName == NULL) || (pulValue == NULL))
4923c2c66affSColin Finck return CR_INVALID_POINTER;
4924c2c66affSColin Finck
4925c2c66affSColin Finck if (ulFlags != 0)
4926c2c66affSColin Finck return CR_INVALID_FLAG;
4927c2c66affSColin Finck
4928c2c66affSColin Finck /* FIXME: Check whether szDevInstName is valid */
4929c2c66affSColin Finck
4930c2c66affSColin Finck if (hMachine != NULL)
4931c2c66affSColin Finck {
4932c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
4933c2c66affSColin Finck if (BindingHandle == NULL)
4934c2c66affSColin Finck return CR_FAILURE;
4935c2c66affSColin Finck }
4936c2c66affSColin Finck else
4937c2c66affSColin Finck {
4938c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
4939c2c66affSColin Finck return CR_FAILURE;
4940c2c66affSColin Finck }
4941c2c66affSColin Finck
4942c2c66affSColin Finck RpcTryExcept
4943c2c66affSColin Finck {
4944c2c66affSColin Finck ret = PNP_HwProfFlags(BindingHandle, PNP_GET_HWPROFFLAGS, szDevInstName,
4945c2c66affSColin Finck ulHardwareProfile, pulValue, NULL, NULL, 0, 0);
4946c2c66affSColin Finck }
4947c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
4948c2c66affSColin Finck {
4949c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
4950c2c66affSColin Finck }
4951c2c66affSColin Finck RpcEndExcept;
4952c2c66affSColin Finck
4953c2c66affSColin Finck return ret;
4954c2c66affSColin Finck }
4955c2c66affSColin Finck
4956c2c66affSColin Finck
4957c2c66affSColin Finck /***********************************************************************
4958c2c66affSColin Finck * CM_Get_Hardware_Profile_InfoA [SETUPAPI.@]
4959c2c66affSColin Finck */
496060a21894SEric Kohl CONFIGRET
496160a21894SEric Kohl WINAPI
CM_Get_Hardware_Profile_InfoA(_In_ ULONG ulIndex,_Out_ PHWPROFILEINFO_A pHWProfileInfo,_In_ ULONG ulFlags)496260a21894SEric Kohl CM_Get_Hardware_Profile_InfoA(
496360a21894SEric Kohl _In_ ULONG ulIndex,
496460a21894SEric Kohl _Out_ PHWPROFILEINFO_A pHWProfileInfo,
496560a21894SEric Kohl _In_ ULONG ulFlags)
4966c2c66affSColin Finck {
496760a21894SEric Kohl TRACE("CM_Get_Hardware_Profile_InfoA(%lu %p %lx)\n",
496860a21894SEric Kohl ulIndex, pHWProfileInfo, ulFlags);
4969c2c66affSColin Finck
4970c2c66affSColin Finck return CM_Get_Hardware_Profile_Info_ExA(ulIndex, pHWProfileInfo,
4971c2c66affSColin Finck ulFlags, NULL);
4972c2c66affSColin Finck }
4973c2c66affSColin Finck
4974c2c66affSColin Finck
4975c2c66affSColin Finck /***********************************************************************
4976c2c66affSColin Finck * CM_Get_Hardware_Profile_InfoW [SETUPAPI.@]
4977c2c66affSColin Finck */
497860a21894SEric Kohl CONFIGRET
497960a21894SEric Kohl WINAPI
CM_Get_Hardware_Profile_InfoW(_In_ ULONG ulIndex,_Out_ PHWPROFILEINFO_W pHWProfileInfo,_In_ ULONG ulFlags)498060a21894SEric Kohl CM_Get_Hardware_Profile_InfoW(
498160a21894SEric Kohl _In_ ULONG ulIndex,
498260a21894SEric Kohl _Out_ PHWPROFILEINFO_W pHWProfileInfo,
498360a21894SEric Kohl _In_ ULONG ulFlags)
4984c2c66affSColin Finck {
498560a21894SEric Kohl TRACE("CM_Get_Hardware_Profile_InfoW(%lu %p %lx)\n",
498660a21894SEric Kohl ulIndex, pHWProfileInfo, ulFlags);
4987c2c66affSColin Finck
4988c2c66affSColin Finck return CM_Get_Hardware_Profile_Info_ExW(ulIndex, pHWProfileInfo,
4989c2c66affSColin Finck ulFlags, NULL);
4990c2c66affSColin Finck }
4991c2c66affSColin Finck
4992c2c66affSColin Finck
4993c2c66affSColin Finck /***********************************************************************
4994c2c66affSColin Finck * CM_Get_Hardware_Profile_Info_ExA [SETUPAPI.@]
4995c2c66affSColin Finck */
499660a21894SEric Kohl CONFIGRET
499760a21894SEric Kohl WINAPI
CM_Get_Hardware_Profile_Info_ExA(_In_ ULONG ulIndex,_Out_ PHWPROFILEINFO_A pHWProfileInfo,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)499860a21894SEric Kohl CM_Get_Hardware_Profile_Info_ExA(
499960a21894SEric Kohl _In_ ULONG ulIndex,
500060a21894SEric Kohl _Out_ PHWPROFILEINFO_A pHWProfileInfo,
500160a21894SEric Kohl _In_ ULONG ulFlags,
500260a21894SEric Kohl _In_opt_ HMACHINE hMachine)
5003c2c66affSColin Finck {
5004c2c66affSColin Finck HWPROFILEINFO_W LocalProfileInfo;
5005c2c66affSColin Finck CONFIGRET ret;
5006c2c66affSColin Finck
500760a21894SEric Kohl TRACE("CM_Get_Hardware_Profile_Info_ExA(%lu %p %lx %p)\n",
500860a21894SEric Kohl ulIndex, pHWProfileInfo, ulFlags, hMachine);
5009c2c66affSColin Finck
5010c2c66affSColin Finck if (pHWProfileInfo == NULL)
5011c2c66affSColin Finck return CR_INVALID_POINTER;
5012c2c66affSColin Finck
5013c2c66affSColin Finck ret = CM_Get_Hardware_Profile_Info_ExW(ulIndex, &LocalProfileInfo,
5014c2c66affSColin Finck ulFlags, hMachine);
5015c2c66affSColin Finck if (ret == CR_SUCCESS)
5016c2c66affSColin Finck {
5017c2c66affSColin Finck pHWProfileInfo->HWPI_ulHWProfile = LocalProfileInfo.HWPI_ulHWProfile;
5018c2c66affSColin Finck pHWProfileInfo->HWPI_dwFlags = LocalProfileInfo.HWPI_dwFlags;
5019c2c66affSColin Finck
5020c2c66affSColin Finck if (WideCharToMultiByte(CP_ACP,
5021c2c66affSColin Finck 0,
5022c2c66affSColin Finck LocalProfileInfo.HWPI_szFriendlyName,
5023c2c66affSColin Finck lstrlenW(LocalProfileInfo.HWPI_szFriendlyName) + 1,
5024c2c66affSColin Finck pHWProfileInfo->HWPI_szFriendlyName,
5025c2c66affSColin Finck MAX_PROFILE_LEN,
5026c2c66affSColin Finck NULL,
5027c2c66affSColin Finck NULL) == 0)
5028c2c66affSColin Finck ret = CR_FAILURE;
5029c2c66affSColin Finck }
5030c2c66affSColin Finck
5031c2c66affSColin Finck return ret;
5032c2c66affSColin Finck }
5033c2c66affSColin Finck
5034c2c66affSColin Finck
5035c2c66affSColin Finck /***********************************************************************
5036c2c66affSColin Finck * CM_Get_Hardware_Profile_Info_ExW [SETUPAPI.@]
5037c2c66affSColin Finck */
503860a21894SEric Kohl CONFIGRET
503960a21894SEric Kohl WINAPI
CM_Get_Hardware_Profile_Info_ExW(_In_ ULONG ulIndex,_Out_ PHWPROFILEINFO_W pHWProfileInfo,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)504060a21894SEric Kohl CM_Get_Hardware_Profile_Info_ExW(
504160a21894SEric Kohl _In_ ULONG ulIndex,
504260a21894SEric Kohl _Out_ PHWPROFILEINFO_W pHWProfileInfo,
504360a21894SEric Kohl _In_ ULONG ulFlags,
504460a21894SEric Kohl _In_opt_ HMACHINE hMachine)
5045c2c66affSColin Finck {
5046c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
5047c2c66affSColin Finck CONFIGRET ret;
5048c2c66affSColin Finck
504960a21894SEric Kohl TRACE("CM_Get_Hardware_Profile_Info_ExW(%lu %p %lx %p)\n",
505060a21894SEric Kohl ulIndex, pHWProfileInfo, ulFlags, hMachine);
5051c2c66affSColin Finck
5052c2c66affSColin Finck if (pHWProfileInfo == NULL)
5053c2c66affSColin Finck return CR_INVALID_POINTER;
5054c2c66affSColin Finck
5055c2c66affSColin Finck if (ulFlags != 0)
5056c2c66affSColin Finck return CR_INVALID_FLAG;
5057c2c66affSColin Finck
5058c2c66affSColin Finck if (hMachine != NULL)
5059c2c66affSColin Finck {
5060c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
5061c2c66affSColin Finck if (BindingHandle == NULL)
5062c2c66affSColin Finck return CR_FAILURE;
5063c2c66affSColin Finck }
5064c2c66affSColin Finck else
5065c2c66affSColin Finck {
5066c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
5067c2c66affSColin Finck return CR_FAILURE;
5068c2c66affSColin Finck }
5069c2c66affSColin Finck
5070c2c66affSColin Finck RpcTryExcept
5071c2c66affSColin Finck {
5072c2c66affSColin Finck ret = PNP_GetHwProfInfo(BindingHandle, ulIndex, pHWProfileInfo,
5073c2c66affSColin Finck sizeof(HWPROFILEINFO_W), 0);
5074c2c66affSColin Finck }
5075c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
5076c2c66affSColin Finck {
5077c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
5078c2c66affSColin Finck }
5079c2c66affSColin Finck RpcEndExcept;
5080c2c66affSColin Finck
5081c2c66affSColin Finck return ret;
5082c2c66affSColin Finck }
5083c2c66affSColin Finck
5084c2c66affSColin Finck
5085c2c66affSColin Finck /***********************************************************************
5086c2c66affSColin Finck * CM_Get_Log_Conf_Priority [SETUPAPI.@]
5087c2c66affSColin Finck */
508860a21894SEric Kohl CONFIGRET
508960a21894SEric Kohl WINAPI
CM_Get_Log_Conf_Priority(_In_ LOG_CONF lcLogConf,_Out_ PPRIORITY pPriority,_In_ ULONG ulFlags)509060a21894SEric Kohl CM_Get_Log_Conf_Priority(
509160a21894SEric Kohl _In_ LOG_CONF lcLogConf,
509260a21894SEric Kohl _Out_ PPRIORITY pPriority,
509360a21894SEric Kohl _In_ ULONG ulFlags)
5094c2c66affSColin Finck {
509560a21894SEric Kohl TRACE("CM_Get_Log_Conf_Priority(%p %p %lx)\n",
509660a21894SEric Kohl lcLogConf, pPriority, ulFlags);
509760a21894SEric Kohl
5098c2c66affSColin Finck return CM_Get_Log_Conf_Priority_Ex(lcLogConf, pPriority, ulFlags, NULL);
5099c2c66affSColin Finck }
5100c2c66affSColin Finck
5101c2c66affSColin Finck
5102c2c66affSColin Finck /***********************************************************************
5103c2c66affSColin Finck * CM_Get_Log_Conf_Priority_Ex [SETUPAPI.@]
5104c2c66affSColin Finck */
510560a21894SEric Kohl CONFIGRET
510660a21894SEric Kohl WINAPI
CM_Get_Log_Conf_Priority_Ex(_In_ LOG_CONF lcLogConf,_Out_ PPRIORITY pPriority,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)510760a21894SEric Kohl CM_Get_Log_Conf_Priority_Ex(
510860a21894SEric Kohl _In_ LOG_CONF lcLogConf,
510960a21894SEric Kohl _Out_ PPRIORITY pPriority,
511060a21894SEric Kohl _In_ ULONG ulFlags,
511160a21894SEric Kohl _In_opt_ HMACHINE hMachine)
5112c2c66affSColin Finck {
5113c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
5114c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
5115c2c66affSColin Finck PLOG_CONF_INFO pLogConfInfo;
5116c2c66affSColin Finck LPWSTR lpDevInst;
5117c2c66affSColin Finck CONFIGRET ret;
5118c2c66affSColin Finck
511960a21894SEric Kohl FIXME("CM_Get_Log_Conf_Priority_Ex(%p %p %lx %p)\n",
512060a21894SEric Kohl lcLogConf, pPriority, ulFlags, hMachine);
5121c2c66affSColin Finck
5122c2c66affSColin Finck pLogConfInfo = (PLOG_CONF_INFO)lcLogConf;
512319fc20f2SEric Kohl if (!IsValidLogConf(pLogConfInfo))
5124c2c66affSColin Finck return CR_INVALID_LOG_CONF;
5125c2c66affSColin Finck
5126c2c66affSColin Finck if (pPriority == NULL)
5127c2c66affSColin Finck return CR_INVALID_POINTER;
5128c2c66affSColin Finck
5129c2c66affSColin Finck if (ulFlags != 0)
5130c2c66affSColin Finck return CR_INVALID_FLAG;
5131c2c66affSColin Finck
5132c2c66affSColin Finck if (hMachine != NULL)
5133c2c66affSColin Finck {
5134c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
5135c2c66affSColin Finck if (BindingHandle == NULL)
5136c2c66affSColin Finck return CR_FAILURE;
5137c2c66affSColin Finck
5138c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
5139c2c66affSColin Finck if (StringTable == 0)
5140c2c66affSColin Finck return CR_FAILURE;
5141c2c66affSColin Finck }
5142c2c66affSColin Finck else
5143c2c66affSColin Finck {
5144c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
5145c2c66affSColin Finck return CR_FAILURE;
5146c2c66affSColin Finck }
5147c2c66affSColin Finck
5148c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, pLogConfInfo->dnDevInst);
5149c2c66affSColin Finck if (lpDevInst == NULL)
5150c2c66affSColin Finck return CR_INVALID_DEVNODE;
5151c2c66affSColin Finck
5152c2c66affSColin Finck RpcTryExcept
5153c2c66affSColin Finck {
5154c2c66affSColin Finck ret = PNP_GetLogConfPriority(BindingHandle,
5155c2c66affSColin Finck lpDevInst,
51566efb3cbeSEric Kohl pLogConfInfo->ulType,
5157c2c66affSColin Finck pLogConfInfo->ulTag,
5158c2c66affSColin Finck pPriority,
5159c2c66affSColin Finck 0);
5160c2c66affSColin Finck }
5161c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
5162c2c66affSColin Finck {
5163c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
5164c2c66affSColin Finck }
5165c2c66affSColin Finck RpcEndExcept;
5166c2c66affSColin Finck
5167c2c66affSColin Finck return ret;
5168c2c66affSColin Finck }
5169c2c66affSColin Finck
5170c2c66affSColin Finck
5171c2c66affSColin Finck /***********************************************************************
5172c2c66affSColin Finck * CM_Get_Next_Log_Conf [SETUPAPI.@]
5173c2c66affSColin Finck */
517460a21894SEric Kohl CONFIGRET
517560a21894SEric Kohl WINAPI
CM_Get_Next_Log_Conf(_Out_opt_ PLOG_CONF plcLogConf,_In_ LOG_CONF lcLogConf,_In_ ULONG ulFlags)517660a21894SEric Kohl CM_Get_Next_Log_Conf(
517760a21894SEric Kohl _Out_opt_ PLOG_CONF plcLogConf,
517860a21894SEric Kohl _In_ LOG_CONF lcLogConf,
517960a21894SEric Kohl _In_ ULONG ulFlags)
5180c2c66affSColin Finck {
518160a21894SEric Kohl TRACE("CM_Get_Next_Log_Conf(%p %p %lx)\n",
518260a21894SEric Kohl plcLogConf, lcLogConf, ulFlags);
518360a21894SEric Kohl
5184c2c66affSColin Finck return CM_Get_Next_Log_Conf_Ex(plcLogConf, lcLogConf, ulFlags, NULL);
5185c2c66affSColin Finck }
5186c2c66affSColin Finck
5187c2c66affSColin Finck
5188c2c66affSColin Finck /***********************************************************************
5189c2c66affSColin Finck * CM_Get_Next_Log_Conf_Ex [SETUPAPI.@]
5190c2c66affSColin Finck */
519160a21894SEric Kohl CONFIGRET
519260a21894SEric Kohl WINAPI
CM_Get_Next_Log_Conf_Ex(_Out_opt_ PLOG_CONF plcLogConf,_In_ LOG_CONF lcLogConf,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)519360a21894SEric Kohl CM_Get_Next_Log_Conf_Ex(
519460a21894SEric Kohl _Out_opt_ PLOG_CONF plcLogConf,
519560a21894SEric Kohl _In_ LOG_CONF lcLogConf,
519660a21894SEric Kohl _In_ ULONG ulFlags,
519760a21894SEric Kohl _In_opt_ HMACHINE hMachine)
5198c2c66affSColin Finck {
5199c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
5200c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
5201c2c66affSColin Finck PLOG_CONF_INFO pLogConfInfo;
5202c2c66affSColin Finck PLOG_CONF_INFO pNewLogConfInfo;
5203c2c66affSColin Finck ULONG ulNewTag;
5204c2c66affSColin Finck LPWSTR lpDevInst;
5205c2c66affSColin Finck CONFIGRET ret;
5206c2c66affSColin Finck
520760a21894SEric Kohl FIXME("CM_Get_Next_Log_Conf_Ex(%p %p %lx %p)\n",
520860a21894SEric Kohl plcLogConf, lcLogConf, ulFlags, hMachine);
5209c2c66affSColin Finck
5210c2c66affSColin Finck if (plcLogConf)
5211c2c66affSColin Finck *plcLogConf = 0;
5212c2c66affSColin Finck
5213c2c66affSColin Finck pLogConfInfo = (PLOG_CONF_INFO)lcLogConf;
521419fc20f2SEric Kohl if (!IsValidLogConf(pLogConfInfo))
5215c2c66affSColin Finck return CR_INVALID_LOG_CONF;
5216c2c66affSColin Finck
5217c2c66affSColin Finck if (ulFlags != 0)
5218c2c66affSColin Finck return CR_INVALID_FLAG;
5219c2c66affSColin Finck
5220c2c66affSColin Finck if (hMachine != NULL)
5221c2c66affSColin Finck {
5222c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
5223c2c66affSColin Finck if (BindingHandle == NULL)
5224c2c66affSColin Finck return CR_FAILURE;
5225c2c66affSColin Finck
5226c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
5227c2c66affSColin Finck if (StringTable == 0)
5228c2c66affSColin Finck return CR_FAILURE;
5229c2c66affSColin Finck }
5230c2c66affSColin Finck else
5231c2c66affSColin Finck {
5232c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
5233c2c66affSColin Finck return CR_FAILURE;
5234c2c66affSColin Finck }
5235c2c66affSColin Finck
5236c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, pLogConfInfo->dnDevInst);
5237c2c66affSColin Finck if (lpDevInst == NULL)
5238c2c66affSColin Finck return CR_INVALID_DEVNODE;
5239c2c66affSColin Finck
5240c2c66affSColin Finck RpcTryExcept
5241c2c66affSColin Finck {
5242c2c66affSColin Finck ret = PNP_GetNextLogConf(BindingHandle,
5243c2c66affSColin Finck lpDevInst,
52446efb3cbeSEric Kohl pLogConfInfo->ulType,
5245c2c66affSColin Finck pLogConfInfo->ulTag,
5246c2c66affSColin Finck &ulNewTag,
5247c2c66affSColin Finck 0);
5248c2c66affSColin Finck }
5249c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
5250c2c66affSColin Finck {
5251c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
5252c2c66affSColin Finck }
5253c2c66affSColin Finck RpcEndExcept;
5254c2c66affSColin Finck
5255c2c66affSColin Finck if (ret != CR_SUCCESS)
5256c2c66affSColin Finck return ret;
5257c2c66affSColin Finck
5258c2c66affSColin Finck if (plcLogConf)
5259c2c66affSColin Finck {
5260c2c66affSColin Finck pNewLogConfInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(LOG_CONF_INFO));
5261c2c66affSColin Finck if (pNewLogConfInfo == NULL)
5262c2c66affSColin Finck return CR_OUT_OF_MEMORY;
5263c2c66affSColin Finck
5264c2c66affSColin Finck pNewLogConfInfo->ulMagic = LOG_CONF_MAGIC;
5265c2c66affSColin Finck pNewLogConfInfo->dnDevInst = pLogConfInfo->dnDevInst;
52666efb3cbeSEric Kohl pNewLogConfInfo->ulType = pLogConfInfo->ulType;
5267c2c66affSColin Finck pNewLogConfInfo->ulTag = ulNewTag;
5268c2c66affSColin Finck
5269c2c66affSColin Finck *plcLogConf = (LOG_CONF)pNewLogConfInfo;
5270c2c66affSColin Finck }
5271c2c66affSColin Finck
5272c2c66affSColin Finck return CR_SUCCESS;
5273c2c66affSColin Finck }
5274c2c66affSColin Finck
5275c2c66affSColin Finck
5276c2c66affSColin Finck /***********************************************************************
5277894ad4f1SEric Kohl * CM_Get_Next_Res_Des [SETUPAPI.@]
5278c2c66affSColin Finck */
527960a21894SEric Kohl CONFIGRET
528060a21894SEric Kohl WINAPI
CM_Get_Next_Res_Des(_Out_ PRES_DES prdResDes,_In_ RES_DES rdResDes,_In_ RESOURCEID ForResource,_Out_opt_ PRESOURCEID pResourceID,_In_ ULONG ulFlags)528160a21894SEric Kohl CM_Get_Next_Res_Des(
528260a21894SEric Kohl _Out_ PRES_DES prdResDes,
528360a21894SEric Kohl _In_ RES_DES rdResDes,
528460a21894SEric Kohl _In_ RESOURCEID ForResource,
528560a21894SEric Kohl _Out_opt_ PRESOURCEID pResourceID,
528660a21894SEric Kohl _In_ ULONG ulFlags)
5287c2c66affSColin Finck {
528860a21894SEric Kohl TRACE("CM_Get_Next_Res_Des(%p %p %lu %p %lx)\n",
528960a21894SEric Kohl prdResDes, rdResDes, ForResource, pResourceID, ulFlags);
529060a21894SEric Kohl
5291c2c66affSColin Finck return CM_Get_Next_Res_Des_Ex(prdResDes, rdResDes, ForResource,
5292c2c66affSColin Finck pResourceID, ulFlags, NULL);
5293c2c66affSColin Finck }
5294c2c66affSColin Finck
5295c2c66affSColin Finck
5296c2c66affSColin Finck /***********************************************************************
5297c2c66affSColin Finck * CM_Get_Next_Re_Des_Ex [SETUPAPI.@]
5298c2c66affSColin Finck */
529960a21894SEric Kohl CONFIGRET
530060a21894SEric Kohl WINAPI
CM_Get_Next_Res_Des_Ex(_Out_ PRES_DES prdResDes,_In_ RES_DES rdResDes,_In_ RESOURCEID ForResource,_Out_opt_ PRESOURCEID pResourceID,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)530160a21894SEric Kohl CM_Get_Next_Res_Des_Ex(
530260a21894SEric Kohl _Out_ PRES_DES prdResDes,
530360a21894SEric Kohl _In_ RES_DES rdResDes,
530460a21894SEric Kohl _In_ RESOURCEID ForResource,
530560a21894SEric Kohl _Out_opt_ PRESOURCEID pResourceID,
530660a21894SEric Kohl _In_ ULONG ulFlags,
530760a21894SEric Kohl _In_opt_ HMACHINE hMachine)
5308c2c66affSColin Finck {
53096efb3cbeSEric Kohl RPC_BINDING_HANDLE BindingHandle = NULL;
53106efb3cbeSEric Kohl HSTRING_TABLE StringTable = NULL;
5311894ad4f1SEric Kohl PRES_DES_INFO pNewResDesInfo = NULL;
5312894ad4f1SEric Kohl ULONG ulLogConfTag, ulLogConfType, ulResDesTag;
5313894ad4f1SEric Kohl ULONG ulNextResDesType = 0, ulNextResDesTag = 0;
53146efb3cbeSEric Kohl LPWSTR lpDevInst;
53156efb3cbeSEric Kohl DEVINST dnDevInst;
53166efb3cbeSEric Kohl CONFIGRET ret;
53176efb3cbeSEric Kohl
531860a21894SEric Kohl FIXME("CM_Get_Next_Res_Des_Ex(%p %p %lu %p %lx %p)\n",
531960a21894SEric Kohl prdResDes, rdResDes, ForResource, pResourceID, ulFlags, hMachine);
5320c2c66affSColin Finck
53216efb3cbeSEric Kohl if (prdResDes == NULL)
53226efb3cbeSEric Kohl return CR_INVALID_POINTER;
53236efb3cbeSEric Kohl
53246efb3cbeSEric Kohl if (IsValidLogConf((PLOG_CONF_INFO)rdResDes))
53256efb3cbeSEric Kohl {
53266efb3cbeSEric Kohl FIXME("LogConf found!\n");
53276efb3cbeSEric Kohl dnDevInst = ((PLOG_CONF_INFO)rdResDes)->dnDevInst;
5328894ad4f1SEric Kohl ulLogConfTag = ((PLOG_CONF_INFO)rdResDes)->ulTag;
5329894ad4f1SEric Kohl ulLogConfType = ((PLOG_CONF_INFO)rdResDes)->ulType;
5330894ad4f1SEric Kohl ulResDesTag = (ULONG)-1;
53316efb3cbeSEric Kohl }
53326efb3cbeSEric Kohl else if (IsValidResDes((PRES_DES_INFO)rdResDes))
53336efb3cbeSEric Kohl {
53346efb3cbeSEric Kohl FIXME("ResDes found!\n");
53356efb3cbeSEric Kohl dnDevInst = ((PRES_DES_INFO)rdResDes)->dnDevInst;
5336894ad4f1SEric Kohl ulLogConfTag = ((PRES_DES_INFO)rdResDes)->ulLogConfTag;
5337894ad4f1SEric Kohl ulLogConfType = ((PRES_DES_INFO)rdResDes)->ulLogConfType;
5338894ad4f1SEric Kohl ulResDesTag = ((PRES_DES_INFO)rdResDes)->ulResDesTag;
53396efb3cbeSEric Kohl }
53406efb3cbeSEric Kohl else
53416efb3cbeSEric Kohl {
53426efb3cbeSEric Kohl return CR_INVALID_RES_DES;
53436efb3cbeSEric Kohl }
53446efb3cbeSEric Kohl
5345894ad4f1SEric Kohl if ((ForResource == ResType_All) && (pResourceID == NULL))
5346894ad4f1SEric Kohl return CR_INVALID_POINTER;
5347894ad4f1SEric Kohl
5348894ad4f1SEric Kohl if (ulFlags != 0)
5349894ad4f1SEric Kohl return CR_INVALID_FLAG;
5350894ad4f1SEric Kohl
53516efb3cbeSEric Kohl if (hMachine != NULL)
53526efb3cbeSEric Kohl {
53536efb3cbeSEric Kohl BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
53546efb3cbeSEric Kohl if (BindingHandle == NULL)
53556efb3cbeSEric Kohl return CR_FAILURE;
53566efb3cbeSEric Kohl
53576efb3cbeSEric Kohl StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
53586efb3cbeSEric Kohl if (StringTable == 0)
53596efb3cbeSEric Kohl return CR_FAILURE;
53606efb3cbeSEric Kohl }
53616efb3cbeSEric Kohl else
53626efb3cbeSEric Kohl {
53636efb3cbeSEric Kohl if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
53646efb3cbeSEric Kohl return CR_FAILURE;
53656efb3cbeSEric Kohl }
53666efb3cbeSEric Kohl
53676efb3cbeSEric Kohl lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
53686efb3cbeSEric Kohl if (lpDevInst == NULL)
53696efb3cbeSEric Kohl return CR_INVALID_DEVNODE;
53706efb3cbeSEric Kohl
53716efb3cbeSEric Kohl RpcTryExcept
53726efb3cbeSEric Kohl {
53736efb3cbeSEric Kohl ret = PNP_GetNextResDes(BindingHandle,
53746efb3cbeSEric Kohl lpDevInst,
5375894ad4f1SEric Kohl ulLogConfTag,
5376894ad4f1SEric Kohl ulLogConfType,
53776efb3cbeSEric Kohl ForResource,
5378894ad4f1SEric Kohl ulResDesTag,
5379894ad4f1SEric Kohl &ulNextResDesTag,
5380894ad4f1SEric Kohl &ulNextResDesType,
53816efb3cbeSEric Kohl 0);
53826efb3cbeSEric Kohl }
53836efb3cbeSEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER)
53846efb3cbeSEric Kohl {
53856efb3cbeSEric Kohl ret = RpcStatusToCmStatus(RpcExceptionCode());
53866efb3cbeSEric Kohl }
53876efb3cbeSEric Kohl RpcEndExcept;
53886efb3cbeSEric Kohl
53896efb3cbeSEric Kohl if (ret != CR_SUCCESS)
53906efb3cbeSEric Kohl return ret;
53916efb3cbeSEric Kohl
5392894ad4f1SEric Kohl if (ForResource == ResType_All)
5393894ad4f1SEric Kohl *pResourceID = ulNextResDesType;
5394894ad4f1SEric Kohl
5395894ad4f1SEric Kohl if (prdResDes)
5396894ad4f1SEric Kohl {
5397894ad4f1SEric Kohl pNewResDesInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(RES_DES_INFO));
5398894ad4f1SEric Kohl if (pNewResDesInfo == NULL)
5399894ad4f1SEric Kohl return CR_OUT_OF_MEMORY;
5400894ad4f1SEric Kohl
5401894ad4f1SEric Kohl pNewResDesInfo->ulMagic = LOG_CONF_MAGIC;
5402894ad4f1SEric Kohl pNewResDesInfo->dnDevInst = dnDevInst;
5403894ad4f1SEric Kohl pNewResDesInfo->ulLogConfType = ulLogConfType;
5404894ad4f1SEric Kohl pNewResDesInfo->ulLogConfTag = ulLogConfTag;
5405894ad4f1SEric Kohl pNewResDesInfo->ulResDesType = ulNextResDesType;
5406894ad4f1SEric Kohl pNewResDesInfo->ulResDesTag = ulNextResDesTag;
5407894ad4f1SEric Kohl
5408894ad4f1SEric Kohl *prdResDes = (RES_DES)pNewResDesInfo;
5409894ad4f1SEric Kohl }
54106efb3cbeSEric Kohl
54116efb3cbeSEric Kohl return CR_SUCCESS;
5412c2c66affSColin Finck }
5413c2c66affSColin Finck
5414c2c66affSColin Finck
5415c2c66affSColin Finck /***********************************************************************
5416c2c66affSColin Finck * CM_Get_Parent [SETUPAPI.@]
5417c2c66affSColin Finck */
541860a21894SEric Kohl CONFIGRET
541960a21894SEric Kohl WINAPI
CM_Get_Parent(_Out_ PDEVINST pdnDevInst,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)542060a21894SEric Kohl CM_Get_Parent(
542160a21894SEric Kohl _Out_ PDEVINST pdnDevInst,
542260a21894SEric Kohl _In_ DEVINST dnDevInst,
542360a21894SEric Kohl _In_ ULONG ulFlags)
5424c2c66affSColin Finck {
542560a21894SEric Kohl TRACE("CM_Get_Parent(%p %p %lx)\n",
542660a21894SEric Kohl pdnDevInst, dnDevInst, ulFlags);
542760a21894SEric Kohl
5428c2c66affSColin Finck return CM_Get_Parent_Ex(pdnDevInst, dnDevInst, ulFlags, NULL);
5429c2c66affSColin Finck }
5430c2c66affSColin Finck
5431c2c66affSColin Finck
5432c2c66affSColin Finck /***********************************************************************
5433c2c66affSColin Finck * CM_Get_Parent_Ex [SETUPAPI.@]
5434c2c66affSColin Finck */
543560a21894SEric Kohl CONFIGRET
543660a21894SEric Kohl WINAPI
CM_Get_Parent_Ex(_Out_ PDEVINST pdnDevInst,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)543760a21894SEric Kohl CM_Get_Parent_Ex(
543860a21894SEric Kohl _Out_ PDEVINST pdnDevInst,
543960a21894SEric Kohl _In_ DEVINST dnDevInst,
544060a21894SEric Kohl _In_ ULONG ulFlags,
544160a21894SEric Kohl _In_opt_ HMACHINE hMachine)
5442c2c66affSColin Finck {
5443c2c66affSColin Finck WCHAR szRelatedDevInst[MAX_DEVICE_ID_LEN];
5444c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
5445c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
5446c2c66affSColin Finck LPWSTR lpDevInst;
5447c2c66affSColin Finck DWORD dwIndex, dwLength = MAX_DEVICE_ID_LEN;
5448c2c66affSColin Finck CONFIGRET ret;
5449c2c66affSColin Finck
545060a21894SEric Kohl TRACE("CM_Get_Parent_Ex(%p %lx %lx %p)\n",
545160a21894SEric Kohl pdnDevInst, dnDevInst, ulFlags, hMachine);
5452c2c66affSColin Finck
5453c2c66affSColin Finck if (pdnDevInst == NULL)
5454c2c66affSColin Finck return CR_INVALID_POINTER;
5455c2c66affSColin Finck
5456c2c66affSColin Finck if (dnDevInst == 0)
5457c2c66affSColin Finck return CR_INVALID_DEVINST;
5458c2c66affSColin Finck
5459c2c66affSColin Finck if (ulFlags != 0)
5460c2c66affSColin Finck return CR_INVALID_FLAG;
5461c2c66affSColin Finck
5462c2c66affSColin Finck *pdnDevInst = -1;
5463c2c66affSColin Finck
5464c2c66affSColin Finck if (hMachine != NULL)
5465c2c66affSColin Finck {
5466c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
5467c2c66affSColin Finck if (BindingHandle == NULL)
5468c2c66affSColin Finck return CR_FAILURE;
5469c2c66affSColin Finck
5470c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
5471c2c66affSColin Finck if (StringTable == 0)
5472c2c66affSColin Finck return CR_FAILURE;
5473c2c66affSColin Finck }
5474c2c66affSColin Finck else
5475c2c66affSColin Finck {
5476c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
5477c2c66affSColin Finck return CR_FAILURE;
5478c2c66affSColin Finck }
5479c2c66affSColin Finck
5480c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
5481c2c66affSColin Finck if (lpDevInst == NULL)
5482c2c66affSColin Finck return CR_INVALID_DEVNODE;
5483c2c66affSColin Finck
5484c2c66affSColin Finck RpcTryExcept
5485c2c66affSColin Finck {
5486c2c66affSColin Finck ret = PNP_GetRelatedDeviceInstance(BindingHandle,
5487c2c66affSColin Finck PNP_GET_PARENT_DEVICE_INSTANCE,
5488c2c66affSColin Finck lpDevInst,
5489c2c66affSColin Finck szRelatedDevInst,
5490c2c66affSColin Finck &dwLength,
5491c2c66affSColin Finck 0);
5492c2c66affSColin Finck }
5493c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
5494c2c66affSColin Finck {
5495c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
5496c2c66affSColin Finck }
5497c2c66affSColin Finck RpcEndExcept;
5498c2c66affSColin Finck
5499c2c66affSColin Finck if (ret != CR_SUCCESS)
5500c2c66affSColin Finck return ret;
5501c2c66affSColin Finck
5502c2c66affSColin Finck TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst));
5503c2c66affSColin Finck
5504c2c66affSColin Finck dwIndex = pSetupStringTableAddString(StringTable, szRelatedDevInst, 1);
5505c2c66affSColin Finck if (dwIndex == -1)
5506c2c66affSColin Finck return CR_FAILURE;
5507c2c66affSColin Finck
5508c2c66affSColin Finck *pdnDevInst = dwIndex;
5509c2c66affSColin Finck
5510c2c66affSColin Finck return CR_SUCCESS;
5511c2c66affSColin Finck }
5512c2c66affSColin Finck
5513c2c66affSColin Finck
5514c2c66affSColin Finck /***********************************************************************
5515c2c66affSColin Finck * CM_Get_Res_Des_Data [SETUPAPI.@]
5516c2c66affSColin Finck */
551760a21894SEric Kohl CONFIGRET
551860a21894SEric Kohl WINAPI
CM_Get_Res_Des_Data(_In_ RES_DES rdResDes,_Out_writes_bytes_ (BufferLen)PVOID Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags)551960a21894SEric Kohl CM_Get_Res_Des_Data(
552060a21894SEric Kohl _In_ RES_DES rdResDes,
552160a21894SEric Kohl _Out_writes_bytes_(BufferLen) PVOID Buffer,
552260a21894SEric Kohl _In_ ULONG BufferLen,
552360a21894SEric Kohl _In_ ULONG ulFlags)
5524c2c66affSColin Finck {
552560a21894SEric Kohl TRACE("CM_Get_Res_Des_Data(%p %p %lu %lx)\n",
552660a21894SEric Kohl rdResDes, Buffer, BufferLen, ulFlags);
552760a21894SEric Kohl
5528c2c66affSColin Finck return CM_Get_Res_Des_Data_Ex(rdResDes, Buffer, BufferLen, ulFlags, NULL);
5529c2c66affSColin Finck }
5530c2c66affSColin Finck
5531c2c66affSColin Finck
5532c2c66affSColin Finck /***********************************************************************
5533c2c66affSColin Finck * CM_Get_Res_Des_Data_Ex [SETUPAPI.@]
5534c2c66affSColin Finck */
553560a21894SEric Kohl CONFIGRET
553660a21894SEric Kohl WINAPI
CM_Get_Res_Des_Data_Ex(_In_ RES_DES rdResDes,_Out_writes_bytes_ (BufferLen)PVOID Buffer,_In_ ULONG BufferLen,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)553760a21894SEric Kohl CM_Get_Res_Des_Data_Ex(
553860a21894SEric Kohl _In_ RES_DES rdResDes,
553960a21894SEric Kohl _Out_writes_bytes_(BufferLen) PVOID Buffer,
554060a21894SEric Kohl _In_ ULONG BufferLen,
554160a21894SEric Kohl _In_ ULONG ulFlags,
554260a21894SEric Kohl _In_opt_ HMACHINE hMachine)
5543c2c66affSColin Finck {
554460a21894SEric Kohl FIXME("CM_Get_Res_Des_Data_Ex(%p %p %lu %lx %p)\n",
554560a21894SEric Kohl rdResDes, Buffer, BufferLen, ulFlags, hMachine);
554660a21894SEric Kohl
5547c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
5548c2c66affSColin Finck }
5549c2c66affSColin Finck
5550c2c66affSColin Finck
5551c2c66affSColin Finck /***********************************************************************
5552c2c66affSColin Finck * CM_Get_Res_Des_Size [SETUPAPI.@]
5553c2c66affSColin Finck */
555460a21894SEric Kohl CONFIGRET
555560a21894SEric Kohl WINAPI
CM_Get_Res_Des_Data_Size(_Out_ PULONG pulSize,_In_ RES_DES rdResDes,_In_ ULONG ulFlags)555660a21894SEric Kohl CM_Get_Res_Des_Data_Size(
555760a21894SEric Kohl _Out_ PULONG pulSize,
555860a21894SEric Kohl _In_ RES_DES rdResDes,
555960a21894SEric Kohl _In_ ULONG ulFlags)
5560c2c66affSColin Finck {
556160a21894SEric Kohl TRACE("CM_Get_Res_Des_Data_Size(%p %p %lx)\n",
556260a21894SEric Kohl pulSize, rdResDes, ulFlags);
556360a21894SEric Kohl
5564c2c66affSColin Finck return CM_Get_Res_Des_Data_Size_Ex(pulSize, rdResDes, ulFlags, NULL);
5565c2c66affSColin Finck }
5566c2c66affSColin Finck
5567c2c66affSColin Finck
5568c2c66affSColin Finck /***********************************************************************
5569c2c66affSColin Finck * CM_Get_Res_Des_Size_Ex [SETUPAPI.@]
5570c2c66affSColin Finck */
557160a21894SEric Kohl CONFIGRET
557260a21894SEric Kohl WINAPI
CM_Get_Res_Des_Data_Size_Ex(_Out_ PULONG pulSize,_In_ RES_DES rdResDes,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)557360a21894SEric Kohl CM_Get_Res_Des_Data_Size_Ex(
557460a21894SEric Kohl _Out_ PULONG pulSize,
557560a21894SEric Kohl _In_ RES_DES rdResDes,
557660a21894SEric Kohl _In_ ULONG ulFlags,
557760a21894SEric Kohl _In_opt_ HMACHINE hMachine)
5578c2c66affSColin Finck {
557960a21894SEric Kohl TRACE("CM_Get_Res_Des_Data_Size_Ex(%p %p %lx %p)\n",
558060a21894SEric Kohl pulSize, rdResDes, ulFlags, hMachine);
558160a21894SEric Kohl
5582c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
5583c2c66affSColin Finck }
5584c2c66affSColin Finck
5585c2c66affSColin Finck
5586c2c66affSColin Finck /***********************************************************************
5587d1c376f3SEric Kohl * CM_Get_Resource_Conflict_Count [SETUPAPI.@]
5588d1c376f3SEric Kohl */
5589d1c376f3SEric Kohl CONFIGRET
5590d1c376f3SEric Kohl WINAPI
CM_Get_Resource_Conflict_Count(_In_ CONFLICT_LIST clConflictList,_Out_ PULONG pulCount)5591d1c376f3SEric Kohl CM_Get_Resource_Conflict_Count(
5592d1c376f3SEric Kohl _In_ CONFLICT_LIST clConflictList,
5593d1c376f3SEric Kohl _Out_ PULONG pulCount)
5594d1c376f3SEric Kohl {
5595d1c376f3SEric Kohl PCONFLICT_DATA pConflictData;
5596d1c376f3SEric Kohl
5597d1c376f3SEric Kohl FIXME("CM_Get_Resource_Conflict_Count(%p %p)\n",
5598d1c376f3SEric Kohl clConflictList, pulCount);
5599d1c376f3SEric Kohl
5600d1c376f3SEric Kohl pConflictData = (PCONFLICT_DATA)clConflictList;
5601d1c376f3SEric Kohl if (!IsValidConflictData(pConflictData))
5602d1c376f3SEric Kohl return CR_INVALID_CONFLICT_LIST;
5603d1c376f3SEric Kohl
5604d1c376f3SEric Kohl if (pulCount == NULL)
5605d1c376f3SEric Kohl return CR_INVALID_POINTER;
5606d1c376f3SEric Kohl
5607d1c376f3SEric Kohl *pulCount = pConflictData->pConflictList->ConflictsListed;
5608d1c376f3SEric Kohl
5609d1c376f3SEric Kohl return CR_SUCCESS;
5610d1c376f3SEric Kohl }
5611d1c376f3SEric Kohl
5612d1c376f3SEric Kohl
5613d1c376f3SEric Kohl /***********************************************************************
5614d1c376f3SEric Kohl * CM_Get_Resource_Conflict_DetailsA [SETUPAPI.@]
5615d1c376f3SEric Kohl */
5616d1c376f3SEric Kohl CONFIGRET
5617d1c376f3SEric Kohl WINAPI
CM_Get_Resource_Conflict_DetailsA(_In_ CONFLICT_LIST clConflictList,_In_ ULONG ulIndex,_Inout_ PCONFLICT_DETAILS_A pConflictDetails)5618d1c376f3SEric Kohl CM_Get_Resource_Conflict_DetailsA(
5619d1c376f3SEric Kohl _In_ CONFLICT_LIST clConflictList,
5620d1c376f3SEric Kohl _In_ ULONG ulIndex,
5621d1c376f3SEric Kohl _Inout_ PCONFLICT_DETAILS_A pConflictDetails)
5622d1c376f3SEric Kohl {
5623d1c376f3SEric Kohl FIXME("CM_Get_Resource_Conflict_CountA(%p %lu %p)\n",
5624d1c376f3SEric Kohl clConflictList, ulIndex, pConflictDetails);
5625d1c376f3SEric Kohl
5626d1c376f3SEric Kohl return CR_CALL_NOT_IMPLEMENTED;
5627d1c376f3SEric Kohl }
5628d1c376f3SEric Kohl
5629d1c376f3SEric Kohl
5630d1c376f3SEric Kohl /***********************************************************************
5631d1c376f3SEric Kohl * CM_Get_Resource_Conflict_DetailsW [SETUPAPI.@]
5632d1c376f3SEric Kohl */
5633d1c376f3SEric Kohl CONFIGRET
5634d1c376f3SEric Kohl WINAPI
CM_Get_Resource_Conflict_DetailsW(_In_ CONFLICT_LIST clConflictList,_In_ ULONG ulIndex,_Inout_ PCONFLICT_DETAILS_W pConflictDetails)5635d1c376f3SEric Kohl CM_Get_Resource_Conflict_DetailsW(
5636d1c376f3SEric Kohl _In_ CONFLICT_LIST clConflictList,
5637d1c376f3SEric Kohl _In_ ULONG ulIndex,
5638d1c376f3SEric Kohl _Inout_ PCONFLICT_DETAILS_W pConflictDetails)
5639d1c376f3SEric Kohl {
5640d1c376f3SEric Kohl FIXME("CM_Get_Resource_Conflict_CountW(%p %lu %p)\n",
5641d1c376f3SEric Kohl clConflictList, ulIndex, pConflictDetails);
5642d1c376f3SEric Kohl
5643d1c376f3SEric Kohl return CR_CALL_NOT_IMPLEMENTED;
5644d1c376f3SEric Kohl }
5645d1c376f3SEric Kohl
5646d1c376f3SEric Kohl
5647d1c376f3SEric Kohl /***********************************************************************
5648c2c66affSColin Finck * CM_Get_Sibling [SETUPAPI.@]
5649c2c66affSColin Finck */
565060a21894SEric Kohl CONFIGRET
565160a21894SEric Kohl WINAPI
CM_Get_Sibling(_Out_ PDEVINST pdnDevInst,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)565260a21894SEric Kohl CM_Get_Sibling(
565360a21894SEric Kohl _Out_ PDEVINST pdnDevInst,
565460a21894SEric Kohl _In_ DEVINST dnDevInst,
565560a21894SEric Kohl _In_ ULONG ulFlags)
5656c2c66affSColin Finck {
565760a21894SEric Kohl TRACE("CM_Get_Sibling(%p %p %lx)\n",
565860a21894SEric Kohl pdnDevInst, dnDevInst, ulFlags);
565960a21894SEric Kohl
5660c2c66affSColin Finck return CM_Get_Sibling_Ex(pdnDevInst, dnDevInst, ulFlags, NULL);
5661c2c66affSColin Finck }
5662c2c66affSColin Finck
5663c2c66affSColin Finck
5664c2c66affSColin Finck /***********************************************************************
5665c2c66affSColin Finck * CM_Get_Sibling_Ex [SETUPAPI.@]
5666c2c66affSColin Finck */
566760a21894SEric Kohl CONFIGRET
566860a21894SEric Kohl WINAPI
CM_Get_Sibling_Ex(_Out_ PDEVINST pdnDevInst,_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)566960a21894SEric Kohl CM_Get_Sibling_Ex(
567060a21894SEric Kohl _Out_ PDEVINST pdnDevInst,
567160a21894SEric Kohl _In_ DEVINST dnDevInst,
567260a21894SEric Kohl _In_ ULONG ulFlags,
567360a21894SEric Kohl _In_opt_ HMACHINE hMachine)
5674c2c66affSColin Finck {
5675c2c66affSColin Finck WCHAR szRelatedDevInst[MAX_DEVICE_ID_LEN];
5676c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
5677c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
5678c2c66affSColin Finck LPWSTR lpDevInst;
5679c2c66affSColin Finck DWORD dwIndex, dwLength = MAX_DEVICE_ID_LEN;
5680c2c66affSColin Finck CONFIGRET ret;
5681c2c66affSColin Finck
568260a21894SEric Kohl TRACE("CM_Get_Sibling_Ex(%p %lx %lx %p)\n",
568360a21894SEric Kohl pdnDevInst, dnDevInst, ulFlags, hMachine);
5684c2c66affSColin Finck
5685c2c66affSColin Finck if (pdnDevInst == NULL)
5686c2c66affSColin Finck return CR_INVALID_POINTER;
5687c2c66affSColin Finck
5688c2c66affSColin Finck if (dnDevInst == 0)
5689c2c66affSColin Finck return CR_INVALID_DEVINST;
5690c2c66affSColin Finck
5691c2c66affSColin Finck if (ulFlags != 0)
5692c2c66affSColin Finck return CR_INVALID_FLAG;
5693c2c66affSColin Finck
5694c2c66affSColin Finck *pdnDevInst = -1;
5695c2c66affSColin Finck
5696c2c66affSColin Finck if (hMachine != NULL)
5697c2c66affSColin Finck {
5698c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
5699c2c66affSColin Finck if (BindingHandle == NULL)
5700c2c66affSColin Finck return CR_FAILURE;
5701c2c66affSColin Finck
5702c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
5703c2c66affSColin Finck if (StringTable == 0)
5704c2c66affSColin Finck return CR_FAILURE;
5705c2c66affSColin Finck }
5706c2c66affSColin Finck else
5707c2c66affSColin Finck {
5708c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
5709c2c66affSColin Finck return CR_FAILURE;
5710c2c66affSColin Finck }
5711c2c66affSColin Finck
5712c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
5713c2c66affSColin Finck if (lpDevInst == NULL)
5714c2c66affSColin Finck return CR_INVALID_DEVNODE;
5715c2c66affSColin Finck
5716c2c66affSColin Finck RpcTryExcept
5717c2c66affSColin Finck {
5718c2c66affSColin Finck ret = PNP_GetRelatedDeviceInstance(BindingHandle,
5719c2c66affSColin Finck PNP_GET_SIBLING_DEVICE_INSTANCE,
5720c2c66affSColin Finck lpDevInst,
5721c2c66affSColin Finck szRelatedDevInst,
5722c2c66affSColin Finck &dwLength,
5723c2c66affSColin Finck 0);
5724c2c66affSColin Finck }
5725c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
5726c2c66affSColin Finck {
5727c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
5728c2c66affSColin Finck }
5729c2c66affSColin Finck RpcEndExcept;
5730c2c66affSColin Finck
5731c2c66affSColin Finck if (ret != CR_SUCCESS)
5732c2c66affSColin Finck return ret;
5733c2c66affSColin Finck
5734c2c66affSColin Finck TRACE("szRelatedDevInst: %s\n", debugstr_w(szRelatedDevInst));
5735c2c66affSColin Finck
5736c2c66affSColin Finck dwIndex = pSetupStringTableAddString(StringTable, szRelatedDevInst, 1);
5737c2c66affSColin Finck if (dwIndex == -1)
5738c2c66affSColin Finck return CR_FAILURE;
5739c2c66affSColin Finck
5740c2c66affSColin Finck *pdnDevInst = dwIndex;
5741c2c66affSColin Finck
5742c2c66affSColin Finck return CR_SUCCESS;
5743c2c66affSColin Finck }
5744c2c66affSColin Finck
5745c2c66affSColin Finck
5746c2c66affSColin Finck /***********************************************************************
5747c2c66affSColin Finck * CM_Get_Version [SETUPAPI.@]
5748c2c66affSColin Finck */
574960a21894SEric Kohl WORD
575060a21894SEric Kohl WINAPI
CM_Get_Version(VOID)575160a21894SEric Kohl CM_Get_Version(VOID)
5752c2c66affSColin Finck {
575360a21894SEric Kohl TRACE("CM_Get_Version()\n");
575460a21894SEric Kohl
5755c2c66affSColin Finck return CM_Get_Version_Ex(NULL);
5756c2c66affSColin Finck }
5757c2c66affSColin Finck
5758c2c66affSColin Finck
5759c2c66affSColin Finck /***********************************************************************
5760c2c66affSColin Finck * CM_Get_Version_Ex [SETUPAPI.@]
5761c2c66affSColin Finck */
576260a21894SEric Kohl WORD
576360a21894SEric Kohl WINAPI
CM_Get_Version_Ex(_In_opt_ HMACHINE hMachine)576460a21894SEric Kohl CM_Get_Version_Ex(
576560a21894SEric Kohl _In_opt_ HMACHINE hMachine)
5766c2c66affSColin Finck {
5767c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
5768c2c66affSColin Finck WORD Version = 0;
5769c2c66affSColin Finck CONFIGRET ret;
5770c2c66affSColin Finck
577160a21894SEric Kohl TRACE("CM_Get_Version_Ex(%p)\n", hMachine);
5772c2c66affSColin Finck
5773c2c66affSColin Finck if (hMachine != NULL)
5774c2c66affSColin Finck {
5775c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
5776c2c66affSColin Finck if (BindingHandle == NULL)
5777c2c66affSColin Finck return 0;
5778c2c66affSColin Finck }
5779c2c66affSColin Finck else
5780c2c66affSColin Finck {
5781c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
5782c2c66affSColin Finck return CR_FAILURE;
5783c2c66affSColin Finck }
5784c2c66affSColin Finck
5785c2c66affSColin Finck RpcTryExcept
5786c2c66affSColin Finck {
5787c2c66affSColin Finck ret = PNP_GetVersion(BindingHandle, &Version);
5788c2c66affSColin Finck }
5789c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
5790c2c66affSColin Finck {
5791c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
5792c2c66affSColin Finck }
5793c2c66affSColin Finck RpcEndExcept;
5794c2c66affSColin Finck
5795c2c66affSColin Finck if (ret != CR_SUCCESS)
5796c2c66affSColin Finck return 0;
5797c2c66affSColin Finck
5798c2c66affSColin Finck return Version;
5799c2c66affSColin Finck }
5800c2c66affSColin Finck
5801c2c66affSColin Finck
5802c2c66affSColin Finck /***********************************************************************
5803c2c66affSColin Finck * CM_Intersect_Range_List [SETUPAPI.@]
5804c2c66affSColin Finck */
5805c2c66affSColin Finck CONFIGRET
5806c2c66affSColin Finck WINAPI
CM_Intersect_Range_List(_In_ RANGE_LIST rlhOld1,_In_ RANGE_LIST rlhOld2,_In_ RANGE_LIST rlhNew,_In_ ULONG ulFlags)5807c2c66affSColin Finck CM_Intersect_Range_List(
5808c2c66affSColin Finck _In_ RANGE_LIST rlhOld1,
5809c2c66affSColin Finck _In_ RANGE_LIST rlhOld2,
5810c2c66affSColin Finck _In_ RANGE_LIST rlhNew,
5811c2c66affSColin Finck _In_ ULONG ulFlags)
5812c2c66affSColin Finck {
5813c2c66affSColin Finck FIXME("CM_Intersect_Range_List(%p %p %p %lx)\n",
5814c2c66affSColin Finck rlhOld1, rlhOld2, rlhNew, ulFlags);
581565d3bf74SEric Kohl
5816c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
5817c2c66affSColin Finck }
5818c2c66affSColin Finck
5819c2c66affSColin Finck
5820c2c66affSColin Finck /***********************************************************************
5821c2c66affSColin Finck * CM_Invert_Range_List [SETUPAPI.@]
5822c2c66affSColin Finck */
5823c2c66affSColin Finck CONFIGRET
5824c2c66affSColin Finck WINAPI
CM_Invert_Range_List(_In_ RANGE_LIST rlhOld,_In_ RANGE_LIST rlhNew,_In_ DWORDLONG ullMaxValue,_In_ ULONG ulFlags)5825c2c66affSColin Finck CM_Invert_Range_List(
5826c2c66affSColin Finck _In_ RANGE_LIST rlhOld,
5827c2c66affSColin Finck _In_ RANGE_LIST rlhNew,
5828c2c66affSColin Finck _In_ DWORDLONG ullMaxValue,
5829c2c66affSColin Finck _In_ ULONG ulFlags)
5830c2c66affSColin Finck {
5831c2c66affSColin Finck FIXME("CM_Invert_Range_List(%p %p %I64u %lx)\n",
5832c2c66affSColin Finck rlhOld, rlhNew, ullMaxValue, ulFlags);
583365d3bf74SEric Kohl
5834c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
5835c2c66affSColin Finck }
5836c2c66affSColin Finck
5837c2c66affSColin Finck
5838c2c66affSColin Finck /***********************************************************************
5839c2c66affSColin Finck * CM_Is_Dock_Station_Present [SETUPAPI.@]
5840c2c66affSColin Finck */
5841f86e78d0SEric Kohl CONFIGRET
5842f86e78d0SEric Kohl WINAPI
CM_Is_Dock_Station_Present(_Out_ PBOOL pbPresent)5843f86e78d0SEric Kohl CM_Is_Dock_Station_Present(
5844f86e78d0SEric Kohl _Out_ PBOOL pbPresent)
5845c2c66affSColin Finck {
5846f86e78d0SEric Kohl TRACE("CM_Is_Dock_Station_Present(%p)\n",
5847f86e78d0SEric Kohl pbPresent);
584865d3bf74SEric Kohl
5849c2c66affSColin Finck return CM_Is_Dock_Station_Present_Ex(pbPresent, NULL);
5850c2c66affSColin Finck }
5851c2c66affSColin Finck
5852c2c66affSColin Finck
5853c2c66affSColin Finck /***********************************************************************
5854c2c66affSColin Finck * CM_Is_Dock_Station_Present_Ex [SETUPAPI.@]
5855c2c66affSColin Finck */
5856f86e78d0SEric Kohl CONFIGRET
5857f86e78d0SEric Kohl WINAPI
CM_Is_Dock_Station_Present_Ex(_Out_ PBOOL pbPresent,_In_opt_ HMACHINE hMachine)5858f86e78d0SEric Kohl CM_Is_Dock_Station_Present_Ex(
5859f86e78d0SEric Kohl _Out_ PBOOL pbPresent,
5860f86e78d0SEric Kohl _In_opt_ HMACHINE hMachine)
5861c2c66affSColin Finck {
5862c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
5863c2c66affSColin Finck CONFIGRET ret;
5864c2c66affSColin Finck
586560a21894SEric Kohl TRACE("CM_Is_Dock_Station_Present_Ex(%p %p)\n",
5866f86e78d0SEric Kohl pbPresent, hMachine);
5867c2c66affSColin Finck
5868c2c66affSColin Finck if (pbPresent == NULL)
5869c2c66affSColin Finck return CR_INVALID_POINTER;
5870c2c66affSColin Finck
5871c2c66affSColin Finck *pbPresent = FALSE;
5872c2c66affSColin Finck
5873c2c66affSColin Finck if (hMachine != NULL)
5874c2c66affSColin Finck {
5875c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
5876c2c66affSColin Finck if (BindingHandle == NULL)
5877c2c66affSColin Finck return CR_FAILURE;
5878c2c66affSColin Finck }
5879c2c66affSColin Finck else
5880c2c66affSColin Finck {
5881c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
5882c2c66affSColin Finck return CR_FAILURE;
5883c2c66affSColin Finck }
5884c2c66affSColin Finck
5885c2c66affSColin Finck RpcTryExcept
5886c2c66affSColin Finck {
5887c2c66affSColin Finck ret = PNP_IsDockStationPresent(BindingHandle,
5888c2c66affSColin Finck pbPresent);
5889c2c66affSColin Finck }
5890c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
5891c2c66affSColin Finck {
5892c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
5893c2c66affSColin Finck }
5894c2c66affSColin Finck RpcEndExcept;
5895c2c66affSColin Finck
5896c2c66affSColin Finck return ret;
5897c2c66affSColin Finck }
5898c2c66affSColin Finck
5899c2c66affSColin Finck
5900c2c66affSColin Finck /***********************************************************************
5901c2c66affSColin Finck * CM_Is_Version_Available_Ex [SETUPAPI.@]
5902c2c66affSColin Finck */
5903f86e78d0SEric Kohl BOOL
5904f86e78d0SEric Kohl WINAPI
CM_Is_Version_Available(_In_ WORD wVersion)5905f86e78d0SEric Kohl CM_Is_Version_Available(
5906f86e78d0SEric Kohl _In_ WORD wVersion)
5907c2c66affSColin Finck {
5908f86e78d0SEric Kohl TRACE("CM_Is_Version_Available(%hu)\n",
5909f86e78d0SEric Kohl wVersion);
591065d3bf74SEric Kohl
5911c2c66affSColin Finck return CM_Is_Version_Available_Ex(wVersion, NULL);
5912c2c66affSColin Finck }
5913c2c66affSColin Finck
5914c2c66affSColin Finck
5915c2c66affSColin Finck /***********************************************************************
5916c2c66affSColin Finck * CM_Is_Version_Available_Ex [SETUPAPI.@]
5917c2c66affSColin Finck */
5918f86e78d0SEric Kohl BOOL
5919f86e78d0SEric Kohl WINAPI
CM_Is_Version_Available_Ex(_In_ WORD wVersion,_In_opt_ HMACHINE hMachine)5920f86e78d0SEric Kohl CM_Is_Version_Available_Ex(
5921f86e78d0SEric Kohl _In_ WORD wVersion,
5922f86e78d0SEric Kohl _In_opt_ HMACHINE hMachine)
5923c2c66affSColin Finck {
5924c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
5925c2c66affSColin Finck WORD wServerVersion;
5926c2c66affSColin Finck CONFIGRET ret;
5927c2c66affSColin Finck
592860a21894SEric Kohl TRACE("CM_Is_Version_Available_Ex(%hu %p)\n",
5929f86e78d0SEric Kohl wVersion, hMachine);
5930c2c66affSColin Finck
5931c2c66affSColin Finck if (wVersion <= 0x400)
5932c2c66affSColin Finck return TRUE;
5933c2c66affSColin Finck
5934c2c66affSColin Finck if (hMachine != NULL)
5935c2c66affSColin Finck {
5936c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
5937c2c66affSColin Finck if (BindingHandle == NULL)
5938c2c66affSColin Finck return FALSE;
5939c2c66affSColin Finck }
5940c2c66affSColin Finck else
5941c2c66affSColin Finck {
5942c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
5943c2c66affSColin Finck return FALSE;
5944c2c66affSColin Finck }
5945c2c66affSColin Finck
5946c2c66affSColin Finck RpcTryExcept
5947c2c66affSColin Finck {
5948c2c66affSColin Finck ret = PNP_GetVersion(BindingHandle, &wServerVersion);
5949c2c66affSColin Finck }
5950c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
5951c2c66affSColin Finck {
5952c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
5953c2c66affSColin Finck }
5954c2c66affSColin Finck RpcEndExcept;
5955c2c66affSColin Finck
5956c2c66affSColin Finck if (ret != CR_SUCCESS)
5957c2c66affSColin Finck return FALSE;
5958c2c66affSColin Finck
5959c2c66affSColin Finck return (wServerVersion >= wVersion);
5960c2c66affSColin Finck }
5961c2c66affSColin Finck
5962c2c66affSColin Finck
5963c2c66affSColin Finck /***********************************************************************
5964c2c66affSColin Finck * CM_Locate_DevNodeA [SETUPAPI.@]
5965c2c66affSColin Finck */
5966f86e78d0SEric Kohl CONFIGRET
5967f86e78d0SEric Kohl WINAPI
CM_Locate_DevNodeA(_Out_ PDEVINST pdnDevInst,_In_opt_ DEVINSTID_A pDeviceID,_In_ ULONG ulFlags)5968f86e78d0SEric Kohl CM_Locate_DevNodeA(
5969f86e78d0SEric Kohl _Out_ PDEVINST pdnDevInst,
5970f86e78d0SEric Kohl _In_opt_ DEVINSTID_A pDeviceID,
5971f86e78d0SEric Kohl _In_ ULONG ulFlags)
5972c2c66affSColin Finck {
597360a21894SEric Kohl TRACE("CM_Locate_DevNodeA(%p %s %lx)\n",
597460a21894SEric Kohl pdnDevInst, debugstr_a(pDeviceID), ulFlags);
597565d3bf74SEric Kohl
5976c2c66affSColin Finck return CM_Locate_DevNode_ExA(pdnDevInst, pDeviceID, ulFlags, NULL);
5977c2c66affSColin Finck }
5978c2c66affSColin Finck
5979c2c66affSColin Finck
5980c2c66affSColin Finck /***********************************************************************
5981c2c66affSColin Finck * CM_Locate_DevNodeW [SETUPAPI.@]
5982c2c66affSColin Finck */
5983f86e78d0SEric Kohl CONFIGRET
5984f86e78d0SEric Kohl WINAPI
CM_Locate_DevNodeW(_Out_ PDEVINST pdnDevInst,_In_opt_ DEVINSTID_W pDeviceID,_In_ ULONG ulFlags)5985f86e78d0SEric Kohl CM_Locate_DevNodeW(
5986f86e78d0SEric Kohl _Out_ PDEVINST pdnDevInst,
5987f86e78d0SEric Kohl _In_opt_ DEVINSTID_W pDeviceID,
5988f86e78d0SEric Kohl _In_ ULONG ulFlags)
5989c2c66affSColin Finck {
599060a21894SEric Kohl TRACE("CM_Locate_DevNodeW(%p %s %lx)\n",
5991f86e78d0SEric Kohl pdnDevInst, debugstr_w(pDeviceID), ulFlags);
599265d3bf74SEric Kohl
5993c2c66affSColin Finck return CM_Locate_DevNode_ExW(pdnDevInst, pDeviceID, ulFlags, NULL);
5994c2c66affSColin Finck }
5995c2c66affSColin Finck
5996c2c66affSColin Finck
5997c2c66affSColin Finck /***********************************************************************
5998c2c66affSColin Finck * CM_Locate_DevNode_ExA [SETUPAPI.@]
5999c2c66affSColin Finck */
6000f86e78d0SEric Kohl CONFIGRET
6001f86e78d0SEric Kohl WINAPI
CM_Locate_DevNode_ExA(_Out_ PDEVINST pdnDevInst,_In_opt_ DEVINSTID_A pDeviceID,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)6002f86e78d0SEric Kohl CM_Locate_DevNode_ExA(
6003f86e78d0SEric Kohl _Out_ PDEVINST pdnDevInst,
6004f86e78d0SEric Kohl _In_opt_ DEVINSTID_A pDeviceID,
6005f86e78d0SEric Kohl _In_ ULONG ulFlags,
6006f86e78d0SEric Kohl _In_opt_ HMACHINE hMachine)
6007c2c66affSColin Finck {
6008c2c66affSColin Finck DEVINSTID_W pDevIdW = NULL;
6009c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
6010c2c66affSColin Finck
601160a21894SEric Kohl TRACE("CM_Locate_DevNode_ExA(%p %s %lx %p)\n",
601260a21894SEric Kohl pdnDevInst, debugstr_a(pDeviceID), ulFlags, hMachine);
6013c2c66affSColin Finck
6014c2c66affSColin Finck if (pDeviceID != NULL)
6015c2c66affSColin Finck {
6016c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(pDeviceID, &pDevIdW))
6017c2c66affSColin Finck return CR_INVALID_DEVICE_ID;
6018c2c66affSColin Finck }
6019c2c66affSColin Finck
6020c2c66affSColin Finck ret = CM_Locate_DevNode_ExW(pdnDevInst, pDevIdW, ulFlags, hMachine);
6021c2c66affSColin Finck
6022c2c66affSColin Finck if (pDevIdW != NULL)
6023c2c66affSColin Finck MyFree(pDevIdW);
6024c2c66affSColin Finck
6025c2c66affSColin Finck return ret;
6026c2c66affSColin Finck }
6027c2c66affSColin Finck
6028c2c66affSColin Finck
6029c2c66affSColin Finck /***********************************************************************
6030c2c66affSColin Finck * CM_Locate_DevNode_ExW [SETUPAPI.@]
6031c2c66affSColin Finck */
6032f86e78d0SEric Kohl CONFIGRET
6033f86e78d0SEric Kohl WINAPI
CM_Locate_DevNode_ExW(_Out_ PDEVINST pdnDevInst,_In_opt_ DEVINSTID_W pDeviceID,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)6034f86e78d0SEric Kohl CM_Locate_DevNode_ExW(
6035f86e78d0SEric Kohl _Out_ PDEVINST pdnDevInst,
6036f86e78d0SEric Kohl _In_opt_ DEVINSTID_W pDeviceID,
6037f86e78d0SEric Kohl _In_ ULONG ulFlags,
6038f86e78d0SEric Kohl _In_opt_ HMACHINE hMachine)
6039c2c66affSColin Finck {
6040c2c66affSColin Finck WCHAR DeviceIdBuffer[MAX_DEVICE_ID_LEN];
6041c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
6042c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
6043c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
6044c2c66affSColin Finck
604560a21894SEric Kohl TRACE("CM_Locate_DevNode_ExW(%p %s %lx %p)\n",
6046f86e78d0SEric Kohl pdnDevInst, debugstr_w(pDeviceID), ulFlags, hMachine);
6047c2c66affSColin Finck
6048c2c66affSColin Finck if (pdnDevInst == NULL)
6049c2c66affSColin Finck return CR_INVALID_POINTER;
6050c2c66affSColin Finck
6051c2c66affSColin Finck if (ulFlags & ~CM_LOCATE_DEVNODE_BITS)
6052c2c66affSColin Finck return CR_INVALID_FLAG;
6053c2c66affSColin Finck
6054c2c66affSColin Finck if (hMachine != NULL)
6055c2c66affSColin Finck {
6056c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
6057c2c66affSColin Finck if (BindingHandle == NULL)
6058c2c66affSColin Finck return CR_FAILURE;
6059c2c66affSColin Finck
6060c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
6061c2c66affSColin Finck if (StringTable == 0)
6062c2c66affSColin Finck return CR_FAILURE;
6063c2c66affSColin Finck }
6064c2c66affSColin Finck else
6065c2c66affSColin Finck {
6066c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
6067c2c66affSColin Finck return CR_FAILURE;
6068c2c66affSColin Finck }
6069c2c66affSColin Finck
6070c2c66affSColin Finck if (pDeviceID != NULL && lstrlenW(pDeviceID) != 0)
6071c2c66affSColin Finck {
6072c2c66affSColin Finck lstrcpyW(DeviceIdBuffer, pDeviceID);
6073dde7e6e2SEric Kohl
6074dde7e6e2SEric Kohl RpcTryExcept
6075dde7e6e2SEric Kohl {
6076dde7e6e2SEric Kohl /* Validate the device ID */
6077dde7e6e2SEric Kohl ret = PNP_ValidateDeviceInstance(BindingHandle,
6078dde7e6e2SEric Kohl DeviceIdBuffer,
6079dde7e6e2SEric Kohl ulFlags);
6080dde7e6e2SEric Kohl }
6081dde7e6e2SEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER)
6082dde7e6e2SEric Kohl {
6083dde7e6e2SEric Kohl ret = RpcStatusToCmStatus(RpcExceptionCode());
6084dde7e6e2SEric Kohl }
6085dde7e6e2SEric Kohl RpcEndExcept;
6086c2c66affSColin Finck }
6087c2c66affSColin Finck else
6088c2c66affSColin Finck {
6089c2c66affSColin Finck RpcTryExcept
6090c2c66affSColin Finck {
6091c2c66affSColin Finck /* Get the root device ID */
6092c2c66affSColin Finck ret = PNP_GetRootDeviceInstance(BindingHandle,
6093c2c66affSColin Finck DeviceIdBuffer,
6094c2c66affSColin Finck MAX_DEVICE_ID_LEN);
6095c2c66affSColin Finck }
6096c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
6097c2c66affSColin Finck {
6098c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
6099c2c66affSColin Finck }
6100c2c66affSColin Finck RpcEndExcept;
6101c2c66affSColin Finck }
6102dde7e6e2SEric Kohl
6103c2c66affSColin Finck TRACE("DeviceIdBuffer: %s\n", debugstr_w(DeviceIdBuffer));
6104c2c66affSColin Finck
6105c2c66affSColin Finck if (ret == CR_SUCCESS)
6106c2c66affSColin Finck {
6107c2c66affSColin Finck *pdnDevInst = pSetupStringTableAddString(StringTable, DeviceIdBuffer, 1);
6108c2c66affSColin Finck if (*pdnDevInst == -1)
6109c2c66affSColin Finck ret = CR_FAILURE;
6110c2c66affSColin Finck }
6111c2c66affSColin Finck
6112c2c66affSColin Finck return ret;
6113c2c66affSColin Finck }
6114c2c66affSColin Finck
6115c2c66affSColin Finck
6116c2c66affSColin Finck /***********************************************************************
6117c2c66affSColin Finck * CM_Merge_Range_List [SETUPAPI.@]
6118c2c66affSColin Finck */
6119c2c66affSColin Finck CONFIGRET
6120c2c66affSColin Finck WINAPI
CM_Merge_Range_List(_In_ RANGE_LIST rlhOld1,_In_ RANGE_LIST rlhOld2,_In_ RANGE_LIST rlhNew,_In_ ULONG ulFlags)6121c2c66affSColin Finck CM_Merge_Range_List(
6122c2c66affSColin Finck _In_ RANGE_LIST rlhOld1,
6123c2c66affSColin Finck _In_ RANGE_LIST rlhOld2,
6124c2c66affSColin Finck _In_ RANGE_LIST rlhNew,
6125c2c66affSColin Finck _In_ ULONG ulFlags)
6126c2c66affSColin Finck {
6127c2c66affSColin Finck FIXME("CM_Merge_Range_List(%p %p %p %lx)\n",
6128c2c66affSColin Finck rlhOld1, rlhOld2, rlhNew, ulFlags);
612965d3bf74SEric Kohl
6130c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
6131c2c66affSColin Finck }
6132c2c66affSColin Finck
6133c2c66affSColin Finck
6134c2c66affSColin Finck /***********************************************************************
6135c2c66affSColin Finck * CM_Modify_Res_Des [SETUPAPI.@]
6136c2c66affSColin Finck */
6137f86e78d0SEric Kohl CONFIGRET
6138f86e78d0SEric Kohl WINAPI
CM_Modify_Res_Des(_Out_ PRES_DES prdResDes,_In_ RES_DES rdResDes,_In_ RESOURCEID ResourceID,_In_reads_bytes_ (ResourceLen)PCVOID ResourceData,_In_ ULONG ResourceLen,_In_ ULONG ulFlags)6139f86e78d0SEric Kohl CM_Modify_Res_Des(
6140f86e78d0SEric Kohl _Out_ PRES_DES prdResDes,
6141f86e78d0SEric Kohl _In_ RES_DES rdResDes,
6142f86e78d0SEric Kohl _In_ RESOURCEID ResourceID,
614360a21894SEric Kohl _In_reads_bytes_(ResourceLen) PCVOID ResourceData,
6144f86e78d0SEric Kohl _In_ ULONG ResourceLen,
6145f86e78d0SEric Kohl _In_ ULONG ulFlags)
6146c2c66affSColin Finck {
6147f86e78d0SEric Kohl TRACE("CM_Modify_Res_Des(%p %p %lx %p %lu %lx)\n",
6148f86e78d0SEric Kohl prdResDes, rdResDes, ResourceID, ResourceData,
6149c2c66affSColin Finck ResourceLen, ulFlags);
615065d3bf74SEric Kohl
6151c2c66affSColin Finck return CM_Modify_Res_Des_Ex(prdResDes, rdResDes, ResourceID, ResourceData,
6152c2c66affSColin Finck ResourceLen, ulFlags, NULL);
6153c2c66affSColin Finck }
6154c2c66affSColin Finck
6155c2c66affSColin Finck
6156c2c66affSColin Finck /***********************************************************************
6157c2c66affSColin Finck * CM_Modify_Res_Des_Ex [SETUPAPI.@]
6158c2c66affSColin Finck */
6159f86e78d0SEric Kohl CONFIGRET
6160f86e78d0SEric Kohl WINAPI
CM_Modify_Res_Des_Ex(_Out_ PRES_DES prdResDes,_In_ RES_DES rdResDes,_In_ RESOURCEID ResourceID,_In_reads_bytes_ (ResourceLen)PCVOID ResourceData,_In_ ULONG ResourceLen,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)6161f86e78d0SEric Kohl CM_Modify_Res_Des_Ex(
6162f86e78d0SEric Kohl _Out_ PRES_DES prdResDes,
6163f86e78d0SEric Kohl _In_ RES_DES rdResDes,
6164f86e78d0SEric Kohl _In_ RESOURCEID ResourceID,
616560a21894SEric Kohl _In_reads_bytes_(ResourceLen) PCVOID ResourceData,
6166f86e78d0SEric Kohl _In_ ULONG ResourceLen,
6167f86e78d0SEric Kohl _In_ ULONG ulFlags,
6168f86e78d0SEric Kohl _In_opt_ HMACHINE hMachine)
6169c2c66affSColin Finck {
617060a21894SEric Kohl FIXME("CM_Modify_Res_Des_Ex(%p %p %lx %p %lu %lx %p)\n",
6171f86e78d0SEric Kohl prdResDes, rdResDes, ResourceID, ResourceData,
6172c2c66affSColin Finck ResourceLen, ulFlags, hMachine);
617365d3bf74SEric Kohl
6174c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
6175c2c66affSColin Finck }
6176c2c66affSColin Finck
6177c2c66affSColin Finck
6178c2c66affSColin Finck /***********************************************************************
6179c2c66affSColin Finck * CM_Move_DevNode [SETUPAPI.@]
6180c2c66affSColin Finck */
6181f86e78d0SEric Kohl CONFIGRET
6182f86e78d0SEric Kohl WINAPI
CM_Move_DevNode(_In_ DEVINST dnFromDevInst,_In_ DEVINST dnToDevInst,_In_ ULONG ulFlags)6183f86e78d0SEric Kohl CM_Move_DevNode(
6184f86e78d0SEric Kohl _In_ DEVINST dnFromDevInst,
6185f86e78d0SEric Kohl _In_ DEVINST dnToDevInst,
6186f86e78d0SEric Kohl _In_ ULONG ulFlags)
6187c2c66affSColin Finck {
6188f86e78d0SEric Kohl TRACE("CM_Move_DevNode(%lx %lx %lx)\n",
6189f86e78d0SEric Kohl dnFromDevInst, dnToDevInst, ulFlags);
619065d3bf74SEric Kohl
6191c2c66affSColin Finck return CM_Move_DevNode_Ex(dnFromDevInst, dnToDevInst, ulFlags, NULL);
6192c2c66affSColin Finck }
6193c2c66affSColin Finck
6194c2c66affSColin Finck
6195c2c66affSColin Finck /***********************************************************************
6196c2c66affSColin Finck * CM_Move_DevNode_Ex [SETUPAPI.@]
6197c2c66affSColin Finck */
6198f86e78d0SEric Kohl CONFIGRET
6199f86e78d0SEric Kohl WINAPI
CM_Move_DevNode_Ex(_In_ DEVINST dnFromDevInst,_In_ DEVINST dnToDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)6200f86e78d0SEric Kohl CM_Move_DevNode_Ex(
6201f86e78d0SEric Kohl _In_ DEVINST dnFromDevInst,
6202f86e78d0SEric Kohl _In_ DEVINST dnToDevInst,
6203f86e78d0SEric Kohl _In_ ULONG ulFlags,
6204f86e78d0SEric Kohl _In_opt_ HMACHINE hMachine)
6205c2c66affSColin Finck {
6206c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
6207c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
6208c2c66affSColin Finck LPWSTR lpFromDevInst;
6209c2c66affSColin Finck LPWSTR lpToDevInst;
6210c2c66affSColin Finck CONFIGRET ret;
6211c2c66affSColin Finck
621260a21894SEric Kohl FIXME("CM_Move_DevNode_Ex(%lx %lx %lx %p)\n",
6213c2c66affSColin Finck dnFromDevInst, dnToDevInst, ulFlags, hMachine);
6214c2c66affSColin Finck
6215c2c66affSColin Finck if (!pSetupIsUserAdmin())
6216c2c66affSColin Finck return CR_ACCESS_DENIED;
6217c2c66affSColin Finck
6218c2c66affSColin Finck if (dnFromDevInst == 0 || dnToDevInst == 0)
6219c2c66affSColin Finck return CR_INVALID_DEVNODE;
6220c2c66affSColin Finck
6221c2c66affSColin Finck if (ulFlags != 0)
6222c2c66affSColin Finck return CR_INVALID_FLAG;
6223c2c66affSColin Finck
6224c2c66affSColin Finck if (hMachine != NULL)
6225c2c66affSColin Finck {
6226c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
6227c2c66affSColin Finck if (BindingHandle == NULL)
6228c2c66affSColin Finck return CR_FAILURE;
6229c2c66affSColin Finck
6230c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
6231c2c66affSColin Finck if (StringTable == 0)
6232c2c66affSColin Finck return CR_FAILURE;
6233c2c66affSColin Finck }
6234c2c66affSColin Finck else
6235c2c66affSColin Finck {
6236c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
6237c2c66affSColin Finck return CR_FAILURE;
6238c2c66affSColin Finck }
6239c2c66affSColin Finck
6240c2c66affSColin Finck lpFromDevInst = pSetupStringTableStringFromId(StringTable, dnFromDevInst);
6241c2c66affSColin Finck if (lpFromDevInst == NULL)
6242c2c66affSColin Finck return CR_INVALID_DEVNODE;
6243c2c66affSColin Finck
6244c2c66affSColin Finck lpToDevInst = pSetupStringTableStringFromId(StringTable, dnToDevInst);
6245c2c66affSColin Finck if (lpToDevInst == NULL)
6246c2c66affSColin Finck return CR_INVALID_DEVNODE;
6247c2c66affSColin Finck
6248c2c66affSColin Finck RpcTryExcept
6249c2c66affSColin Finck {
6250c2c66affSColin Finck ret = PNP_DeviceInstanceAction(BindingHandle,
6251c2c66affSColin Finck PNP_DEVINST_MOVE,
6252c2c66affSColin Finck ulFlags,
6253c2c66affSColin Finck lpFromDevInst,
6254c2c66affSColin Finck lpToDevInst);
6255c2c66affSColin Finck }
6256c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
6257c2c66affSColin Finck {
6258c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
6259c2c66affSColin Finck }
6260c2c66affSColin Finck RpcEndExcept;
6261c2c66affSColin Finck
6262c2c66affSColin Finck return ret;
6263c2c66affSColin Finck }
6264c2c66affSColin Finck
6265c2c66affSColin Finck
6266c2c66affSColin Finck /***********************************************************************
6267c2c66affSColin Finck * CM_Next_Range [SETUPAPI.@]
6268c2c66affSColin Finck */
6269c2c66affSColin Finck CONFIGRET
6270c2c66affSColin Finck WINAPI
CM_Next_Range(_Inout_ PRANGE_ELEMENT preElement,_Out_ PDWORDLONG pullStart,_Out_ PDWORDLONG pullEnd,_In_ ULONG ulFlags)6271c2c66affSColin Finck CM_Next_Range(
6272c2c66affSColin Finck _Inout_ PRANGE_ELEMENT preElement,
6273c2c66affSColin Finck _Out_ PDWORDLONG pullStart,
6274c2c66affSColin Finck _Out_ PDWORDLONG pullEnd,
6275c2c66affSColin Finck _In_ ULONG ulFlags)
6276c2c66affSColin Finck {
6277e88a6b20SEric Kohl PINTERNAL_RANGE_LIST pRangeList;
6278e88a6b20SEric Kohl PINTERNAL_RANGE pRange;
6279e88a6b20SEric Kohl PLIST_ENTRY ListEntry;
6280e88a6b20SEric Kohl CONFIGRET ret = CR_SUCCESS;
6281e88a6b20SEric Kohl
6282c2c66affSColin Finck FIXME("CM_Next_Range(%p %p %p %lx)\n",
6283c2c66affSColin Finck preElement, pullStart, pullEnd, ulFlags);
628465d3bf74SEric Kohl
6285e88a6b20SEric Kohl pRange = (PINTERNAL_RANGE)preElement;
6286e88a6b20SEric Kohl
6287e88a6b20SEric Kohl if (pRange == NULL || pRange->pRangeList == NULL)
6288e88a6b20SEric Kohl return CR_FAILURE;
6289e88a6b20SEric Kohl
6290e88a6b20SEric Kohl if (pullStart == NULL || pullEnd == NULL)
6291e88a6b20SEric Kohl return CR_INVALID_POINTER;
6292e88a6b20SEric Kohl
6293e88a6b20SEric Kohl if (ulFlags != 0)
6294e88a6b20SEric Kohl return CR_INVALID_FLAG;
6295e88a6b20SEric Kohl
6296e88a6b20SEric Kohl pRangeList = pRange->pRangeList;
6297e88a6b20SEric Kohl
6298e88a6b20SEric Kohl /* Lock the range list */
6299e88a6b20SEric Kohl WaitForSingleObject(pRangeList->hMutex, INFINITE);
6300e88a6b20SEric Kohl
6301e88a6b20SEric Kohl /* Fail, if we reached the end of the list */
6302e88a6b20SEric Kohl if (pRange->ListEntry.Flink == &pRangeList->ListHead)
6303e88a6b20SEric Kohl {
6304e88a6b20SEric Kohl ret = CR_FAILURE;
6305e88a6b20SEric Kohl goto done;
6306e88a6b20SEric Kohl }
6307e88a6b20SEric Kohl
6308e88a6b20SEric Kohl /* Get the next range */
6309e88a6b20SEric Kohl ListEntry = pRangeList->ListHead.Flink;
6310e88a6b20SEric Kohl pRange = CONTAINING_RECORD(ListEntry, INTERNAL_RANGE, ListEntry);
6311e88a6b20SEric Kohl
6312e88a6b20SEric Kohl /* Return the range data */
6313e88a6b20SEric Kohl *pullStart = pRange->ullStart;
6314e88a6b20SEric Kohl *pullEnd = pRange->ullEnd;
6315e88a6b20SEric Kohl *preElement = (RANGE_ELEMENT)pRange;
6316e88a6b20SEric Kohl
6317e88a6b20SEric Kohl done:
6318e88a6b20SEric Kohl /* Unlock the range list */
6319e88a6b20SEric Kohl ReleaseMutex(pRangeList->hMutex);
6320e88a6b20SEric Kohl
6321e88a6b20SEric Kohl return ret;
6322c2c66affSColin Finck }
6323c2c66affSColin Finck
6324c2c66affSColin Finck
6325c2c66affSColin Finck /***********************************************************************
6326c2c66affSColin Finck * CM_Open_Class_KeyA [SETUPAPI.@]
6327c2c66affSColin Finck */
6328f86e78d0SEric Kohl CONFIGRET
6329f86e78d0SEric Kohl WINAPI
CM_Open_Class_KeyA(_In_opt_ LPGUID pClassGuid,_In_opt_ LPCSTR pszClassName,_In_ REGSAM samDesired,_In_ REGDISPOSITION Disposition,_Out_ PHKEY phkClass,_In_ ULONG ulFlags)6330f86e78d0SEric Kohl CM_Open_Class_KeyA(
6331f86e78d0SEric Kohl _In_opt_ LPGUID pClassGuid,
6332f86e78d0SEric Kohl _In_opt_ LPCSTR pszClassName,
6333f86e78d0SEric Kohl _In_ REGSAM samDesired,
6334f86e78d0SEric Kohl _In_ REGDISPOSITION Disposition,
6335f86e78d0SEric Kohl _Out_ PHKEY phkClass,
6336f86e78d0SEric Kohl _In_ ULONG ulFlags)
6337c2c66affSColin Finck {
6338f86e78d0SEric Kohl TRACE("CM_Open_Class_KeyA(%p %s %lx %lx %p %lx)\n",
633960a21894SEric Kohl debugstr_guid(pClassGuid), debugstr_a(pszClassName),
6340c2c66affSColin Finck samDesired, Disposition, phkClass, ulFlags);
6341c2c66affSColin Finck
6342c2c66affSColin Finck return CM_Open_Class_Key_ExA(pClassGuid, pszClassName, samDesired,
6343c2c66affSColin Finck Disposition, phkClass, ulFlags, NULL);
6344c2c66affSColin Finck }
6345c2c66affSColin Finck
6346c2c66affSColin Finck
6347c2c66affSColin Finck /***********************************************************************
6348c2c66affSColin Finck * CM_Open_Class_KeyW [SETUPAPI.@]
6349c2c66affSColin Finck */
6350f86e78d0SEric Kohl CONFIGRET
6351f86e78d0SEric Kohl WINAPI
CM_Open_Class_KeyW(_In_opt_ LPGUID pClassGuid,_In_opt_ LPCWSTR pszClassName,_In_ REGSAM samDesired,_In_ REGDISPOSITION Disposition,_Out_ PHKEY phkClass,_In_ ULONG ulFlags)6352f86e78d0SEric Kohl CM_Open_Class_KeyW(
6353f86e78d0SEric Kohl _In_opt_ LPGUID pClassGuid,
6354f86e78d0SEric Kohl _In_opt_ LPCWSTR pszClassName,
6355f86e78d0SEric Kohl _In_ REGSAM samDesired,
6356f86e78d0SEric Kohl _In_ REGDISPOSITION Disposition,
6357f86e78d0SEric Kohl _Out_ PHKEY phkClass,
6358f86e78d0SEric Kohl _In_ ULONG ulFlags)
6359c2c66affSColin Finck {
6360ab0119c6SThamatip Chitpong TRACE("CM_Open_Class_KeyW(%p %s %lx %lx %p %lx)\n",
6361c2c66affSColin Finck debugstr_guid(pClassGuid), debugstr_w(pszClassName),
6362c2c66affSColin Finck samDesired, Disposition, phkClass, ulFlags);
6363c2c66affSColin Finck
6364c2c66affSColin Finck return CM_Open_Class_Key_ExW(pClassGuid, pszClassName, samDesired,
6365c2c66affSColin Finck Disposition, phkClass, ulFlags, NULL);
6366c2c66affSColin Finck }
6367c2c66affSColin Finck
6368c2c66affSColin Finck
6369c2c66affSColin Finck /***********************************************************************
6370c2c66affSColin Finck * CM_Open_Class_Key_ExA [SETUPAPI.@]
6371c2c66affSColin Finck */
6372f86e78d0SEric Kohl CONFIGRET
6373f86e78d0SEric Kohl WINAPI
CM_Open_Class_Key_ExA(_In_opt_ LPGUID pClassGuid,_In_opt_ LPCSTR pszClassName,_In_ REGSAM samDesired,_In_ REGDISPOSITION Disposition,_Out_ PHKEY phkClass,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)6374f86e78d0SEric Kohl CM_Open_Class_Key_ExA(
6375f86e78d0SEric Kohl _In_opt_ LPGUID pClassGuid,
6376f86e78d0SEric Kohl _In_opt_ LPCSTR pszClassName,
6377f86e78d0SEric Kohl _In_ REGSAM samDesired,
6378f86e78d0SEric Kohl _In_ REGDISPOSITION Disposition,
6379f86e78d0SEric Kohl _Out_ PHKEY phkClass,
6380f86e78d0SEric Kohl _In_ ULONG ulFlags,
6381f86e78d0SEric Kohl _In_opt_ HMACHINE hMachine)
6382c2c66affSColin Finck {
6383c2c66affSColin Finck LPWSTR pszClassNameW = NULL;
6384c2c66affSColin Finck CONFIGRET ret;
6385c2c66affSColin Finck
638660a21894SEric Kohl TRACE("CM_Open_Class_Key_ExA(%p %s %lx %lx %p %lx %p)\n",
638760a21894SEric Kohl debugstr_guid(pClassGuid), debugstr_a(pszClassName),
6388c2c66affSColin Finck samDesired, Disposition, phkClass, ulFlags, hMachine);
6389c2c66affSColin Finck
6390c2c66affSColin Finck if (pszClassName != NULL)
6391c2c66affSColin Finck {
6392c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(pszClassName, &pszClassNameW))
6393c2c66affSColin Finck return CR_INVALID_DATA;
6394c2c66affSColin Finck }
6395c2c66affSColin Finck
6396c2c66affSColin Finck ret = CM_Open_Class_Key_ExW(pClassGuid, pszClassNameW, samDesired,
6397c2c66affSColin Finck Disposition, phkClass, ulFlags, hMachine);
6398c2c66affSColin Finck
6399c2c66affSColin Finck if (pszClassNameW != NULL)
6400c2c66affSColin Finck MyFree(pszClassNameW);
6401c2c66affSColin Finck
6402c2c66affSColin Finck return ret;
6403c2c66affSColin Finck }
6404c2c66affSColin Finck
6405c2c66affSColin Finck
6406c2c66affSColin Finck /***********************************************************************
6407c2c66affSColin Finck * CM_Open_Class_Key_ExW [SETUPAPI.@]
6408c2c66affSColin Finck */
6409f86e78d0SEric Kohl CONFIGRET
6410f86e78d0SEric Kohl WINAPI
CM_Open_Class_Key_ExW(_In_opt_ LPGUID pClassGuid,_In_opt_ LPCWSTR pszClassName,_In_ REGSAM samDesired,_In_ REGDISPOSITION Disposition,_Out_ PHKEY phkClass,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)6411f86e78d0SEric Kohl CM_Open_Class_Key_ExW(
6412f86e78d0SEric Kohl _In_opt_ LPGUID pClassGuid,
6413f86e78d0SEric Kohl _In_opt_ LPCWSTR pszClassName,
6414f86e78d0SEric Kohl _In_ REGSAM samDesired,
6415f86e78d0SEric Kohl _In_ REGDISPOSITION Disposition,
6416f86e78d0SEric Kohl _Out_ PHKEY phkClass,
6417f86e78d0SEric Kohl _In_ ULONG ulFlags,
6418f86e78d0SEric Kohl _In_opt_ HMACHINE hMachine)
6419c2c66affSColin Finck {
6420c2c66affSColin Finck WCHAR szKeyName[MAX_PATH];
6421c2c66affSColin Finck LPWSTR lpGuidString;
6422c2c66affSColin Finck DWORD dwDisposition;
6423c2c66affSColin Finck DWORD dwError;
6424c2c66affSColin Finck HKEY hKey;
6425c2c66affSColin Finck
642660a21894SEric Kohl TRACE("CM_Open_Class_Key_ExW(%p %s %lx %lx %p %lx %p)\n",
6427c2c66affSColin Finck debugstr_guid(pClassGuid), debugstr_w(pszClassName),
6428c2c66affSColin Finck samDesired, Disposition, phkClass, ulFlags, hMachine);
6429c2c66affSColin Finck
6430c2c66affSColin Finck /* Check Disposition and ulFlags */
6431c2c66affSColin Finck if ((Disposition & ~RegDisposition_Bits) ||
6432c2c66affSColin Finck (ulFlags & ~CM_OPEN_CLASS_KEY_BITS))
6433c2c66affSColin Finck return CR_INVALID_FLAG;
6434c2c66affSColin Finck
6435c2c66affSColin Finck /* Check phkClass */
6436c2c66affSColin Finck if (phkClass == NULL)
6437c2c66affSColin Finck return CR_INVALID_POINTER;
6438c2c66affSColin Finck
6439c2c66affSColin Finck *phkClass = NULL;
6440c2c66affSColin Finck
6441c2c66affSColin Finck if (ulFlags == CM_OPEN_CLASS_KEY_INTERFACE &&
6442c2c66affSColin Finck pszClassName != NULL)
6443c2c66affSColin Finck return CR_INVALID_DATA;
6444c2c66affSColin Finck
6445c2c66affSColin Finck if (hMachine == NULL)
6446c2c66affSColin Finck {
6447c2c66affSColin Finck hKey = HKEY_LOCAL_MACHINE;
6448c2c66affSColin Finck }
6449c2c66affSColin Finck else
6450c2c66affSColin Finck {
6451c2c66affSColin Finck if (RegConnectRegistryW(((PMACHINE_INFO)hMachine)->szMachineName,
645206f9e122SEric Kohl HKEY_LOCAL_MACHINE,
645306f9e122SEric Kohl &hKey))
6454c2c66affSColin Finck return CR_REGISTRY_ERROR;
6455c2c66affSColin Finck }
6456c2c66affSColin Finck
6457c2c66affSColin Finck if (ulFlags & CM_OPEN_CLASS_KEY_INTERFACE)
6458c2c66affSColin Finck {
6459c2c66affSColin Finck lstrcpyW(szKeyName, DeviceClasses);
6460c2c66affSColin Finck }
6461c2c66affSColin Finck else
6462c2c66affSColin Finck {
6463c2c66affSColin Finck lstrcpyW(szKeyName, ControlClass);
6464c2c66affSColin Finck }
6465c2c66affSColin Finck
6466c2c66affSColin Finck if (pClassGuid != NULL)
6467c2c66affSColin Finck {
6468c2c66affSColin Finck if (UuidToStringW((UUID*)pClassGuid, &lpGuidString) != RPC_S_OK)
6469c2c66affSColin Finck {
6470c2c66affSColin Finck RegCloseKey(hKey);
6471c2c66affSColin Finck return CR_INVALID_DATA;
6472c2c66affSColin Finck }
6473c2c66affSColin Finck
64748da00cd9SHervé Poussineau lstrcatW(szKeyName, BackslashOpenBrace);
6475c2c66affSColin Finck lstrcatW(szKeyName, lpGuidString);
64768da00cd9SHervé Poussineau lstrcatW(szKeyName, CloseBrace);
6477c2c66affSColin Finck }
6478c2c66affSColin Finck
6479c2c66affSColin Finck if (Disposition == RegDisposition_OpenAlways)
6480c2c66affSColin Finck {
6481c2c66affSColin Finck dwError = RegCreateKeyExW(hKey, szKeyName, 0, NULL, 0, samDesired,
6482c2c66affSColin Finck NULL, phkClass, &dwDisposition);
6483c2c66affSColin Finck }
6484c2c66affSColin Finck else
6485c2c66affSColin Finck {
6486c2c66affSColin Finck dwError = RegOpenKeyExW(hKey, szKeyName, 0, samDesired, phkClass);
6487c2c66affSColin Finck }
6488c2c66affSColin Finck
6489c2c66affSColin Finck RegCloseKey(hKey);
6490c2c66affSColin Finck
6491c2c66affSColin Finck if (pClassGuid != NULL)
6492c2c66affSColin Finck RpcStringFreeW(&lpGuidString);
6493c2c66affSColin Finck
6494c2c66affSColin Finck if (dwError != ERROR_SUCCESS)
6495c2c66affSColin Finck {
6496c2c66affSColin Finck *phkClass = NULL;
6497c2c66affSColin Finck return CR_NO_SUCH_REGISTRY_KEY;
6498c2c66affSColin Finck }
6499c2c66affSColin Finck
6500c2c66affSColin Finck if (pszClassName != NULL)
6501c2c66affSColin Finck {
6502c2c66affSColin Finck RegSetValueExW(*phkClass, Class, 0, REG_SZ, (LPBYTE)pszClassName,
6503c2c66affSColin Finck (lstrlenW(pszClassName) + 1) * sizeof(WCHAR));
6504c2c66affSColin Finck }
6505c2c66affSColin Finck
6506c2c66affSColin Finck return CR_SUCCESS;
6507c2c66affSColin Finck }
6508c2c66affSColin Finck
6509c2c66affSColin Finck
6510c2c66affSColin Finck /***********************************************************************
6511c2c66affSColin Finck * CM_Open_DevNode_Key [SETUPAPI.@]
6512c2c66affSColin Finck */
651378cf2a04SEric Kohl CONFIGRET
651478cf2a04SEric Kohl WINAPI
CM_Open_DevNode_Key(_In_ DEVINST dnDevNode,_In_ REGSAM samDesired,_In_ ULONG ulHardwareProfile,_In_ REGDISPOSITION Disposition,_Out_ PHKEY phkDevice,_In_ ULONG ulFlags)651578cf2a04SEric Kohl CM_Open_DevNode_Key(
651678cf2a04SEric Kohl _In_ DEVINST dnDevNode,
651778cf2a04SEric Kohl _In_ REGSAM samDesired,
651878cf2a04SEric Kohl _In_ ULONG ulHardwareProfile,
651978cf2a04SEric Kohl _In_ REGDISPOSITION Disposition,
652078cf2a04SEric Kohl _Out_ PHKEY phkDevice,
652178cf2a04SEric Kohl _In_ ULONG ulFlags)
6522c2c66affSColin Finck {
652378cf2a04SEric Kohl TRACE("CM_Open_DevNode_Key(%lx %lx %lu %lx %p %lx)\n",
652478cf2a04SEric Kohl dnDevNode, samDesired, ulHardwareProfile, Disposition, phkDevice, ulFlags);
652565d3bf74SEric Kohl
6526c2c66affSColin Finck return CM_Open_DevNode_Key_Ex(dnDevNode, samDesired, ulHardwareProfile,
6527c2c66affSColin Finck Disposition, phkDevice, ulFlags, NULL);
6528c2c66affSColin Finck }
6529c2c66affSColin Finck
6530c2c66affSColin Finck
6531c2c66affSColin Finck /***********************************************************************
6532c2c66affSColin Finck * CM_Open_DevNode_Key_Ex [SETUPAPI.@]
6533c2c66affSColin Finck */
653478cf2a04SEric Kohl CONFIGRET
653578cf2a04SEric Kohl WINAPI
CM_Open_DevNode_Key_Ex(_In_ DEVINST dnDevNode,_In_ REGSAM samDesired,_In_ ULONG ulHardwareProfile,_In_ REGDISPOSITION Disposition,_Out_ PHKEY phkDevice,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)653678cf2a04SEric Kohl CM_Open_DevNode_Key_Ex(
653778cf2a04SEric Kohl _In_ DEVINST dnDevNode,
653878cf2a04SEric Kohl _In_ REGSAM samDesired,
653978cf2a04SEric Kohl _In_ ULONG ulHardwareProfile,
654078cf2a04SEric Kohl _In_ REGDISPOSITION Disposition,
654178cf2a04SEric Kohl _Out_ PHKEY phkDevice,
654278cf2a04SEric Kohl _In_ ULONG ulFlags,
6543f86e78d0SEric Kohl _In_opt_ HMACHINE hMachine)
6544c2c66affSColin Finck {
654578cf2a04SEric Kohl RPC_BINDING_HANDLE BindingHandle = NULL;
654678cf2a04SEric Kohl HSTRING_TABLE StringTable = NULL;
654778cf2a04SEric Kohl LPWSTR pszDevInst, pszKeyPath = NULL, pszInstancePath = NULL;
654878cf2a04SEric Kohl LONG lError;
654906f9e122SEric Kohl DWORD dwDisposition;
655006f9e122SEric Kohl HKEY hRootKey = NULL;
655178cf2a04SEric Kohl CONFIGRET ret = CR_CALL_NOT_IMPLEMENTED;
6552c2c66affSColin Finck
655360a21894SEric Kohl TRACE("CM_Open_DevNode_Key_Ex(%lx %lx %lu %lx %p %lx %p)\n",
655478cf2a04SEric Kohl dnDevNode, samDesired, ulHardwareProfile, Disposition, phkDevice, ulFlags, hMachine);
655578cf2a04SEric Kohl
655678cf2a04SEric Kohl if (phkDevice == NULL)
655778cf2a04SEric Kohl return CR_INVALID_POINTER;
655878cf2a04SEric Kohl
655978cf2a04SEric Kohl *phkDevice = NULL;
656078cf2a04SEric Kohl
656178cf2a04SEric Kohl if (dnDevNode == 0)
656278cf2a04SEric Kohl return CR_INVALID_DEVNODE;
656378cf2a04SEric Kohl
656478cf2a04SEric Kohl if (ulFlags & ~CM_REGISTRY_BITS)
656578cf2a04SEric Kohl return CR_INVALID_FLAG;
656678cf2a04SEric Kohl
656778cf2a04SEric Kohl if (Disposition & ~RegDisposition_Bits)
656878cf2a04SEric Kohl return CR_INVALID_DATA;
656978cf2a04SEric Kohl
657078cf2a04SEric Kohl if (hMachine != NULL)
657178cf2a04SEric Kohl {
657278cf2a04SEric Kohl BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
657378cf2a04SEric Kohl if (BindingHandle == NULL)
657478cf2a04SEric Kohl return CR_FAILURE;
657578cf2a04SEric Kohl
657678cf2a04SEric Kohl StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
657778cf2a04SEric Kohl if (StringTable == 0)
657878cf2a04SEric Kohl return CR_FAILURE;
657978cf2a04SEric Kohl }
658078cf2a04SEric Kohl else
658178cf2a04SEric Kohl {
658278cf2a04SEric Kohl if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
658378cf2a04SEric Kohl return CR_FAILURE;
658478cf2a04SEric Kohl }
658578cf2a04SEric Kohl
658678cf2a04SEric Kohl pszDevInst = pSetupStringTableStringFromId(StringTable, dnDevNode);
658778cf2a04SEric Kohl if (pszDevInst == NULL)
658878cf2a04SEric Kohl return CR_INVALID_DEVNODE;
658978cf2a04SEric Kohl
659078cf2a04SEric Kohl TRACE("pszDevInst: %S\n", pszDevInst);
659178cf2a04SEric Kohl
659206f9e122SEric Kohl pszKeyPath = MyMalloc(512 * sizeof(WCHAR));
659378cf2a04SEric Kohl if (pszKeyPath == NULL)
659478cf2a04SEric Kohl {
659578cf2a04SEric Kohl ret = CR_OUT_OF_MEMORY;
659678cf2a04SEric Kohl goto done;
659778cf2a04SEric Kohl }
659878cf2a04SEric Kohl
659906f9e122SEric Kohl pszInstancePath = MyMalloc(512 * sizeof(WCHAR));
660078cf2a04SEric Kohl if (pszInstancePath == NULL)
660178cf2a04SEric Kohl {
660278cf2a04SEric Kohl ret = CR_OUT_OF_MEMORY;
660378cf2a04SEric Kohl goto done;
660478cf2a04SEric Kohl }
660578cf2a04SEric Kohl
660678cf2a04SEric Kohl ret = GetDeviceInstanceKeyPath(BindingHandle,
660778cf2a04SEric Kohl pszDevInst,
660878cf2a04SEric Kohl pszKeyPath,
660978cf2a04SEric Kohl pszInstancePath,
661078cf2a04SEric Kohl ulHardwareProfile,
661178cf2a04SEric Kohl ulFlags);
661278cf2a04SEric Kohl if (ret != CR_SUCCESS)
661378cf2a04SEric Kohl goto done;
661478cf2a04SEric Kohl
6615a2a37239SEric Kohl TRACE("pszKeyPath: %S\n", pszKeyPath);
6616a2a37239SEric Kohl TRACE("pszInstancePath: %S\n", pszInstancePath);
661778cf2a04SEric Kohl
661878cf2a04SEric Kohl wcscat(pszKeyPath, L"\\");
661978cf2a04SEric Kohl wcscat(pszKeyPath, pszInstancePath);
662078cf2a04SEric Kohl
6621a2a37239SEric Kohl TRACE("pszKeyPath: %S\n", pszKeyPath);
662278cf2a04SEric Kohl
662306f9e122SEric Kohl if (hMachine == NULL)
662406f9e122SEric Kohl {
662506f9e122SEric Kohl hRootKey = HKEY_LOCAL_MACHINE;
662606f9e122SEric Kohl }
662706f9e122SEric Kohl else
662806f9e122SEric Kohl {
662906f9e122SEric Kohl if (RegConnectRegistryW(((PMACHINE_INFO)hMachine)->szMachineName,
663006f9e122SEric Kohl HKEY_LOCAL_MACHINE,
663106f9e122SEric Kohl &hRootKey))
663206f9e122SEric Kohl {
663306f9e122SEric Kohl ret = CR_REGISTRY_ERROR;
663406f9e122SEric Kohl goto done;
663506f9e122SEric Kohl }
663606f9e122SEric Kohl }
663778cf2a04SEric Kohl
663806f9e122SEric Kohl if (Disposition == RegDisposition_OpenAlways)
663906f9e122SEric Kohl {
664006f9e122SEric Kohl lError = RegCreateKeyExW(hRootKey,
664106f9e122SEric Kohl pszKeyPath,
664206f9e122SEric Kohl 0,
664306f9e122SEric Kohl NULL,
664406f9e122SEric Kohl 0,
664506f9e122SEric Kohl samDesired,
664606f9e122SEric Kohl NULL,
664706f9e122SEric Kohl phkDevice,
664806f9e122SEric Kohl &dwDisposition);
664906f9e122SEric Kohl }
665006f9e122SEric Kohl else
665106f9e122SEric Kohl {
665206f9e122SEric Kohl lError = RegOpenKeyExW(hRootKey,
665378cf2a04SEric Kohl pszKeyPath,
665478cf2a04SEric Kohl 0,
665578cf2a04SEric Kohl samDesired,
665678cf2a04SEric Kohl phkDevice);
665706f9e122SEric Kohl }
665806f9e122SEric Kohl
665978cf2a04SEric Kohl if (lError != ERROR_SUCCESS)
666078cf2a04SEric Kohl {
666178cf2a04SEric Kohl *phkDevice = NULL;
666278cf2a04SEric Kohl ret = CR_NO_SUCH_REGISTRY_KEY;
666378cf2a04SEric Kohl }
666478cf2a04SEric Kohl
666578cf2a04SEric Kohl done:
666606f9e122SEric Kohl if ((hRootKey != NULL) && (hRootKey != HKEY_LOCAL_MACHINE))
666706f9e122SEric Kohl RegCloseKey(hRootKey);
666806f9e122SEric Kohl
666978cf2a04SEric Kohl if (pszInstancePath != NULL)
667078cf2a04SEric Kohl MyFree(pszInstancePath);
667178cf2a04SEric Kohl
667278cf2a04SEric Kohl if (pszKeyPath != NULL)
667378cf2a04SEric Kohl MyFree(pszKeyPath);
667478cf2a04SEric Kohl
667578cf2a04SEric Kohl return ret;
6676c2c66affSColin Finck }
6677c2c66affSColin Finck
6678c2c66affSColin Finck
6679c2c66affSColin Finck /***********************************************************************
6680c2c66affSColin Finck * CM_Query_And_Remove_SubTreeA [SETUPAPI.@]
6681c2c66affSColin Finck */
668265d3bf74SEric Kohl CONFIGRET
668365d3bf74SEric Kohl WINAPI
CM_Query_And_Remove_SubTreeA(_In_ DEVINST dnAncestor,_Out_opt_ PPNP_VETO_TYPE pVetoType,_Out_writes_opt_ (ulNameLength)LPSTR pszVetoName,_In_ ULONG ulNameLength,_In_ ULONG ulFlags)668465d3bf74SEric Kohl CM_Query_And_Remove_SubTreeA(
668565d3bf74SEric Kohl _In_ DEVINST dnAncestor,
668665d3bf74SEric Kohl _Out_opt_ PPNP_VETO_TYPE pVetoType,
668765d3bf74SEric Kohl _Out_writes_opt_(ulNameLength) LPSTR pszVetoName,
668865d3bf74SEric Kohl _In_ ULONG ulNameLength,
668965d3bf74SEric Kohl _In_ ULONG ulFlags)
6690c2c66affSColin Finck {
6691ab0119c6SThamatip Chitpong TRACE("CM_Query_And_Remove_SubTreeA(%lx %p %p %lu %lx)\n",
669265d3bf74SEric Kohl dnAncestor, pVetoType, pszVetoName, ulNameLength, ulFlags);
6693c2c66affSColin Finck
6694c2c66affSColin Finck return CM_Query_And_Remove_SubTree_ExA(dnAncestor, pVetoType, pszVetoName,
6695c2c66affSColin Finck ulNameLength, ulFlags, NULL);
6696c2c66affSColin Finck }
6697c2c66affSColin Finck
6698c2c66affSColin Finck
6699c2c66affSColin Finck /***********************************************************************
6700c2c66affSColin Finck * CM_Query_And_Remove_SubTreeW [SETUPAPI.@]
6701c2c66affSColin Finck */
670265d3bf74SEric Kohl CONFIGRET
670365d3bf74SEric Kohl WINAPI
CM_Query_And_Remove_SubTreeW(_In_ DEVINST dnAncestor,_Out_opt_ PPNP_VETO_TYPE pVetoType,_Out_writes_opt_ (ulNameLength)LPWSTR pszVetoName,_In_ ULONG ulNameLength,_In_ ULONG ulFlags)670465d3bf74SEric Kohl CM_Query_And_Remove_SubTreeW(
670565d3bf74SEric Kohl _In_ DEVINST dnAncestor,
670665d3bf74SEric Kohl _Out_opt_ PPNP_VETO_TYPE pVetoType,
670765d3bf74SEric Kohl _Out_writes_opt_(ulNameLength) LPWSTR pszVetoName,
670865d3bf74SEric Kohl _In_ ULONG ulNameLength,
670965d3bf74SEric Kohl _In_ ULONG ulFlags)
6710c2c66affSColin Finck {
67115b5aaf66SSerge Gautherie TRACE("CM_Query_And_Remove_SubTreeW(%lx %p %p %lu %lx)\n",
67125b5aaf66SSerge Gautherie dnAncestor, pVetoType, pszVetoName, ulNameLength, ulFlags);
6713c2c66affSColin Finck
6714c2c66affSColin Finck return CM_Query_And_Remove_SubTree_ExW(dnAncestor, pVetoType, pszVetoName,
6715c2c66affSColin Finck ulNameLength, ulFlags, NULL);
6716c2c66affSColin Finck }
6717c2c66affSColin Finck
6718c2c66affSColin Finck
6719c2c66affSColin Finck /***********************************************************************
6720c2c66affSColin Finck * CM_Query_And_Remove_SubTree_ExA [SETUPAPI.@]
6721c2c66affSColin Finck */
672265d3bf74SEric Kohl CONFIGRET
672365d3bf74SEric Kohl WINAPI
CM_Query_And_Remove_SubTree_ExA(_In_ DEVINST dnAncestor,_Out_opt_ PPNP_VETO_TYPE pVetoType,_Out_writes_opt_ (ulNameLength)LPSTR pszVetoName,_In_ ULONG ulNameLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)672465d3bf74SEric Kohl CM_Query_And_Remove_SubTree_ExA(
672565d3bf74SEric Kohl _In_ DEVINST dnAncestor,
672665d3bf74SEric Kohl _Out_opt_ PPNP_VETO_TYPE pVetoType,
672765d3bf74SEric Kohl _Out_writes_opt_(ulNameLength) LPSTR pszVetoName,
672865d3bf74SEric Kohl _In_ ULONG ulNameLength,
672965d3bf74SEric Kohl _In_ ULONG ulFlags,
673065d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
6731c2c66affSColin Finck {
6732c2c66affSColin Finck LPWSTR lpLocalVetoName;
6733c2c66affSColin Finck CONFIGRET ret;
6734c2c66affSColin Finck
67355b5aaf66SSerge Gautherie TRACE("CM_Query_And_Remove_SubTree_ExA(%lx %p %p %lu %lx %p)\n",
67365b5aaf66SSerge Gautherie dnAncestor, pVetoType, pszVetoName, ulNameLength,
673765d3bf74SEric Kohl ulFlags, hMachine);
6738c2c66affSColin Finck
6739c2c66affSColin Finck if (pszVetoName == NULL && ulNameLength == 0)
6740c2c66affSColin Finck return CR_INVALID_POINTER;
6741c2c66affSColin Finck
6742c2c66affSColin Finck lpLocalVetoName = HeapAlloc(GetProcessHeap(), 0, ulNameLength * sizeof(WCHAR));
6743c2c66affSColin Finck if (lpLocalVetoName == NULL)
6744c2c66affSColin Finck return CR_OUT_OF_MEMORY;
6745c2c66affSColin Finck
6746c2c66affSColin Finck ret = CM_Query_And_Remove_SubTree_ExW(dnAncestor, pVetoType, lpLocalVetoName,
6747c2c66affSColin Finck ulNameLength, ulFlags, hMachine);
6748c2c66affSColin Finck if (ret == CR_REMOVE_VETOED)
6749c2c66affSColin Finck {
6750c2c66affSColin Finck if (WideCharToMultiByte(CP_ACP,
6751c2c66affSColin Finck 0,
6752c2c66affSColin Finck lpLocalVetoName,
6753c2c66affSColin Finck ulNameLength,
6754c2c66affSColin Finck pszVetoName,
6755c2c66affSColin Finck ulNameLength,
6756c2c66affSColin Finck NULL,
6757c2c66affSColin Finck NULL) == 0)
6758c2c66affSColin Finck ret = CR_FAILURE;
6759c2c66affSColin Finck }
6760c2c66affSColin Finck
6761c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, lpLocalVetoName);
6762c2c66affSColin Finck
6763c2c66affSColin Finck return ret;
6764c2c66affSColin Finck }
6765c2c66affSColin Finck
6766c2c66affSColin Finck
6767c2c66affSColin Finck /***********************************************************************
6768c2c66affSColin Finck * CM_Query_And_Remove_SubTree_ExW [SETUPAPI.@]
6769c2c66affSColin Finck */
677065d3bf74SEric Kohl CONFIGRET
677165d3bf74SEric Kohl WINAPI
CM_Query_And_Remove_SubTree_ExW(_In_ DEVINST dnAncestor,_Out_opt_ PPNP_VETO_TYPE pVetoType,_Out_writes_opt_ (ulNameLength)LPWSTR pszVetoName,_In_ ULONG ulNameLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)677265d3bf74SEric Kohl CM_Query_And_Remove_SubTree_ExW(
677365d3bf74SEric Kohl _In_ DEVINST dnAncestor,
677465d3bf74SEric Kohl _Out_opt_ PPNP_VETO_TYPE pVetoType,
677565d3bf74SEric Kohl _Out_writes_opt_(ulNameLength) LPWSTR pszVetoName,
677665d3bf74SEric Kohl _In_ ULONG ulNameLength,
677765d3bf74SEric Kohl _In_ ULONG ulFlags,
677865d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
6779c2c66affSColin Finck {
6780c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
6781c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
6782c2c66affSColin Finck LPWSTR lpDevInst;
6783c2c66affSColin Finck CONFIGRET ret;
6784c2c66affSColin Finck
67855b5aaf66SSerge Gautherie TRACE("CM_Query_And_Remove_SubTree_ExW(%lx %p %p %lu %lx %p)\n",
67865b5aaf66SSerge Gautherie dnAncestor, pVetoType, pszVetoName, ulNameLength,
678765d3bf74SEric Kohl ulFlags, hMachine);
6788c2c66affSColin Finck
6789c2c66affSColin Finck if (dnAncestor == 0)
6790c2c66affSColin Finck return CR_INVALID_DEVNODE;
6791c2c66affSColin Finck
6792c2c66affSColin Finck if (ulFlags & ~CM_REMOVE_BITS)
6793c2c66affSColin Finck return CR_INVALID_FLAG;
6794c2c66affSColin Finck
6795c2c66affSColin Finck if (pszVetoName == NULL && ulNameLength == 0)
6796c2c66affSColin Finck return CR_INVALID_POINTER;
6797c2c66affSColin Finck
6798c2c66affSColin Finck if (hMachine != NULL)
6799c2c66affSColin Finck {
6800c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
6801c2c66affSColin Finck if (BindingHandle == NULL)
6802c2c66affSColin Finck return CR_FAILURE;
6803c2c66affSColin Finck
6804c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
6805c2c66affSColin Finck if (StringTable == 0)
6806c2c66affSColin Finck return CR_FAILURE;
6807c2c66affSColin Finck }
6808c2c66affSColin Finck else
6809c2c66affSColin Finck {
6810c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
6811c2c66affSColin Finck return CR_FAILURE;
6812c2c66affSColin Finck }
6813c2c66affSColin Finck
6814c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnAncestor);
6815c2c66affSColin Finck if (lpDevInst == NULL)
6816c2c66affSColin Finck return CR_INVALID_DEVNODE;
6817c2c66affSColin Finck
6818c2c66affSColin Finck RpcTryExcept
6819c2c66affSColin Finck {
6820c2c66affSColin Finck ret = PNP_QueryRemove(BindingHandle,
6821c2c66affSColin Finck lpDevInst,
6822c2c66affSColin Finck pVetoType,
6823c2c66affSColin Finck pszVetoName,
6824c2c66affSColin Finck ulNameLength,
6825c2c66affSColin Finck ulFlags);
6826c2c66affSColin Finck }
6827c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
6828c2c66affSColin Finck {
6829c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
6830c2c66affSColin Finck }
6831c2c66affSColin Finck RpcEndExcept;
6832c2c66affSColin Finck
6833c2c66affSColin Finck return ret;
6834c2c66affSColin Finck }
6835c2c66affSColin Finck
6836c2c66affSColin Finck
6837c2c66affSColin Finck /***********************************************************************
6838c2c66affSColin Finck * CM_Query_Arbitrator_Free_Data [SETUPAPI.@]
6839c2c66affSColin Finck */
684065d3bf74SEric Kohl CONFIGRET
684165d3bf74SEric Kohl WINAPI
CM_Query_Arbitrator_Free_Data(_Out_writes_bytes_ (DataLen)PVOID pData,_In_ ULONG DataLen,_In_ DEVINST dnDevInst,_In_ RESOURCEID ResourceID,_In_ ULONG ulFlags)684265d3bf74SEric Kohl CM_Query_Arbitrator_Free_Data(
684365d3bf74SEric Kohl _Out_writes_bytes_(DataLen) PVOID pData,
684465d3bf74SEric Kohl _In_ ULONG DataLen,
684565d3bf74SEric Kohl _In_ DEVINST dnDevInst,
684665d3bf74SEric Kohl _In_ RESOURCEID ResourceID,
684765d3bf74SEric Kohl _In_ ULONG ulFlags)
6848c2c66affSColin Finck {
684965d3bf74SEric Kohl TRACE("CM_Query_Arbitrator_Free_Data(%p %lu %lx %lu 0x%08lx)\n",
685065d3bf74SEric Kohl pData, DataLen, dnDevInst, ResourceID, ulFlags);
6851c2c66affSColin Finck
6852c2c66affSColin Finck return CM_Query_Arbitrator_Free_Data_Ex(pData, DataLen, dnDevInst,
6853c2c66affSColin Finck ResourceID, ulFlags, NULL);
6854c2c66affSColin Finck }
6855c2c66affSColin Finck
6856c2c66affSColin Finck
6857c2c66affSColin Finck /***********************************************************************
6858c2c66affSColin Finck * CM_Query_Arbitrator_Free_Data_Ex [SETUPAPI.@]
6859c2c66affSColin Finck */
686065d3bf74SEric Kohl CONFIGRET
686165d3bf74SEric Kohl WINAPI
CM_Query_Arbitrator_Free_Data_Ex(_Out_writes_bytes_ (DataLen)PVOID pData,_In_ ULONG DataLen,_In_ DEVINST dnDevInst,_In_ RESOURCEID ResourceID,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)686265d3bf74SEric Kohl CM_Query_Arbitrator_Free_Data_Ex(
686365d3bf74SEric Kohl _Out_writes_bytes_(DataLen) PVOID pData,
686465d3bf74SEric Kohl _In_ ULONG DataLen,
686565d3bf74SEric Kohl _In_ DEVINST dnDevInst,
686665d3bf74SEric Kohl _In_ RESOURCEID ResourceID,
686765d3bf74SEric Kohl _In_ ULONG ulFlags,
686865d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
6869c2c66affSColin Finck {
6870c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
6871c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
6872c2c66affSColin Finck LPWSTR lpDevInst;
6873c2c66affSColin Finck CONFIGRET ret;
6874c2c66affSColin Finck
687565d3bf74SEric Kohl TRACE("CM_Query_Arbitrator_Free_Data_Ex(%p %lu %lx %lu 0x%08lx %p)\n",
687665d3bf74SEric Kohl pData, DataLen, dnDevInst, ResourceID, ulFlags, hMachine);
6877c2c66affSColin Finck
6878c2c66affSColin Finck if (pData == NULL || DataLen == 0)
6879c2c66affSColin Finck return CR_INVALID_POINTER;
6880c2c66affSColin Finck
6881c2c66affSColin Finck if (dnDevInst == 0)
6882c2c66affSColin Finck return CR_INVALID_DEVINST;
6883c2c66affSColin Finck
6884c2c66affSColin Finck if (ulFlags & ~CM_QUERY_ARBITRATOR_BITS)
6885c2c66affSColin Finck return CR_INVALID_FLAG;
6886c2c66affSColin Finck
6887c2c66affSColin Finck if (hMachine != NULL)
6888c2c66affSColin Finck {
6889c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
6890c2c66affSColin Finck if (BindingHandle == NULL)
6891c2c66affSColin Finck return CR_FAILURE;
6892c2c66affSColin Finck
6893c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
6894c2c66affSColin Finck if (StringTable == 0)
6895c2c66affSColin Finck return CR_FAILURE;
6896c2c66affSColin Finck }
6897c2c66affSColin Finck else
6898c2c66affSColin Finck {
6899c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
6900c2c66affSColin Finck return CR_FAILURE;
6901c2c66affSColin Finck }
6902c2c66affSColin Finck
6903c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
6904c2c66affSColin Finck if (lpDevInst == NULL)
6905c2c66affSColin Finck return CR_INVALID_DEVNODE;
6906c2c66affSColin Finck
6907c2c66affSColin Finck RpcTryExcept
6908c2c66affSColin Finck {
6909c2c66affSColin Finck ret = PNP_QueryArbitratorFreeData(BindingHandle,
6910c2c66affSColin Finck pData,
6911c2c66affSColin Finck DataLen,
6912c2c66affSColin Finck lpDevInst,
6913c2c66affSColin Finck ResourceID,
6914c2c66affSColin Finck ulFlags);
6915c2c66affSColin Finck }
6916c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
6917c2c66affSColin Finck {
6918c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
6919c2c66affSColin Finck }
6920c2c66affSColin Finck RpcEndExcept;
6921c2c66affSColin Finck
6922c2c66affSColin Finck return ret;
6923c2c66affSColin Finck }
6924c2c66affSColin Finck
6925c2c66affSColin Finck
6926c2c66affSColin Finck /***********************************************************************
6927c2c66affSColin Finck * CM_Query_Arbitrator_Free_Size [SETUPAPI.@]
6928c2c66affSColin Finck */
692965d3bf74SEric Kohl CONFIGRET
693065d3bf74SEric Kohl WINAPI
CM_Query_Arbitrator_Free_Size(_Out_ PULONG pulSize,_In_ DEVINST dnDevInst,_In_ RESOURCEID ResourceID,_In_ ULONG ulFlags)693165d3bf74SEric Kohl CM_Query_Arbitrator_Free_Size(
693265d3bf74SEric Kohl _Out_ PULONG pulSize,
693365d3bf74SEric Kohl _In_ DEVINST dnDevInst,
693465d3bf74SEric Kohl _In_ RESOURCEID ResourceID,
693565d3bf74SEric Kohl _In_ ULONG ulFlags)
6936c2c66affSColin Finck {
693765d3bf74SEric Kohl TRACE("CM_Query_Arbitrator_Free_Size(%p %lu %lx 0x%08lx)\n",
693865d3bf74SEric Kohl pulSize, dnDevInst,ResourceID, ulFlags);
6939c2c66affSColin Finck
6940c2c66affSColin Finck return CM_Query_Arbitrator_Free_Size_Ex(pulSize, dnDevInst, ResourceID,
6941c2c66affSColin Finck ulFlags, NULL);
6942c2c66affSColin Finck }
6943c2c66affSColin Finck
6944c2c66affSColin Finck
6945c2c66affSColin Finck /***********************************************************************
6946c2c66affSColin Finck * CM_Query_Arbitrator_Free_Size_Ex [SETUPAPI.@]
6947c2c66affSColin Finck */
694865d3bf74SEric Kohl CONFIGRET
694965d3bf74SEric Kohl WINAPI
CM_Query_Arbitrator_Free_Size_Ex(_Out_ PULONG pulSize,_In_ DEVINST dnDevInst,_In_ RESOURCEID ResourceID,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)695065d3bf74SEric Kohl CM_Query_Arbitrator_Free_Size_Ex(
695165d3bf74SEric Kohl _Out_ PULONG pulSize,
695265d3bf74SEric Kohl _In_ DEVINST dnDevInst,
695365d3bf74SEric Kohl _In_ RESOURCEID ResourceID,
695465d3bf74SEric Kohl _In_ ULONG ulFlags,
695565d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
6956c2c66affSColin Finck {
6957c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
6958c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
6959c2c66affSColin Finck LPWSTR lpDevInst;
6960c2c66affSColin Finck CONFIGRET ret;
6961c2c66affSColin Finck
696265d3bf74SEric Kohl TRACE("CM_Query_Arbitrator_Free_Size_Ex(%p %lu %lx 0x%08lx %p)\n",
696365d3bf74SEric Kohl pulSize, dnDevInst,ResourceID, ulFlags, hMachine);
6964c2c66affSColin Finck
6965c2c66affSColin Finck if (pulSize == NULL)
6966c2c66affSColin Finck return CR_INVALID_POINTER;
6967c2c66affSColin Finck
6968c2c66affSColin Finck if (dnDevInst == 0)
6969c2c66affSColin Finck return CR_INVALID_DEVINST;
6970c2c66affSColin Finck
6971c2c66affSColin Finck if (ulFlags & ~CM_QUERY_ARBITRATOR_BITS)
6972c2c66affSColin Finck return CR_INVALID_FLAG;
6973c2c66affSColin Finck
6974c2c66affSColin Finck if (hMachine != NULL)
6975c2c66affSColin Finck {
6976c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
6977c2c66affSColin Finck if (BindingHandle == NULL)
6978c2c66affSColin Finck return CR_FAILURE;
6979c2c66affSColin Finck
6980c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
6981c2c66affSColin Finck if (StringTable == 0)
6982c2c66affSColin Finck return CR_FAILURE;
6983c2c66affSColin Finck }
6984c2c66affSColin Finck else
6985c2c66affSColin Finck {
6986c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
6987c2c66affSColin Finck return CR_FAILURE;
6988c2c66affSColin Finck }
6989c2c66affSColin Finck
6990c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
6991c2c66affSColin Finck if (lpDevInst == NULL)
6992c2c66affSColin Finck return CR_INVALID_DEVNODE;
6993c2c66affSColin Finck
6994c2c66affSColin Finck RpcTryExcept
6995c2c66affSColin Finck {
6996c2c66affSColin Finck ret = PNP_QueryArbitratorFreeSize(BindingHandle,
6997c2c66affSColin Finck pulSize,
6998c2c66affSColin Finck lpDevInst,
6999c2c66affSColin Finck ResourceID,
7000c2c66affSColin Finck ulFlags);
7001c2c66affSColin Finck }
7002c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
7003c2c66affSColin Finck {
7004c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
7005c2c66affSColin Finck }
7006c2c66affSColin Finck RpcEndExcept;
7007c2c66affSColin Finck
7008c2c66affSColin Finck return ret;
7009c2c66affSColin Finck }
7010c2c66affSColin Finck
7011c2c66affSColin Finck
7012c2c66affSColin Finck /***********************************************************************
7013c2c66affSColin Finck * CM_Query_Remove_SubTree [SETUPAPI.@]
7014c2c66affSColin Finck *
7015c2c66affSColin Finck * This function is obsolete in Windows XP and above.
7016c2c66affSColin Finck */
701765d3bf74SEric Kohl CONFIGRET
701865d3bf74SEric Kohl WINAPI
CM_Query_Remove_SubTree(_In_ DEVINST dnAncestor,_In_ ULONG ulFlags)701965d3bf74SEric Kohl CM_Query_Remove_SubTree(
702065d3bf74SEric Kohl _In_ DEVINST dnAncestor,
702165d3bf74SEric Kohl _In_ ULONG ulFlags)
7022c2c66affSColin Finck {
702365d3bf74SEric Kohl TRACE("CM_Query_Remove_SubTree(%lx %lx)\n",
702465d3bf74SEric Kohl dnAncestor, ulFlags);
702565d3bf74SEric Kohl
7026c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
7027c2c66affSColin Finck }
7028c2c66affSColin Finck
7029c2c66affSColin Finck
7030c2c66affSColin Finck /***********************************************************************
7031c2c66affSColin Finck * CM_Query_Remove_SubTree_Ex [SETUPAPI.@]
7032c2c66affSColin Finck *
7033c2c66affSColin Finck * This function is obsolete in Windows XP and above.
7034c2c66affSColin Finck */
703565d3bf74SEric Kohl CONFIGRET
703665d3bf74SEric Kohl WINAPI
CM_Query_Remove_SubTree_Ex(_In_ DEVINST dnAncestor,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)703765d3bf74SEric Kohl CM_Query_Remove_SubTree_Ex(
703865d3bf74SEric Kohl _In_ DEVINST dnAncestor,
703965d3bf74SEric Kohl _In_ ULONG ulFlags,
704065d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
7041c2c66affSColin Finck {
704260a21894SEric Kohl TRACE("CM_Query_Remove_SubTree_Ex(%lx %lx %p)\n",
704365d3bf74SEric Kohl dnAncestor, ulFlags, hMachine);
704465d3bf74SEric Kohl
7045c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
7046c2c66affSColin Finck }
7047c2c66affSColin Finck
7048c2c66affSColin Finck
7049c2c66affSColin Finck /***********************************************************************
7050d7e40954SEric Kohl * CM_Query_Resource_Conflict_List [SETUPAPI.@]
7051d7e40954SEric Kohl */
7052d7e40954SEric Kohl CONFIGRET
7053d7e40954SEric Kohl WINAPI
CM_Query_Resource_Conflict_List(_Out_ PCONFLICT_LIST pclConflictList,_In_ DEVINST dnDevInst,_In_ RESOURCEID ResourceID,_In_ PCVOID ResourceData,_In_ ULONG ResourceLen,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)7054d7e40954SEric Kohl CM_Query_Resource_Conflict_List(
7055d7e40954SEric Kohl _Out_ PCONFLICT_LIST pclConflictList,
7056d7e40954SEric Kohl _In_ DEVINST dnDevInst,
7057d7e40954SEric Kohl _In_ RESOURCEID ResourceID,
7058d7e40954SEric Kohl _In_ PCVOID ResourceData,
7059d7e40954SEric Kohl _In_ ULONG ResourceLen,
7060d7e40954SEric Kohl _In_ ULONG ulFlags,
7061d7e40954SEric Kohl _In_opt_ HMACHINE hMachine)
7062d7e40954SEric Kohl {
7063cee1817eSEric Kohl RPC_BINDING_HANDLE BindingHandle = NULL;
7064cee1817eSEric Kohl HSTRING_TABLE StringTable = NULL;
7065cee1817eSEric Kohl PPNP_CONFLICT_LIST pConflictBuffer = NULL;
7066cee1817eSEric Kohl PCONFLICT_DATA pConflictData = NULL;
7067cee1817eSEric Kohl ULONG ulBufferLength;
7068cee1817eSEric Kohl LPWSTR lpDevInst;
7069cee1817eSEric Kohl CONFIGRET ret;
7070cee1817eSEric Kohl
7071d7e40954SEric Kohl FIXME("CM_Query_Resource_Conflict_List(%p %lx %lu %p %lu %lx %p)\n",
7072d7e40954SEric Kohl pclConflictList, dnDevInst, ResourceID, ResourceData,
7073d7e40954SEric Kohl ResourceLen, ulFlags, hMachine);
7074d7e40954SEric Kohl
7075cee1817eSEric Kohl if (dnDevInst == 0)
7076cee1817eSEric Kohl return CR_INVALID_DEVNODE;
7077cee1817eSEric Kohl
7078cee1817eSEric Kohl if (ulFlags & ~CM_RESDES_WIDTH_BITS)
7079cee1817eSEric Kohl return CR_INVALID_FLAG;
7080cee1817eSEric Kohl
7081cee1817eSEric Kohl if (pclConflictList == NULL ||
7082cee1817eSEric Kohl ResourceData == NULL ||
7083cee1817eSEric Kohl ResourceLen == 0)
7084cee1817eSEric Kohl return CR_INVALID_POINTER;
7085cee1817eSEric Kohl
7086cee1817eSEric Kohl if (ResourceID == 0)
7087cee1817eSEric Kohl return CR_INVALID_RESOURCEID;
7088cee1817eSEric Kohl
7089cee1817eSEric Kohl *pclConflictList = 0;
7090cee1817eSEric Kohl
7091cee1817eSEric Kohl if (hMachine != NULL)
7092cee1817eSEric Kohl {
7093cee1817eSEric Kohl BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
7094cee1817eSEric Kohl if (BindingHandle == NULL)
7095cee1817eSEric Kohl return CR_FAILURE;
7096cee1817eSEric Kohl
7097cee1817eSEric Kohl StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
7098cee1817eSEric Kohl if (StringTable == 0)
7099cee1817eSEric Kohl return CR_FAILURE;
7100cee1817eSEric Kohl }
7101cee1817eSEric Kohl else
7102cee1817eSEric Kohl {
7103cee1817eSEric Kohl if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
7104cee1817eSEric Kohl return CR_FAILURE;
7105cee1817eSEric Kohl }
7106cee1817eSEric Kohl
7107cee1817eSEric Kohl lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
7108cee1817eSEric Kohl if (lpDevInst == NULL)
7109cee1817eSEric Kohl return CR_INVALID_DEVNODE;
7110cee1817eSEric Kohl
7111b13990bdSSerge Gautherie pConflictData = MyMalloc(sizeof(CONFLICT_DATA));
7112cee1817eSEric Kohl if (pConflictData == NULL)
7113cee1817eSEric Kohl {
7114cee1817eSEric Kohl ret = CR_OUT_OF_MEMORY;
7115cee1817eSEric Kohl goto done;
7116cee1817eSEric Kohl }
7117cee1817eSEric Kohl
7118cee1817eSEric Kohl ulBufferLength = sizeof(PNP_CONFLICT_LIST) +
7119cee1817eSEric Kohl sizeof(PNP_CONFLICT_STRINGS) +
7120cee1817eSEric Kohl (sizeof(wchar_t) * 200);
7121cee1817eSEric Kohl pConflictBuffer = MyMalloc(ulBufferLength);
7122cee1817eSEric Kohl if (pConflictBuffer == NULL)
7123cee1817eSEric Kohl {
7124cee1817eSEric Kohl ret = CR_OUT_OF_MEMORY;
7125cee1817eSEric Kohl goto done;
7126cee1817eSEric Kohl }
7127cee1817eSEric Kohl
7128cee1817eSEric Kohl RpcTryExcept
7129cee1817eSEric Kohl {
7130cee1817eSEric Kohl ret = PNP_QueryResConfList(BindingHandle,
7131cee1817eSEric Kohl lpDevInst,
7132cee1817eSEric Kohl ResourceID,
7133cee1817eSEric Kohl (PBYTE)ResourceData,
7134cee1817eSEric Kohl ResourceLen,
7135cee1817eSEric Kohl (PBYTE)pConflictBuffer,
7136cee1817eSEric Kohl ulBufferLength,
7137cee1817eSEric Kohl ulFlags);
7138cee1817eSEric Kohl }
7139cee1817eSEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER)
7140cee1817eSEric Kohl {
7141cee1817eSEric Kohl ret = RpcStatusToCmStatus(RpcExceptionCode());
7142cee1817eSEric Kohl }
7143cee1817eSEric Kohl RpcEndExcept;
7144cee1817eSEric Kohl
7145cee1817eSEric Kohl if (ret != CR_SUCCESS)
7146cee1817eSEric Kohl goto done;
7147cee1817eSEric Kohl
7148cee1817eSEric Kohl pConflictData->ulMagic = CONFLICT_MAGIC;
7149cee1817eSEric Kohl pConflictData->pConflictList = pConflictBuffer;
7150cee1817eSEric Kohl
7151cee1817eSEric Kohl *pclConflictList = (CONFLICT_LIST)pConflictData;
7152cee1817eSEric Kohl
7153cee1817eSEric Kohl done:
7154cee1817eSEric Kohl if (ret != CR_SUCCESS)
7155cee1817eSEric Kohl {
7156cee1817eSEric Kohl if (pConflictBuffer != NULL)
7157cee1817eSEric Kohl MyFree(pConflictBuffer);
7158cee1817eSEric Kohl
7159cee1817eSEric Kohl if (pConflictData != NULL)
7160cee1817eSEric Kohl MyFree(pConflictData);
7161cee1817eSEric Kohl }
7162cee1817eSEric Kohl
7163cee1817eSEric Kohl return ret;
7164d7e40954SEric Kohl }
7165d7e40954SEric Kohl
7166d7e40954SEric Kohl
7167d7e40954SEric Kohl /***********************************************************************
7168c2c66affSColin Finck * CM_Reenumerate_DevNode [SETUPAPI.@]
7169c2c66affSColin Finck */
717065d3bf74SEric Kohl CONFIGRET
717165d3bf74SEric Kohl WINAPI
CM_Reenumerate_DevNode(_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)717265d3bf74SEric Kohl CM_Reenumerate_DevNode(
717365d3bf74SEric Kohl _In_ DEVINST dnDevInst,
717465d3bf74SEric Kohl _In_ ULONG ulFlags)
7175c2c66affSColin Finck {
717665d3bf74SEric Kohl TRACE("CM_Reenumerate_DevNode(%lx %lx)\n",
717765d3bf74SEric Kohl dnDevInst, ulFlags);
717865d3bf74SEric Kohl
7179c2c66affSColin Finck return CM_Reenumerate_DevNode_Ex(dnDevInst, ulFlags, NULL);
7180c2c66affSColin Finck }
7181c2c66affSColin Finck
7182c2c66affSColin Finck
7183c2c66affSColin Finck /***********************************************************************
7184c2c66affSColin Finck * CM_Reenumerate_DevNode_Ex [SETUPAPI.@]
7185c2c66affSColin Finck */
7186c2c66affSColin Finck CONFIGRET WINAPI
CM_Reenumerate_DevNode_Ex(_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)7187c2c66affSColin Finck CM_Reenumerate_DevNode_Ex(
7188c7fc2ef4SEric Kohl _In_ DEVINST dnDevInst,
7189c7fc2ef4SEric Kohl _In_ ULONG ulFlags,
719065d3bf74SEric Kohl _In_opt_ HMACHINE hMachine)
7191c2c66affSColin Finck {
7192c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
7193c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
7194c2c66affSColin Finck LPWSTR lpDevInst;
7195c2c66affSColin Finck CONFIGRET ret;
7196c2c66affSColin Finck
719760a21894SEric Kohl FIXME("CM_Reenumerate_DevNode_Ex(%lx %lx %p)\n",
719865d3bf74SEric Kohl dnDevInst, ulFlags, hMachine);
7199c2c66affSColin Finck
7200c2c66affSColin Finck if (dnDevInst == 0)
7201c2c66affSColin Finck return CR_INVALID_DEVNODE;
7202c2c66affSColin Finck
7203c2c66affSColin Finck if (ulFlags & ~CM_REENUMERATE_BITS)
7204c2c66affSColin Finck return CR_INVALID_FLAG;
7205c2c66affSColin Finck
7206c2c66affSColin Finck if (hMachine != NULL)
7207c2c66affSColin Finck {
7208c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
7209c2c66affSColin Finck if (BindingHandle == NULL)
7210c2c66affSColin Finck return CR_FAILURE;
7211c2c66affSColin Finck
7212c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
7213c2c66affSColin Finck if (StringTable == 0)
7214c2c66affSColin Finck return CR_FAILURE;
7215c2c66affSColin Finck }
7216c2c66affSColin Finck else
7217c2c66affSColin Finck {
7218c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
7219c2c66affSColin Finck return CR_FAILURE;
7220c2c66affSColin Finck }
7221c2c66affSColin Finck
7222c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
7223c2c66affSColin Finck if (lpDevInst == NULL)
7224c2c66affSColin Finck return CR_INVALID_DEVNODE;
7225c2c66affSColin Finck
7226c2c66affSColin Finck RpcTryExcept
7227c2c66affSColin Finck {
7228c2c66affSColin Finck ret = PNP_DeviceInstanceAction(BindingHandle,
7229c2c66affSColin Finck PNP_DEVINST_REENUMERATE,
7230c2c66affSColin Finck ulFlags,
7231c2c66affSColin Finck lpDevInst,
7232c2c66affSColin Finck NULL);
7233c2c66affSColin Finck }
7234c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
7235c2c66affSColin Finck {
7236c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
7237c2c66affSColin Finck }
7238c2c66affSColin Finck RpcEndExcept;
7239c2c66affSColin Finck
7240c2c66affSColin Finck return ret;
7241c2c66affSColin Finck }
7242c2c66affSColin Finck
7243c2c66affSColin Finck
7244c2c66affSColin Finck /***********************************************************************
724560a21894SEric Kohl * CM_Register_Device_Driver [SETUPAPI.@]
724660a21894SEric Kohl */
724760a21894SEric Kohl CONFIGRET
724860a21894SEric Kohl WINAPI
CM_Register_Device_Driver(_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)724960a21894SEric Kohl CM_Register_Device_Driver(
725060a21894SEric Kohl _In_ DEVINST dnDevInst,
725160a21894SEric Kohl _In_ ULONG ulFlags)
725260a21894SEric Kohl {
725360a21894SEric Kohl TRACE("CM_Register_Device_Driver(%lx 0x%08lx)\n",
725460a21894SEric Kohl dnDevInst, ulFlags);
725560a21894SEric Kohl
725660a21894SEric Kohl return CM_Register_Device_Driver_Ex(dnDevInst, ulFlags, NULL);
725760a21894SEric Kohl }
725860a21894SEric Kohl
725960a21894SEric Kohl
726060a21894SEric Kohl /***********************************************************************
726160a21894SEric Kohl * CM_Register_Device_Driver_Ex [SETUPAPI.@]
726260a21894SEric Kohl */
726360a21894SEric Kohl CONFIGRET
726460a21894SEric Kohl WINAPI
CM_Register_Device_Driver_Ex(_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)726560a21894SEric Kohl CM_Register_Device_Driver_Ex(
726660a21894SEric Kohl _In_ DEVINST dnDevInst,
726760a21894SEric Kohl _In_ ULONG ulFlags,
726860a21894SEric Kohl _In_opt_ HMACHINE hMachine)
726960a21894SEric Kohl {
727060a21894SEric Kohl RPC_BINDING_HANDLE BindingHandle = NULL;
727160a21894SEric Kohl HSTRING_TABLE StringTable = NULL;
727260a21894SEric Kohl LPWSTR lpDevInst;
727360a21894SEric Kohl CONFIGRET ret;
727460a21894SEric Kohl
727560a21894SEric Kohl TRACE("CM_Register_Device_Driver_Ex(%lx 0x%08lx %p)\n",
727660a21894SEric Kohl dnDevInst, ulFlags, hMachine);
727760a21894SEric Kohl
727860a21894SEric Kohl if (dnDevInst == 0)
727960a21894SEric Kohl return CR_INVALID_DEVNODE;
728060a21894SEric Kohl
728160a21894SEric Kohl if (ulFlags & ~CM_REGISTER_DEVICE_DRIVER_BITS)
728260a21894SEric Kohl return CR_INVALID_FLAG;
728360a21894SEric Kohl
728460a21894SEric Kohl if (hMachine != NULL)
728560a21894SEric Kohl {
728660a21894SEric Kohl BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
728760a21894SEric Kohl if (BindingHandle == NULL)
728860a21894SEric Kohl return CR_FAILURE;
728960a21894SEric Kohl
729060a21894SEric Kohl StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
729160a21894SEric Kohl if (StringTable == 0)
729260a21894SEric Kohl return CR_FAILURE;
729360a21894SEric Kohl }
729460a21894SEric Kohl else
729560a21894SEric Kohl {
729660a21894SEric Kohl if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
729760a21894SEric Kohl return CR_FAILURE;
729860a21894SEric Kohl }
729960a21894SEric Kohl
730060a21894SEric Kohl lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
730160a21894SEric Kohl if (lpDevInst == NULL)
730260a21894SEric Kohl return CR_INVALID_DEVNODE;
730360a21894SEric Kohl
730460a21894SEric Kohl RpcTryExcept
730560a21894SEric Kohl {
730660a21894SEric Kohl ret = PNP_RegisterDriver(BindingHandle,
730760a21894SEric Kohl lpDevInst,
730860a21894SEric Kohl ulFlags);
730960a21894SEric Kohl }
731060a21894SEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER)
731160a21894SEric Kohl {
731260a21894SEric Kohl ret = RpcStatusToCmStatus(RpcExceptionCode());
731360a21894SEric Kohl }
731460a21894SEric Kohl RpcEndExcept;
731560a21894SEric Kohl
731660a21894SEric Kohl return ret;
731760a21894SEric Kohl }
731860a21894SEric Kohl
731960a21894SEric Kohl
732060a21894SEric Kohl /***********************************************************************
7321c2c66affSColin Finck * CM_Register_Device_InterfaceA [SETUPAPI.@]
7322c2c66affSColin Finck */
732360a21894SEric Kohl CONFIGRET
732460a21894SEric Kohl WINAPI
CM_Register_Device_InterfaceA(_In_ DEVINST dnDevInst,_In_ LPGUID InterfaceClassGuid,_In_opt_ LPCSTR pszReference,_Out_writes_ (* pulLength)LPSTR pszDeviceInterface,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)732560a21894SEric Kohl CM_Register_Device_InterfaceA(
732660a21894SEric Kohl _In_ DEVINST dnDevInst,
732760a21894SEric Kohl _In_ LPGUID InterfaceClassGuid,
732860a21894SEric Kohl _In_opt_ LPCSTR pszReference,
732960a21894SEric Kohl _Out_writes_(*pulLength) LPSTR pszDeviceInterface,
733060a21894SEric Kohl _Inout_ PULONG pulLength,
733160a21894SEric Kohl _In_ ULONG ulFlags)
7332c2c66affSColin Finck {
733360a21894SEric Kohl TRACE("CM_Register_Device_InterfaceA(%lx %s %s %p %p %lx)\n",
733460a21894SEric Kohl dnDevInst, debugstr_guid(InterfaceClassGuid),
7335c2c66affSColin Finck pszReference, pszDeviceInterface, pulLength, ulFlags);
7336c2c66affSColin Finck
7337c2c66affSColin Finck return CM_Register_Device_Interface_ExA(dnDevInst, InterfaceClassGuid,
7338c2c66affSColin Finck pszReference, pszDeviceInterface,
7339c2c66affSColin Finck pulLength, ulFlags, NULL);
7340c2c66affSColin Finck }
7341c2c66affSColin Finck
7342c2c66affSColin Finck
7343c2c66affSColin Finck /***********************************************************************
7344c2c66affSColin Finck * CM_Register_Device_InterfaceW [SETUPAPI.@]
7345c2c66affSColin Finck */
734660a21894SEric Kohl CONFIGRET
734760a21894SEric Kohl WINAPI
CM_Register_Device_InterfaceW(_In_ DEVINST dnDevInst,_In_ LPGUID InterfaceClassGuid,_In_opt_ LPCWSTR pszReference,_Out_writes_ (* pulLength)LPWSTR pszDeviceInterface,_Inout_ PULONG pulLength,_In_ ULONG ulFlags)734860a21894SEric Kohl CM_Register_Device_InterfaceW(
734960a21894SEric Kohl _In_ DEVINST dnDevInst,
735060a21894SEric Kohl _In_ LPGUID InterfaceClassGuid,
735160a21894SEric Kohl _In_opt_ LPCWSTR pszReference,
735260a21894SEric Kohl _Out_writes_(*pulLength) LPWSTR pszDeviceInterface,
735360a21894SEric Kohl _Inout_ PULONG pulLength,
735460a21894SEric Kohl _In_ ULONG ulFlags)
7355c2c66affSColin Finck {
735660a21894SEric Kohl TRACE("CM_Register_Device_InterfaceW(%lx %s %s %p %p %lx)\n",
735760a21894SEric Kohl dnDevInst, debugstr_guid(InterfaceClassGuid),
7358c2c66affSColin Finck debugstr_w(pszReference), pszDeviceInterface, pulLength, ulFlags);
7359c2c66affSColin Finck
7360c2c66affSColin Finck return CM_Register_Device_Interface_ExW(dnDevInst, InterfaceClassGuid,
7361c2c66affSColin Finck pszReference, pszDeviceInterface,
7362c2c66affSColin Finck pulLength, ulFlags, NULL);
7363c2c66affSColin Finck }
7364c2c66affSColin Finck
7365c2c66affSColin Finck
7366c2c66affSColin Finck /***********************************************************************
7367c2c66affSColin Finck * CM_Register_Device_Interface_ExA [SETUPAPI.@]
7368c2c66affSColin Finck */
736960a21894SEric Kohl CONFIGRET
737060a21894SEric Kohl WINAPI
CM_Register_Device_Interface_ExA(_In_ DEVINST dnDevInst,_In_ LPGUID InterfaceClassGuid,_In_opt_ LPCSTR pszReference,_Out_writes_ (* pulLength)LPSTR pszDeviceInterface,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)737160a21894SEric Kohl CM_Register_Device_Interface_ExA(
737260a21894SEric Kohl _In_ DEVINST dnDevInst,
737360a21894SEric Kohl _In_ LPGUID InterfaceClassGuid,
737460a21894SEric Kohl _In_opt_ LPCSTR pszReference,
737560a21894SEric Kohl _Out_writes_(*pulLength) LPSTR pszDeviceInterface,
737660a21894SEric Kohl _Inout_ PULONG pulLength,
737760a21894SEric Kohl _In_ ULONG ulFlags,
737860a21894SEric Kohl _In_opt_ HMACHINE hMachine)
7379c2c66affSColin Finck {
7380c2c66affSColin Finck LPWSTR pszReferenceW = NULL;
73818943354dSSerge Gautherie LPWSTR pszDeviceInterfaceW;
7382c2c66affSColin Finck ULONG ulLength;
7383c2c66affSColin Finck CONFIGRET ret;
7384c2c66affSColin Finck
738560a21894SEric Kohl TRACE("CM_Register_Device_Interface_ExA(%lx %s %s %p %p %lx %p)\n",
738660a21894SEric Kohl dnDevInst, debugstr_guid(InterfaceClassGuid), debugstr_a(pszReference),
738760a21894SEric Kohl pszDeviceInterface, pulLength, ulFlags, hMachine);
7388c2c66affSColin Finck
7389c2c66affSColin Finck if (pulLength == NULL || pszDeviceInterface == NULL)
7390c2c66affSColin Finck return CR_INVALID_POINTER;
7391c2c66affSColin Finck
7392c2c66affSColin Finck if (pszReference != NULL)
7393c2c66affSColin Finck {
7394c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(pszReference, &pszReferenceW))
7395c2c66affSColin Finck return CR_INVALID_DATA;
7396c2c66affSColin Finck }
7397c2c66affSColin Finck
7398c2c66affSColin Finck ulLength = *pulLength;
7399c2c66affSColin Finck
7400c2c66affSColin Finck pszDeviceInterfaceW = HeapAlloc(GetProcessHeap(), 0, ulLength * sizeof(WCHAR));
7401c2c66affSColin Finck if (pszDeviceInterfaceW == NULL)
7402c2c66affSColin Finck {
7403c2c66affSColin Finck ret = CR_OUT_OF_MEMORY;
7404c2c66affSColin Finck goto Done;
7405c2c66affSColin Finck }
7406c2c66affSColin Finck
7407c2c66affSColin Finck ret = CM_Register_Device_Interface_ExW(dnDevInst,
7408c2c66affSColin Finck InterfaceClassGuid,
7409c2c66affSColin Finck pszReferenceW,
7410c2c66affSColin Finck pszDeviceInterfaceW,
7411c2c66affSColin Finck &ulLength,
7412c2c66affSColin Finck ulFlags,
7413c2c66affSColin Finck hMachine);
7414c2c66affSColin Finck if (ret == CR_SUCCESS)
7415c2c66affSColin Finck {
7416c2c66affSColin Finck if (WideCharToMultiByte(CP_ACP,
7417c2c66affSColin Finck 0,
7418c2c66affSColin Finck pszDeviceInterfaceW,
7419c2c66affSColin Finck ulLength,
7420c2c66affSColin Finck pszDeviceInterface,
7421c2c66affSColin Finck *pulLength,
7422c2c66affSColin Finck NULL,
7423c2c66affSColin Finck NULL) == 0)
7424c2c66affSColin Finck ret = CR_FAILURE;
7425c2c66affSColin Finck }
7426c2c66affSColin Finck
7427c2c66affSColin Finck *pulLength = ulLength;
7428c2c66affSColin Finck
7429c2c66affSColin Finck Done:
7430c2c66affSColin Finck if (pszDeviceInterfaceW != NULL)
7431c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, pszDeviceInterfaceW);
7432c2c66affSColin Finck
7433c2c66affSColin Finck if (pszReferenceW != NULL)
7434c2c66affSColin Finck MyFree(pszReferenceW);
7435c2c66affSColin Finck
7436c2c66affSColin Finck return ret;
7437c2c66affSColin Finck }
7438c2c66affSColin Finck
7439c2c66affSColin Finck
7440c2c66affSColin Finck /***********************************************************************
7441c2c66affSColin Finck * CM_Register_Device_Interface_ExW [SETUPAPI.@]
7442c2c66affSColin Finck */
744360a21894SEric Kohl CONFIGRET
744460a21894SEric Kohl WINAPI
CM_Register_Device_Interface_ExW(_In_ DEVINST dnDevInst,_In_ LPGUID InterfaceClassGuid,_In_opt_ LPCWSTR pszReference,_Out_writes_ (* pulLength)LPWSTR pszDeviceInterface,_Inout_ PULONG pulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)744560a21894SEric Kohl CM_Register_Device_Interface_ExW(
744660a21894SEric Kohl _In_ DEVINST dnDevInst,
744760a21894SEric Kohl _In_ LPGUID InterfaceClassGuid,
744860a21894SEric Kohl _In_opt_ LPCWSTR pszReference,
744960a21894SEric Kohl _Out_writes_(*pulLength) LPWSTR pszDeviceInterface,
745060a21894SEric Kohl _Inout_ PULONG pulLength,
745160a21894SEric Kohl _In_ ULONG ulFlags,
745260a21894SEric Kohl _In_opt_ HMACHINE hMachine)
7453c2c66affSColin Finck {
7454c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
7455c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
7456c2c66affSColin Finck LPWSTR lpDevInst;
7457c2c66affSColin Finck ULONG ulTransferLength;
7458c2c66affSColin Finck CONFIGRET ret;
7459c2c66affSColin Finck
746060a21894SEric Kohl TRACE("CM_Register_Device_Interface_ExW(%lx %s %s %p %p %lx %p)\n",
746160a21894SEric Kohl dnDevInst, debugstr_guid(InterfaceClassGuid), debugstr_w(pszReference),
746260a21894SEric Kohl pszDeviceInterface, pulLength, ulFlags, hMachine);
7463c2c66affSColin Finck
7464c2c66affSColin Finck if (dnDevInst == 0)
7465c2c66affSColin Finck return CR_INVALID_DEVNODE;
7466c2c66affSColin Finck
7467c2c66affSColin Finck if (InterfaceClassGuid == NULL ||
7468c2c66affSColin Finck pszDeviceInterface == NULL ||
7469c2c66affSColin Finck pulLength == NULL)
7470c2c66affSColin Finck return CR_INVALID_POINTER;
7471c2c66affSColin Finck
7472c2c66affSColin Finck if (ulFlags != 0)
7473c2c66affSColin Finck return CR_INVALID_FLAG;
7474c2c66affSColin Finck
7475c2c66affSColin Finck if (hMachine != NULL)
7476c2c66affSColin Finck {
7477c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
7478c2c66affSColin Finck if (BindingHandle == NULL)
7479c2c66affSColin Finck return CR_FAILURE;
7480c2c66affSColin Finck
7481c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
7482c2c66affSColin Finck if (StringTable == 0)
7483c2c66affSColin Finck return CR_FAILURE;
7484c2c66affSColin Finck }
7485c2c66affSColin Finck else
7486c2c66affSColin Finck {
7487c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
7488c2c66affSColin Finck return CR_FAILURE;
7489c2c66affSColin Finck }
7490c2c66affSColin Finck
7491c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
7492c2c66affSColin Finck if (lpDevInst == NULL)
7493c2c66affSColin Finck return CR_INVALID_DEVNODE;
7494c2c66affSColin Finck
7495c2c66affSColin Finck ulTransferLength = *pulLength;
7496c2c66affSColin Finck
7497c2c66affSColin Finck RpcTryExcept
7498c2c66affSColin Finck {
7499c2c66affSColin Finck ret = PNP_RegisterDeviceClassAssociation(BindingHandle,
7500c2c66affSColin Finck lpDevInst,
7501c2c66affSColin Finck InterfaceClassGuid,
7502c2c66affSColin Finck (LPWSTR)pszReference,
7503c2c66affSColin Finck pszDeviceInterface,
7504c2c66affSColin Finck pulLength,
7505c2c66affSColin Finck &ulTransferLength,
7506c2c66affSColin Finck 0);
7507c2c66affSColin Finck }
7508c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
7509c2c66affSColin Finck {
7510c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
7511c2c66affSColin Finck }
7512c2c66affSColin Finck RpcEndExcept;
7513c2c66affSColin Finck
7514c2c66affSColin Finck return ret;
7515c2c66affSColin Finck }
7516c2c66affSColin Finck
7517c2c66affSColin Finck
7518c2c66affSColin Finck /***********************************************************************
7519c2c66affSColin Finck * CM_Remove_SubTree [SETUPAPI.@]
7520c2c66affSColin Finck *
7521c2c66affSColin Finck * This function is obsolete in Windows XP and above.
7522c2c66affSColin Finck */
752360a21894SEric Kohl CONFIGRET
752460a21894SEric Kohl WINAPI
CM_Remove_SubTree(_In_ DEVINST dnAncestor,_In_ ULONG ulFlags)752560a21894SEric Kohl CM_Remove_SubTree(
752660a21894SEric Kohl _In_ DEVINST dnAncestor,
752760a21894SEric Kohl _In_ ULONG ulFlags)
7528c2c66affSColin Finck {
752960a21894SEric Kohl TRACE("CM_Remove_SubTree(%lx %lx)\n",
753060a21894SEric Kohl dnAncestor, ulFlags);
753160a21894SEric Kohl
7532c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
7533c2c66affSColin Finck }
7534c2c66affSColin Finck
7535c2c66affSColin Finck
7536c2c66affSColin Finck /***********************************************************************
7537c2c66affSColin Finck * CM_Remove_SubTree_Ex [SETUPAPI.@]
7538c2c66affSColin Finck *
7539c2c66affSColin Finck * This function is obsolete in Windows XP and above.
7540c2c66affSColin Finck */
754160a21894SEric Kohl CONFIGRET
754260a21894SEric Kohl WINAPI
CM_Remove_SubTree_Ex(_In_ DEVINST dnAncestor,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)754360a21894SEric Kohl CM_Remove_SubTree_Ex(
754460a21894SEric Kohl _In_ DEVINST dnAncestor,
754560a21894SEric Kohl _In_ ULONG ulFlags,
754660a21894SEric Kohl _In_opt_ HMACHINE hMachine)
7547c2c66affSColin Finck {
754860a21894SEric Kohl TRACE("CM_Remove_SubTree_Ex(%lx %lx %p)\n",
754960a21894SEric Kohl dnAncestor, ulFlags, hMachine);
755060a21894SEric Kohl
7551c2c66affSColin Finck return CR_CALL_NOT_IMPLEMENTED;
7552c2c66affSColin Finck }
7553c2c66affSColin Finck
7554c2c66affSColin Finck
7555c2c66affSColin Finck /***********************************************************************
7556c2c66affSColin Finck * CM_Request_Device_EjectA [SETUPAPI.@]
7557c2c66affSColin Finck */
755860a21894SEric Kohl CONFIGRET
755960a21894SEric Kohl WINAPI
CM_Request_Device_EjectA(_In_ DEVINST dnDevInst,_Out_opt_ PPNP_VETO_TYPE pVetoType,_Out_writes_opt_ (ulNameLength)LPSTR pszVetoName,_In_ ULONG ulNameLength,_In_ ULONG ulFlags)756060a21894SEric Kohl CM_Request_Device_EjectA(
756160a21894SEric Kohl _In_ DEVINST dnDevInst,
756260a21894SEric Kohl _Out_opt_ PPNP_VETO_TYPE pVetoType,
756360a21894SEric Kohl _Out_writes_opt_(ulNameLength) LPSTR pszVetoName,
756460a21894SEric Kohl _In_ ULONG ulNameLength,
756560a21894SEric Kohl _In_ ULONG ulFlags)
7566c2c66affSColin Finck {
75675b5aaf66SSerge Gautherie TRACE("CM_Request_Device_EjectA(%lx %p %p %lu %lx)\n",
75685b5aaf66SSerge Gautherie dnDevInst, pVetoType, pszVetoName, ulNameLength, ulFlags);
756960a21894SEric Kohl
7570c2c66affSColin Finck return CM_Request_Device_Eject_ExA(dnDevInst, pVetoType, pszVetoName,
7571c2c66affSColin Finck ulNameLength, ulFlags, NULL);
7572c2c66affSColin Finck }
7573c2c66affSColin Finck
7574c2c66affSColin Finck
7575c2c66affSColin Finck /***********************************************************************
7576c2c66affSColin Finck * CM_Request_Device_EjectW [SETUPAPI.@]
7577c2c66affSColin Finck */
757860a21894SEric Kohl CONFIGRET
757960a21894SEric Kohl WINAPI
CM_Request_Device_EjectW(_In_ DEVINST dnDevInst,_Out_opt_ PPNP_VETO_TYPE pVetoType,_Out_writes_opt_ (ulNameLength)LPWSTR pszVetoName,_In_ ULONG ulNameLength,_In_ ULONG ulFlags)758060a21894SEric Kohl CM_Request_Device_EjectW(
758160a21894SEric Kohl _In_ DEVINST dnDevInst,
758260a21894SEric Kohl _Out_opt_ PPNP_VETO_TYPE pVetoType,
758360a21894SEric Kohl _Out_writes_opt_(ulNameLength) LPWSTR pszVetoName,
758460a21894SEric Kohl _In_ ULONG ulNameLength,
758560a21894SEric Kohl _In_ ULONG ulFlags)
7586c2c66affSColin Finck {
75875b5aaf66SSerge Gautherie TRACE("CM_Request_Device_EjectW(%lx %p %p %lu %lx)\n",
75885b5aaf66SSerge Gautherie dnDevInst, pVetoType, pszVetoName, ulNameLength, ulFlags);
758960a21894SEric Kohl
7590c2c66affSColin Finck return CM_Request_Device_Eject_ExW(dnDevInst, pVetoType, pszVetoName,
7591c2c66affSColin Finck ulNameLength, ulFlags, NULL);
7592c2c66affSColin Finck }
7593c2c66affSColin Finck
7594c2c66affSColin Finck
7595c2c66affSColin Finck /***********************************************************************
7596c2c66affSColin Finck * CM_Request_Device_Eject_ExA [SETUPAPI.@]
7597c2c66affSColin Finck */
759860a21894SEric Kohl CONFIGRET
759960a21894SEric Kohl WINAPI
CM_Request_Device_Eject_ExA(_In_ DEVINST dnDevInst,_Out_opt_ PPNP_VETO_TYPE pVetoType,_Out_writes_opt_ (ulNameLength)LPSTR pszVetoName,_In_ ULONG ulNameLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)760060a21894SEric Kohl CM_Request_Device_Eject_ExA(
760160a21894SEric Kohl _In_ DEVINST dnDevInst,
760260a21894SEric Kohl _Out_opt_ PPNP_VETO_TYPE pVetoType,
760360a21894SEric Kohl _Out_writes_opt_(ulNameLength) LPSTR pszVetoName,
760460a21894SEric Kohl _In_ ULONG ulNameLength,
760560a21894SEric Kohl _In_ ULONG ulFlags,
760660a21894SEric Kohl _In_opt_ HMACHINE hMachine)
7607c2c66affSColin Finck {
76087f346b1aSThamatip Chitpong LPWSTR lpLocalVetoName = NULL;
7609c2c66affSColin Finck CONFIGRET ret;
7610c2c66affSColin Finck
76115b5aaf66SSerge Gautherie TRACE("CM_Request_Device_Eject_ExA(%lx %p %p %lu %lx %p)\n",
76125b5aaf66SSerge Gautherie dnDevInst, pVetoType, pszVetoName, ulNameLength, ulFlags, hMachine);
7613c2c66affSColin Finck
76147f346b1aSThamatip Chitpong if (ulNameLength != 0)
76157f346b1aSThamatip Chitpong {
76167f346b1aSThamatip Chitpong if (pszVetoName == NULL)
7617c2c66affSColin Finck return CR_INVALID_POINTER;
7618c2c66affSColin Finck
7619c2c66affSColin Finck lpLocalVetoName = HeapAlloc(GetProcessHeap(), 0, ulNameLength * sizeof(WCHAR));
7620c2c66affSColin Finck if (lpLocalVetoName == NULL)
7621c2c66affSColin Finck return CR_OUT_OF_MEMORY;
76227f346b1aSThamatip Chitpong }
7623c2c66affSColin Finck
7624c2c66affSColin Finck ret = CM_Request_Device_Eject_ExW(dnDevInst, pVetoType, lpLocalVetoName,
7625c2c66affSColin Finck ulNameLength, ulFlags, hMachine);
76267f346b1aSThamatip Chitpong if (ret == CR_REMOVE_VETOED && ulNameLength != 0)
7627c2c66affSColin Finck {
7628c2c66affSColin Finck if (WideCharToMultiByte(CP_ACP,
7629c2c66affSColin Finck 0,
7630c2c66affSColin Finck lpLocalVetoName,
7631c2c66affSColin Finck ulNameLength,
7632c2c66affSColin Finck pszVetoName,
7633c2c66affSColin Finck ulNameLength,
7634c2c66affSColin Finck NULL,
7635c2c66affSColin Finck NULL) == 0)
7636c2c66affSColin Finck ret = CR_FAILURE;
7637c2c66affSColin Finck }
7638c2c66affSColin Finck
7639c2c66affSColin Finck HeapFree(GetProcessHeap(), 0, lpLocalVetoName);
7640c2c66affSColin Finck
7641c2c66affSColin Finck return ret;
7642c2c66affSColin Finck }
7643c2c66affSColin Finck
7644c2c66affSColin Finck
7645c2c66affSColin Finck /***********************************************************************
7646c2c66affSColin Finck * CM_Request_Device_Eject_ExW [SETUPAPI.@]
7647c2c66affSColin Finck */
764860a21894SEric Kohl CONFIGRET
764960a21894SEric Kohl WINAPI
CM_Request_Device_Eject_ExW(_In_ DEVINST dnDevInst,_Out_opt_ PPNP_VETO_TYPE pVetoType,_Out_writes_opt_ (ulNameLength)LPWSTR pszVetoName,_In_ ULONG ulNameLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)765060a21894SEric Kohl CM_Request_Device_Eject_ExW(
765160a21894SEric Kohl _In_ DEVINST dnDevInst,
765260a21894SEric Kohl _Out_opt_ PPNP_VETO_TYPE pVetoType,
765360a21894SEric Kohl _Out_writes_opt_(ulNameLength) LPWSTR pszVetoName,
765460a21894SEric Kohl _In_ ULONG ulNameLength,
765560a21894SEric Kohl _In_ ULONG ulFlags,
765660a21894SEric Kohl _In_opt_ HMACHINE hMachine)
7657c2c66affSColin Finck {
7658c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
7659c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
7660c2c66affSColin Finck LPWSTR lpDevInst;
7661c2c66affSColin Finck CONFIGRET ret;
7662c2c66affSColin Finck
76635b5aaf66SSerge Gautherie TRACE("CM_Request_Device_Eject_ExW(%lx %p %p %lu %lx %p)\n",
76645b5aaf66SSerge Gautherie dnDevInst, pVetoType, pszVetoName, ulNameLength, ulFlags, hMachine);
7665c2c66affSColin Finck
7666c2c66affSColin Finck if (dnDevInst == 0)
7667c2c66affSColin Finck return CR_INVALID_DEVNODE;
7668c2c66affSColin Finck
7669c2c66affSColin Finck if (ulFlags != 0)
7670c2c66affSColin Finck return CR_INVALID_FLAG;
7671c2c66affSColin Finck
76727f346b1aSThamatip Chitpong if (pszVetoName == NULL && ulNameLength != 0)
7673c2c66affSColin Finck return CR_INVALID_POINTER;
7674c2c66affSColin Finck
767540bc5bf4SThamatip Chitpong /* Windows 2003 SP2 ignores pszVetoName when ulNameLength is zero
767640bc5bf4SThamatip Chitpong * and behaves like when pszVetoName is NULL */
767740bc5bf4SThamatip Chitpong if (ulNameLength == 0)
767840bc5bf4SThamatip Chitpong pszVetoName = NULL;
767940bc5bf4SThamatip Chitpong
7680c2c66affSColin Finck if (hMachine != NULL)
7681c2c66affSColin Finck {
7682c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
7683c2c66affSColin Finck if (BindingHandle == NULL)
7684c2c66affSColin Finck return CR_FAILURE;
7685c2c66affSColin Finck
7686c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
7687c2c66affSColin Finck if (StringTable == 0)
7688c2c66affSColin Finck return CR_FAILURE;
7689c2c66affSColin Finck }
7690c2c66affSColin Finck else
7691c2c66affSColin Finck {
7692c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
7693c2c66affSColin Finck return CR_FAILURE;
7694c2c66affSColin Finck }
7695c2c66affSColin Finck
7696c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
7697c2c66affSColin Finck if (lpDevInst == NULL)
7698c2c66affSColin Finck return CR_INVALID_DEVNODE;
7699c2c66affSColin Finck
7700c2c66affSColin Finck RpcTryExcept
7701c2c66affSColin Finck {
7702c2c66affSColin Finck ret = PNP_RequestDeviceEject(BindingHandle,
7703c2c66affSColin Finck lpDevInst,
7704c2c66affSColin Finck pVetoType,
7705c2c66affSColin Finck pszVetoName,
7706c2c66affSColin Finck ulNameLength,
7707c2c66affSColin Finck ulFlags);
7708c2c66affSColin Finck }
7709c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
7710c2c66affSColin Finck {
7711c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
7712c2c66affSColin Finck }
7713c2c66affSColin Finck RpcEndExcept;
7714c2c66affSColin Finck
7715c2c66affSColin Finck return ret;
7716c2c66affSColin Finck }
7717c2c66affSColin Finck
7718c2c66affSColin Finck
7719c2c66affSColin Finck /***********************************************************************
7720c2c66affSColin Finck * CM_Request_Eject_PC [SETUPAPI.@]
7721c2c66affSColin Finck */
772260a21894SEric Kohl CONFIGRET
772360a21894SEric Kohl WINAPI
CM_Request_Eject_PC(VOID)772460a21894SEric Kohl CM_Request_Eject_PC(VOID)
7725c2c66affSColin Finck {
772660a21894SEric Kohl TRACE("CM_Request_Eject_PC()\n");
772760a21894SEric Kohl
7728c2c66affSColin Finck return CM_Request_Eject_PC_Ex(NULL);
7729c2c66affSColin Finck }
7730c2c66affSColin Finck
7731c2c66affSColin Finck
7732c2c66affSColin Finck /***********************************************************************
7733c2c66affSColin Finck * CM_Request_Eject_PC_Ex [SETUPAPI.@]
7734c2c66affSColin Finck */
773560a21894SEric Kohl CONFIGRET
773660a21894SEric Kohl WINAPI
CM_Request_Eject_PC_Ex(_In_opt_ HMACHINE hMachine)773760a21894SEric Kohl CM_Request_Eject_PC_Ex(
773860a21894SEric Kohl _In_opt_ HMACHINE hMachine)
7739c2c66affSColin Finck {
7740c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
7741c2c66affSColin Finck CONFIGRET ret;
7742c2c66affSColin Finck
774360a21894SEric Kohl TRACE("CM_Request_Eject_PC_Ex(%p)\n", hMachine);
7744c2c66affSColin Finck
7745c2c66affSColin Finck if (hMachine != NULL)
7746c2c66affSColin Finck {
7747c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
7748c2c66affSColin Finck if (BindingHandle == NULL)
7749c2c66affSColin Finck return CR_FAILURE;
7750c2c66affSColin Finck }
7751c2c66affSColin Finck else
7752c2c66affSColin Finck {
7753c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
7754c2c66affSColin Finck return CR_FAILURE;
7755c2c66affSColin Finck }
7756c2c66affSColin Finck
7757c2c66affSColin Finck RpcTryExcept
7758c2c66affSColin Finck {
7759c2c66affSColin Finck ret = PNP_RequestEjectPC(BindingHandle);
7760c2c66affSColin Finck }
7761c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
7762c2c66affSColin Finck {
7763c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
7764c2c66affSColin Finck }
7765c2c66affSColin Finck RpcEndExcept;
7766c2c66affSColin Finck
7767c2c66affSColin Finck return ret;
7768c2c66affSColin Finck }
7769c2c66affSColin Finck
7770c2c66affSColin Finck
7771c2c66affSColin Finck /***********************************************************************
7772c2c66affSColin Finck * CM_Run_Detection [SETUPAPI.@]
7773c2c66affSColin Finck */
777460a21894SEric Kohl CONFIGRET
777560a21894SEric Kohl WINAPI
CM_Run_Detection(_In_ ULONG ulFlags)777660a21894SEric Kohl CM_Run_Detection(
777760a21894SEric Kohl _In_ ULONG ulFlags)
7778c2c66affSColin Finck {
777960a21894SEric Kohl TRACE("CM_Run_Detection(%lx)\n", ulFlags);
778060a21894SEric Kohl
7781c2c66affSColin Finck return CM_Run_Detection_Ex(ulFlags, NULL);
7782c2c66affSColin Finck }
7783c2c66affSColin Finck
7784c2c66affSColin Finck
7785c2c66affSColin Finck /***********************************************************************
7786c2c66affSColin Finck * CM_Run_Detection_Ex [SETUPAPI.@]
7787c2c66affSColin Finck */
778860a21894SEric Kohl CONFIGRET
778960a21894SEric Kohl WINAPI
CM_Run_Detection_Ex(_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)779060a21894SEric Kohl CM_Run_Detection_Ex(
779160a21894SEric Kohl _In_ ULONG ulFlags,
779260a21894SEric Kohl _In_opt_ HMACHINE hMachine)
7793c2c66affSColin Finck {
7794c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
7795c2c66affSColin Finck CONFIGRET ret;
7796c2c66affSColin Finck
779760a21894SEric Kohl TRACE("CM_Run_Detection_Ex(%lx %p)\n",
779860a21894SEric Kohl ulFlags, hMachine);
7799c2c66affSColin Finck
7800c2c66affSColin Finck if (!pSetupIsUserAdmin())
7801c2c66affSColin Finck return CR_ACCESS_DENIED;
7802c2c66affSColin Finck
7803c2c66affSColin Finck if (ulFlags & ~CM_DETECT_BITS)
7804c2c66affSColin Finck return CR_INVALID_FLAG;
7805c2c66affSColin Finck
7806c2c66affSColin Finck if (hMachine != NULL)
7807c2c66affSColin Finck {
7808c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
7809c2c66affSColin Finck if (BindingHandle == NULL)
7810c2c66affSColin Finck return CR_FAILURE;
7811c2c66affSColin Finck }
7812c2c66affSColin Finck else
7813c2c66affSColin Finck {
7814c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
7815c2c66affSColin Finck return CR_FAILURE;
7816c2c66affSColin Finck }
7817c2c66affSColin Finck
7818c2c66affSColin Finck RpcTryExcept
7819c2c66affSColin Finck {
7820c2c66affSColin Finck ret = PNP_RunDetection(BindingHandle,
7821c2c66affSColin Finck ulFlags);
7822c2c66affSColin Finck }
7823c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
7824c2c66affSColin Finck {
7825c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
7826c2c66affSColin Finck }
7827c2c66affSColin Finck RpcEndExcept;
7828c2c66affSColin Finck
7829c2c66affSColin Finck return ret;
7830c2c66affSColin Finck }
7831c2c66affSColin Finck
7832c2c66affSColin Finck
7833c2c66affSColin Finck /***********************************************************************
7834c2c66affSColin Finck * CM_Set_Class_Registry_PropertyA [SETUPAPI.@]
7835c2c66affSColin Finck */
783660a21894SEric Kohl CONFIGRET
783760a21894SEric Kohl WINAPI
CM_Set_Class_Registry_PropertyA(_In_ LPGUID ClassGuid,_In_ ULONG ulProperty,_In_reads_bytes_opt_ (ulLength)PCVOID Buffer,_In_ ULONG ulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)783860a21894SEric Kohl CM_Set_Class_Registry_PropertyA(
783960a21894SEric Kohl _In_ LPGUID ClassGuid,
784060a21894SEric Kohl _In_ ULONG ulProperty,
784160a21894SEric Kohl _In_reads_bytes_opt_(ulLength) PCVOID Buffer,
784260a21894SEric Kohl _In_ ULONG ulLength,
784360a21894SEric Kohl _In_ ULONG ulFlags,
784460a21894SEric Kohl _In_opt_ HMACHINE hMachine)
7845c2c66affSColin Finck {
7846b667d82fSEric Kohl LPWSTR lpBuffer;
7847b667d82fSEric Kohl ULONG ulType;
7848b667d82fSEric Kohl CONFIGRET ret;
7849b667d82fSEric Kohl
7850b667d82fSEric Kohl TRACE("CM_Set_Class_Registry_PropertyA(%p %lx %p %lu %lx %p)\n",
7851c2c66affSColin Finck ClassGuid, ulProperty, Buffer, ulLength, ulFlags, hMachine);
785260a21894SEric Kohl
7853b667d82fSEric Kohl if (ClassGuid == NULL)
7854b667d82fSEric Kohl return CR_INVALID_POINTER;
7855b667d82fSEric Kohl
7856b667d82fSEric Kohl if ((Buffer == NULL) && (ulLength != 0))
7857b667d82fSEric Kohl return CR_INVALID_POINTER;
7858b667d82fSEric Kohl
7859b667d82fSEric Kohl if (ulFlags != 0)
7860b667d82fSEric Kohl return CR_INVALID_FLAG;
7861b667d82fSEric Kohl
7862b667d82fSEric Kohl if (Buffer == NULL)
7863b667d82fSEric Kohl {
7864b667d82fSEric Kohl ret = CM_Set_Class_Registry_PropertyW(ClassGuid,
7865b667d82fSEric Kohl ulProperty,
7866b667d82fSEric Kohl Buffer,
7867b667d82fSEric Kohl ulLength,
7868b667d82fSEric Kohl ulFlags,
7869b667d82fSEric Kohl hMachine);
7870b667d82fSEric Kohl }
7871b667d82fSEric Kohl else
7872b667d82fSEric Kohl {
7873b667d82fSEric Kohl /* Get property type */
7874b667d82fSEric Kohl ulType = GetRegistryPropertyType(ulProperty);
7875b667d82fSEric Kohl
7876b667d82fSEric Kohl /* Allocate buffer if needed */
7877b667d82fSEric Kohl if ((ulType == REG_SZ) || (ulType == REG_MULTI_SZ))
7878b667d82fSEric Kohl {
7879b667d82fSEric Kohl lpBuffer = MyMalloc(ulLength * sizeof(WCHAR));
7880b667d82fSEric Kohl if (lpBuffer == NULL)
7881b667d82fSEric Kohl {
7882b667d82fSEric Kohl ret = CR_OUT_OF_MEMORY;
7883b667d82fSEric Kohl }
7884b667d82fSEric Kohl else
7885b667d82fSEric Kohl {
7886b667d82fSEric Kohl if (!MultiByteToWideChar(CP_ACP, 0, Buffer,
7887b667d82fSEric Kohl ulLength, lpBuffer, ulLength))
7888b667d82fSEric Kohl {
7889b667d82fSEric Kohl MyFree(lpBuffer);
7890b667d82fSEric Kohl ret = CR_FAILURE;
7891b667d82fSEric Kohl }
7892b667d82fSEric Kohl else
7893b667d82fSEric Kohl {
7894b667d82fSEric Kohl ret = CM_Set_Class_Registry_PropertyW(ClassGuid,
7895b667d82fSEric Kohl ulProperty,
7896b667d82fSEric Kohl lpBuffer,
7897b667d82fSEric Kohl ulLength * sizeof(WCHAR),
7898b667d82fSEric Kohl ulFlags,
7899b667d82fSEric Kohl hMachine);
7900b667d82fSEric Kohl MyFree(lpBuffer);
7901b667d82fSEric Kohl }
7902b667d82fSEric Kohl }
7903b667d82fSEric Kohl }
7904b667d82fSEric Kohl else
7905b667d82fSEric Kohl {
7906b667d82fSEric Kohl ret = CM_Set_Class_Registry_PropertyW(ClassGuid,
7907b667d82fSEric Kohl ulProperty,
7908b667d82fSEric Kohl Buffer,
7909b667d82fSEric Kohl ulLength,
7910b667d82fSEric Kohl ulFlags,
7911b667d82fSEric Kohl hMachine);
7912b667d82fSEric Kohl }
7913b667d82fSEric Kohl
7914b667d82fSEric Kohl }
7915b667d82fSEric Kohl
7916b667d82fSEric Kohl return ret;
7917c2c66affSColin Finck }
7918c2c66affSColin Finck
7919c2c66affSColin Finck
7920c2c66affSColin Finck /***********************************************************************
7921c2c66affSColin Finck * CM_Set_Class_Registry_PropertyW [SETUPAPI.@]
7922c2c66affSColin Finck */
792360a21894SEric Kohl CONFIGRET
792460a21894SEric Kohl WINAPI
CM_Set_Class_Registry_PropertyW(_In_ LPGUID ClassGuid,_In_ ULONG ulProperty,_In_reads_bytes_opt_ (ulLength)PCVOID Buffer,_In_ ULONG ulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)792560a21894SEric Kohl CM_Set_Class_Registry_PropertyW(
792660a21894SEric Kohl _In_ LPGUID ClassGuid,
792760a21894SEric Kohl _In_ ULONG ulProperty,
792860a21894SEric Kohl _In_reads_bytes_opt_(ulLength) PCVOID Buffer,
792960a21894SEric Kohl _In_ ULONG ulLength,
793060a21894SEric Kohl _In_ ULONG ulFlags,
793160a21894SEric Kohl _In_opt_ HMACHINE hMachine)
7932c2c66affSColin Finck {
793318c3f39cSEric Kohl RPC_BINDING_HANDLE BindingHandle = NULL;
793418c3f39cSEric Kohl WCHAR szGuidString[PNP_MAX_GUID_STRING_LEN + 1];
793518c3f39cSEric Kohl ULONG ulType = 0;
7936b96e6480SEric Kohl PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
7937b96e6480SEric Kohl ULONG SecurityDescriptorSize = 0;
793818c3f39cSEric Kohl CONFIGRET ret;
793918c3f39cSEric Kohl
794018c3f39cSEric Kohl TRACE("CM_Set_Class_Registry_PropertyW(%p %lx %p %lu %lx %p)\n",
7941c2c66affSColin Finck ClassGuid, ulProperty, Buffer, ulLength, ulFlags, hMachine);
794260a21894SEric Kohl
794318c3f39cSEric Kohl if (ClassGuid == NULL)
794418c3f39cSEric Kohl return CR_INVALID_POINTER;
794518c3f39cSEric Kohl
794618c3f39cSEric Kohl if ((Buffer == NULL) && (ulLength != 0))
794718c3f39cSEric Kohl return CR_INVALID_POINTER;
794818c3f39cSEric Kohl
794918c3f39cSEric Kohl if (ulFlags != 0)
795018c3f39cSEric Kohl return CR_INVALID_FLAG;
795118c3f39cSEric Kohl
795218c3f39cSEric Kohl if (pSetupStringFromGuid(ClassGuid,
795318c3f39cSEric Kohl szGuidString,
795418c3f39cSEric Kohl PNP_MAX_GUID_STRING_LEN) != 0)
795518c3f39cSEric Kohl return CR_INVALID_DATA;
795618c3f39cSEric Kohl
795718c3f39cSEric Kohl if ((ulProperty < CM_CRP_MIN) || (ulProperty > CM_CRP_MAX))
795818c3f39cSEric Kohl return CR_INVALID_PROPERTY;
795918c3f39cSEric Kohl
796018c3f39cSEric Kohl if (hMachine != NULL)
796118c3f39cSEric Kohl {
796218c3f39cSEric Kohl BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
796318c3f39cSEric Kohl if (BindingHandle == NULL)
796418c3f39cSEric Kohl return CR_FAILURE;
796518c3f39cSEric Kohl }
796618c3f39cSEric Kohl else
796718c3f39cSEric Kohl {
796818c3f39cSEric Kohl if (!PnpGetLocalHandles(&BindingHandle, NULL))
796918c3f39cSEric Kohl return CR_FAILURE;
797018c3f39cSEric Kohl }
797118c3f39cSEric Kohl
797218c3f39cSEric Kohl ulType = GetRegistryPropertyType(ulProperty);
797318c3f39cSEric Kohl if ((ulType == REG_DWORD) && (ulLength != sizeof(DWORD)))
797418c3f39cSEric Kohl return CR_INVALID_DATA;
797518c3f39cSEric Kohl
797618c3f39cSEric Kohl if (ulProperty == CM_CRP_SECURITY_SDS)
797718c3f39cSEric Kohl {
7978*4d376dfdSEric Kohl if (ulLength != 0)
7979*4d376dfdSEric Kohl {
7980b96e6480SEric Kohl if (!ConvertStringSecurityDescriptorToSecurityDescriptorW((LPCWSTR)Buffer,
7981b96e6480SEric Kohl SDDL_REVISION_1,
7982b96e6480SEric Kohl &pSecurityDescriptor,
7983b96e6480SEric Kohl &SecurityDescriptorSize))
7984b96e6480SEric Kohl {
7985b96e6480SEric Kohl ERR("ConvertStringSecurityDescriptorToSecurityDescriptorW() failed (Error %lu)\n", GetLastError());
7986b96e6480SEric Kohl return CR_INVALID_DATA;
7987b96e6480SEric Kohl }
7988b96e6480SEric Kohl
7989b96e6480SEric Kohl Buffer = (PCVOID)pSecurityDescriptor;
7990b96e6480SEric Kohl ulLength = SecurityDescriptorSize;
7991*4d376dfdSEric Kohl }
7992*4d376dfdSEric Kohl
7993b96e6480SEric Kohl ulProperty = CM_CRP_SECURITY;
7994b96e6480SEric Kohl ulType = REG_BINARY;
7995c2c66affSColin Finck }
7996c2c66affSColin Finck
799718c3f39cSEric Kohl RpcTryExcept
799818c3f39cSEric Kohl {
799918c3f39cSEric Kohl ret = PNP_SetClassRegProp(BindingHandle,
800018c3f39cSEric Kohl szGuidString,
800118c3f39cSEric Kohl ulProperty,
800218c3f39cSEric Kohl ulType,
800318c3f39cSEric Kohl (LPBYTE)Buffer,
800418c3f39cSEric Kohl ulLength,
800518c3f39cSEric Kohl ulFlags);
800618c3f39cSEric Kohl }
800718c3f39cSEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER)
800818c3f39cSEric Kohl {
800918c3f39cSEric Kohl ret = RpcStatusToCmStatus(RpcExceptionCode());
801018c3f39cSEric Kohl }
801118c3f39cSEric Kohl RpcEndExcept;
801218c3f39cSEric Kohl
8013b96e6480SEric Kohl if (pSecurityDescriptor)
8014b96e6480SEric Kohl LocalFree(pSecurityDescriptor);
8015b96e6480SEric Kohl
801618c3f39cSEric Kohl return ret;
801718c3f39cSEric Kohl }
801818c3f39cSEric Kohl
8019c2c66affSColin Finck
8020c2c66affSColin Finck /***********************************************************************
8021c2c66affSColin Finck * CM_Set_DevNode_Problem [SETUPAPI.@]
8022c2c66affSColin Finck */
802360a21894SEric Kohl CONFIGRET
802460a21894SEric Kohl WINAPI
CM_Set_DevNode_Problem(_In_ DEVINST dnDevInst,_In_ ULONG ulProblem,_In_ ULONG ulFlags)802560a21894SEric Kohl CM_Set_DevNode_Problem(
802660a21894SEric Kohl _In_ DEVINST dnDevInst,
802760a21894SEric Kohl _In_ ULONG ulProblem,
802860a21894SEric Kohl _In_ ULONG ulFlags)
8029c2c66affSColin Finck {
803060a21894SEric Kohl TRACE("CM_Set_DevNode_Problem(%lx %lx %lx)\n",
803160a21894SEric Kohl dnDevInst, ulProblem, ulFlags);
803260a21894SEric Kohl
8033c2c66affSColin Finck return CM_Set_DevNode_Problem_Ex(dnDevInst, ulProblem, ulFlags, NULL);
8034c2c66affSColin Finck }
8035c2c66affSColin Finck
8036c2c66affSColin Finck
8037c2c66affSColin Finck /***********************************************************************
8038c2c66affSColin Finck * CM_Set_DevNode_Problem_Ex [SETUPAPI.@]
8039c2c66affSColin Finck */
804060a21894SEric Kohl CONFIGRET
804160a21894SEric Kohl WINAPI
CM_Set_DevNode_Problem_Ex(_In_ DEVINST dnDevInst,_In_ ULONG ulProblem,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)804260a21894SEric Kohl CM_Set_DevNode_Problem_Ex(
804360a21894SEric Kohl _In_ DEVINST dnDevInst,
804460a21894SEric Kohl _In_ ULONG ulProblem,
804560a21894SEric Kohl _In_ ULONG ulFlags,
804660a21894SEric Kohl _In_opt_ HMACHINE hMachine)
8047c2c66affSColin Finck {
8048c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
8049c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
8050c2c66affSColin Finck LPWSTR lpDevInst;
8051c2c66affSColin Finck CONFIGRET ret;
8052c2c66affSColin Finck
805360a21894SEric Kohl TRACE("CM_Set_DevNode_Problem_Ex(%lx %lx %lx %p)\n",
805460a21894SEric Kohl dnDevInst, ulProblem, ulFlags, hMachine);
8055c2c66affSColin Finck
8056c2c66affSColin Finck if (dnDevInst == 0)
8057c2c66affSColin Finck return CR_INVALID_DEVNODE;
8058c2c66affSColin Finck
8059c2c66affSColin Finck if (ulFlags & ~CM_SET_DEVNODE_PROBLEM_BITS)
8060c2c66affSColin Finck return CR_INVALID_FLAG;
8061c2c66affSColin Finck
8062c2c66affSColin Finck if (hMachine != NULL)
8063c2c66affSColin Finck {
8064c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
8065c2c66affSColin Finck if (BindingHandle == NULL)
8066c2c66affSColin Finck return CR_FAILURE;
8067c2c66affSColin Finck
8068c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
8069c2c66affSColin Finck if (StringTable == 0)
8070c2c66affSColin Finck return CR_FAILURE;
8071c2c66affSColin Finck }
8072c2c66affSColin Finck else
8073c2c66affSColin Finck {
8074c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
8075c2c66affSColin Finck return CR_FAILURE;
8076c2c66affSColin Finck }
8077c2c66affSColin Finck
8078c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
8079c2c66affSColin Finck if (lpDevInst == NULL)
8080c2c66affSColin Finck return CR_INVALID_DEVNODE;
8081c2c66affSColin Finck
8082c2c66affSColin Finck RpcTryExcept
8083c2c66affSColin Finck {
8084c2c66affSColin Finck ret = PNP_SetDeviceProblem(BindingHandle,
8085c2c66affSColin Finck lpDevInst,
8086c2c66affSColin Finck ulProblem,
8087c2c66affSColin Finck ulFlags);
8088c2c66affSColin Finck }
8089c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
8090c2c66affSColin Finck {
8091c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
8092c2c66affSColin Finck }
8093c2c66affSColin Finck RpcEndExcept;
8094c2c66affSColin Finck
8095c2c66affSColin Finck return ret;
8096c2c66affSColin Finck }
8097c2c66affSColin Finck
8098c2c66affSColin Finck
8099c2c66affSColin Finck /***********************************************************************
8100c2c66affSColin Finck * CM_Set_DevNode_Registry_PropertyA [SETUPAPI.@]
8101c2c66affSColin Finck */
810260a21894SEric Kohl CONFIGRET
810360a21894SEric Kohl WINAPI
CM_Set_DevNode_Registry_PropertyA(_In_ DEVINST dnDevInst,_In_ ULONG ulProperty,_In_reads_bytes_opt_ (ulLength)PCVOID Buffer,_In_ ULONG ulLength,_In_ ULONG ulFlags)810460a21894SEric Kohl CM_Set_DevNode_Registry_PropertyA(
810560a21894SEric Kohl _In_ DEVINST dnDevInst,
810660a21894SEric Kohl _In_ ULONG ulProperty,
810760a21894SEric Kohl _In_reads_bytes_opt_(ulLength) PCVOID Buffer,
810860a21894SEric Kohl _In_ ULONG ulLength,
810960a21894SEric Kohl _In_ ULONG ulFlags)
8110c2c66affSColin Finck {
811160a21894SEric Kohl TRACE("CM_Set_DevNode_Registry_PropertyA(%lx %lu %p %lx %lx)\n",
8112c2c66affSColin Finck dnDevInst, ulProperty, Buffer, ulLength, ulFlags);
811360a21894SEric Kohl
8114c2c66affSColin Finck return CM_Set_DevNode_Registry_Property_ExA(dnDevInst, ulProperty,
8115c2c66affSColin Finck Buffer, ulLength,
8116c2c66affSColin Finck ulFlags, NULL);
8117c2c66affSColin Finck }
8118c2c66affSColin Finck
8119c2c66affSColin Finck
8120c2c66affSColin Finck /***********************************************************************
8121c2c66affSColin Finck * CM_Set_DevNode_Registry_PropertyW [SETUPAPI.@]
8122c2c66affSColin Finck */
812360a21894SEric Kohl CONFIGRET
812460a21894SEric Kohl WINAPI
CM_Set_DevNode_Registry_PropertyW(_In_ DEVINST dnDevInst,_In_ ULONG ulProperty,_In_reads_bytes_opt_ (ulLength)PCVOID Buffer,_In_ ULONG ulLength,_In_ ULONG ulFlags)812560a21894SEric Kohl CM_Set_DevNode_Registry_PropertyW(
812660a21894SEric Kohl _In_ DEVINST dnDevInst,
812760a21894SEric Kohl _In_ ULONG ulProperty,
812860a21894SEric Kohl _In_reads_bytes_opt_(ulLength) PCVOID Buffer,
812960a21894SEric Kohl _In_ ULONG ulLength,
813060a21894SEric Kohl _In_ ULONG ulFlags)
8131c2c66affSColin Finck {
813260a21894SEric Kohl TRACE("CM_Set_DevNode_Registry_PropertyW(%lx %lu %p %lx %lx)\n",
8133c2c66affSColin Finck dnDevInst, ulProperty, Buffer, ulLength, ulFlags);
813460a21894SEric Kohl
8135c2c66affSColin Finck return CM_Set_DevNode_Registry_Property_ExW(dnDevInst, ulProperty,
8136c2c66affSColin Finck Buffer, ulLength,
8137c2c66affSColin Finck ulFlags, NULL);
8138c2c66affSColin Finck }
8139c2c66affSColin Finck
8140c2c66affSColin Finck
8141c2c66affSColin Finck /***********************************************************************
8142c2c66affSColin Finck * CM_Set_DevNode_Registry_Property_ExA [SETUPAPI.@]
8143c2c66affSColin Finck */
814460a21894SEric Kohl CONFIGRET
814560a21894SEric Kohl WINAPI
CM_Set_DevNode_Registry_Property_ExA(_In_ DEVINST dnDevInst,_In_ ULONG ulProperty,_In_reads_bytes_opt_ (ulLength)PCVOID Buffer,_In_ ULONG ulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)814660a21894SEric Kohl CM_Set_DevNode_Registry_Property_ExA(
814760a21894SEric Kohl _In_ DEVINST dnDevInst,
814860a21894SEric Kohl _In_ ULONG ulProperty,
814960a21894SEric Kohl _In_reads_bytes_opt_(ulLength) PCVOID Buffer,
815060a21894SEric Kohl _In_ ULONG ulLength,
815160a21894SEric Kohl _In_ ULONG ulFlags,
815260a21894SEric Kohl _In_opt_ HMACHINE hMachine)
8153c2c66affSColin Finck {
8154c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
8155c2c66affSColin Finck LPWSTR lpBuffer;
8156c2c66affSColin Finck ULONG ulType;
8157c2c66affSColin Finck
815860a21894SEric Kohl FIXME("CM_Set_DevNode_Registry_Property_ExA(%lx %lu %p %lx %lx %p)\n",
8159c2c66affSColin Finck dnDevInst, ulProperty, Buffer, ulLength, ulFlags, hMachine);
8160c2c66affSColin Finck
8161c2c66affSColin Finck if (Buffer == NULL && ulLength != 0)
8162c2c66affSColin Finck return CR_INVALID_POINTER;
8163c2c66affSColin Finck
8164c2c66affSColin Finck if (ulProperty < CM_DRP_MIN || ulProperty > CM_DRP_MAX)
8165c2c66affSColin Finck return CR_INVALID_PROPERTY;
8166c2c66affSColin Finck
8167c2c66affSColin Finck if (Buffer == NULL)
8168c2c66affSColin Finck {
8169c2c66affSColin Finck ret = CM_Set_DevNode_Registry_Property_ExW(dnDevInst,
8170c2c66affSColin Finck ulProperty,
8171c2c66affSColin Finck NULL,
8172c2c66affSColin Finck 0,
8173c2c66affSColin Finck ulFlags,
8174c2c66affSColin Finck hMachine);
8175c2c66affSColin Finck }
8176c2c66affSColin Finck else
8177c2c66affSColin Finck {
8178c2c66affSColin Finck /* Get property type */
8179c2c66affSColin Finck ulType = GetRegistryPropertyType(ulProperty);
8180c2c66affSColin Finck
8181c2c66affSColin Finck /* Allocate buffer if needed */
8182c2c66affSColin Finck if (ulType == REG_SZ ||
8183c2c66affSColin Finck ulType == REG_MULTI_SZ)
8184c2c66affSColin Finck {
8185c2c66affSColin Finck lpBuffer = MyMalloc(ulLength * sizeof(WCHAR));
8186c2c66affSColin Finck if (lpBuffer == NULL)
8187c2c66affSColin Finck {
8188c2c66affSColin Finck ret = CR_OUT_OF_MEMORY;
8189c2c66affSColin Finck }
8190c2c66affSColin Finck else
8191c2c66affSColin Finck {
8192c2c66affSColin Finck if (!MultiByteToWideChar(CP_ACP, 0, Buffer,
8193c2c66affSColin Finck ulLength, lpBuffer, ulLength))
8194c2c66affSColin Finck {
8195c2c66affSColin Finck MyFree(lpBuffer);
8196c2c66affSColin Finck ret = CR_FAILURE;
8197c2c66affSColin Finck }
8198c2c66affSColin Finck else
8199c2c66affSColin Finck {
8200c2c66affSColin Finck ret = CM_Set_DevNode_Registry_Property_ExW(dnDevInst,
8201c2c66affSColin Finck ulProperty,
8202c2c66affSColin Finck lpBuffer,
8203c2c66affSColin Finck ulLength * sizeof(WCHAR),
8204c2c66affSColin Finck ulFlags,
8205c2c66affSColin Finck hMachine);
8206c2c66affSColin Finck MyFree(lpBuffer);
8207c2c66affSColin Finck }
8208c2c66affSColin Finck }
8209c2c66affSColin Finck }
8210c2c66affSColin Finck else
8211c2c66affSColin Finck {
8212c2c66affSColin Finck ret = CM_Set_DevNode_Registry_Property_ExW(dnDevInst,
8213c2c66affSColin Finck ulProperty,
8214c2c66affSColin Finck Buffer,
8215c2c66affSColin Finck ulLength,
8216c2c66affSColin Finck ulFlags,
8217c2c66affSColin Finck hMachine);
8218c2c66affSColin Finck }
8219c2c66affSColin Finck
8220c2c66affSColin Finck ret = CR_CALL_NOT_IMPLEMENTED;
8221c2c66affSColin Finck }
8222c2c66affSColin Finck
8223c2c66affSColin Finck return ret;
8224c2c66affSColin Finck }
8225c2c66affSColin Finck
8226c2c66affSColin Finck
8227c2c66affSColin Finck /***********************************************************************
8228c2c66affSColin Finck * CM_Set_DevNode_Registry_Property_ExW [SETUPAPI.@]
8229c2c66affSColin Finck */
823060a21894SEric Kohl CONFIGRET
823160a21894SEric Kohl WINAPI
CM_Set_DevNode_Registry_Property_ExW(_In_ DEVINST dnDevInst,_In_ ULONG ulProperty,_In_reads_bytes_opt_ (ulLength)PCVOID Buffer,_In_ ULONG ulLength,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)823260a21894SEric Kohl CM_Set_DevNode_Registry_Property_ExW(
823360a21894SEric Kohl _In_ DEVINST dnDevInst,
823460a21894SEric Kohl _In_ ULONG ulProperty,
823560a21894SEric Kohl _In_reads_bytes_opt_(ulLength) PCVOID Buffer,
823660a21894SEric Kohl _In_ ULONG ulLength,
823760a21894SEric Kohl _In_ ULONG ulFlags,
823860a21894SEric Kohl _In_opt_ HMACHINE hMachine)
8239c2c66affSColin Finck {
8240c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
8241c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
8242c2c66affSColin Finck LPWSTR lpDevInst;
8243c2c66affSColin Finck ULONG ulType;
8244c2c66affSColin Finck CONFIGRET ret;
8245c2c66affSColin Finck
824660a21894SEric Kohl TRACE("CM_Set_DevNode_Registry_Property_ExW(%lx %lu %p %lx %lx %p)\n",
8247c2c66affSColin Finck dnDevInst, ulProperty, Buffer, ulLength, ulFlags, hMachine);
8248c2c66affSColin Finck
8249c2c66affSColin Finck if (dnDevInst == 0)
8250c2c66affSColin Finck return CR_INVALID_DEVNODE;
8251c2c66affSColin Finck
8252c2c66affSColin Finck if (ulProperty < CM_DRP_MIN || ulProperty > CM_DRP_MAX)
8253c2c66affSColin Finck return CR_INVALID_PROPERTY;
8254c2c66affSColin Finck
8255c2c66affSColin Finck if (Buffer != NULL && ulLength == 0)
8256c2c66affSColin Finck return CR_INVALID_POINTER;
8257c2c66affSColin Finck
8258c2c66affSColin Finck if (ulFlags != 0)
8259c2c66affSColin Finck return CR_INVALID_FLAG;
8260c2c66affSColin Finck
8261c2c66affSColin Finck if (hMachine != NULL)
8262c2c66affSColin Finck {
8263c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
8264c2c66affSColin Finck if (BindingHandle == NULL)
8265c2c66affSColin Finck return CR_FAILURE;
8266c2c66affSColin Finck
8267c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
8268c2c66affSColin Finck if (StringTable == 0)
8269c2c66affSColin Finck return CR_FAILURE;
8270c2c66affSColin Finck }
8271c2c66affSColin Finck else
8272c2c66affSColin Finck {
8273c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
8274c2c66affSColin Finck return CR_FAILURE;
8275c2c66affSColin Finck }
8276c2c66affSColin Finck
8277c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
8278c2c66affSColin Finck if (lpDevInst == NULL)
8279c2c66affSColin Finck return CR_INVALID_DEVNODE;
8280c2c66affSColin Finck
8281c2c66affSColin Finck /* Get property type */
8282c2c66affSColin Finck ulType = GetRegistryPropertyType(ulProperty);
8283c2c66affSColin Finck
8284c2c66affSColin Finck RpcTryExcept
8285c2c66affSColin Finck {
8286c2c66affSColin Finck ret = PNP_SetDeviceRegProp(BindingHandle,
8287c2c66affSColin Finck lpDevInst,
8288c2c66affSColin Finck ulProperty,
8289c2c66affSColin Finck ulType,
8290c2c66affSColin Finck (BYTE *)Buffer,
8291c2c66affSColin Finck ulLength,
8292c2c66affSColin Finck ulFlags);
8293c2c66affSColin Finck }
8294c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
8295c2c66affSColin Finck {
8296c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
8297c2c66affSColin Finck }
8298c2c66affSColin Finck RpcEndExcept;
8299c2c66affSColin Finck
8300c2c66affSColin Finck return ret;
8301c2c66affSColin Finck }
8302c2c66affSColin Finck
8303c2c66affSColin Finck
8304c2c66affSColin Finck /***********************************************************************
8305c2c66affSColin Finck * CM_Set_HW_Prof [SETUPAPI.@]
8306c2c66affSColin Finck */
830760a21894SEric Kohl CONFIGRET
830860a21894SEric Kohl WINAPI
CM_Set_HW_Prof(_In_ ULONG ulHardwareProfile,_In_ ULONG ulFlags)830960a21894SEric Kohl CM_Set_HW_Prof(
831060a21894SEric Kohl _In_ ULONG ulHardwareProfile,
831160a21894SEric Kohl _In_ ULONG ulFlags)
8312c2c66affSColin Finck {
831360a21894SEric Kohl TRACE("CM_Set_HW_Prof(%lu %lx)\n",
831460a21894SEric Kohl ulHardwareProfile, ulFlags);
831560a21894SEric Kohl
8316c2c66affSColin Finck return CM_Set_HW_Prof_Ex(ulHardwareProfile, ulFlags, NULL);
8317c2c66affSColin Finck }
8318c2c66affSColin Finck
8319c2c66affSColin Finck
8320c2c66affSColin Finck /***********************************************************************
8321c2c66affSColin Finck * CM_Set_HW_Prof_Ex [SETUPAPI.@]
8322c2c66affSColin Finck */
832360a21894SEric Kohl CONFIGRET
832460a21894SEric Kohl WINAPI
CM_Set_HW_Prof_Ex(_In_ ULONG ulHardwareProfile,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)832560a21894SEric Kohl CM_Set_HW_Prof_Ex(
832660a21894SEric Kohl _In_ ULONG ulHardwareProfile,
832760a21894SEric Kohl _In_ ULONG ulFlags,
832860a21894SEric Kohl _In_opt_ HMACHINE hMachine)
8329c2c66affSColin Finck {
8330c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
8331c2c66affSColin Finck CONFIGRET ret;
8332c2c66affSColin Finck
833360a21894SEric Kohl TRACE("CM_Set_HW_Prof_Ex(%lu %lx %p)\n",
833460a21894SEric Kohl ulHardwareProfile, ulFlags, hMachine);
8335c2c66affSColin Finck
8336c2c66affSColin Finck if (!pSetupIsUserAdmin())
8337c2c66affSColin Finck return CR_ACCESS_DENIED;
8338c2c66affSColin Finck
8339c2c66affSColin Finck if (ulFlags != 0)
8340c2c66affSColin Finck return CR_INVALID_FLAG;
8341c2c66affSColin Finck
8342c2c66affSColin Finck if (hMachine != NULL)
8343c2c66affSColin Finck {
8344c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
8345c2c66affSColin Finck if (BindingHandle == NULL)
8346c2c66affSColin Finck return CR_FAILURE;
8347c2c66affSColin Finck }
8348c2c66affSColin Finck else
8349c2c66affSColin Finck {
8350c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
8351c2c66affSColin Finck return CR_FAILURE;
8352c2c66affSColin Finck }
8353c2c66affSColin Finck
8354c2c66affSColin Finck RpcTryExcept
8355c2c66affSColin Finck {
8356c2c66affSColin Finck ret = PNP_SetHwProf(BindingHandle, ulHardwareProfile, ulFlags);
8357c2c66affSColin Finck }
8358c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
8359c2c66affSColin Finck {
8360c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
8361c2c66affSColin Finck }
8362c2c66affSColin Finck RpcEndExcept;
8363c2c66affSColin Finck
8364c2c66affSColin Finck return ret;
8365c2c66affSColin Finck }
8366c2c66affSColin Finck
8367c2c66affSColin Finck
8368c2c66affSColin Finck /***********************************************************************
8369c2c66affSColin Finck * CM_Set_HW_Prof_FlagsA [SETUPAPI.@]
8370c2c66affSColin Finck */
837160a21894SEric Kohl CONFIGRET
837260a21894SEric Kohl WINAPI
CM_Set_HW_Prof_FlagsA(_In_ DEVINSTID_A szDevInstName,_In_ ULONG ulConfig,_In_ ULONG ulValue,_In_ ULONG ulFlags)837360a21894SEric Kohl CM_Set_HW_Prof_FlagsA(
837460a21894SEric Kohl _In_ DEVINSTID_A szDevInstName,
837560a21894SEric Kohl _In_ ULONG ulConfig,
837660a21894SEric Kohl _In_ ULONG ulValue,
837760a21894SEric Kohl _In_ ULONG ulFlags)
8378c2c66affSColin Finck {
837960a21894SEric Kohl TRACE("CM_Set_HW_Prof_FlagsA(%s %lu %lu %lx)\n",
838060a21894SEric Kohl debugstr_a(szDevInstName), ulConfig, ulValue, ulFlags);
838160a21894SEric Kohl
8382c2c66affSColin Finck return CM_Set_HW_Prof_Flags_ExA(szDevInstName, ulConfig, ulValue,
8383c2c66affSColin Finck ulFlags, NULL);
8384c2c66affSColin Finck }
8385c2c66affSColin Finck
8386c2c66affSColin Finck
8387c2c66affSColin Finck /***********************************************************************
8388c2c66affSColin Finck * CM_Set_HW_Prof_FlagsW [SETUPAPI.@]
8389c2c66affSColin Finck */
839060a21894SEric Kohl CONFIGRET
839160a21894SEric Kohl WINAPI
CM_Set_HW_Prof_FlagsW(_In_ DEVINSTID_W szDevInstName,_In_ ULONG ulConfig,_In_ ULONG ulValue,_In_ ULONG ulFlags)839260a21894SEric Kohl CM_Set_HW_Prof_FlagsW(
839360a21894SEric Kohl _In_ DEVINSTID_W szDevInstName,
839460a21894SEric Kohl _In_ ULONG ulConfig,
839560a21894SEric Kohl _In_ ULONG ulValue,
839660a21894SEric Kohl _In_ ULONG ulFlags)
8397c2c66affSColin Finck {
839860a21894SEric Kohl TRACE("CM_Set_HW_Prof_FlagsW(%s %lu %lu %lx)\n",
839960a21894SEric Kohl debugstr_w(szDevInstName), ulConfig, ulValue, ulFlags);
840060a21894SEric Kohl
8401c2c66affSColin Finck return CM_Set_HW_Prof_Flags_ExW(szDevInstName, ulConfig, ulValue,
8402c2c66affSColin Finck ulFlags, NULL);
8403c2c66affSColin Finck }
8404c2c66affSColin Finck
8405c2c66affSColin Finck
8406c2c66affSColin Finck /***********************************************************************
8407c2c66affSColin Finck * CM_Set_HW_Prof_Flags_ExA [SETUPAPI.@]
8408c2c66affSColin Finck */
840960a21894SEric Kohl CONFIGRET
841060a21894SEric Kohl WINAPI
CM_Set_HW_Prof_Flags_ExA(_In_ DEVINSTID_A szDevInstName,_In_ ULONG ulConfig,_In_ ULONG ulValue,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)841160a21894SEric Kohl CM_Set_HW_Prof_Flags_ExA(
841260a21894SEric Kohl _In_ DEVINSTID_A szDevInstName,
841360a21894SEric Kohl _In_ ULONG ulConfig,
841460a21894SEric Kohl _In_ ULONG ulValue,
841560a21894SEric Kohl _In_ ULONG ulFlags,
841660a21894SEric Kohl _In_opt_ HMACHINE hMachine)
8417c2c66affSColin Finck {
8418c2c66affSColin Finck DEVINSTID_W pszDevIdW = NULL;
8419c2c66affSColin Finck CONFIGRET ret = CR_SUCCESS;
8420c2c66affSColin Finck
842160a21894SEric Kohl TRACE("CM_Set_HW_Prof_Flags_ExA(%s %lu %lu %lx %p)\n",
842260a21894SEric Kohl debugstr_a(szDevInstName), ulConfig, ulValue, ulFlags, hMachine);
8423c2c66affSColin Finck
8424c2c66affSColin Finck if (szDevInstName != NULL)
8425c2c66affSColin Finck {
8426c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(szDevInstName, &pszDevIdW))
8427c2c66affSColin Finck return CR_INVALID_DEVICE_ID;
8428c2c66affSColin Finck }
8429c2c66affSColin Finck
8430c2c66affSColin Finck ret = CM_Set_HW_Prof_Flags_ExW(pszDevIdW, ulConfig, ulValue,
8431c2c66affSColin Finck ulFlags, hMachine);
8432c2c66affSColin Finck
8433c2c66affSColin Finck if (pszDevIdW != NULL)
8434c2c66affSColin Finck MyFree(pszDevIdW);
8435c2c66affSColin Finck
8436c2c66affSColin Finck return ret;
8437c2c66affSColin Finck }
8438c2c66affSColin Finck
8439c2c66affSColin Finck
8440c2c66affSColin Finck /***********************************************************************
8441c2c66affSColin Finck * CM_Set_HW_Prof_Flags_ExW [SETUPAPI.@]
8442c2c66affSColin Finck */
844360a21894SEric Kohl CONFIGRET
844460a21894SEric Kohl WINAPI
CM_Set_HW_Prof_Flags_ExW(_In_ DEVINSTID_W szDevInstName,_In_ ULONG ulConfig,_In_ ULONG ulValue,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)844560a21894SEric Kohl CM_Set_HW_Prof_Flags_ExW(
844660a21894SEric Kohl _In_ DEVINSTID_W szDevInstName,
844760a21894SEric Kohl _In_ ULONG ulConfig,
844860a21894SEric Kohl _In_ ULONG ulValue,
844960a21894SEric Kohl _In_ ULONG ulFlags,
845060a21894SEric Kohl _In_opt_ HMACHINE hMachine)
8451c2c66affSColin Finck {
8452c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
8453c2c66affSColin Finck CONFIGRET ret;
8454c2c66affSColin Finck
845560a21894SEric Kohl FIXME("CM_Set_HW_Prof_Flags_ExW(%s %lu %lu %lx %p)\n",
845660a21894SEric Kohl debugstr_w(szDevInstName), ulConfig, ulValue, ulFlags, hMachine);
8457c2c66affSColin Finck
8458c2c66affSColin Finck if (szDevInstName == NULL)
8459c2c66affSColin Finck return CR_INVALID_POINTER;
8460c2c66affSColin Finck
8461c2c66affSColin Finck if (ulFlags & ~ CM_SET_HW_PROF_FLAGS_BITS)
8462c2c66affSColin Finck return CR_INVALID_FLAG;
8463c2c66affSColin Finck
8464c2c66affSColin Finck /* FIXME: Check whether szDevInstName is valid */
8465c2c66affSColin Finck
8466c2c66affSColin Finck if (hMachine != NULL)
8467c2c66affSColin Finck {
8468c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
8469c2c66affSColin Finck if (BindingHandle == NULL)
8470c2c66affSColin Finck return CR_FAILURE;
8471c2c66affSColin Finck }
8472c2c66affSColin Finck else
8473c2c66affSColin Finck {
8474c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
8475c2c66affSColin Finck return CR_FAILURE;
8476c2c66affSColin Finck }
8477c2c66affSColin Finck
8478c2c66affSColin Finck RpcTryExcept
8479c2c66affSColin Finck {
8480c2c66affSColin Finck ret = PNP_HwProfFlags(BindingHandle, PNP_SET_HWPROFFLAGS, szDevInstName,
8481c2c66affSColin Finck ulConfig, &ulValue, NULL, NULL, 0, 0);
8482c2c66affSColin Finck }
8483c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
8484c2c66affSColin Finck {
8485c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
8486c2c66affSColin Finck }
8487c2c66affSColin Finck RpcEndExcept;
8488c2c66affSColin Finck
8489c2c66affSColin Finck return ret;
8490c2c66affSColin Finck }
8491c2c66affSColin Finck
8492c2c66affSColin Finck
8493c2c66affSColin Finck /***********************************************************************
8494c2c66affSColin Finck * CM_Setup_DevNode [SETUPAPI.@]
8495c2c66affSColin Finck */
849660a21894SEric Kohl CONFIGRET
849760a21894SEric Kohl WINAPI
CM_Setup_DevNode(_In_ DEVINST dnDevInst,_In_ ULONG ulFlags)849860a21894SEric Kohl CM_Setup_DevNode(
849960a21894SEric Kohl _In_ DEVINST dnDevInst,
850060a21894SEric Kohl _In_ ULONG ulFlags)
8501c2c66affSColin Finck {
850260a21894SEric Kohl TRACE("CM_Setup_DevNode(%lx %lx)\n",
850360a21894SEric Kohl dnDevInst, ulFlags);
850460a21894SEric Kohl
8505c2c66affSColin Finck return CM_Setup_DevNode_Ex(dnDevInst, ulFlags, NULL);
8506c2c66affSColin Finck }
8507c2c66affSColin Finck
8508c2c66affSColin Finck
8509c2c66affSColin Finck /***********************************************************************
8510c2c66affSColin Finck * CM_Setup_DevNode_Ex [SETUPAPI.@]
8511c2c66affSColin Finck */
851260a21894SEric Kohl CONFIGRET
851360a21894SEric Kohl WINAPI
CM_Setup_DevNode_Ex(_In_ DEVINST dnDevInst,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)851460a21894SEric Kohl CM_Setup_DevNode_Ex(
851560a21894SEric Kohl _In_ DEVINST dnDevInst,
851660a21894SEric Kohl _In_ ULONG ulFlags,
851760a21894SEric Kohl _In_opt_ HMACHINE hMachine)
8518c2c66affSColin Finck {
8519c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
8520c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
8521c2c66affSColin Finck LPWSTR lpDevInst;
8522c2c66affSColin Finck CONFIGRET ret;
8523c2c66affSColin Finck
852460a21894SEric Kohl FIXME("CM_Setup_DevNode_Ex(%lx %lx %p)\n",
852560a21894SEric Kohl dnDevInst, ulFlags, hMachine);
8526c2c66affSColin Finck
8527c2c66affSColin Finck if (!pSetupIsUserAdmin())
8528c2c66affSColin Finck return CR_ACCESS_DENIED;
8529c2c66affSColin Finck
8530c2c66affSColin Finck if (dnDevInst == 0)
8531c2c66affSColin Finck return CR_INVALID_DEVNODE;
8532c2c66affSColin Finck
8533c2c66affSColin Finck if (ulFlags & ~CM_SETUP_BITS)
8534c2c66affSColin Finck return CR_INVALID_FLAG;
8535c2c66affSColin Finck
8536c2c66affSColin Finck if (hMachine != NULL)
8537c2c66affSColin Finck {
8538c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
8539c2c66affSColin Finck if (BindingHandle == NULL)
8540c2c66affSColin Finck return CR_FAILURE;
8541c2c66affSColin Finck
8542c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
8543c2c66affSColin Finck if (StringTable == 0)
8544c2c66affSColin Finck return CR_FAILURE;
8545c2c66affSColin Finck }
8546c2c66affSColin Finck else
8547c2c66affSColin Finck {
8548c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
8549c2c66affSColin Finck return CR_FAILURE;
8550c2c66affSColin Finck }
8551c2c66affSColin Finck
8552c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnDevInst);
8553c2c66affSColin Finck if (lpDevInst == NULL)
8554c2c66affSColin Finck return CR_INVALID_DEVNODE;
8555c2c66affSColin Finck
8556c2c66affSColin Finck RpcTryExcept
8557c2c66affSColin Finck {
8558c2c66affSColin Finck ret = PNP_DeviceInstanceAction(BindingHandle,
8559c2c66affSColin Finck PNP_DEVINST_SETUP,
8560c2c66affSColin Finck ulFlags,
8561c2c66affSColin Finck lpDevInst,
8562c2c66affSColin Finck NULL);
8563c2c66affSColin Finck }
8564c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
8565c2c66affSColin Finck {
8566c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
8567c2c66affSColin Finck }
8568c2c66affSColin Finck RpcEndExcept;
8569c2c66affSColin Finck
8570c2c66affSColin Finck return ret;
8571c2c66affSColin Finck }
8572c2c66affSColin Finck
8573c2c66affSColin Finck
8574c2c66affSColin Finck /***********************************************************************
8575c2c66affSColin Finck * CM_Test_Range_Available [SETUPAPI.@]
8576c2c66affSColin Finck */
8577c2c66affSColin Finck CONFIGRET
8578c2c66affSColin Finck WINAPI
CM_Test_Range_Available(_In_ DWORDLONG ullStartValue,_In_ DWORDLONG ullEndValue,_In_ RANGE_LIST rlh,_In_ ULONG ulFlags)8579c2c66affSColin Finck CM_Test_Range_Available(
8580c2c66affSColin Finck _In_ DWORDLONG ullStartValue,
8581c2c66affSColin Finck _In_ DWORDLONG ullEndValue,
8582c2c66affSColin Finck _In_ RANGE_LIST rlh,
8583c2c66affSColin Finck _In_ ULONG ulFlags)
8584c2c66affSColin Finck {
8585f24fbb65SEric Kohl PINTERNAL_RANGE_LIST pRangeList;
8586f24fbb65SEric Kohl PINTERNAL_RANGE pRange;
8587f24fbb65SEric Kohl PLIST_ENTRY ListEntry;
8588f24fbb65SEric Kohl CONFIGRET ret = CR_SUCCESS;
8589f24fbb65SEric Kohl
8590c2c66affSColin Finck FIXME("CM_Test_Range_Available(%I64u %I64u %p %lx)\n",
8591c2c66affSColin Finck ullStartValue, ullEndValue, rlh, ulFlags);
8592f24fbb65SEric Kohl
8593f24fbb65SEric Kohl pRangeList = (PINTERNAL_RANGE_LIST)rlh;
8594f24fbb65SEric Kohl
8595f24fbb65SEric Kohl if (!IsValidRangeList(pRangeList))
8596f24fbb65SEric Kohl return CR_INVALID_RANGE_LIST;
8597f24fbb65SEric Kohl
8598f24fbb65SEric Kohl if (ulFlags != 0)
8599f24fbb65SEric Kohl return CR_INVALID_FLAG;
8600f24fbb65SEric Kohl
8601f24fbb65SEric Kohl if (ullStartValue > ullEndValue)
8602f24fbb65SEric Kohl return CR_INVALID_RANGE;
8603f24fbb65SEric Kohl
8604f24fbb65SEric Kohl /* Lock the range list */
8605f24fbb65SEric Kohl WaitForSingleObject(pRangeList->hMutex, INFINITE);
8606f24fbb65SEric Kohl
8607f24fbb65SEric Kohl /* Check the ranges */
8608f24fbb65SEric Kohl ListEntry = &pRangeList->ListHead;
8609f24fbb65SEric Kohl while (ListEntry->Flink == &pRangeList->ListHead)
8610f24fbb65SEric Kohl {
8611f24fbb65SEric Kohl pRange = CONTAINING_RECORD(ListEntry, INTERNAL_RANGE, ListEntry);
8612f24fbb65SEric Kohl
8613f24fbb65SEric Kohl /* Check if the start value is within the current range */
8614f24fbb65SEric Kohl if ((ullStartValue >= pRange->ullStart) && (ullStartValue <= pRange->ullEnd))
8615f24fbb65SEric Kohl {
8616f24fbb65SEric Kohl ret = CR_FAILURE;
8617f24fbb65SEric Kohl break;
8618f24fbb65SEric Kohl }
8619f24fbb65SEric Kohl
8620f24fbb65SEric Kohl /* Check if the end value is within the current range */
8621f24fbb65SEric Kohl if ((ullEndValue >= pRange->ullStart) && (ullEndValue <= pRange->ullEnd))
8622f24fbb65SEric Kohl {
8623f24fbb65SEric Kohl ret = CR_FAILURE;
8624f24fbb65SEric Kohl break;
8625f24fbb65SEric Kohl }
8626f24fbb65SEric Kohl
8627f24fbb65SEric Kohl /* Check if the current range lies inside of the start-end interval */
8628f24fbb65SEric Kohl if ((ullStartValue <= pRange->ullStart) && (ullEndValue >= pRange->ullEnd))
8629f24fbb65SEric Kohl {
8630f24fbb65SEric Kohl ret = CR_FAILURE;
8631f24fbb65SEric Kohl break;
8632f24fbb65SEric Kohl }
8633f24fbb65SEric Kohl
8634f24fbb65SEric Kohl ListEntry = ListEntry->Flink;
8635f24fbb65SEric Kohl }
8636f24fbb65SEric Kohl
8637f24fbb65SEric Kohl /* Unlock the range list */
8638f24fbb65SEric Kohl ReleaseMutex(pRangeList->hMutex);
8639f24fbb65SEric Kohl
8640f24fbb65SEric Kohl return ret;
8641c2c66affSColin Finck }
8642c2c66affSColin Finck
8643c2c66affSColin Finck
8644c2c66affSColin Finck /***********************************************************************
8645c2c66affSColin Finck * CM_Uninstall_DevNode [SETUPAPI.@]
8646c2c66affSColin Finck */
864760a21894SEric Kohl CONFIGRET
864860a21894SEric Kohl WINAPI
CM_Uninstall_DevNode(_In_ DEVINST dnPhantom,_In_ ULONG ulFlags)864960a21894SEric Kohl CM_Uninstall_DevNode(
865060a21894SEric Kohl _In_ DEVINST dnPhantom,
865160a21894SEric Kohl _In_ ULONG ulFlags)
8652c2c66affSColin Finck {
865360a21894SEric Kohl TRACE("CM_Uninstall_DevNode(%lx %lx)\n",
865460a21894SEric Kohl dnPhantom, ulFlags);
865560a21894SEric Kohl
8656c2c66affSColin Finck return CM_Uninstall_DevNode_Ex(dnPhantom, ulFlags, NULL);
8657c2c66affSColin Finck }
8658c2c66affSColin Finck
8659c2c66affSColin Finck
8660c2c66affSColin Finck /***********************************************************************
8661c2c66affSColin Finck * CM_Uninstall_DevNode_Ex [SETUPAPI.@]
8662c2c66affSColin Finck */
866360a21894SEric Kohl CONFIGRET
866460a21894SEric Kohl WINAPI
CM_Uninstall_DevNode_Ex(_In_ DEVINST dnPhantom,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)866560a21894SEric Kohl CM_Uninstall_DevNode_Ex(
866660a21894SEric Kohl _In_ DEVINST dnPhantom,
866760a21894SEric Kohl _In_ ULONG ulFlags,
866860a21894SEric Kohl _In_opt_ HMACHINE hMachine)
8669c2c66affSColin Finck {
8670c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
8671c2c66affSColin Finck HSTRING_TABLE StringTable = NULL;
8672c2c66affSColin Finck LPWSTR lpDevInst;
8673c2c66affSColin Finck CONFIGRET ret;
8674c2c66affSColin Finck
867560a21894SEric Kohl TRACE("CM_Uninstall_DevNode_Ex(%lx %lx %p)\n",
867660a21894SEric Kohl dnPhantom, ulFlags, hMachine);
8677c2c66affSColin Finck
8678c2c66affSColin Finck if (dnPhantom == 0)
8679c2c66affSColin Finck return CR_INVALID_DEVNODE;
8680c2c66affSColin Finck
8681c2c66affSColin Finck if (ulFlags != 0)
8682c2c66affSColin Finck return CR_INVALID_FLAG;
8683c2c66affSColin Finck
8684c2c66affSColin Finck if (hMachine != NULL)
8685c2c66affSColin Finck {
8686c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
8687c2c66affSColin Finck if (BindingHandle == NULL)
8688c2c66affSColin Finck return CR_FAILURE;
8689c2c66affSColin Finck
8690c2c66affSColin Finck StringTable = ((PMACHINE_INFO)hMachine)->StringTable;
8691c2c66affSColin Finck if (StringTable == 0)
8692c2c66affSColin Finck return CR_FAILURE;
8693c2c66affSColin Finck }
8694c2c66affSColin Finck else
8695c2c66affSColin Finck {
8696c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, &StringTable))
8697c2c66affSColin Finck return CR_FAILURE;
8698c2c66affSColin Finck }
8699c2c66affSColin Finck
8700c2c66affSColin Finck lpDevInst = pSetupStringTableStringFromId(StringTable, dnPhantom);
8701c2c66affSColin Finck if (lpDevInst == NULL)
8702c2c66affSColin Finck return CR_INVALID_DEVNODE;
8703c2c66affSColin Finck
8704c2c66affSColin Finck RpcTryExcept
8705c2c66affSColin Finck {
8706c2c66affSColin Finck ret = PNP_UninstallDevInst(BindingHandle,
8707c2c66affSColin Finck lpDevInst,
8708c2c66affSColin Finck ulFlags);
8709c2c66affSColin Finck }
8710c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
8711c2c66affSColin Finck {
8712c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
8713c2c66affSColin Finck }
8714c2c66affSColin Finck RpcEndExcept;
8715c2c66affSColin Finck
8716c2c66affSColin Finck return ret;
8717c2c66affSColin Finck }
8718c2c66affSColin Finck
8719c2c66affSColin Finck
8720c2c66affSColin Finck /***********************************************************************
8721c2c66affSColin Finck * CM_Unregister_Device_InterfaceA [SETUPAPI.@]
8722c2c66affSColin Finck */
872360a21894SEric Kohl CONFIGRET
872460a21894SEric Kohl WINAPI
CM_Unregister_Device_InterfaceA(_In_ LPCSTR pszDeviceInterface,_In_ ULONG ulFlags)872560a21894SEric Kohl CM_Unregister_Device_InterfaceA(
872660a21894SEric Kohl _In_ LPCSTR pszDeviceInterface,
872760a21894SEric Kohl _In_ ULONG ulFlags)
8728c2c66affSColin Finck {
872960a21894SEric Kohl TRACE("CM_Unregister_Device_InterfaceA(%s %lx)\n",
873060a21894SEric Kohl debugstr_a(pszDeviceInterface), ulFlags);
8731c2c66affSColin Finck
8732c2c66affSColin Finck return CM_Unregister_Device_Interface_ExA(pszDeviceInterface,
8733c2c66affSColin Finck ulFlags, NULL);
8734c2c66affSColin Finck }
8735c2c66affSColin Finck
8736c2c66affSColin Finck
8737c2c66affSColin Finck /***********************************************************************
8738c2c66affSColin Finck * CM_Unregister_Device_InterfaceW [SETUPAPI.@]
8739c2c66affSColin Finck */
874060a21894SEric Kohl CONFIGRET
874160a21894SEric Kohl WINAPI
CM_Unregister_Device_InterfaceW(_In_ LPCWSTR pszDeviceInterface,_In_ ULONG ulFlags)874260a21894SEric Kohl CM_Unregister_Device_InterfaceW(
874360a21894SEric Kohl _In_ LPCWSTR pszDeviceInterface,
874460a21894SEric Kohl _In_ ULONG ulFlags)
8745c2c66affSColin Finck {
874660a21894SEric Kohl TRACE("CM_Unregister_Device_InterfaceW(%s %lx)\n",
874760a21894SEric Kohl debugstr_w(pszDeviceInterface), ulFlags);
8748c2c66affSColin Finck
8749c2c66affSColin Finck return CM_Unregister_Device_Interface_ExW(pszDeviceInterface,
8750c2c66affSColin Finck ulFlags, NULL);
8751c2c66affSColin Finck }
8752c2c66affSColin Finck
8753c2c66affSColin Finck
8754c2c66affSColin Finck /***********************************************************************
8755c2c66affSColin Finck * CM_Unregister_Device_Interface_ExA [SETUPAPI.@]
8756c2c66affSColin Finck */
875760a21894SEric Kohl CONFIGRET
875860a21894SEric Kohl WINAPI
CM_Unregister_Device_Interface_ExA(_In_ LPCSTR pszDeviceInterface,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)875960a21894SEric Kohl CM_Unregister_Device_Interface_ExA(
876060a21894SEric Kohl _In_ LPCSTR pszDeviceInterface,
876160a21894SEric Kohl _In_ ULONG ulFlags,
876260a21894SEric Kohl _In_opt_ HMACHINE hMachine)
8763c2c66affSColin Finck {
8764c2c66affSColin Finck LPWSTR pszDeviceInterfaceW = NULL;
8765c2c66affSColin Finck CONFIGRET ret;
8766c2c66affSColin Finck
876760a21894SEric Kohl TRACE("CM_Unregister_Device_Interface_ExA(%s %lx %p)\n",
876860a21894SEric Kohl debugstr_a(pszDeviceInterface), ulFlags, hMachine);
8769c2c66affSColin Finck
8770c2c66affSColin Finck if (pszDeviceInterface == NULL)
8771c2c66affSColin Finck return CR_INVALID_POINTER;
8772c2c66affSColin Finck
8773c2c66affSColin Finck if (pSetupCaptureAndConvertAnsiArg(pszDeviceInterface, &pszDeviceInterfaceW))
8774c2c66affSColin Finck return CR_INVALID_DATA;
8775c2c66affSColin Finck
8776c2c66affSColin Finck ret = CM_Unregister_Device_Interface_ExW(pszDeviceInterfaceW,
8777c2c66affSColin Finck ulFlags, hMachine);
8778c2c66affSColin Finck
8779c2c66affSColin Finck if (pszDeviceInterfaceW != NULL)
8780c2c66affSColin Finck MyFree(pszDeviceInterfaceW);
8781c2c66affSColin Finck
8782c2c66affSColin Finck return ret;
8783c2c66affSColin Finck }
8784c2c66affSColin Finck
8785c2c66affSColin Finck
8786c2c66affSColin Finck /***********************************************************************
8787c2c66affSColin Finck * CM_Unregister_Device_Interface_ExW [SETUPAPI.@]
8788c2c66affSColin Finck */
878960a21894SEric Kohl CONFIGRET
879060a21894SEric Kohl WINAPI
CM_Unregister_Device_Interface_ExW(_In_ LPCWSTR pszDeviceInterface,_In_ ULONG ulFlags,_In_opt_ HMACHINE hMachine)879160a21894SEric Kohl CM_Unregister_Device_Interface_ExW(
879260a21894SEric Kohl _In_ LPCWSTR pszDeviceInterface,
879360a21894SEric Kohl _In_ ULONG ulFlags,
879460a21894SEric Kohl _In_opt_ HMACHINE hMachine)
8795c2c66affSColin Finck {
8796c2c66affSColin Finck RPC_BINDING_HANDLE BindingHandle = NULL;
8797c2c66affSColin Finck CONFIGRET ret;
8798c2c66affSColin Finck
879960a21894SEric Kohl TRACE("CM_Unregister_Device_Interface_ExW(%s %lx %p)\n",
880060a21894SEric Kohl debugstr_w(pszDeviceInterface), ulFlags, hMachine);
8801c2c66affSColin Finck
8802c2c66affSColin Finck if (pszDeviceInterface == NULL)
8803c2c66affSColin Finck return CR_INVALID_POINTER;
8804c2c66affSColin Finck
8805c2c66affSColin Finck if (ulFlags != 0)
8806c2c66affSColin Finck return CR_INVALID_FLAG;
8807c2c66affSColin Finck
8808c2c66affSColin Finck if (hMachine != NULL)
8809c2c66affSColin Finck {
8810c2c66affSColin Finck BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
8811c2c66affSColin Finck if (BindingHandle == NULL)
8812c2c66affSColin Finck return CR_FAILURE;
8813c2c66affSColin Finck }
8814c2c66affSColin Finck else
8815c2c66affSColin Finck {
8816c2c66affSColin Finck if (!PnpGetLocalHandles(&BindingHandle, NULL))
8817c2c66affSColin Finck return CR_FAILURE;
8818c2c66affSColin Finck }
8819c2c66affSColin Finck
8820c2c66affSColin Finck RpcTryExcept
8821c2c66affSColin Finck {
8822c2c66affSColin Finck ret = PNP_UnregisterDeviceClassAssociation(BindingHandle,
8823c2c66affSColin Finck (LPWSTR)pszDeviceInterface,
8824c2c66affSColin Finck ulFlags);
8825c2c66affSColin Finck }
8826c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER)
8827c2c66affSColin Finck {
8828c2c66affSColin Finck ret = RpcStatusToCmStatus(RpcExceptionCode());
8829c2c66affSColin Finck }
8830c2c66affSColin Finck RpcEndExcept;
8831c2c66affSColin Finck
8832c2c66affSColin Finck return ret;
8833c2c66affSColin Finck }
8834