- Add a minimal implementation of SetupScanFileQueueW
- In SetupDiBuildDriverInfoList, add found drivers in the right driver list
- In SetupDiEnumDriverInfoW, enumerate the right driver list if DeviceInfoData is not NULL
Modified: trunk/reactos/lib/setupapi/devinst.c
Modified: trunk/reactos/lib/setupapi/queue.c

Modified: trunk/reactos/lib/setupapi/devinst.c
--- trunk/reactos/lib/setupapi/devinst.c	2005-12-28 13:27:40 UTC (rev 20393)
+++ trunk/reactos/lib/setupapi/devinst.c	2005-12-28 14:21:05 UTC (rev 20394)
@@ -5389,6 +5389,7 @@
         SetLastError(ERROR_INVALID_USER_BUFFER);
     else
     {
+        PLIST_ENTRY pDriverListHead = &list->DriverListHead;
         BOOL Result;
 
         InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
@@ -5396,6 +5397,13 @@
         if (!Result)
             goto done;
 
+        if (DeviceInfoData)
+        {
+            struct DeviceInfoElement *devInfo = (struct DeviceInfoElement *)DeviceInfoData->Reserved;
+            if (!(devInfo->CreationFlags & DICD_INHERIT_CLASSDRVS))
+                pDriverListHead = &devInfo->DriverListHead;
+        }
+
         if (DriverType == SPDIT_COMPATDRIVER)
         {
             /* Get hardware IDs list */
@@ -5633,7 +5641,7 @@
                         {
                             /* FIXME: read [ControlFlags] / ExcludeFromSelect */
                             if (!AddDriverToList(
-                                &list->DriverListHead,
+                                pDriverListHead,
                                 DriverType,
                                 &ClassGuid,
                                 ContextDevice,
@@ -5689,7 +5697,7 @@
                                     if (wcsicmp(DeviceId, currentId) == 0)
                                     {
                                         AddDriverToList(
-                                            &((struct DeviceInfoElement *)DeviceInfoData->Reserved)->DriverListHead,
+                                            pDriverListHead,
                                             DriverType,
                                             &ClassGuid,
                                             ContextDevice,
@@ -5710,7 +5718,7 @@
                                         if (wcsicmp(DeviceId, currentId) == 0)
                                         {
                                             AddDriverToList(
-                                                &((struct DeviceInfoElement *)DeviceInfoData->Reserved)->DriverListHead,
+                                                pDriverListHead,
                                                 DriverType,
                                                 &ClassGuid,
                                                 ContextDevice,
@@ -6106,8 +6114,6 @@
         SetLastError(ERROR_INVALID_HANDLE);
     else if (DriverType != SPDIT_CLASSDRIVER && DriverType != SPDIT_COMPATDRIVER)
         SetLastError(ERROR_INVALID_PARAMETER);
-    else if (DriverType == SPDIT_CLASSDRIVER && DeviceInfoData)
-        SetLastError(ERROR_INVALID_PARAMETER);
     else if (DriverType == SPDIT_COMPATDRIVER && !DeviceInfoData)
         SetLastError(ERROR_INVALID_PARAMETER);
     else if (DriverInfoData->cbSize != sizeof(SP_DRVINFO_DATA_V1_W) && DriverInfoData->cbSize != sizeof(SP_DRVINFO_DATA_V2_W))
@@ -6118,8 +6124,7 @@
         PLIST_ENTRY ItemList;
         if (DeviceInfoData)
             devInfo = (struct DeviceInfoElement *)DeviceInfoData->Reserved;
-        if (DriverType == SPDIT_CLASSDRIVER ||
-            (devInfo && devInfo->CreationFlags & DICD_INHERIT_CLASSDRVS))
+        if (!devInfo || (devInfo->CreationFlags & DICD_INHERIT_CLASSDRVS))
         {
             ListHead = &((struct DeviceInfoSet *)DeviceInfoSet)->DriverListHead;
         }

Modified: trunk/reactos/lib/setupapi/queue.c
--- trunk/reactos/lib/setupapi/queue.c	2005-12-28 13:27:40 UTC (rev 20393)
+++ trunk/reactos/lib/setupapi/queue.c	2005-12-28 14:21:05 UTC (rev 20394)
@@ -1200,11 +1200,43 @@
 /***********************************************************************
  *            SetupScanFileQueueW   (SETUPAPI.@)
  */
-BOOL WINAPI SetupScanFileQueueW( HSPFILEQ queue, DWORD flags, HWND window,
+BOOL WINAPI SetupScanFileQueueW( HSPFILEQ handle, DWORD flags, HWND window,
                                  PSP_FILE_CALLBACK_W callback, PVOID context, PDWORD result )
 {
-    FIXME("stub\n");
-    return FALSE;
+    struct file_queue *queue = handle;
+    struct file_op *op;
+    BOOL allnodesprocessed = FALSE;
+    FILEPATHS_W paths;
+
+    paths.Source = paths.Target = NULL;
+    *result = FALSE;
+
+    if ( flags & (SPQ_SCAN_FILE_PRESENCE | SPQ_SCAN_FILE_VALIDITY | SPQ_SCAN_USE_CALLBACKEX | SPQ_SCAN_INFORM_USER | SPQ_SCAN_PRUNE_COPY_QUEUE /*| SPQ_SCAN_USE_CALLBACK_SIGNERINFO | SPQ_SCAN_PRUNE_DELREN*/) )
+    {
+        FIXME( "flags ignored 0x%lx\n", flags & (SPQ_SCAN_FILE_PRESENCE | SPQ_SCAN_FILE_VALIDITY | SPQ_SCAN_USE_CALLBACKEX | SPQ_SCAN_INFORM_USER | SPQ_SCAN_PRUNE_COPY_QUEUE /*| SPQ_SCAN_USE_CALLBACK_SIGNERINFO | SPQ_SCAN_PRUNE_DELREN*/) );
+    }
+
+    if (queue->copy_queue.count)
+    {
+        for (op = queue->copy_queue.head; op; op = op->next)
+        {
+            build_filepathsW( op, &paths );
+            if (flags & SPQ_SCAN_USE_CALLBACK)
+            {
+                /* FIXME: sometimes set param 2 to SPQ_DELAYED_COPY */
+                if (NO_ERROR != callback( context, SPFILENOTIFY_QUEUESCAN, (UINT)paths.Target, 0 ))
+                    goto done;
+            }
+        }
+    }
+
+    *result = TRUE;
+    allnodesprocessed = TRUE;
+
+ done:
+    HeapFree( GetProcessHeap(), 0, (void *)paths.Source );
+    HeapFree( GetProcessHeap(), 0, (void *)paths.Target );
+    return allnodesprocessed;
 }