Active functions related to interfaces enumeration: SETUP_CreateSerialDeviceList, SETUP_CreateInterfaceList, SetupDiGetDeviceInterfaceDetailW. They were disabled since r17210
Replace ERROR_NO_SYSTEM_RESOURCES by ERROR_NOT_ENOUGH_MEMORY
Replace #ifdef __WINESRC__ by #ifndef __REACTOS__, as ReactOS also defines __WINESRC__
Minor fixes
Modified: trunk/reactos/lib/setupapi/devinst.c

Modified: trunk/reactos/lib/setupapi/devinst.c
--- trunk/reactos/lib/setupapi/devinst.c	2005-08-09 19:52:16 UTC (rev 17250)
+++ trunk/reactos/lib/setupapi/devinst.c	2005-08-09 20:12:35 UTC (rev 17251)
@@ -82,11 +82,13 @@
 
 #define SETUP_DEV_INFO_SET_MAGIC 0xd00ff057
 
-struct DeviceInterface /* Element of DeviceInfoElement.InterfaceHead */
+struct DeviceInterface /* Element of DeviceInfoElement.InterfaceListHead */
 {
     LIST_ENTRY ListEntry;
 
+    struct DeviceInfoElement* DeviceInfo;
     GUID InterfaceClassGuid;
+
     
     /* SPINT_ACTIVE : the interface is active/enabled
      * SPINT_DEFAULT: the interface is the default interface for the device class FIXME???
@@ -157,7 +159,7 @@
     struct DriverInfoElement *SelectedDriver;
 
     /* List of interfaces implemented by this device */
-    LIST_ENTRY InterfaceHead; /* List of struct DeviceInterface */
+    LIST_ENTRY InterfaceListHead; /* List of struct DeviceInterface */
 
     WCHAR Data[0];
 };
@@ -1167,11 +1169,12 @@
     struct DeviceInfoElement *deviceInfo;
 
     *pDeviceInfo = NULL;
+    if (IsEqualIID(&pClassGuid, &GUID_NULL)) { FIXME("Bad argument!!!"); return FALSE; }/* FIXME: remove */
 
     deviceInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(struct DeviceInfoElement) + (wcslen(InstancePath) + 1) * sizeof(WCHAR));
     if (!deviceInfo)
     {
-        SetLastError(ERROR_NO_SYSTEM_RESOURCES);
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
         return FALSE;
     }
     wcscpy(deviceInfo->Data, InstancePath);
@@ -1185,12 +1188,39 @@
     deviceInfo->FlagsEx = 0; /* FIXME */
     deviceInfo->SelectedDriver = NULL;
     InitializeListHead(&deviceInfo->DriverListHead);
-    InitializeListHead(&deviceInfo->InterfaceHead);
+    InitializeListHead(&deviceInfo->InterfaceListHead);
 
     *pDeviceInfo = deviceInfo;
     return TRUE;
 }
 
+static BOOL
+CreateDeviceInterface(
+    IN struct DeviceInfoElement* deviceInfo,
+    IN LPCWSTR SymbolicLink,
+    IN LPCGUID pInterfaceGuid,
+    OUT struct DeviceInterface **pDeviceInterface)
+{
+    struct DeviceInterface *deviceInterface;
+
+    *pDeviceInterface = NULL;
+    if (IsEqualIID(&pInterfaceGuid, &GUID_NULL)) { FIXME("Bad argument!!!"); return FALSE; }/* FIXME: remove */
+
+    deviceInterface = HeapAlloc(GetProcessHeap(), 0, sizeof(struct DeviceInterface) + (wcslen(SymbolicLink) + 1) * sizeof(WCHAR));
+    if (!deviceInterface)
+    {
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        return FALSE;
+    }
+    deviceInterface->DeviceInfo = deviceInfo;
+    wcscpy(deviceInterface->SymbolicLink, SymbolicLink);
+    deviceInterface->Flags = 0; /* FIXME */
+    memcpy(&deviceInterface->InterfaceClassGuid, pInterfaceGuid, sizeof(GUID));
+
+    *pDeviceInterface = deviceInterface;
+    return TRUE;
+}
+
 static LONG SETUP_CreateDevListFromEnumerator(
        struct DeviceInfoSet *list,
        LPCGUID pClassGuid OPTIONAL,
@@ -1393,7 +1423,7 @@
     }
 }
 
