[ros-diffs] [fireball] 40066: - Implement boot drivers loading.

fireball at svn.reactos.org fireball at svn.reactos.org
Mon Mar 16 21:56:08 CET 2009


Author: fireball
Date: Mon Mar 16 23:56:07 2009
New Revision: 40066

URL: http://svn.reactos.org/svn/reactos?rev=40066&view=rev
Log:
- Implement boot drivers loading.

Modified:
    trunk/reactos/boot/freeldr/freeldr/windows/setupldr2.c

Modified: trunk/reactos/boot/freeldr/freeldr/windows/setupldr2.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windows/setupldr2.c?rev=40066&r1=40065&r2=40066&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/windows/setupldr2.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/windows/setupldr2.c [iso-8859-1] Mon Mar 16 23:56:07 2009
@@ -42,7 +42,11 @@
                   IN LPCSTR AnsiFileName,
                   IN LPCSTR OemFileName,
                   IN LPCSTR LanguageFileName);
-
+BOOLEAN
+WinLdrAddDriverToList(LIST_ENTRY *BootDriverListHead,
+                      LPWSTR RegistryPath,
+                      LPWSTR ImagePath,
+                      LPWSTR ServiceName);
 
 
 //FIXME: Do a better way to retrieve Arc disk information
@@ -98,6 +102,52 @@
 
     Status = WinLdrLoadNLSData(LoaderBlock, SearchPath, AnsiName, OemName, LangName);
     DPRINTM(DPRINT_WINDOWS, "NLS data loaded with status %d\n", Status);
+}
+
+VOID
+SetupLdrScanBootDrivers(PLOADER_PARAMETER_BLOCK LoaderBlock, HINF InfHandle, LPCSTR SearchPath)
+{
+    INFCONTEXT InfContext;
+    BOOLEAN Status;
+    LPCSTR Media, DriverName;
+    WCHAR ServiceName[256];
+    WCHAR ImagePath[256];
+
+    /* Open inf section */
+    if (!InfFindFirstLine(InfHandle, "SourceDisksFiles", NULL, &InfContext))
+        return;
+
+    /* Load all listed boot drivers */
+    do
+    {
+        if (InfGetDataField(&InfContext, 7, &Media) &&
+            InfGetDataField(&InfContext, 0, &DriverName))
+        {
+            if (strcmp(Media, "x") == 0)
+            {
+                /* Convert name to widechar */
+                swprintf(ServiceName, L"%S", DriverName);
+
+                /* Remove .sys extension */
+                ServiceName[wcslen(ServiceName) - 4] = 0;
+
+                /* Prepare image path */
+                swprintf(ImagePath, L"%S", DriverName);
+
+                /* Add it to the list */
+                Status = WinLdrAddDriverToList(&LoaderBlock->BootDriverListHead,
+                    L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\",
+                    ImagePath,
+                    ServiceName);
+
+                if (!Status)
+                {
+                    DPRINTM(DPRINT_WINDOWS, "could not add boot driver %s, %s\n", SearchPath, DriverName);
+                    return;
+                }
+            }
+        }
+    } while (InfFindNextLine(&InfContext, &InfContext));
 }
 
 VOID LoadReactOSSetup2(VOID)
@@ -239,8 +289,11 @@
     /* Load NLS data */
     SetupLdrLoadNlsData(LoaderBlock, InfHandle, BootPath);
 
+    /* Get a list of boot drivers */
+    SetupLdrScanBootDrivers(LoaderBlock, InfHandle, BootPath);
+
     /* Load boot drivers */
-    //Status = WinLdrLoadBootDrivers(LoaderBlock, BootPath);
+    Status = WinLdrLoadBootDrivers(LoaderBlock, BootPath);
     DPRINTM(DPRINT_WINDOWS, "Boot drivers loaded with status %d\n", Status);
 
     /* Alloc PCR, TSS, do magic things with the GDT/IDT */



More information about the Ros-diffs mailing list