update for HEAD-2003050101
[reactos.git] / ntoskrnl / ldr / loader.c
index 1bb0712..031f23c 100644 (file)
@@ -18,6 +18,7 @@
  *   JF   26/01/2000 Recoded some parts to retrieve export details correctly
  *   DW   27/06/2000 Removed redundant header files
  *   CSH  11/04/2001 Added automatic loading of module symbols if they exist
+ *   KJK  02/04/2003 Nebbet-ized a couple of type names
  */
 
 
@@ -533,6 +534,7 @@ LdrInitializeBootStartDriver(PVOID ModuleLoadBase,
     Length = wcslen(Start);
 
   wcsncpy(Buffer, Start, Length);
+  Buffer[Length] = 0;
   RtlCreateUnicodeString(&DeviceNode->ServiceName, Buffer);
 
   Status = IopInitializeDriver(ModuleObject->EntryPoint,
@@ -592,7 +594,7 @@ LdrpQueryModuleInformation(PVOID Buffer,
   PLIST_ENTRY current_entry;
   PMODULE_OBJECT current;
   ULONG ModuleCount = 0;
-  PSYSTEM_MODULE_INFORMATION Smi;
+  PSYSTEM_MODULES Smi;
   ANSI_STRING AnsiName;
   PCHAR p;
   KIRQL Irql;
@@ -607,8 +609,8 @@ LdrpQueryModuleInformation(PVOID Buffer,
       current_entry = current_entry->Flink;
     }
 
-  *ReqSize = sizeof(SYSTEM_MODULE_INFORMATION)+
-    (ModuleCount - 1) * sizeof(SYSTEM_MODULE_ENTRY);
+  *ReqSize = sizeof(SYSTEM_MODULES)+
+    (ModuleCount - 1) * sizeof(SYSTEM_MODULE_INFORMATION);
 
   if (Size < *ReqSize)
     {
@@ -619,7 +621,7 @@ LdrpQueryModuleInformation(PVOID Buffer,
   /* fill the buffer */
   memset(Buffer, '=', Size);
 
-  Smi = (PSYSTEM_MODULE_INFORMATION)Buffer;
+  Smi = (PSYSTEM_MODULES)Buffer;
   Smi->Count = ModuleCount;
 
   ModuleCount = 0;
@@ -628,15 +630,18 @@ LdrpQueryModuleInformation(PVOID Buffer,
     {
       current = CONTAINING_RECORD(current_entry,MODULE_OBJECT,ListEntry);
 
-      Smi->Module[ModuleCount].Unknown2 = 0;           /* Always 0 */
-      Smi->Module[ModuleCount].BaseAddress = current->Base;
-      Smi->Module[ModuleCount].Size = current->Length;
-      Smi->Module[ModuleCount].Flags = 0;              /* Flags ??? (GN) */
-      Smi->Module[ModuleCount].EntryIndex = ModuleCount;
+      Smi->Modules[ModuleCount].Reserved[0] = 0;               /* Always 0 */
+      Smi->Modules[ModuleCount].Reserved[1] = 0;               /* Always 0 */
+      Smi->Modules[ModuleCount].Base = current->Base;
+      Smi->Modules[ModuleCount].Size = current->Length;
+      Smi->Modules[ModuleCount].Flags = 0;             /* Flags ??? (GN) */
+      Smi->Modules[ModuleCount].Index = ModuleCount;
+      Smi->Modules[ModuleCount].Unknown = 0;
+      Smi->Modules[ModuleCount].LoadCount = 0; /* FIXME */
 
       AnsiName.Length = 0;
       AnsiName.MaximumLength = 256;
-      AnsiName.Buffer = Smi->Module[ModuleCount].Name;
+      AnsiName.Buffer = Smi->Modules[ModuleCount].ImageName;
       RtlUnicodeStringToAnsiString(&AnsiName,
                                   &current->FullName,
                                   FALSE);
@@ -644,14 +649,12 @@ LdrpQueryModuleInformation(PVOID Buffer,
       p = strrchr(AnsiName.Buffer, '\\');
       if (p == NULL)
        {
-         Smi->Module[ModuleCount].PathLength = 0;
-         Smi->Module[ModuleCount].NameLength = strlen(AnsiName.Buffer);
+         Smi->Modules[ModuleCount].ModuleNameOffset = 0;
        }
       else
        {
          p++;
-         Smi->Module[ModuleCount].PathLength = p - AnsiName.Buffer;
-         Smi->Module[ModuleCount].NameLength = strlen(p);
+         Smi->Modules[ModuleCount].ModuleNameOffset = p - AnsiName.Buffer;
        }
 
       ModuleCount++;
@@ -1067,15 +1070,22 @@ LdrPEProcessModule(PVOID ModuleLoadBase,
           LibraryModuleObject = LdrGetModuleObject(&ModuleName);
           if (LibraryModuleObject == NULL)
             {
-              CPRINT("Module '%wZ' not loaded yet\n", &ModuleName);
+              DPRINT("Module '%wZ' not loaded yet\n", &ModuleName);
               wcscpy(NameBuffer, L"\\SystemRoot\\system32\\drivers\\");
               wcscat(NameBuffer, ModuleName.Buffer);
               RtlInitUnicodeString(&NameString, NameBuffer);
               Status = LdrLoadModule(&NameString, &LibraryModuleObject);
               if (!NT_SUCCESS(Status))
                 {
-                  CPRINT("Unknown import module: %wZ (Status %lx)\n", &ModuleName, Status);
-                  return(Status);
+                  wcscpy(NameBuffer, L"\\SystemRoot\\system32\\");
+                  wcscat(NameBuffer, ModuleName.Buffer);
+                  RtlInitUnicodeString(&NameString, NameBuffer);
+                  Status = LdrLoadModule(&NameString, &LibraryModuleObject);
+                  if (!NT_SUCCESS(Status))
+                    {
+                      DPRINT1("Unknown import module: %wZ (Status %lx)\n", &ModuleName, Status);
+                      return(Status);
+                    }
                 }
             }
           /*  Get the import address list  */
@@ -1384,7 +1394,7 @@ LdrSafePEProcessModule(PVOID ModuleLoadBase,
         {
          ULONG Offset;
          ULONG Type;
-         PDWORD RelocItem;
+         PULONG RelocItem;
 
          Offset = RelocEntry[Idx].TypeOffset & 0xfff;
          Type = (RelocEntry[Idx].TypeOffset >> 12) & 0xf;