-#ifdef __WINESRC__
+#ifndef __REACTOS__
 static LONG SETUP_CreateSerialDeviceList(
        struct DeviceInfoSet *list,
        PCWSTR MachineName,
@@ -1406,7 +1436,7 @@
     LPWSTR devices;
     static const WCHAR devicePrefixW[] = { 'C','O','M',0 };
     LPWSTR ptr;
-    //DeviceInfo *deviceInfo;
+    struct DeviceInfoElement *deviceInfo;
 
     if (MachineName)
         WARN("'MachineName' is ignored on Wine!\n");
@@ -1426,7 +1456,7 @@
                 HeapFree(GetProcessHeap(), 0, devices);
             devices = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
             if (!devices)
-                return ERROR_NO_SYSTEM_RESOURCES;
+                return ERROR_NOT_ENOUGH_MEMORY;
             *devices = '\0';
         }
         else
@@ -1443,24 +1473,25 @@
         if (strncmpW(devicePrefixW, ptr, sizeof(devicePrefixW) / sizeof(devicePrefixW[0]) - 1) == 0)
         {
             /* We have found a device */
+            struct DeviceInterface *interfaceInfo;
             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)
+            /* Step 1. Create a device info element */
+            if (!CreateDeviceInfoElement(ptr, &GUID_SERENUM_BUS_ENUMERATOR, &deviceInfo))
             {
                 if (devices != buf)
                     HeapFree(GetProcessHeap(), 0, devices);
-                return ERROR_NO_SYSTEM_RESOURCES;
+                return GetLastError();
             }
-            deviceInfo->IsDevice = FALSE;
-            deviceInfo->Interface.pSymbolicLink = &deviceInfo->Interface.Data[0];
-            memcpy(&deviceInfo->Interface.InterfaceGuid, InterfaceGuid, sizeof(GUID));
-            wcscpy(deviceInfo->Interface.pSymbolicLink, ptr);
-            InsertTailList(&list->ListHead, &deviceInfo->ItemEntry);
-#else
-            FIXME("not implemented\n");
-#endif
+            InsertTailList(&list->ListHead, &deviceInfo->ListEntry);
+
+            /* Step 2. Create an interface list for this element */
+            if (!CreateDeviceInterface(deviceInfo, ptr, InterfaceGuid, &interfaceInfo))
+            {
+                if (devices != buf)
+                    HeapFree(GetProcessHeap(), 0, devices);
+                return GetLastError();
+            }
+            InsertTailList(&deviceInfo->InterfaceListHead, &interfaceInfo->ListEntry);
         }
     }
     if (devices != buf)
@@ -1468,7 +1499,7 @@
     return ERROR_SUCCESS;
 }
 
-#else /* __WINESRC__ */
+#else /* __REACTOS__ */
 
 static LONG SETUP_CreateInterfaceList(
        struct DeviceInfoSet *list,
@@ -1488,7 +1519,7 @@
     DWORD dwLength, dwInstancePathLength;
     DWORD dwRegType;
     GUID ClassGuid;
-    DeviceInfo *deviceInfo;
+    struct DeviceInfoElement *deviceInfo;
 
     /* Open registry key related to this interface */
     hInterfaceKey = SetupDiOpenClassRegKeyExW(InterfaceGuid, KEY_ENUMERATE_SUB_KEYS, DIOCR_INTERFACE, MachineName, NULL);
@@ -1537,7 +1568,7 @@
         {
             RegCloseKey(hDeviceInstanceKey);
             RegCloseKey(hInterfaceKey);
-            return ERROR_NO_SYSTEM_RESOURCES;
+            return ERROR_NOT_ENOUGH_MEMORY;
         }
         rc = RegQueryValueExW(hDeviceInstanceKey, DeviceInstance, NULL, NULL, (LPBYTE)InstancePath, &dwInstancePathLength);
         if (rc != ERROR_SUCCESS)
@@ -1622,6 +1653,9 @@
         j = 0;
         while (TRUE)
         {
+            LPWSTR pSymbolicLink;
+            struct DeviceInterface *interfaceInfo;
+
             dwLength = sizeof(KeyBuffer) / sizeof(KeyBuffer[0]);
             rc = RegEnumKeyExW(hDeviceInstanceKey, j, KeyBuffer, &dwLength, NULL, NULL, NULL, NULL);
             if (rc == ERROR_NO_MORE_ITEMS)
@@ -1663,45 +1697,55 @@
                 RegCloseKey(hInterfaceKey);
                 return ERROR_GEN_FAILURE;
             }
-            deviceInfo = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(DeviceInfo, Interface.Data) + dwInstancePathLength + dwLength + 2 * sizeof(WCHAR));
-            if (!deviceInfo)
+
+            /* We have found a device */
+            /* Step 1. Create a device info element */
+            if (!CreateDeviceInfoElement(InstancePath, &ClassGuid, &deviceInfo))
             {
                 RegCloseKey(hReferenceKey);
                 RegCloseKey(hDeviceInstanceKey);
                 RegCloseKey(hInterfaceKey);
-                return ERROR_NO_SYSTEM_RESOURCES;
+                return GetLastError();
             }
