Change structures used to keep information about devices/interfaces/drivers. This one is more logical and should be more extensible
Sorry, i've disabled code to enumerate devices implementing some interface (not ported)
Do related changes in the file
Modified: trunk/reactos/lib/setupapi/devinst.c

Modified: trunk/reactos/lib/setupapi/devinst.c
--- trunk/reactos/lib/setupapi/devinst.c	2005-08-08 15:56:27 UTC (rev 17209)
+++ trunk/reactos/lib/setupapi/devinst.c	2005-08-08 16:06:52 UTC (rev 17210)
@@ -76,50 +76,116 @@
                                   'E','n','u','m',0};
 
 
-typedef struct _DeviceInfo
+/* FIXME: header mess */
+DEFINE_GUID(GUID_NULL,
+  0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+
+#define SETUP_DEV_INFO_SET_MAGIC 0xd00ff057
+
+struct DeviceInterface /* Element of DeviceInfoElement.InterfaceHead */
 {
-    LIST_ENTRY ItemEntry;
-    BOOL IsDevice; /* This entry is a device or an interface */
-    union
-    {
-        struct
-        {
-            GUID ClassGuid;
-            WCHAR InstancePath[0]; /* "ACPI\PNP0501\4&2658d0a0&0" */
-        } Device;
-        struct
-        {
-            GUID InterfaceGuid;
-            GUID ClassGuid;
-#ifndef __WINESRC__
-            /* Pointer into Data field. Contains something like */
-            /* "ACPI\PNP0501\4&2658d0a0&0" */
-            PWSTR pInstancePath;
-#endif
-            /* Pointer into Data field. Contains something like
-            * "\\?\ACPI#PNP0501#4&2658d0a0&0#{GUID}", or "COMx" for WINE */
-            PWSTR pSymbolicLink;
-            WCHAR Data[0];
-        } Interface;
-    };
-} DeviceInfo;
+    LIST_ENTRY ListEntry;
 
-#define SETUP_DEV_INFO_LIST_MAGIC 0xd00ff056
+    GUID InterfaceClassGuid;
+    
+    /* SPINT_ACTIVE : the interface is active/enabled
+     * SPINT_DEFAULT: the interface is the default interface for the device class FIXME???
+     * SPINT_REMOVED: the interface is removed
+     */
+    DWORD Flags;
 
-typedef struct _DeviceInfoList
+    WCHAR SymbolicLink[0]; /* \\?\ACPI#PNP0501#4&2658d0a0&0#{GUID} */
+};
+
+struct DriverInfoElement /* Element of DeviceInfoSet.DriverListHead and DeviceInfoElement.DriverListHead */
 {
-    DWORD magic;
-    GUID ClassGuid; /* Only devices related of this class are in the device list */
-    HWND hWnd;
+    LIST_ENTRY ListEntry;
+
+    SP_DRVINFO_DATA_V2_W Info;
+};
+
+struct DeviceInfoElement /* Element of DeviceInfoSet.ListHead */
+{
+    LIST_ENTRY ListEntry;
+
+    /* Information about devnode:
+     * - DeviceName:
+     *       "Root\*PNP0501" for example.
+     *       It doesn't contain the unique ID for the device
+     *       (points into the Data field at the end of the structure)
+     *       WARNING: no NULL char exist between DeviceName and UniqueId
+     *       in Data field!
+     * - UniqueId
+     *       "5&1be2108e&0" or "0000"
+     *       If DICD_GENERATE_ID is specified in creation flags,
+     *       this unique ID is autogenerated using 4 digits, base 10
+     *       (points into the Data field at the end of the structure)
+     * - DeviceDescription
+     *       String which identifies the device. Can be NULL. If not NULL,
+     *       points into the Data field at the end of the structure
+     * - ClassGuid
+     *       Identifies the class of this device. FIXME: can it be GUID_NULL?
+     * - CreationFlags
+     *       Is a combination of:
+     *       - DICD_GENERATE_ID
+     *              the unique ID needs to be generated
+     *       - DICD_INHERIT_CLASSDRVS
+     *              inherit driver of the device info set (== same pointer)
+     * - hwndParent
+     *       Used when doing device-specific actions. Can be NULL
+     */
+    PCWSTR DeviceName;
+    PCWSTR UniqueId;
+    PCWSTR DeviceDescription;
+    GUID ClassGuid;
+    DWORD CreationFlags;
+    HWND hwndParent;
+
+    /* Flags is a combination of:
+     * - DI_DIDCOMPAT
+     *       Set when the device driver list is created
+     * FlagsEx is a combination of:
+     */
+    DWORD Flags;
+    DWORD FlagsEx;
+
+    /* If CreationFlags contains DICD_INHERIT_CLASSDRVS, this list is invalid */
+    /* If the driver is not searched/detected, this list is empty */
+    LIST_ENTRY DriverListHead; /* List of struct DriverInfoElement */
+
+    /* List of interfaces implemented by this device */
+    LIST_ENTRY InterfaceHead; /* List of struct DeviceInterface */
+
+    WCHAR Data[0];
+};
+
+struct DeviceInfoSet /* HDEVINFO */
+{
+    DWORD magic; /* SETUP_DEV_INFO_SET_MAGIC */
+    GUID ClassGuid; /* If != GUID_NULL, only devices of this class can be in the device info set */
+    HWND hwndParent; /* only used on non-device-specific actions, like as a select-device dialog using the global class driver list */
     HKEY HKLM; /* Local or distant HKEY_LOCAL_MACHINE registry key */
-    DWORD numberOfEntries;
-    LIST_ENTRY ListHead;
-} DeviceInfoList;
 
