ReactOS  0.4.13-dev-92-gf251225
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 */
25 static const WCHAR AddInterface[] = {'A','d','d','I','n','t','e','r','f','a','c','e',0};
26 static const WCHAR ClassGUID[] = {'C','l','a','s','s','G','U','I','D',0};
27 static const WCHAR Control[] = {'C','o','n','t','r','o','l',0};
28 static const WCHAR DeviceInstance[] = {'D','e','v','i','c','e','I','n','s','t','a','n','c','e',0};
29 static const WCHAR DotInterfaces[] = {'.','I','n','t','e','r','f','a','c','e','s',0};
30 static const WCHAR Linked[] = {'L','i','n','k','e','d',0};
31 static const WCHAR SymbolicLink[] = {'S','y','m','b','o','l','i','c','L','i','n','k',0};
32 
33 static BOOL
35  IN struct DeviceInfo* deviceInfo,
37  IN LPCGUID pInterfaceGuid,
38  OUT struct DeviceInterface **pDeviceInterface)
39 {
40  struct DeviceInterface *deviceInterface;
41 
42  *pDeviceInterface = NULL;
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 
60 BOOL
62  struct DeviceInterface* deviceInterface)
63 {
64  return HeapFree(GetProcessHeap(), 0, deviceInterface);
65 }
66 
67 LONG
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  {
130  rc = ERROR_GEN_FAILURE;
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 */
158  READ_CONTROL,
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);
173  RegCloseKey(hKey);
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  {
180  rc = ERROR_GEN_FAILURE;
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  goto cleanup;
217  if (dwRegType != REG_SZ)
218  {
219  rc = ERROR_GEN_FAILURE;
220  goto cleanup;
221  }
222 
223  /* We have found a device */
224  /* Step 1. Create a device info element */
225  if (!CreateDeviceInfo(list, InstancePath, &ClassGuid, &deviceInfo))
226  {
227  rc = GetLastError();
228  goto cleanup;
229  }
230  TRACE("Adding device %s to list\n", debugstr_w(InstancePath));
231  InsertTailList(&list->ListHead, &deviceInfo->ListEntry);
232 
233  /* Step 2. Create an interface list for this element */
234  HeapFree(GetProcessHeap(), 0, pSymbolicLink);
235  pSymbolicLink = HeapAlloc(GetProcessHeap(), 0, dwLength + sizeof(WCHAR));
236  if (!pSymbolicLink)
237  {
239  goto cleanup;
240  }
241  rc = RegQueryValueExW(hReferenceKey, SymbolicLink, NULL, NULL, (LPBYTE)pSymbolicLink, &dwLength);
242  pSymbolicLink[dwLength / sizeof(WCHAR)] = '\0';
243  if (rc != ERROR_SUCCESS)
244  goto cleanup;
245  if (!CreateDeviceInterface(deviceInfo, pSymbolicLink, InterfaceGuid, &interfaceInfo))
246  {
247  rc = GetLastError();
248  goto cleanup;
249  }
250 
251  /* Step 3. Update flags */
252  if (KeyBuffer[1] == '\0')
253  interfaceInfo->Flags |= SPINT_DEFAULT;
254  rc = RegOpenKeyExW(hReferenceKey, Control, 0, KEY_QUERY_VALUE, &hControlKey);
255  if (rc != ERROR_SUCCESS)
256  {
257 #if 0
258  if (OnlyPresentInterfaces)
259  {
260  DestroyDeviceInterface(interfaceInfo);
261  continue;
262  }
263  else
264  interfaceInfo->Flags |= SPINT_REMOVED;
265 #endif
266  }
267  else
268  {
269  dwLength = sizeof(DWORD);
270  if (RegQueryValueExW(hControlKey, Linked, NULL, &dwRegType, (LPBYTE)&LinkedValue, &dwLength) == ERROR_SUCCESS
271  && dwRegType == REG_DWORD && LinkedValue)
272  interfaceInfo->Flags |= SPINT_ACTIVE;
273  RegCloseKey(hControlKey);
274  }
275 
276  TRACE("Adding interface %s to list\n", debugstr_w(pSymbolicLink));
277  InsertTailList(&deviceInfo->InterfaceListHead, &interfaceInfo->ListEntry);
278  }
279  }
280  rc = ERROR_SUCCESS;
281 
282 cleanup:
283  if (hReferenceKey != NULL)
284  RegCloseKey(hReferenceKey);
285  if (hDeviceInstanceKey != NULL)
286  RegCloseKey(hDeviceInstanceKey);
287  if (hInterfaceKey != INVALID_HANDLE_VALUE)
288  RegCloseKey(hInterfaceKey);
289  HeapFree(GetProcessHeap(), 0, InstancePath);
290  HeapFree(GetProcessHeap(), 0, pSymbolicLink);
291  return rc;
292 }
293 
294 static LPWSTR
298  IN struct DeviceInfo *devInfo)
299 {
301  LPWSTR Key;
302 
303  Length = wcslen(devInfo->instanceId) + 4 /* prepend ##?# */ + 41 /* #{GUID} + */ + 1 /* zero byte */;
304 
306  if (!Key)
307  return NULL;
308 
309  wcscpy(Key, L"##?#");
310  wcscat(Key, devInfo->instanceId);
311 
312  for(Index = 4; Index < Length; Index++)
313  {
314  if (Key[Index] == L'\\')
315  {
316  Key[Index] = L'#';
317  }
318  }
319 
320  wcscat(Key, L"#");
321 
322  Offset = wcslen(Key);
324 
325  return Key;
326 }
327 
328 
329 static BOOL
333  IN LPCWSTR InterfaceSection,
334  IN UINT InterfaceFlags,
335  IN HINF hInf,
337  IN struct DeviceInfo *devInfo)
338 {
339  HKEY hKey, hRefKey;
340  LPWSTR Path;
341  SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
342  struct DeviceInterface *DevItf = NULL;
343 
344  if (InterfaceFlags != 0)
345  {
347  return FALSE;
348  }
349 
350  TRACE("Need to InstallOneInterface(%s %s %s %u) hInf %p DeviceInfoSet %p devInfo %p instanceId %s\n", debugstr_guid(InterfaceGuid),
351  debugstr_w(ReferenceString), debugstr_w(InterfaceSection), InterfaceFlags, hInf, DeviceInfoSet, devInfo, debugstr_w(devInfo->instanceId));
352 
353 
355  if (!Path)
356  return FALSE;
357 
358  CreateDeviceInterface(devInfo, Path, InterfaceGuid, &DevItf);
360  if (!DevItf)
361  {
362  return FALSE;
363  }
364 
365  memcpy(&DeviceInterfaceData.InterfaceClassGuid, &DevItf->InterfaceClassGuid, sizeof(GUID));
366  DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
367  DeviceInterfaceData.Flags = DevItf->Flags;
368  DeviceInterfaceData.Reserved = (ULONG_PTR)DevItf;
369 
370  hKey = SetupDiCreateDeviceInterfaceRegKeyW(DeviceInfoSet, &DeviceInterfaceData, 0, KEY_ALL_ACCESS, NULL, 0);
371  HeapFree(GetProcessHeap(), 0, DevItf);
372  if (hKey == INVALID_HANDLE_VALUE)
373  {
374  return FALSE;
375  }
376 
377  if (ReferenceString)
378  {
379  Path = HeapAlloc(GetProcessHeap(), 0, (wcslen(ReferenceString) + 2) * sizeof(WCHAR));
380  if (!Path)
381  {
382  RegCloseKey(hKey);
383  return FALSE;
384  }
385 
386  wcscpy(Path, L"#");
388 
389  if (RegCreateKeyExW(hKey, Path, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hRefKey, NULL) != ERROR_SUCCESS)
390  {
391  ERR("failed to create key %s %lx\n", debugstr_w(Path), GetLastError());
393  return FALSE;
394  }
395 
396  RegCloseKey(hKey);
397  hKey = hRefKey;
399  }
400 
401  if (RegCreateKeyExW(hKey, L"Device Parameters", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hRefKey, NULL) != ERROR_SUCCESS)
402  {
403  RegCloseKey(hKey);
404  return FALSE;
405  }
406 
407  return SetupInstallFromInfSectionW(NULL, /* FIXME */ hInf, InterfaceSection, SPINST_REGISTRY, hRefKey, NULL, 0, NULL, NULL, NULL, NULL);
408 }
409 
410 /***********************************************************************
411  * SetupDiInstallDeviceInterfaces (SETUPAPI.@)
412  */
413 BOOL WINAPI
417 {
418  struct DeviceInfoSet *list = NULL;
419  BOOL ret = FALSE;
420 
421  TRACE("%p %p\n", DeviceInfoSet, DeviceInfoData);
422 
423  if (!DeviceInfoSet)
429  else if (!DeviceInfoData)
431  else if (DeviceInfoData && DeviceInfoData->Reserved == 0)
433  else if (DeviceInfoData && DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA))
435  else
436  {
437  struct DeviceInfo *devInfo;
438  struct DriverInfoElement *SelectedDriver = NULL;
439  SP_DEVINSTALL_PARAMS_W InstallParams;
440  WCHAR SectionName[MAX_PATH];
441  DWORD SectionNameLength = 0;
442  INFCONTEXT ContextInterface;
443  LPWSTR InterfaceGuidString = NULL;
445  LPWSTR InterfaceSection = NULL;
446  INT InterfaceFlags;
448  BOOL Result;
449 
450  devInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
451 
454  if (!Result)
455  goto cleanup;
456 
457  SelectedDriver = (struct DriverInfoElement *)InstallParams.ClassInstallReserved;
458  if (SelectedDriver == NULL)
459  {
461  ret = FALSE;
462  goto cleanup;
463  }
464 
465  /* Get .Interfaces section name */
467  SelectedDriver->InfFileDetails->hInf,
468  SelectedDriver->Details.SectionName,
469  SectionName, MAX_PATH, &SectionNameLength, NULL);
470  if (!Result || SectionNameLength > MAX_PATH - strlenW(DotInterfaces) - 1)
471  goto cleanup;
472  strcatW(SectionName, DotInterfaces);
473 
474  ret = TRUE;
476  SelectedDriver->InfFileDetails->hInf,
477  SectionName,
478  AddInterface,
479  &ContextInterface);
480  while (ret && Result)
481  {
482  ret = GetStringField(&ContextInterface, 1, &InterfaceGuidString);
483  if (!ret)
484  goto cleanup;
485  else if (strlenW(InterfaceGuidString) != MAX_GUID_STRING_LEN - 1)
486  {
488  ret = FALSE;
489  goto cleanup;
490  }
491 
492  InterfaceGuidString[MAX_GUID_STRING_LEN - 2] = '\0'; /* Replace the } by a NULL character */
493  if (UuidFromStringW(&InterfaceGuidString[1], &InterfaceGuid) != RPC_S_OK)
494  {
495  /* Bad GUID, skip the entry */
497  ret = FALSE;
498  goto cleanup;
499  }
500 
501  ret = GetStringField(&ContextInterface, 2, &ReferenceString);
502  if (!ret)
503  goto cleanup;
504 
505  ret = GetStringField(&ContextInterface, 3, &InterfaceSection);
506  if (!ret)
507  {
508  /* ReferenceString is optional */
509  InterfaceSection = ReferenceString;
511  }
512 
514  &ContextInterface,
515  (ReferenceString ? 4 : 3), /* Field index */
516  &InterfaceFlags);
517  if (!ret)
518  {
520  {
521  /* The field may be empty. Ignore the error */
522  InterfaceFlags = 0;
523  ret = TRUE;
524  }
525  else
526  goto cleanup;
527  }
528 
529  /* Install Interface */
530  ret = InstallOneInterface(&InterfaceGuid, ReferenceString, InterfaceSection, InterfaceFlags, SelectedDriver->InfFileDetails->hInf, DeviceInfoSet, devInfo);
531 
532 cleanup:
533  MyFree(InterfaceGuidString);
534  if (ReferenceString)
536  MyFree(InterfaceSection);
537  InterfaceGuidString = ReferenceString = InterfaceSection = NULL;
538  Result = SetupFindNextMatchLineW(&ContextInterface, AddInterface, &ContextInterface);
539  }
540  }
541 
542  TRACE("Returning %d\n", ret);
543  return ret;
544 }
545 
546 HKEY WINAPI
548  IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN DWORD Reserved, IN REGSAM samDesired)
549 {
550  HKEY hKey = INVALID_HANDLE_VALUE, hDevKey;
551  struct DeviceInfoSet * list;
552 
553  TRACE("%p %p %p 0x%08x 0x%08x)\n", DeviceInfoSet, DeviceInterfaceData, Reserved, samDesired);
554 
555  if (!DeviceInfoSet)
561  else if (!DeviceInterfaceData)
563  else if (DeviceInterfaceData && DeviceInterfaceData->Reserved == 0)
565  else if (DeviceInterfaceData && DeviceInterfaceData->cbSize != sizeof(SP_DEVICE_INTERFACE_DATA))
567  else
568  {
569  struct DeviceInterface *DevItf;
570  LPWSTR Path, Guid, Slash;
571  DWORD Length;
572  DevItf = (struct DeviceInterface *)DeviceInterfaceData->Reserved;
573 
574  Length = wcslen(DevItf->SymbolicLink);
575 
576  Path = HeapAlloc(GetProcessHeap(), 0, (Length+2) * sizeof(WCHAR));
577  if (!Path)
578  {
580  return INVALID_HANDLE_VALUE;
581  }
582 
583  wcscpy(Path, DevItf->SymbolicLink);
584 
585  Guid = wcsrchr(Path, '}');
586  Slash = wcsrchr(Path, '\\');
587  if (!Guid || !Slash)
588  {
591  return INVALID_HANDLE_VALUE;
592  }
593 
594  if ((ULONG_PTR)Slash > (ULONG_PTR)Guid)
595  {
596  /* Create an extra slash */
597  memmove(Slash+1, Slash, (wcslen(Slash) + 1) * sizeof(WCHAR));
598  Slash[1] = L'#';
599  }
600 
601  Guid = Path;
602  while((ULONG_PTR)Guid < (ULONG_PTR)Slash)
603  {
604  if (*Guid == L'\\')
605  *Guid = L'#';
606 
607  Guid++;
608  }
609 
610  hKey = SetupDiOpenClassRegKeyExW(&DeviceInterfaceData->InterfaceClassGuid, samDesired, DIOCR_INTERFACE, NULL, NULL);
611  if (hKey != INVALID_HANDLE_VALUE)
612  {
613  if (RegOpenKeyExW(hKey, Path, 0, samDesired, &hDevKey) == ERROR_SUCCESS)
614  {
615  RegCloseKey(hKey);
616  hKey = hDevKey;
617  }
618  else
619  {
620  RegCloseKey(hKey);
621  hKey = INVALID_HANDLE_VALUE;
622  }
623  }
624 
626  }
627 
628  return hKey;
629 }
630 
631 /***********************************************************************
632  * SetupDiDeleteDeviceInterfaceData (SETUPAPI.@)
633  */
634 BOOL
635 WINAPI
638  PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
639 {
640  FIXME("SetupDiDeleteDeviceInterfaceData(%p %p) stub\n",
641  DeviceInfoSet, DeviceInterfaceData);
642  return TRUE;
643 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
static BOOL CreateDeviceInterface(IN struct DeviceInfo *deviceInfo, IN LPCWSTR SymbolicLink, IN LPCGUID pInterfaceGuid, OUT struct DeviceInterface **pDeviceInterface)
Definition: interface.c:34
BOOL WINAPI SetupFindFirstLineW(IN HINF InfHandle, IN PCWSTR Section, IN PCWSTR Key, IN OUT PINFCONTEXT Context)
Definition: infsupp.c:54
const uint16_t * PCWSTR
Definition: typedefs.h:55
#define IN
Definition: typedefs.h:38
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define max(a, b)
Definition: svc.c:63
BOOL WINAPI SetupDiGetActualSectionToInstallW(HINF InfHandle, PCWSTR InfSectionName, PWSTR InfSectionWithExt, DWORD InfSectionWithExtSize, PDWORD RequiredSize, PWSTR *Extension)
Definition: devinst.c:1985
#define TRUE
Definition: types.h:120
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ULONG Key
Definition: fatprocs.h:2697
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
#define SPINT_ACTIVE
Definition: setupapi.h:577
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG SETUP_CreateInterfaceList(struct DeviceInfoSet *list, PCWSTR MachineName, CONST GUID *InterfaceGuid, PCWSTR DeviceInstanceW, BOOL OnlyPresentInterfaces)
Definition: interface.c:68
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:95
uint16_t * PWSTR
Definition: typedefs.h:54
#define ERROR_INVALID_HANDLE
Definition: compat.h:88
LIST_ENTRY InterfaceListHead
static const WCHAR DotInterfaces[]
Definition: interface.c:29
#define REGSTR_PATH_SYSTEMENUM
Definition: regstr.h:483
u32_t magic(void)
struct DeviceInfo * DeviceInfo
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
_In_ DWORD _Out_ PDWORD _In_opt_ PCSTR MachineName
Definition: setupapi.h:1286
static const WCHAR DeviceInstance[]
Definition: interface.c:28
HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyW(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DWORD Reserved, REGSAM samDesired, HINF InfHandle, PCWSTR InfSectionName)
Definition: devinst.c:2618
SP_DEVINSTALL_PARAMS_W InstallParams
static const WCHAR AddInterface[]
Definition: interface.c:25
#define InsertTailList(ListHead, Entry)
#define DWORD
Definition: nt_native.h:44
int32_t INT
Definition: typedefs.h:56
#define SETUP_DEVICE_INFO_SET_MAGIC
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1094
uint32_t ULONG_PTR
Definition: typedefs.h:63
struct InfFileDetails * InfFileDetails
BOOL CreateDeviceInfo(IN struct DeviceInfoSet *list, IN LPCWSTR InstancePath, IN LPCGUID pClassGuid, OUT struct DeviceInfo **pDeviceInfo)
Definition: devinst.c:526
#define SPINT_DEFAULT
Definition: setupapi.h:578
#define ERROR_INVALID_USER_BUFFER
Definition: winerror.h:1091
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
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
RPC_STATUS WINAPI UuidFromStringW(RPC_WSTR s, UUID *uuid)
Definition: rpcrt4_main.c:615
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:110
_In_ CONST GUID _In_opt_ PUNICODE_STRING ReferenceString
Definition: iofuncs.h:1134
BOOL WINAPI SetupDiGetDeviceInstallParamsW(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
Definition: devinst.c:4456
static HKEY hEnumKey
Definition: umpnpmgr.c:64
#define SPINST_REGISTRY
Definition: setupapi.h:585
static GUID * Guid
Definition: apphelp.c:93
ULONG_PTR ClassInstallReserved
Definition: setupapi.h:893
smooth NULL
Definition: ftsmooth.c:416
BOOL DestroyDeviceInterface(struct DeviceInterface *deviceInterface)
Definition: interface.c:61
_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:426
_Check_return_ _CRTIMP _CONST_RETURN wchar_t *__cdecl wcsrchr(_In_z_ const wchar_t *_Str, _In_ wchar_t _Ch)
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
#define debugstr_guid
Definition: kernel32.h:35
ULONG_PTR Reserved
Definition: setupapi.h:833
HKEY WINAPI SetupDiOpenDeviceInterfaceRegKey(IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN DWORD Reserved, IN REGSAM samDesired)
Definition: interface.c:547
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 TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4134
if(!(yy_init))
Definition: macro.lex.yy.c:714
__wchar_t WCHAR
Definition: xmlstorage.h:180
static DWORD DWORD * dwLength
Definition: fusion.c:83
#define MAX_GUID_STRING_LEN
Definition: apphelp.c:29
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:8
static const UCHAR Index[8]
Definition: usbohci.c:18
_In_opt_ PSP_DEVINFO_DATA DeviceInfoData
Definition: setupapi.h:1523
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:409
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
DWORD WINAPI pSetupStringFromGuid(LPGUID lpGUID, PWSTR pString, DWORD dwStringLen)
Definition: misc.c:1775
#define ERROR_NO_DRIVER_SELECTED
Definition: setupapi.h:294
WCHAR SymbolicLink[ANYSIZE_ARRAY]
#define READ_CONTROL
Definition: nt_native.h:58
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:1323
int ret
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
static const GUID InterfaceGuid
Definition: wlanapi.c:25
static const WCHAR L[]
Definition: oid.c:1250
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define GUID_NULL
Definition: ks.h:106
Definition: _list.h:228
#define DIOCR_INTERFACE
Definition: setupapi.h:177
static const WCHAR Control[]
Definition: interface.c:27
#define ERR(fmt,...)
Definition: debug.h:109
#define SPINT_REMOVED
Definition: setupapi.h:579
BOOL GetStringField(PINFCONTEXT context, DWORD index, PWSTR *value)
Definition: install.c:1696
LIST_ENTRY ListEntry
static LPWSTR CreateSymbolicLink(IN LPGUID InterfaceGuid, IN LPCWSTR ReferenceString, IN struct DeviceInfo *devInfo)
Definition: interface.c:295
WINE_UNICODE_INLINE WCHAR * strcpyW(WCHAR *dst, const WCHAR *src)
Definition: unicode.h:219
PRTL_UNICODE_STRING_BUFFER Path
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
BOOL WINAPI SetupDiInstallDeviceInterfaces(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData)
Definition: interface.c:414
WINE_UNICODE_INLINE WCHAR * strcatW(WCHAR *dst, const WCHAR *src)
Definition: unicode.h:242
ACCESS_MASK REGSAM
Definition: winreg.h:69
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:254
#define list
Definition: rosglue.h:35
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
unsigned int UINT
Definition: ndis.h:50
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
WCHAR SectionName[LINE_LEN]
Definition: setupapi.h:1071
BOOL WINAPI SetupDiDeleteDeviceInterfaceData(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
Definition: interface.c:636
LIST_ENTRY ListEntry
static const WCHAR Linked[]
Definition: interface.c:30
BOOL WINAPI SetupGetIntField(IN PINFCONTEXT Context, IN ULONG FieldIndex, OUT INT *IntegerValue)
Definition: infsupp.c:146
WINE_UNICODE_INLINE int strcmpW(const WCHAR *str1, const WCHAR *str2)
Definition: unicode.h:229
#define OUT
Definition: typedefs.h:39
SP_DRVINFO_DETAIL_DATA_W Details
struct _SP_DEVICE_INTERFACE_DATA SP_DEVICE_INTERFACE_DATA
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3381
#define ULONG_PTR
Definition: config.h:101
char * cleanup(char *str)
Definition: wpickclick.c:99
HKEY WINAPI SetupDiOpenClassRegKeyExW(const GUID *ClassGuid, REGSAM samDesired, DWORD Flags, PCWSTR MachineName, PVOID Reserved)
Definition: devinst.c:3667
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:2541
#define ERROR_GEN_FAILURE
Definition: winerror.h:134
WCHAR * LPWSTR
Definition: xmlstorage.h:184
static const WCHAR ClassGUID[]
Definition: interface.c:26
#define REG_DWORD
Definition: sdbapi.c:596
VOID WINAPI MyFree(LPVOID lpMem)
Definition: misc.c:128
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
Definition: compat.h:394
BOOL WINAPI SetupFindNextMatchLineW(PINFCONTEXT context_in, PCWSTR key, PINFCONTEXT context_out)
Definition: parser.c:1694
#define CONST
Definition: pedump.c:81
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:90
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:330
static const WCHAR SymbolicLink[]
Definition: interface.c:31
#define RPC_S_OK
Definition: rpcnterr.h:22
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1019
#define REG_SZ
Definition: layer.c:22