-            deviceInfo->Interface.pInstancePath = &deviceInfo->Interface.Data[0];
-            deviceInfo->Interface.pSymbolicLink = &deviceInfo->Interface.Data[dwInstancePathLength + 1];
-            rc = RegQueryValueExW(hReferenceKey, SymbolicLink, NULL, NULL, (LPBYTE)deviceInfo->Interface.pSymbolicLink, &dwLength);
+            TRACE("Adding device %s to list\n", debugstr_w(InstancePath));
+            InsertTailList(&list->ListHead, &deviceInfo->ListEntry);
+
+            /* Step 2. Create an interface list for this element */
+            pSymbolicLink = HeapAlloc(GetProcessHeap(), 0, (dwLength + 1) * sizeof(WCHAR));
+            if (!pSymbolicLink)
+            {
+                RegCloseKey(hReferenceKey);
+                RegCloseKey(hDeviceInstanceKey);
+                RegCloseKey(hInterfaceKey);
+                return ERROR_NOT_ENOUGH_MEMORY;
+            }
+            rc = RegQueryValueExW(hReferenceKey, SymbolicLink, NULL, NULL, (LPBYTE)pSymbolicLink, &dwLength);
+            pSymbolicLink[dwLength / sizeof(WCHAR)] = '\0';
             RegCloseKey(hReferenceKey);
             if (rc != ERROR_SUCCESS)
             {
-                HeapFree(GetProcessHeap(), 0, deviceInfo);
+                HeapFree(GetProcessHeap(), 0, pSymbolicLink);
                 RegCloseKey(hDeviceInstanceKey);
                 RegCloseKey(hInterfaceKey);
                 return rc;
             }
-            deviceInfo->Interface.pSymbolicLink[dwLength / sizeof(WCHAR)] = '\0';
-            TRACE("Symbolic link %s\n", debugstr_w(deviceInfo->Interface.pSymbolicLink));
-
-            /* Add this entry to the list */
-            TRACE("Entry found\n");
-            deviceInfo->IsDevice = FALSE;
-            memcpy(
-                &deviceInfo->Interface.InterfaceGuid,
-                InterfaceGuid,
-                sizeof(deviceInfo->Interface.InterfaceGuid));
-            wcscpy(deviceInfo->Interface.pInstancePath, InstancePath);
-            InsertTailList(&list->ListHead, &deviceInfo->ItemEntry);
-            list->numberOfEntries++;
+            if (!CreateDeviceInterface(deviceInfo, pSymbolicLink, InterfaceGuid, &interfaceInfo))
+            {
+                HeapFree(GetProcessHeap(), 0, pSymbolicLink);
+                RegCloseKey(hDeviceInstanceKey);
+                RegCloseKey(hInterfaceKey);
+                return GetLastError();
+            }
+            TRACE("Adding interface %s to list\n", debugstr_w(pSymbolicLink));
+            HeapFree(GetProcessHeap(), 0, pSymbolicLink);
+            InsertTailList(&deviceInfo->InterfaceListHead, &interfaceInfo->ListEntry);
         }
         RegCloseKey(hDeviceInstanceKey);
     }
     RegCloseKey(hInterfaceKey);
     return ERROR_SUCCESS;
 }
-#endif /* __WINESRC__ */
+#endif /* __REACTOS__ */
 
 /***********************************************************************
  *		SetupDiGetClassDevsExW (SETUPAPI.@)
@@ -1776,7 +1820,7 @@
             return INVALID_HANDLE_VALUE;
         }
 
-#ifdef __WINESRC__
+#ifndef __REACTOS__
         /* Special case: find serial ports by calling QueryDosDevice */
         if (IsEqualIID(class, &GUID_DEVINTERFACE_COMPORT))
             rc = SETUP_CreateSerialDeviceList(list, machine, (LPGUID)class, enumstr);
@@ -1787,9 +1831,9 @@
             ERR("Wine can only enumerate serial devices at the moment!\n");
             rc = ERROR_INVALID_PARAMETER;
         }
-#else /* __WINESRC__ */
+#else /* __REACTOS__ */
         rc = SETUP_CreateInterfaceList(list, machine, (LPGUID)class, enumstr);