-/* FIXME: header mess */
-DEFINE_GUID(GUID_NULL,
-  0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+    /* Flags is a combination of:
+     * - DI_FLAGSEX_DIDINFOLIST
+     * - DI_DIDCLASS
+     * - DI_MULTMFGS
+     *       Set by SetupDiBuildDriverInfoList if drivers of
+     *       multiple manufacturers found
+     * - DI_FLAGSEX_DIDCOMPATINFO
+     * - DI_COMPAT_FROM_CLASS
+     *       Forces SetupDiBuildDriverInfoList to build a class drivers list
+     * FlagsEx is a combination of:
+     */
+    DWORD Flags;
+    DWORD FlagsEx;
 
+    /* If the driver is not searched/detected, this list is empty */
+    LIST_ENTRY DriverListHead; /* List of struct DriverInfoElement */
+
+    LIST_ENTRY ListHead; /* List of struct DeviceInfoElement */
+};
+
 /***********************************************************************
  *              SetupDiBuildClassInfoList  (SETUPAPI.@)
  */
@@ -627,7 +693,7 @@
     LPWSTR MachineNameW = NULL;
     HDEVINFO hDevInfo;
 
-    TRACE("\n");
+    TRACE("%p %p %s %p\n", ClassGuid, hwndParent, MachineName, Reserved);
 
     if (MachineName)
     {
@@ -654,21 +720,24 @@
 			       PCWSTR MachineName,
 			       PVOID Reserved)
 {
-  DeviceInfoList* list;
+  struct DeviceInfoSet *list;
   DWORD rc;
 
-  TRACE("%p %p %p %p\n", ClassGuid, hwndParent, MachineName, Reserved);
+  TRACE("%p %p %S %p\n", ClassGuid, hwndParent, MachineName, Reserved);
 
-  list = HeapAlloc(GetProcessHeap(), 0, sizeof(DeviceInfoList));
+  list = HeapAlloc(GetProcessHeap(), 0, sizeof(struct DeviceInfoSet));
   if (!list)
   {
     SetLastError(ERROR_NOT_ENOUGH_MEMORY);
     return (HDEVINFO)INVALID_HANDLE_VALUE;
   }
 
-  list->magic = SETUP_DEV_INFO_LIST_MAGIC;
-  list->hWnd = hwndParent;
-  list->numberOfEntries = 0;
+  list->magic = SETUP_DEV_INFO_SET_MAGIC;
+  memcpy(
+    &list->ClassGuid,
+    ClassGuid ? ClassGuid : &GUID_NULL,
+    sizeof(list->ClassGuid));
+  list->hwndParent = hwndParent;
   if (MachineName)
   {
     rc = RegConnectRegistryW(MachineName, HKEY_LOCAL_MACHINE, &list->HKLM);
@@ -683,11 +752,9 @@
   {
     list->HKLM = HKEY_LOCAL_MACHINE;
   }
-  
-  memcpy(
-    &list->ClassGuid,
-    ClassGuid ? ClassGuid : &GUID_NULL,
-    sizeof(list->ClassGuid));
+  list->Flags = 0; /* FIXME */
+  list->FlagsEx = 0; /* FIXME */
+  InitializeListHead(&list->DriverListHead);
   InitializeListHead(&list->ListHead);
   return (HDEVINFO)list;
 }
@@ -707,25 +774,24 @@
         SetLastError(ERROR_INVALID_PARAMETER);
     else if (DeviceInfoSet && DeviceInfoSet != (HDEVINFO)INVALID_HANDLE_VALUE)
     {
-        DeviceInfoList *list = (DeviceInfoList *)DeviceInfoSet;
+        struct DeviceInfoSet *list = (struct DeviceInfoSet *)DeviceInfoSet;
         
-        if (list->magic != SETUP_DEV_INFO_LIST_MAGIC)
+        if (list->magic != SETUP_DEV_INFO_SET_MAGIC)
             SetLastError(ERROR_INVALID_HANDLE);
         else if (DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA))
             SetLastError(ERROR_INVALID_USER_BUFFER);
-        else if (MemberIndex >= list->numberOfEntries)
-            SetLastError(ERROR_NO_MORE_ITEMS);
         else
         {
             PLIST_ENTRY ItemList = list->ListHead.Flink;
-            DeviceInfo* DevInfo;
-            while (MemberIndex-- > 0)
+            while (ItemList != &list->ListHead && MemberIndex-- > 0)
                 ItemList = ItemList->Flink;
-            DevInfo = (DeviceInfo *)ItemList;
-            if (DevInfo->IsDevice)
+            if (ItemList == &list->ListHead)
+                SetLastError(ERROR_NO_MORE_ITEMS);
+            else
             {
+                struct DeviceInfoElement *DevInfo = (struct DeviceInfoElement *)ItemList;
                 memcpy(&DeviceInfoData->ClassGuid,
-                    &DevInfo->Device.ClassGuid,
+                    &DevInfo->ClassGuid,
                     sizeof(GUID));
                 DeviceInfoData->DevInst = 0; /* FIXME */
                 /* Note: this appears to be dangerous, passing a private
@@ -736,10 +802,6 @@
                 DeviceInfoData->Reserved = (ULONG_PTR)DevInfo;
                 ret = TRUE;
             }
-            else
-            {
-                SetLastError(ERROR_INVALID_PARAMETER);
-            }
         }
     }
     else
@@ -1095,7 +1157,7 @@
 }
 
 static LONG SETUP_CreateDevListFromEnumerator(
-       DeviceInfoList* list,
+       struct DeviceInfoSet *list,
        LPCGUID pClassGuid OPTIONAL,
        LPCWSTR Enumerator,
        HKEY hEnumeratorKey) /* handle to Enumerator registry key */
@@ -1104,7 +1166,7 @@
     WCHAR KeyBuffer[MAX_PATH];
     WCHAR InstancePath[MAX_PATH];
     LPWSTR pEndOfInstancePath; /* Pointer into InstancePath buffer */
-    DeviceInfo* deviceInfo;
+    struct DeviceInfoElement *deviceInfo;
     DWORD i = 0, j;
     DWORD dwLength, dwRegType;
     DWORD rc;
@@ -1178,6 +1240,7 @@
             else if (pClassGuid)
             {
                 GUID KeyGuid;
+                KeyBuffer[37] = '\0'; /* Replace the } by a NULL character */
                 if (UuidFromStringW(&KeyBuffer[1], &KeyGuid) != RPC_S_OK)
                 {
                     RegCloseKey(hDeviceIdKey);
@@ -1189,17 +1252,25 @@
             }
 
             /* Add the entry to the list */
-            deviceInfo = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(DeviceInfo, Device.InstancePath) + (wcslen(InstancePath) + 1) * sizeof(WCHAR));
+            deviceInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(struct DeviceInfoElement) + (wcslen(InstancePath) + 1) * sizeof(WCHAR));
             if (!deviceInfo)
             {
                 RegCloseKey(hDeviceIdKey);
                 return ERROR_NO_SYSTEM_RESOURCES;
             }
-            deviceInfo->IsDevice = TRUE;
-            memcpy(&deviceInfo->Device.ClassGuid, pClassGuid, sizeof(GUID));
-            wcscpy(deviceInfo->Device.InstancePath, InstancePath);
-            InsertTailList(&list->ListHead, &deviceInfo->ItemEntry);
-            list->numberOfEntries++;
+            TRACE("Adding '%S' to device info set %p\n", InstancePath, list);
+            wcscpy(deviceInfo->Data, InstancePath);
+            deviceInfo->DeviceName = deviceInfo->Data;
+            deviceInfo->UniqueId = &deviceInfo->Data[pEndOfInstancePath - InstancePath + 1];
+            deviceInfo->DeviceDescription = NULL;
+            memcpy(&deviceInfo->ClassGuid, pClassGuid, sizeof(GUID));
+            deviceInfo->CreationFlags = 0;
+            deviceInfo->hwndParent = NULL;
+            deviceInfo->Flags = 0; /* FIXME */
+            deviceInfo->FlagsEx = 0; /* FIXME */
+            InitializeListHead(&deviceInfo->DriverListHead);
+            InitializeListHead(&deviceInfo->InterfaceHead);
+            InsertTailList(&list->ListHead, &deviceInfo->ListEntry);
         }
         RegCloseKey(hDeviceIdKey);
     }
