- Added support for NTLDR style freeloader GUI. To enable, edit freeldr.ini and add:
[reactos.git] / reactos / ntoskrnl / io / driver.c
index 71bb6c2..862d982 100644 (file)
 #include <internal/debug.h>
 
 /* ke/main.c */
-extern LOADER_PARAMETER_BLOCK EXPORTED KeLoaderBlock;
+extern LOADER_PARAMETER_BLOCK KeLoaderBlock;
 extern ULONG KeTickCount;
 extern BOOLEAN SetupMode;
-
-NTSTATUS
-LdrProcessModule(PVOID ModuleLoadBase,
-                PUNICODE_STRING ModuleName,
-                PLDR_DATA_TABLE_ENTRY *ModuleObject);
+extern BOOLEAN NoGuiBoot;
 
 typedef struct _SERVICE_GROUP
 {
@@ -73,13 +69,48 @@ static LIST_ENTRY ServiceListHead  = {NULL, NULL};
 static UNICODE_STRING IopHardwareDatabaseKey =
    RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\HARDWARE\\DESCRIPTION\\SYSTEM");
 
-POBJECT_TYPE EXPORTED IoDriverObjectType = NULL;
+POBJECT_TYPE IoDriverObjectType = NULL;
 
 /* DECLARATIONS ***************************************************************/
 
 VOID STDCALL
 IopDeleteDriver(PVOID ObjectBody);
 
+NTSTATUS
+LdrProcessModule(PVOID ModuleLoadBase,
+                PUNICODE_STRING ModuleName,
+                PLDR_DATA_TABLE_ENTRY *ModuleObject);
+
+VOID 
+FASTCALL
+INIT_FUNCTION
+IopDisplayLoadingMessage(PVOID ServiceName, 
+                         BOOLEAN Unicode);
+
+static VOID INIT_FUNCTION
+MiFreeBootDriverMemory(PVOID StartAddress, ULONG Length);
+
+NTSTATUS FASTCALL INIT_FUNCTION
+IopInitializeBuiltinDriver(
+   PDEVICE_NODE ModuleDeviceNode,
+   PVOID ModuleLoadBase,
+   PCHAR FileName,
+   ULONG ModuleLength);
+
+static INIT_FUNCTION NTSTATUS
+IopLoadDriver(PSERVICE Service);
+
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, IopInitDriverImplementation)
+#pragma alloc_text(INIT, IopDisplayLoadingMessage)
+#pragma alloc_text(INIT, IoCreateDriverList)
+#pragma alloc_text(INIT, IoDestroyDriverList)
+#pragma alloc_text(INIT, MiFreeBootDriverMemory)
+#pragma alloc_text(INIT, IopInitializeBuiltinDriver)
+#pragma alloc_text(INIT, IopLoadDriver)
+#endif
+
+
 /* PRIVATE FUNCTIONS **********************************************************/
 
 VOID 
@@ -342,7 +373,7 @@ IopDisplayLoadingMessage(PVOID ServiceName,
                          BOOLEAN Unicode)
 {
     CHAR TextBuffer[256];
-    if (SetupMode) return;
+    if (SetupMode || !NoGuiBoot) return;
     if (Unicode) 
     {
         sprintf(TextBuffer, "Loading %S...\n", (PWCHAR)ServiceName);
@@ -465,7 +496,7 @@ IopLoadServiceModule(
       return Status;
    }
    
-   IopDisplayLoadingMessage(ServiceName->Buffer, TRUE);
+   //IopDisplayLoadingMessage(ServiceName->Buffer, TRUE);
 
    /*
     * Normalize the image path for all later processing.
@@ -529,6 +560,9 @@ IopLoadServiceModule(
                break;
             }
          }
+         if (!NT_SUCCESS(Status))
+            /* Try to load it. It may just have been installed by PnP manager */
+            Status = LdrLoadModule(&ServiceImagePath, ModuleObject);
       }
 
       /*
@@ -1150,7 +1184,7 @@ IoDestroyDriverList(VOID)
   return(STATUS_SUCCESS);
 }
 
-VOID STATIC INIT_FUNCTION
+static VOID INIT_FUNCTION
 MiFreeBootDriverMemory(PVOID StartAddress, ULONG Length)
 {
    ULONG i;