Implement the magic flag in RtlImageDirectoryEntryToData and make the Size parameter non-optional.
Modified: trunk/reactos/lib/ntdll/ldr/utils.c
Modified: trunk/reactos/lib/rtl/image.c
Modified: trunk/reactos/ntoskrnl/ldr/loader.c

Modified: trunk/reactos/lib/ntdll/ldr/utils.c
--- trunk/reactos/lib/ntdll/ldr/utils.c	2005-07-31 09:48:12 UTC (rev 16917)
+++ trunk/reactos/lib/ntdll/ldr/utils.c	2005-07-31 10:22:29 UTC (rev 16918)
@@ -237,6 +237,7 @@
    PLDR_DATA_TABLE_ENTRY Module;
    PIMAGE_TLS_DIRECTORY TlsDirectory;
    PTLS_DATA TlsData;
+   ULONG Size;
 
    DPRINT("LdrpInitializeTlsForProccess() called for %wZ\n", &ExeModule->BaseDllName);
 
@@ -263,7 +264,7 @@
                                  RtlImageDirectoryEntryToData(Module->DllBase,
                                                               TRUE,
                                                               IMAGE_DIRECTORY_ENTRY_TLS,
-                                                              NULL);
+                                                              &Size);
                ASSERT(Module->TlsIndex < LdrpTlsCount);
                TlsData = &LdrpTlsArray[Module->TlsIndex];
                TlsData->StartAddressOfRawData = (PVOID)TlsDirectory->StartAddressOfRawData;
@@ -1476,6 +1477,7 @@
    NTSTATUS Status;
    PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
    PCHAR Name;
+   ULONG Size;
 
    DPRINT("LdrpProcessImportDirectory(%x '%wZ', '%s')\n",
           Module, &Module->BaseDllName, ImportedName);