@@ -1208,7 +1279,7 @@
 }
 
 static LONG SETUP_CreateDevList(
-       DeviceInfoList* list,
+       struct DeviceInfoSet *list,
        PCWSTR MachineName OPTIONAL,
        LPGUID class OPTIONAL,
        PCWSTR Enumerator OPTIONAL)
@@ -1301,7 +1372,7 @@
 
 #ifdef __WINESRC__
 static LONG SETUP_CreateSerialDeviceList(
-       DeviceInfoList *list,
+       struct DeviceInfoSet *list,
        PCWSTR MachineName,
        LPGUID InterfaceGuid,
        PCWSTR DeviceInstanceW)
@@ -1312,7 +1383,7 @@
     LPWSTR devices;
     static const WCHAR devicePrefixW[] = { 'C','O','M',0 };
     LPWSTR ptr;
-    DeviceInfo *deviceInfo;
+    //DeviceInfo *deviceInfo;
 
     if (MachineName)
         WARN("'MachineName' is ignored on Wine!\n");
@@ -1350,6 +1421,7 @@
         {
             /* We have found a device */
             TRACE("Adding %s to list\n", debugstr_w(ptr));
+#if 0
             deviceInfo = HeapAlloc(GetProcessHeap(), 0,
                 FIELD_OFFSET(DeviceInfo, Interface.Data) + (strlenW(ptr) + 1) * sizeof(WCHAR));
             if (!deviceInfo)
@@ -1363,7 +1435,9 @@
             memcpy(&deviceInfo->Interface.InterfaceGuid, InterfaceGuid, sizeof(GUID));
             wcscpy(deviceInfo->Interface.pSymbolicLink, ptr);
             InsertTailList(&list->ListHead, &deviceInfo->ItemEntry);
-            list->numberOfEntries++;
+#else
+            FIXME("not implemented\n");
+#endif
         }
     }
     if (devices != buf)
