ReactOS 0.4.16-dev-2613-g9533ad7
interface.c
Go to the documentation of this file.
1/*
2 * SetupAPI interface-related functions
3 *
4 * Copyright 2000 Andreas Mohr for CodeWeavers
5 * 2005-2006 Herv� Poussineau (hpoussin@reactos.org)
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include "setupapi_private.h"
23
24/* Unicode constants */
25static const WCHAR AddInterface[] = {'A','d','d','I','n','t','e','r','f','a','c','e',0};
26static const WCHAR ClassGUID[] = {'C','l','a','s','s','G','U','I','D',0};
27static const WCHAR Control[] = {'C','o','n','t','r','o','l',0};
28static const WCHAR DeviceInstance[] = {'D','e','v','i','c','e','I','n','s','t','a','n','c','e',0};
29static const WCHAR DotInterfaces[] = {'.','I','n','t','e','r','f','a','c','e','s',0};
30static const WCHAR Linked[] = {'L','i','n','k','e','d',0};
31static const WCHAR SymbolicLink[] = {'S','y','m','b','o','l','i','c','L','i','n','k',0};
32
33static BOOL
35 IN struct DeviceInfo* deviceInfo,
37 IN LPCGUID pInterfaceGuid,
39{
40 struct DeviceInterface *deviceInterface;
41
43
44 deviceInterface = HeapAlloc(GetProcessHeap(), 0,
46 if (!deviceInterface)
47 {
49 return FALSE;
50 }
51 deviceInterface->DeviceInfo = deviceInfo;
52 strcpyW(deviceInterface->SymbolicLink, SymbolicLink);
53 deviceInterface->Flags = 0; /* Flags will be updated later */
54 memcpy(&deviceInterface->InterfaceClassGuid, pInterfaceGuid, sizeof(GUID));
55
56 *pDeviceInterface = deviceInterface;
57 return TRUE;
58}
59
60BOOL
62 struct DeviceInterface* deviceInterface)
63{
64 return HeapFree(GetProcessHeap(), 0, deviceInterface);
65}
66
67LONG
69 struct DeviceInfoSet *list,
72 PCWSTR DeviceInstanceW /* OPTIONAL */,
73 BOOL OnlyPresentInterfaces)
74{
75 HKEY hInterfaceKey; /* HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{GUID} */
76 HKEY hDeviceInstanceKey; /* HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{GUID}\##?#{InstancePath} */
77 HKEY hReferenceKey; /* HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{GUID}\##?#{InstancePath}\#{ReferenceString} */
78 HKEY hControlKey; /* HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses\{GUID}\##?#{InstancePath}\#{ReferenceString}\Control */
79 HKEY hEnumKey; /* HKLM\SYSTEM\CurrentControlSet\Enum */
80 HKEY hKey; /* HKLM\SYSTEM\CurrentControlSet\Enum\{Instance\Path} */
81 LONG rc;
82 WCHAR KeyBuffer[max(MAX_PATH, MAX_GUID_STRING_LEN) + 1];
83 PWSTR pSymbolicLink = NULL;
84 PWSTR InstancePath = NULL;
85 DWORD i, j;
86 DWORD dwLength, dwInstancePathLength;
87 DWORD dwRegType;
88 DWORD LinkedValue;
89 GUID ClassGuid;
90 struct DeviceInfo *deviceInfo;
91
92 hInterfaceKey = INVALID_HANDLE_VALUE;
93 hDeviceInstanceKey = NULL;
94 hReferenceKey = NULL;
95
96 /* Open registry key related to this interface */
98 if (hInterfaceKey == INVALID_HANDLE_VALUE)
99 {
100 /* Key doesn't exist. Let's keep it empty */
101 rc = ERROR_SUCCESS;
102 goto cleanup;
103 }
104
105 /* Enumerate sub keys of hInterfaceKey */
106 i = 0;
107 while (TRUE)
108 {
109 dwLength = sizeof(KeyBuffer) / sizeof(KeyBuffer[0]);
110 rc = RegEnumKeyExW(hInterfaceKey, i, KeyBuffer, &dwLength, NULL, NULL, NULL, NULL);
111 if (rc == ERROR_NO_MORE_ITEMS)
112 break;
113 if (rc != ERROR_SUCCESS)
114 goto cleanup;
115 i++;
116
117 /* Open sub key */
118 if (hDeviceInstanceKey != NULL)
119 RegCloseKey(hDeviceInstanceKey);
120 rc = RegOpenKeyExW(hInterfaceKey, KeyBuffer, 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &hDeviceInstanceKey);
121 if (rc != ERROR_SUCCESS)
122 goto cleanup;
123
124 /* Read DeviceInstance */
125 rc = RegQueryValueExW(hDeviceInstanceKey, DeviceInstance, NULL, &dwRegType, NULL, &dwInstancePathLength);
126 if (rc != ERROR_SUCCESS)
127 goto cleanup;
128 if (dwRegType != REG_SZ)
129 {
131 goto cleanup;
132 }
133 HeapFree(GetProcessHeap(), 0, InstancePath);
134 InstancePath = HeapAlloc(GetProcessHeap(), 0, dwInstancePathLength + sizeof(WCHAR));
135 if (!InstancePath)
136 {
138 goto cleanup;
139 }
140 rc = RegQueryValueExW(hDeviceInstanceKey, DeviceInstance, NULL, NULL, (LPBYTE)InstancePath, &dwInstancePathLength);
141 if (rc != ERROR_SUCCESS)
142 goto cleanup;
143 InstancePath[dwInstancePathLength / sizeof(WCHAR)] = '\0';
144 TRACE("DeviceInstance %s\n", debugstr_w(InstancePath));
145
146 if (DeviceInstanceW)
147 {
148 /* Check if device enumerator is not the right one */
149 if (strcmpW(DeviceInstanceW, InstancePath) != 0)
150 continue;
151 }
152
153 /* Find class GUID associated to the device instance */
154 rc = RegOpenKeyExW(
155 list->HKLM,
157 0, /* Options */
159 &hEnumKey);
160 if (rc != ERROR_SUCCESS)
161 goto cleanup;
162 rc = RegOpenKeyExW(
163 hEnumKey,
164 InstancePath,
165 0, /* Options */
167 &hKey);
169 if (rc != ERROR_SUCCESS)
170 goto cleanup;
171 dwLength = sizeof(KeyBuffer) - sizeof(WCHAR);
172 rc = RegQueryValueExW(hKey, ClassGUID, NULL, NULL, (LPBYTE)KeyBuffer, &dwLength);
174 if (rc != ERROR_SUCCESS)
175 goto cleanup;
176 KeyBuffer[dwLength / sizeof(WCHAR)] = '\0';
177 KeyBuffer[37] = '\0'; /* Replace the } by a NULL character */
178 if (UuidFromStringW(&KeyBuffer[1], &ClassGuid) != RPC_S_OK)
179 {
181 goto cleanup;
182 }
183 TRACE("ClassGUID %s\n", debugstr_guid(&ClassGuid));
184
185 /* If current device doesn't match the list GUID (if any), skip this entry */
186 if (!IsEqualIID(&list->ClassGuid, &GUID_NULL) && !IsEqualIID(&list->ClassGuid, &ClassGuid))
187 continue;
188
189 /* Enumerate subkeys of hDeviceInstanceKey (ie "#ReferenceString" in IoRegisterDeviceInterface). Skip entries that don't start with '#' */
190 j = 0;
191 while (TRUE)
192 {
193 struct DeviceInterface *interfaceInfo;
194
195 dwLength = sizeof(KeyBuffer) / sizeof(KeyBuffer[0]);
196 rc = RegEnumKeyExW(hDeviceInstanceKey, j, KeyBuffer, &dwLength, NULL, NULL, NULL, NULL);
197 if (rc == ERROR_NO_MORE_ITEMS)
198 break;
199 if (rc != ERROR_SUCCESS)
200 goto cleanup;
201 j++;
202 if (KeyBuffer[0] != '#')
203 /* This entry doesn't represent an interesting entry */
204 continue;
205
206 /* Open sub key */
207 if (hReferenceKey != NULL)
208 RegCloseKey(hReferenceKey);
209 rc = RegOpenKeyExW(hDeviceInstanceKey, KeyBuffer, 0, KEY_QUERY_VALUE, &hReferenceKey);
210 if (rc != ERROR_SUCCESS)
211 goto cleanup;
212
213 /* Read SymbolicLink value */
214 rc = RegQueryValueExW(hReferenceKey, SymbolicLink, NULL, &dwRegType, NULL, &dwLength);
215 if (rc != ERROR_SUCCESS)
216 {
217 /* Skip device interface with invalid reference value (i.e. interface not actually available for this device) */
218 RegCloseKey(hReferenceKey);
219 continue;
220 }
221 if (dwRegType != REG_SZ)
222 {
224 goto cleanup;
225 }
226
227 /* We have found a device */
228 /* Step 1. Create a device info element */
229 if (!CreateDeviceInfo(list, InstancePath, &ClassGuid, &deviceInfo))
230 {
231 rc = GetLastError();
232 goto cleanup;
233 }
234 TRACE("Adding device %s to list\n", debugstr_w(InstancePath));
235 InsertTailList(&list->ListHead, &deviceInfo->ListEntry);
236
237 /* Step 2. Create an interface list for this element */
238 HeapFree(GetProcessHeap(), 0, pSymbolicLink);
239 pSymbolicLink = HeapAlloc(GetProcessHeap(), 0, dwLength + sizeof(WCHAR));
240 if (!pSymbolicLink)
241 {
243 goto cleanup;
244 }
245 rc = RegQueryValueExW(hReferenceKey, SymbolicLink, NULL, NULL, (LPBYTE)pSymbolicLink, &dwLength);
246 pSymbolicLink[dwLength / sizeof(WCHAR)] = '\0';
247 if (rc != ERROR_SUCCESS)
248 goto cleanup;
249 if (!CreateDeviceInterface(deviceInfo, pSymbolicLink, InterfaceGuid, &interfaceInfo))
250 {
251 rc = GetLastError();
252 goto cleanup;
253 }
254
255 /* Step 3. Update flags */
256 if (KeyBuffer[1] == '\0')
257 interfaceInfo->Flags |= SPINT_DEFAULT;
258 rc = RegOpenKeyExW(hReferenceKey, Control, 0, KEY_QUERY_VALUE, &hControlKey);
259 if (rc != ERROR_SUCCESS)
260 {
261#if 0
262 if (OnlyPresentInterfaces)
263 {
264 DestroyDeviceInterface(interfaceInfo);
265 continue;
266 }
267 else
268 interfaceInfo->Flags |= SPINT_REMOVED;
269#endif
270 }
271 else
272 {
273 dwLength = sizeof(DWORD);
274 if (RegQueryValueExW(hControlKey, Linked, NULL, &dwRegType, (LPBYTE)&LinkedValue, &dwLength) == ERROR_SUCCESS
275 && dwRegType == REG_DWORD && LinkedValue)
276 interfaceInfo->Flags |= SPINT_ACTIVE;
277 RegCloseKey(hControlKey);
278 }
279
280 TRACE("Adding interface %s to list\n", debugstr_w(pSymbolicLink));
281 InsertTailList(&deviceInfo->InterfaceListHead, &interfaceInfo->ListEntry);
282 }
283 }
284 rc = ERROR_SUCCESS;
285
286cleanup:
287 if (hReferenceKey != NULL)
288 RegCloseKey(hReferenceKey);
289 if (hDeviceInstanceKey != NULL)
290 RegCloseKey(hDeviceInstanceKey);
291 if (hInterfaceKey != INVALID_HANDLE_VALUE)
292 RegCloseKey(hInterfaceKey);
293 HeapFree(GetProcessHeap(), 0, InstancePath);
294 HeapFree(GetProcessHeap(), 0, pSymbolicLink);
295 return rc;
296}
297
298static LPWSTR
302 IN struct DeviceInfo *devInfo)
303{
305 LPWSTR Key;
306
307 Length = wcslen(devInfo->instanceId) + 4 /* prepend ##?# */ + 41 /* #{GUID} + */ + 1 /* zero byte */;
308
310 if (!Key)
311 return NULL;
312
313 wcscpy(Key, L"##?#");
314 wcscat(Key, devInfo->instanceId);
315
316 for(Index = 4; Index < Length; Index++)
317 {
318 if (Key[Index] == L'\\')
319 {
320 Key[Index] = L'#';
321 }
322 }
323
324 wcscat(Key, L"#");
325
326 Offset = wcslen(Key);
328
329 return Key;
330}
331
332
333static BOOL
337 IN LPCWSTR InterfaceSection,
338 IN UINT InterfaceFlags,
339 IN HINF hInf,
341 IN struct DeviceInfo *devInfo)
342{
343 HKEY hKey;
344 LPWSTR Path;
345 SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
346 struct DeviceInterface *DevItf = NULL;
347
348 if (InterfaceFlags != 0)
349 {
351 return FALSE;
352 }
353
354 TRACE("Need to InstallOneInterface(%s %s %s %u) hInf %p DeviceInfoSet %p devInfo %p instanceId %s\n", debugstr_guid(InterfaceGuid),
355 debugstr_w(ReferenceString), debugstr_w(InterfaceSection), InterfaceFlags, hInf, DeviceInfoSet, devInfo, debugstr_w(devInfo->instanceId));
356
357
359 if (!Path)
360 return FALSE;
361
362 CreateDeviceInterface(devInfo, Path, InterfaceGuid, &DevItf);
364 if (!DevItf)
365 {
366 return FALSE;
367 }
368
369 memcpy(&DeviceInterfaceData.InterfaceClassGuid, &DevItf->InterfaceClassGuid, sizeof(GUID));
370 DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
371 DeviceInterfaceData.Flags = DevItf->Flags;
372 DeviceInterfaceData.Reserved = (ULONG_PTR)DevItf;
373
375 HeapFree(GetProcessHeap(), 0, DevItf);
377 {
378 return FALSE;
379 }
380
381 return SetupInstallFromInfSectionW(NULL, /* FIXME */ hInf, InterfaceSection, SPINST_REGISTRY, hKey, NULL, 0, NULL, NULL, NULL, NULL);
382}
383
384/***********************************************************************
385 * SetupDiInstallDeviceInterfaces (SETUPAPI.@)
386 */
391{
392 struct DeviceInfoSet *list = NULL;
393 BOOL ret = FALSE;
394
396
397 if (!DeviceInfoSet)
403 else if (!DeviceInfoData)
405 else if (DeviceInfoData && DeviceInfoData->Reserved == 0)
407 else if (DeviceInfoData && DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA))
409 else
410 {
411 struct DeviceInfo *devInfo;
412 struct DriverInfoElement *SelectedDriver = NULL;
413 SP_DEVINSTALL_PARAMS_W InstallParams;
414 WCHAR SectionName[MAX_PATH];
415 DWORD SectionNameLength = 0;
416 INFCONTEXT ContextInterface;
417 LPWSTR InterfaceGuidString = NULL;
419 LPWSTR InterfaceSection = NULL;
420 INT InterfaceFlags;
422 BOOL Result;
423
424 devInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
425
428 if (!Result)
429 goto cleanup;
430
431 SelectedDriver = (struct DriverInfoElement *)InstallParams.ClassInstallReserved;
432 if (SelectedDriver == NULL)
433 {
435 ret = FALSE;
436 goto cleanup;
437 }
438
439 /* Get .Interfaces section name */
441 SelectedDriver->InfFileDetails->hInf,
442 SelectedDriver->Details.SectionName,
443 SectionName, MAX_PATH, &SectionNameLength, NULL);
444 if (!Result || SectionNameLength > MAX_PATH - strlenW(DotInterfaces) - 1)
445 goto cleanup;
446 strcatW(SectionName, DotInterfaces);
447
448 ret = TRUE;
450 SelectedDriver->InfFileDetails->hInf,
451 SectionName,
453 &ContextInterface);
454 while (ret && Result)
455 {
456 ret = GetStringField(&ContextInterface, 1, &InterfaceGuidString);
457 if (!ret)
458 goto cleanup;
459 else if (strlenW(InterfaceGuidString) != MAX_GUID_STRING_LEN - 1)
460 {
462 ret = FALSE;
463 goto cleanup;
464 }
465
466 InterfaceGuidString[MAX_GUID_STRING_LEN - 2] = '\0'; /* Replace the } by a NULL character */
467 if (UuidFromStringW(&InterfaceGuidString[1], &InterfaceGuid) != RPC_S_OK)
468 {
469 /* Bad GUID, skip the entry */
471 ret = FALSE;
472 goto cleanup;
473 }
474
475 ret = GetStringField(&ContextInterface, 2, &ReferenceString);
476 if (!ret)
477 goto cleanup;
478
479 ret = GetStringField(&ContextInterface, 3, &InterfaceSection);
480 if (!ret)
481 {
482 /* ReferenceString is optional */
483 InterfaceSection = ReferenceString;
485 }
486
488 &ContextInterface,
489 (ReferenceString ? 4 : 3), /* Field index */
490 &InterfaceFlags);
491 if (!ret)
492 {
494 {
495 /* The field may be empty. Ignore the error */
496 InterfaceFlags = 0;
497 ret = TRUE;
498 }
499 else
500 goto cleanup;
501 }
502
503 /* Install Interface */
504 ret = InstallOneInterface(&InterfaceGuid, ReferenceString, InterfaceSection, InterfaceFlags, SelectedDriver->InfFileDetails->hInf, DeviceInfoSet, devInfo);
505
506cleanup:
507 MyFree(InterfaceGuidString);
508 if (ReferenceString)
510 MyFree(InterfaceSection);
511 InterfaceGuidString = ReferenceString = InterfaceSection = NULL;
512 Result = SetupFindNextMatchLineW(&ContextInterface, AddInterface, &ContextInterface);
513 }
514 }
515
516 TRACE("Returning %d\n", ret);
517 return ret;
518}
519
522 IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN DWORD Reserved, IN REGSAM samDesired)
523{
524 HKEY hKey = INVALID_HANDLE_VALUE, hDevKey;
525 struct DeviceInfoSet * list;
526
527 TRACE("%p %p %p 0x%08x 0x%08x)\n", DeviceInfoSet, DeviceInterfaceData, Reserved, samDesired);
528
529 if (!DeviceInfoSet)
535 else if (!DeviceInterfaceData)
537 else if (DeviceInterfaceData && DeviceInterfaceData->Reserved == 0)
539 else if (DeviceInterfaceData && DeviceInterfaceData->cbSize != sizeof(SP_DEVICE_INTERFACE_DATA))
541 else
542 {
543 struct DeviceInterface *DevItf;
544 LPWSTR Path, Guid, Slash;
546 DevItf = (struct DeviceInterface *)DeviceInterfaceData->Reserved;
547
548 Length = wcslen(DevItf->SymbolicLink);
549
550 Path = HeapAlloc(GetProcessHeap(), 0, (Length+2) * sizeof(WCHAR));
551 if (!Path)
552 {
555 }
556
557 wcscpy(Path, DevItf->SymbolicLink);
558
559 Guid = wcsrchr(Path, '}');
560 Slash = wcsrchr(Path, '\\');
561 if (!Guid || !Slash)
562 {
566 }
567
568 if ((ULONG_PTR)Slash > (ULONG_PTR)Guid)
569 {
570 /* Create an extra slash */
571 memmove(Slash+1, Slash, (wcslen(Slash) + 1) * sizeof(WCHAR));
572 Slash[1] = L'#';
573 }
574
575 Guid = Path;
576 while((ULONG_PTR)Guid < (ULONG_PTR)Slash)
577 {
578 if (*Guid == L'\\')
579 *Guid = L'#';
580
581 Guid++;
582 }
583
584 hKey = SetupDiOpenClassRegKeyExW(&DeviceInterfaceData->InterfaceClassGuid, samDesired, DIOCR_INTERFACE, NULL, NULL);
586 {
587 if (RegOpenKeyExW(hKey, Path, 0, samDesired, &hDevKey) == ERROR_SUCCESS)
588 {
590 hKey = hDevKey;
591 }
592 else
593 {
596 }
597 }
598
600 }
601
602 return hKey;
603}
604
605/***********************************************************************
606 * SetupDiDeleteDeviceInterfaceData (SETUPAPI.@)
607 */
608BOOL
609WINAPI
612 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
613{
614 FIXME("SetupDiDeleteDeviceInterfaceData(%p %p) stub\n",
615 DeviceInfoSet, DeviceInterfaceData);
616 return TRUE;
617}
PRTL_UNICODE_STRING_BUFFER Path
HKEY hEnumKey
Definition: umpnpmgr.c:44
#define FIXME(fmt,...)
Definition: precomp.h:53
#define RegCloseKey(hKey)
Definition: registry.h:49
Definition: list.h:37
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define MAX_GUID_STRING_LEN
Definition: apphelp.c:29
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
#define GetProcessHeap()
Definition: compat.h:736
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define wcsrchr
Definition: compat.h:16
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
static DWORD DWORD * dwLength
Definition: fusion.c:86
static void cleanup(void)
Definition: main.c:1335
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
BOOL WINAPI SetupDiGetDeviceInstallParamsW(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
Definition: devinst.c:4495
BOOL WINAPI SetupDiGetActualSectionToInstallW(HINF InfHandle, PCWSTR InfSectionName, PWSTR InfSectionWithExt, DWORD InfSectionWithExtSize, PDWORD RequiredSize, PWSTR *Extension)
Definition: devinst.c:1980
HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyW(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DWORD Reserved, REGSAM samDesired, HINF InfHandle, PCWSTR InfSectionName)
Definition: devinst.c:2613
HKEY WINAPI SetupDiOpenClassRegKeyExW(const GUID *ClassGuid, REGSAM samDesired, DWORD Flags, PCWSTR MachineName, PVOID Reserved)
Definition: devinst.c:3706
BOOL CreateDeviceInfo(IN struct DeviceInfoSet *list, IN LPCWSTR InstancePath, IN LPCGUID pClassGuid, OUT struct DeviceInfo **pDeviceInfo)
Definition: devinst.c:528
BOOL WINAPI SetupInstallFromInfSectionW(HWND owner, HINF hinf, PCWSTR section, UINT flags, HKEY key_root, PCWSTR src_root, UINT copy_flags, PSP_FILE_CALLBACK_W callback, PVOID context, HDEVINFO devinfo, PSP_DEVINFO_DATA devinfo_data)
Definition: install.c:1330
BOOL GetStringField(PINFCONTEXT context, DWORD index, PWSTR *value)
Definition: install.c:1738
BOOL DestroyDeviceInterface(struct DeviceInterface *deviceInterface)
Definition: interface.c:61
static const WCHAR SymbolicLink[]
Definition: interface.c:31
static const WCHAR ClassGUID[]
Definition: interface.c:26
static BOOL CreateDeviceInterface(IN struct DeviceInfo *deviceInfo, IN LPCWSTR SymbolicLink, IN LPCGUID pInterfaceGuid, OUT struct DeviceInterface **pDeviceInterface)
Definition: interface.c:34
static const WCHAR Linked[]
Definition: interface.c:30
BOOL WINAPI SetupDiInstallDeviceInterfaces(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData)
Definition: interface.c:388
static const WCHAR AddInterface[]
Definition: interface.c:25
static const WCHAR DotInterfaces[]
Definition: interface.c:29
BOOL WINAPI SetupDiDeleteDeviceInterfaceData(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
Definition: interface.c:610
LONG SETUP_CreateInterfaceList(struct DeviceInfoSet *list, PCWSTR MachineName, CONST GUID *InterfaceGuid, PCWSTR DeviceInstanceW, BOOL OnlyPresentInterfaces)
Definition: interface.c:68
static BOOL InstallOneInterface(IN LPGUID InterfaceGuid, IN LPCWSTR ReferenceString, IN LPCWSTR InterfaceSection, IN UINT InterfaceFlags, IN HINF hInf, IN HDEVINFO DeviceInfoSet, IN struct DeviceInfo *devInfo)
Definition: interface.c:334
HKEY WINAPI SetupDiOpenDeviceInterfaceRegKey(IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN DWORD Reserved, IN REGSAM samDesired)
Definition: interface.c:521
static const WCHAR DeviceInstance[]
Definition: interface.c:28
static LPWSTR CreateSymbolicLink(IN LPGUID InterfaceGuid, IN LPCWSTR ReferenceString, IN struct DeviceInfo *devInfo)
Definition: interface.c:299
VOID WINAPI MyFree(LPVOID lpMem)
Definition: misc.c:128
DWORD WINAPI pSetupStringFromGuid(LPGUID lpGUID, PWSTR pString, DWORD dwStringLen)
Definition: misc.c:1775
BOOL WINAPI SetupFindNextMatchLineW(PINFCONTEXT context_in, PCWSTR key, PINFCONTEXT context_out)
Definition: parser.c:1701
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
#define ULONG_PTR
Definition: config.h:101
#define InsertTailList(ListHead, Entry)
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxDeviceInterface * pDeviceInterface
FxAutoRegKey hKey
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
#define GUID_NULL
Definition: ks.h:106
#define REG_SZ
Definition: layer.c:22
if(dx< 0)
Definition: linetemp.h:194
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
unsigned int UINT
Definition: ndis.h:50
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1022
#define READ_CONTROL
Definition: nt_native.h:58
#define DWORD
Definition: nt_native.h:44
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define CONST
Definition: pedump.c:81
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REGSTR_PATH_SYSTEMENUM
Definition: regstr.h:483
#define list
Definition: rosglue.h:35
#define RPC_S_OK
Definition: rpcnterr.h:22
RPC_STATUS WINAPI UuidFromStringW(RPC_WSTR s, UUID *uuid)
Definition: rpcrt4_main.c:655
#define REG_DWORD
Definition: sdbapi.c:615
wcscat
wcscpy
_In_ DWORD _Out_ PDWORD _In_opt_ PCSTR MachineName
Definition: setupapi.h:1294
#define DIOCR_INTERFACE
Definition: setupapi.h:178
#define SPINST_REGISTRY
Definition: setupapi.h:591
#define SPINT_REMOVED
Definition: setupapi.h:585
#define ERROR_NO_DRIVER_SELECTED
Definition: setupapi.h:300
#define SPINT_DEFAULT
Definition: setupapi.h:584
_In_opt_ PSP_DEVINFO_DATA DeviceInfoData
Definition: setupapi.h:1529
#define SPINT_ACTIVE
Definition: setupapi.h:583
struct _SP_DEVICE_INTERFACE_DATA SP_DEVICE_INTERFACE_DATA
#define SETUP_DEVICE_INFO_SET_MAGIC
#define TRACE(s)
Definition: solgame.cpp:4
LIST_ENTRY InterfaceListHead
SP_DEVINSTALL_PARAMS_W InstallParams
LIST_ENTRY ListEntry
struct DeviceInfo * DeviceInfo
WCHAR SymbolicLink[ANYSIZE_ARRAY]
LIST_ENTRY ListEntry
struct InfFileDetails * InfFileDetails
SP_DRVINFO_DETAIL_DATA_W Details
ULONG_PTR Reserved
Definition: setupapi.h:839
ULONG_PTR ClassInstallReserved
Definition: setupapi.h:899
WCHAR SectionName[LINE_LEN]
Definition: setupapi.h:1077
#define max(a, b)
Definition: svc.c:63
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
#define OUT
Definition: typedefs.h:40
BOOL WINAPI SetupFindFirstLineW(IN HINF InfHandle, IN PCWSTR Section, IN PCWSTR Key, IN OUT PINFCONTEXT Context)
Definition: infsupp.c:56
BOOL WINAPI SetupGetIntField(IN PINFCONTEXT Context, IN ULONG FieldIndex, OUT INT *IntegerValue)
Definition: infsupp.c:148
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ CONST GUID _In_opt_ PCUNICODE_STRING ReferenceString
Definition: wdfdevice.h:3636
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
Definition: wdfobject.h:762
_In_ WDF_WMI_PROVIDER_CONTROL Control
Definition: wdfwmi.h:166
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
#define WINAPI
Definition: msvc.h:6
#define strcmpW(s1, s2)
Definition: unicode.h:44
#define strlenW(s)
Definition: unicode.h:34
#define strcatW(d, s)
Definition: unicode.h:36
#define strcpyW(d, s)
Definition: unicode.h:35
#define ERROR_INVALID_USER_BUFFER
Definition: winerror.h:1448
#define ERROR_GEN_FAILURE
Definition: winerror.h:256
ACCESS_MASK REGSAM
Definition: winreg.h:76
static const GUID InterfaceGuid
Definition: wlanapi.c:25
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409