@@ -1485,7 +1487,7 @@
                              RtlImageDirectoryEntryToData(Module->DllBase,
                                                           TRUE,
                                                           IMAGE_DIRECTORY_ENTRY_IMPORT,
-                                                          NULL);
+                                                          &Size);
    if (ImportModuleDirectory == NULL)
      {
        return STATUS_UNSUCCESSFUL;
@@ -1529,6 +1531,7 @@
    ULONG IATSize;
    PIMAGE_NT_HEADERS NTHeaders;
    PCHAR Name;
+   ULONG Size;
 
    DPRINT("LdrpAdjustImportDirectory(Module %x '%wZ', %x '%wZ', %x '%s')\n",
           Module, &Module->BaseDllName, ImportedModule, &ImportedModule->BaseDllName, ImportedName);
@@ -1537,7 +1540,7 @@
                               RtlImageDirectoryEntryToData(Module->DllBase,
                                                            TRUE,
                                                            IMAGE_DIRECTORY_ENTRY_IMPORT,
-                                                           NULL);
+                                                           &Size);
    if (ImportModuleDirectory == NULL)
      {
        return STATUS_UNSUCCESSFUL;
@@ -1647,6 +1650,7 @@
    NTSTATUS Status;
    PLDR_DATA_TABLE_ENTRY ImportedModule;
    PCHAR ImportedName;
+   ULONG Size;
 
    DPRINT("LdrFixupImports(SearchPath %x, Module %x)\n", SearchPath, Module);
 
@@ -1655,7 +1659,7 @@
                      RtlImageDirectoryEntryToData(Module->DllBase,
                                                   TRUE,
                                                   IMAGE_DIRECTORY_ENTRY_TLS,
-                                                  NULL);
+                                                  &Size);
    if (TlsDirectory)
      {
        TlsSize = TlsDirectory->EndAddressOfRawData
@@ -1676,13 +1680,13 @@
                               RtlImageDirectoryEntryToData(Module->DllBase,
                                                            TRUE,
                                                            IMAGE_DIRECTORY_ENTRY_IMPORT,
-                                                           NULL);
+                                                           &Size);
 
    BoundImportDescriptor = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)
                               RtlImageDirectoryEntryToData(Module->DllBase,
                                                            TRUE,
                                                            IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
-                                                           NULL);
+                                                           &Size);
 
    if (BoundImportDescriptor != NULL && ImportModuleDirectory == NULL)
      {
@@ -2142,8 +2146,8 @@
    PLDR_DATA_TABLE_ENTRY ImportedModule;
    NTSTATUS Status;
    LONG LoadCount;
+   ULONG Size;
 
-
    if (Unload)
      {
        RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock);
@@ -2163,7 +2167,7 @@
                                  RtlImageDirectoryEntryToData(Module->DllBase,
                                                               TRUE,
                                                               IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
-                                                              NULL);
+                                                              &Size);
        if (BoundImportDescriptor)
         {
           /* dereferencing all imported modules, use the bound import descriptor */
@@ -2197,7 +2201,7 @@
                                       RtlImageDirectoryEntryToData(Module->DllBase,
                                                                    TRUE,
                                                                    IMAGE_DIRECTORY_ENTRY_IMPORT,
-                                                                   NULL);
+                                                                   &Size);
            if (ImportModuleDirectory)
              {
                /* dereferencing all imported modules, use the import descriptor */

Modified: trunk/reactos/lib/rtl/image.c
--- trunk/reactos/lib/rtl/image.c	2005-07-31 09:48:12 UTC (rev 16917)
+++ trunk/reactos/lib/rtl/image.c	2005-07-31 10:22:29 UTC (rev 16918)
@@ -49,7 +49,7 @@
 STDCALL
 RtlImageDirectoryEntryToData (
 	PVOID	BaseAddress,
-	BOOLEAN	bFlag,
+	BOOLEAN	bMappedAsImage,
 	ULONG	Directory,
 	PULONG	Size
 	)
@@ -59,8 +59,12 @@
 
 	/* Magic flag for non-mapped images. */
 	if ((ULONG_PTR)BaseAddress & 1)
-	        BaseAddress = (PVOID)((ULONG_PTR)BaseAddress & ~1);
+	{
+		BaseAddress = (PVOID)((ULONG_PTR)BaseAddress & ~1);
+		bMappedAsImage = FALSE;
+        }
 
+
 	NtHeader = RtlImageNtHeader (BaseAddress);
 	if (NtHeader == NULL)
 		return NULL;
@@ -72,10 +76,9 @@
 	if (Va == 0)
 		return NULL;
 
-	if (Size)
-		*Size = NtHeader->OptionalHeader.DataDirectory[Directory].Size;
+	*Size = NtHeader->OptionalHeader.DataDirectory[Directory].Size;
 
-	if (bFlag)
+	if (bMappedAsImage || Va < NtHeader->OptionalHeader.SizeOfHeaders)
 		return (PVOID)((ULONG_PTR)BaseAddress + Va);
 
 	/* image mapped as ordinary file, we must find raw pointer */

Modified: trunk/reactos/ntoskrnl/ldr/loader.c
--- trunk/reactos/ntoskrnl/ldr/loader.c	2005-07-31 09:48:12 UTC (rev 16917)
+++ trunk/reactos/ntoskrnl/ldr/loader.c	2005-07-31 10:22:29 UTC (rev 16918)
@@ -161,8 +161,8 @@
     if (ModuleBase)
         *ModuleBase = ModuleObject->DllBase;
 
-    //if (SectionPointer)
-    //    *SectionPointer = ModuleObject->
+    if (SectionPointer)
+        *SectionPointer = ModuleObject;
 
     if (EntryPoint)
         *EntryPoint = ModuleObject->EntryPoint;
@@ -204,7 +204,7 @@
     DriverEntry = (PDRIVER_INITIALIZE)ModuleObject->EntryPoint;
 
     RtlZeroMemory(&DriverObject, sizeof(DriverObject));
-    DriverObject.DriverStart = ModuleObject->DllBase;
+//    DriverObject.DriverStart = ModuleObject->DllBase;
 
     Status = DriverEntry(&DriverObject, NULL);
     if (!NT_SUCCESS(Status))
@@ -768,6 +768,7 @@
     }
 
     RtlCopyUnicodeString(&CreatedModuleObject->FullDllName, FileName);
+    CreatedModuleObject->FullDllName.Buffer[FileName->Length / sizeof(WCHAR)] = 0;
     LdrpBuildModuleBaseName(&CreatedModuleObject->BaseDllName,
         &CreatedModuleObject->FullDllName);
 
@@ -1482,13 +1483,14 @@
     PCHAR ImportedName;
     PLDR_DATA_TABLE_ENTRY ImportedModule;
     NTSTATUS Status;
+    ULONG Size;
 
     /*  Process each import module  */
     ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
         RtlImageDirectoryEntryToData(Module->DllBase,
         TRUE,
         IMAGE_DIRECTORY_ENTRY_IMPORT,
-        NULL);
+        &Size);
     DPRINT("Processeing import directory at %p\n", ImportModuleDirectory);
     while (ImportModuleDirectory->Name)
     {