-#endif /* __WINESRC__ */
+#endif /* __REACTOS__ */
         if (rc != ERROR_SUCCESS)
         {
             SetLastError(rc);
@@ -1825,7 +1869,7 @@
 {
     BOOL ret = FALSE;
 
-    TRACE("%p, %p, %s, 0x%08lx, %p\n", DeviceInfoSet, DeviceInfoData,
+    TRACE("%p, %p, %s, %ld, %p\n", DeviceInfoSet, DeviceInfoData,
      debugstr_guid(InterfaceClassGuid), MemberIndex, DeviceInterfaceData);
 
     if (!DeviceInterfaceData)
@@ -1850,8 +1894,8 @@
                     ItemList = ItemList->Flink;
                     continue;
                 }
-                InterfaceListEntry = DevInfo->InterfaceHead.Flink;
-                while (InterfaceListEntry != &DevInfo->InterfaceHead && !Found)
+                InterfaceListEntry = DevInfo->InterfaceListHead.Flink;
+                while (InterfaceListEntry != &DevInfo->InterfaceListHead && !Found)
                 {
                     struct DeviceInterface *DevItf = (struct DeviceInterface *)InterfaceListEntry;
                     if (!IsEqualIID(&DevItf->InterfaceClassGuid, InterfaceClassGuid))
@@ -1874,7 +1918,7 @@
                         DeviceInterfaceData->Reserved = (ULONG_PTR)DevItf;
                         Found = TRUE;
                     }
-                    MemberIndex--;
+                    InterfaceListEntry = InterfaceListEntry->Flink;
                 }
                 ItemList = ItemList->Flink;
             }
@@ -1911,9 +1955,9 @@
             {
                 ListEntry = RemoveHeadList(&list->ListHead);
                 deviceInfo = (struct DeviceInfoElement *)ListEntry;
-                while (!IsListEmpty(&deviceInfo->InterfaceHead))
+                while (!IsListEmpty(&deviceInfo->InterfaceListHead))
                 {
-                    InterfaceEntry = RemoveHeadList(&deviceInfo->InterfaceHead);
+                    InterfaceEntry = RemoveHeadList(&deviceInfo->InterfaceListHead);
                     HeapFree(GetProcessHeap(), 0, InterfaceEntry);
                 }
                 HeapFree(GetProcessHeap(), 0, ListEntry);
@@ -1928,6 +1972,8 @@
     }
     else
         SetLastError(ERROR_INVALID_HANDLE);
+
+    TRACE("Returning %d\n", ret);
     return ret;
 }
 
@@ -2036,11 +2082,10 @@
         SetLastError(ERROR_INVALID_PARAMETER);
     else
     {
-#if 0
-        DeviceInfo *deviceInfo = (DeviceInfo *)DeviceInterfaceData->Reserved;
-        LPCWSTR devName = deviceInfo->Interface.pSymbolicLink;
+        struct DeviceInterface *deviceInterface = (struct DeviceInterface *)DeviceInterfaceData->Reserved;
+        LPCWSTR devName = deviceInterface->SymbolicLink;
         DWORD sizeRequired = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W) +
-            lstrlenW(devName);
+            (lstrlenW(devName) + 1) * sizeof(WCHAR);
 
         if (sizeRequired > DeviceInterfaceDetailDataSize)
         {
@@ -2055,7 +2100,7 @@
             if (DeviceInfoData)
             {
                 memcpy(&DeviceInfoData->ClassGuid,
-                    &deviceInfo->Interface.ClassGuid,
+                    &deviceInterface->DeviceInfo->ClassGuid,
                     sizeof(GUID));
                 DeviceInfoData->DevInst = 0; /* FIXME */
                 /* Note: this appears to be dangerous, passing a private
@@ -2063,15 +2108,10 @@
                  * expected lifetime of the device data is the same as the
                  * HDEVINFO; once that is closed, the data are no longer valid.
                  */
-                DeviceInfoData->Reserved = (ULONG_PTR)deviceInfo;
+                DeviceInfoData->Reserved = (ULONG_PTR)deviceInterface->DeviceInfo;
             }
             ret = TRUE;
         }
-#else
-        FIXME("not implemented\n");
-        SetLastError(ERROR_GEN_FAILURE);
-        ret = FALSE;
-#endif
     }
 
     TRACE("Returning %d\n", ret);
@@ -2643,7 +2683,7 @@
     lpFullGuidString = HeapAlloc(GetProcessHeap(), 0, (dwLength + 3) * sizeof(WCHAR));
     if (!lpFullGuidString)
     {
-        SetLastError(ERROR_NO_SYSTEM_RESOURCES);
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
         RpcStringFreeW(&lpGuidString);
         return INVALID_HANDLE_VALUE;
     }
@@ -2864,7 +2904,7 @@
             {
                 struct DeviceInfoElement *deviceInfo;
 
-                if (CreateDeviceInfoElement(DeviceName, &GUID_NULL /* FIXME */, &deviceInfo))
+                if (CreateDeviceInfoElement(DeviceName, ClassGuid, &deviceInfo))
                 {
                     InsertTailList(&list->ListHead, &deviceInfo->ListEntry);