@@ -1374,7 +1448,7 @@
 #else /* __WINESRC__ */
 
 static LONG SETUP_CreateInterfaceList(
-       DeviceInfoList *list,
+       struct DeviceInfoSet *list,
        PCWSTR MachineName,
        LPGUID InterfaceGuid,
        PCWSTR DeviceInstanceW /* OPTIONAL */)
@@ -1619,7 +1693,7 @@
        PVOID reserved)
 {
     HDEVINFO hDeviceInfo = INVALID_HANDLE_VALUE;
-    DeviceInfoList *list;
+    struct DeviceInfoSet *list;
     LPGUID pClassGuid;
     LONG rc;
 
@@ -1629,8 +1703,8 @@
     /* Create the deviceset if not set */
     if (deviceset)
     {
-        list = (DeviceInfoList *)deviceset;
-        if (list->magic != SETUP_DEV_INFO_LIST_MAGIC)
+        list = (struct DeviceInfoSet *)deviceset;
+        if (list->magic != SETUP_DEV_INFO_SET_MAGIC)
         {
             SetLastError(ERROR_INVALID_HANDLE);
             return INVALID_HANDLE_VALUE;
@@ -1644,7 +1718,7 @@
              NULL, machine, NULL);
          if (hDeviceInfo == INVALID_HANDLE_VALUE)
              return INVALID_HANDLE_VALUE;
-         list = (DeviceInfoList *)hDeviceInfo;
+         list = (struct DeviceInfoSet *)hDeviceInfo;
     }
 
     if (IsEqualIID(&list->ClassGuid, &GUID_NULL))
@@ -1730,8 +1804,6 @@
 
     TRACE("%p, %p, %s, 0x%08lx, %p\n", DeviceInfoSet, DeviceInfoData,
      debugstr_guid(InterfaceClassGuid), MemberIndex, DeviceInterfaceData);
-    if (DeviceInfoData)
-        FIXME(": unimplemented with PSP_DEVINFO_DATA set\n");
 
     if (!DeviceInterfaceData)
         SetLastError(ERROR_INVALID_PARAMETER);
@@ -1739,39 +1811,54 @@
         SetLastError(ERROR_INVALID_USER_BUFFER);
     else if (DeviceInfoSet && DeviceInfoSet != (HDEVINFO)INVALID_HANDLE_VALUE)
     {
-        DeviceInfoList *list = (DeviceInfoList *)DeviceInfoSet;
+        struct DeviceInfoSet *list = (struct DeviceInfoSet *)DeviceInfoSet;
 
-        if (list->magic == SETUP_DEV_INFO_LIST_MAGIC)
+        if (list->magic == SETUP_DEV_INFO_SET_MAGIC)
         {
-            if (MemberIndex >= list->numberOfEntries)
-                SetLastError(ERROR_NO_MORE_ITEMS);
-            else
+            PLIST_ENTRY ItemList = list->ListHead.Flink;
+            BOOL Found = FALSE;
+            while (ItemList != &list->ListHead && !Found)
             {
-                PLIST_ENTRY ItemList = list->ListHead.Flink;
-                DeviceInfo* DevInfo;
-                while (MemberIndex-- > 0)
+                PLIST_ENTRY InterfaceListEntry;
+                struct DeviceInfoElement *DevInfo = (struct DeviceInfoElement *)ItemList;
+                if (DeviceInfoData && (struct DeviceInfoElement *)DeviceInfoData->Reserved != DevInfo)
+                {
+                    /* We are not searching for this element */
                     ItemList = ItemList->Flink;
-                DevInfo = (DeviceInfo *)ItemList;
-
-                if (DevInfo->IsDevice)
-                    SetLastError(ERROR_INVALID_PARAMETER);
-                else if (!IsEqualIID(&DevInfo->Interface.InterfaceGuid, InterfaceClassGuid))
-                    SetLastError(ERROR_INVALID_PARAMETER);
-                else
+                    continue;
+                }
+                InterfaceListEntry = DevInfo->InterfaceHead.Flink;
+                while (InterfaceListEntry != &DevInfo->InterfaceHead && !Found)
                 {
-                    memcpy(&DeviceInterfaceData->InterfaceClassGuid,
-                        &DevInfo->Interface.InterfaceGuid,
-                        sizeof(DeviceInterfaceData->InterfaceClassGuid));
-                    DeviceInterfaceData->Flags = 0; /* FIXME */
-                    /* Note: this appears to be dangerous, passing a private
-                     * pointer a heap-allocated datum to the caller.  However, the
-                     * expected lifetime of the device data is the same as the
-                     * HDEVINFO; once that is closed, the data are no longer valid.
-                     */
-                    DeviceInterfaceData->Reserved = (ULONG_PTR)DevInfo;
-                    ret = TRUE;
+                    struct DeviceInterface *DevItf = (struct DeviceInterface *)InterfaceListEntry;
+                    if (!IsEqualIID(&DevItf->InterfaceClassGuid, InterfaceClassGuid))
+                    {
+                        InterfaceListEntry = InterfaceListEntry->Flink;
+                        continue;
+                    }
+                    if (MemberIndex-- == 0)
+                    {
+                        /* return this item */
+                        memcpy(&DeviceInterfaceData->InterfaceClassGuid,
+                            &DevItf->InterfaceClassGuid,
+                            sizeof(GUID));
+                        DeviceInterfaceData->Flags = 0; /* FIXME */
+                        /* Note: this appears to be dangerous, passing a private
+                         * pointer a heap-allocated datum to the caller.  However, the
+                         * expected lifetime of the device data is the same as the
+                         * HDEVINFO; once that is closed, the data are no longer valid.
+                         */
+                        DeviceInterfaceData->Reserved = (ULONG_PTR)DevItf;
+                        Found = TRUE;
+                    }
+                    MemberIndex--;
                 }
+                ItemList = ItemList->Flink;
             }
+            if (!Found)
+                SetLastError(ERROR_NO_MORE_ITEMS);
+            else
+                ret = TRUE;
         }
         else
             SetLastError(ERROR_INVALID_HANDLE);
@@ -1791,14 +1878,21 @@
     TRACE("%p\n", devinfo);
     if (devinfo && devinfo != (HDEVINFO)INVALID_HANDLE_VALUE)
     {
-        DeviceInfoList *list = (DeviceInfoList *)devinfo;
+        struct DeviceInfoSet *list = (struct DeviceInfoSet *)devinfo;
 
-        if (list->magic == SETUP_DEV_INFO_LIST_MAGIC)
+        if (list->magic == SETUP_DEV_INFO_SET_MAGIC)
         {
-            PLIST_ENTRY ListEntry;
+            PLIST_ENTRY ListEntry, InterfaceEntry;
+            struct DeviceInfoElement *deviceInfo;
             while (!IsListEmpty(&list->ListHead))
             {
                 ListEntry = RemoveHeadList(&list->ListHead);
+                deviceInfo = (struct DeviceInfoElement *)ListEntry;
+                while (!IsListEmpty(&deviceInfo->InterfaceHead))
+                {
+                    InterfaceEntry = RemoveHeadList(&deviceInfo->InterfaceHead);
+                    HeapFree(GetProcessHeap(), 0, InterfaceEntry);
+                }
                 HeapFree(GetProcessHeap(), 0, ListEntry);
             }
             if (list->HKLM != HKEY_LOCAL_MACHINE)
@@ -1905,7 +1999,7 @@
         SetLastError(ERROR_INVALID_PARAMETER);
     else if (DeviceInfoSet == (HDEVINFO)INVALID_HANDLE_VALUE)
         SetLastError(ERROR_INVALID_HANDLE);
-    else if (((DeviceInfoList*)DeviceInfoSet)->magic != SETUP_DEV_INFO_LIST_MAGIC)
+    else if (((struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEV_INFO_SET_MAGIC)
         SetLastError(ERROR_INVALID_HANDLE);
     else if (DeviceInterfaceData->cbSize != sizeof(SP_DEVICE_INTERFACE_DATA))
         SetLastError(ERROR_INVALID_USER_BUFFER);
@@ -1919,6 +2013,7 @@
         SetLastError(ERROR_INVALID_PARAMETER);
     else
     {
+#if 0
         DeviceInfo *deviceInfo = (DeviceInfo *)DeviceInterfaceData->Reserved;
         LPCWSTR devName = deviceInfo->Interface.pSymbolicLink;
         DWORD sizeRequired = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W) +
@@ -1949,6 +2044,11 @@
             }
             ret = TRUE;
         }
+#else
+        FIXME("not implemented\n");
+        SetLastError(ERROR_GEN_FAILURE);
+        ret = FALSE;
+#endif
     }
 
     TRACE("Returning %d\n", ret);
@@ -2052,7 +2152,7 @@
 
     if (!DeviceInfoSet || DeviceInfoSet == (HDEVINFO)INVALID_HANDLE_VALUE)
         SetLastError(ERROR_INVALID_HANDLE);
-    else if (((DeviceInfoList *)DeviceInfoSet)->magic != SETUP_DEV_INFO_LIST_MAGIC)
+    else if (((struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEV_INFO_SET_MAGIC)
         SetLastError(ERROR_INVALID_HANDLE);
     else if (!DeviceInfoData)
         SetLastError(ERROR_INVALID_PARAMETER);
@@ -2060,12 +2160,10 @@
         SetLastError(ERROR_INVALID_USER_BUFFER);
     else if (Property >= SPDRP_MAXIMUM_PROPERTY)
         SetLastError(ERROR_INVALID_PARAMETER);
-    else if (!((DeviceInfo *)DeviceInfoData->Reserved)->IsDevice)
-        SetLastError(ERROR_INVALID_PARAMETER);
     else
     {
-        DeviceInfoList *list = (DeviceInfoList *)DeviceInfoSet;
-        DeviceInfo* DevInfo = (DeviceInfo *)DeviceInfoData->Reserved;
+        struct DeviceInfoSet *list = (struct DeviceInfoSet *)DeviceInfoSet;
+        struct DeviceInfoElement *DevInfo = (struct DeviceInfoElement *)DeviceInfoData->Reserved;
 
         switch (Property)
         {
@@ -2142,7 +2240,7 @@
                 }
                 rc = RegOpenKeyExW(
                     hEnumKey,
-                    DevInfo->Device.InstancePath,
+                    DevInfo->Data,
                     0, /* Options */
                     KEY_QUERY_VALUE,
                     &hKey);
@@ -2173,7 +2271,7 @@
 
             case SPDRP_PHYSICAL_DEVICE_OBJECT_NAME:
             {
-                DWORD required = (wcslen(DevInfo->Device.InstancePath) + 1) * sizeof(WCHAR);
+                DWORD required = (wcslen(DevInfo->Data) + 1) * sizeof(WCHAR);
 
                 if (PropertyRegDataType)
                     *PropertyRegDataType = REG_SZ;
@@ -2181,7 +2279,7 @@
                     *RequiredSize = required;
                 if (PropertyBufferSize >= required)
                 {
-                    wcscpy((LPWSTR)PropertyBuffer, DevInfo->Device.InstancePath);
+                    wcscpy((LPWSTR)PropertyBuffer, DevInfo->Data);
                     ret = TRUE;
                 }
                 else