- Update NDK with proper (when possible) RTL structure names that were previously...
[reactos.git] / reactos / lib / ntdll / ldr / utils.c
index 54fe950..1c9240d 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: utils.c,v 1.96 2004/06/27 12:20:33 ekohl Exp $
- * 
+/* $Id$
+ *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            lib/ntdll/ldr/utils.c
 
 /* INCLUDES *****************************************************************/
 
-#include <reactos/config.h>
-#include <ddk/ntddk.h>
-#include <windows.h>
-#include <string.h>
-#include <wchar.h>
-#include <ntdll/ldr.h>
-#include <ntos/minmax.h>
+#include <ntdll.h>
+#define NDEBUG
+#include <debug.h>
 
 #define LDRP_PROCESS_CREATION_TIME 0x8000000
 
-#ifdef DBG_NTDLL_LDR_UTILS
-#define NDEBUG
-#endif
-#include <ntdll/ntdll.h>
-
 /* GLOBALS *******************************************************************/
 
+#ifdef NDEBUG
+#if defined(__GNUC__)
+#define TRACE_LDR(args...) if (RtlGetNtGlobalFlags() & FLG_SHOW_LDR_SNAPS) { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(args); }
+#else
+#endif /* __GNUC__ */
+#else
+#define TRACE_LDR(args...) do { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(args); } while(0)
+#endif
+
 typedef struct _TLS_DATA
 {
    PVOID StartAddressOfRawData;
    DWORD TlsDataSize;
    DWORD TlsZeroSize;
    PIMAGE_TLS_CALLBACK TlsAddressOfCallBacks;
-   PLDR_MODULE Module;
+   PLDR_DATA_TABLE_ENTRY Module;
 } TLS_DATA, *PTLS_DATA;
 
 static PTLS_DATA LdrpTlsArray = NULL;
@@ -50,28 +50,28 @@ static ULONG LdrpTlsCount = 0;
 static ULONG LdrpTlsSize = 0;
 static HANDLE LdrpKnownDllsDirHandle = NULL;
 static UNICODE_STRING LdrpKnownDllPath = {0, 0, NULL};
-static PLDR_MODULE LdrpLastModule = NULL;
-extern ULONG NtGlobalFlag;
-extern PLDR_MODULE ExeModule;
+static PLDR_DATA_TABLE_ENTRY LdrpLastModule = NULL;
+extern PLDR_DATA_TABLE_ENTRY ExeModule;
 
 /* PROTOTYPES ****************************************************************/
 
-static NTSTATUS LdrFindEntryForName(PUNICODE_STRING Name, PLDR_MODULE *Module, BOOL Ref);
+static NTSTATUS LdrFindEntryForName(PUNICODE_STRING Name, PLDR_DATA_TABLE_ENTRY *Module, BOOLEAN Ref);
 static PVOID LdrFixupForward(PCHAR ForwardName);
 static PVOID LdrGetExportByName(PVOID BaseAddress, PUCHAR SymbolName, USHORT Hint);
 static NTSTATUS LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
                                IN ULONG LoadFlags,
                                IN PUNICODE_STRING Name,
-                               OUT PLDR_MODULE *Module);
+                               OUT PLDR_DATA_TABLE_ENTRY *Module,
+                               OUT PVOID *BaseAddress OPTIONAL);
 static NTSTATUS LdrpAttachProcess(VOID);
-static VOID LdrpDetachProcess(BOOL UnloadAll);
+static VOID LdrpDetachProcess(BOOLEAN UnloadAll);
 
 /* FUNCTIONS *****************************************************************/
 
-#ifdef KDBG
+#if defined(DBG) || defined(KDBG)
 
 VOID
-LdrpLoadUserModuleSymbols(PLDR_MODULE LdrModule)
+LdrpLoadUserModuleSymbols(PLDR_DATA_TABLE_ENTRY LdrModule)
 {
   NtSystemDebugControl(
     DebugDbgLoadSymbols,
@@ -82,9 +82,21 @@ LdrpLoadUserModuleSymbols(PLDR_MODULE LdrModule)
     NULL);
 }
 
-#endif /* DBG */
+#endif /* DBG || KDBG */
 
-static inline LONG LdrpDecrementLoadCount(PLDR_MODULE Module, BOOL Locked)
+BOOLEAN
+LdrMappedAsDataFile(PVOID *BaseAddress)
+{
+  if (0 != ((DWORD_PTR) *BaseAddress & (PAGE_SIZE - 1)))
+    {
+      *BaseAddress = (PVOID) ((DWORD_PTR) *BaseAddress & ~ ((DWORD_PTR) PAGE_SIZE - 1));
+      return TRUE;
+    }
+
+   return FALSE;
+}
+
+static __inline LONG LdrpDecrementLoadCount(PLDR_DATA_TABLE_ENTRY Module, BOOLEAN Locked)
 {
    LONG LoadCount;
    if (!Locked)
@@ -92,7 +104,7 @@ static inline LONG LdrpDecrementLoadCount(PLDR_MODULE Module, BOOL Locked)
        RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock);
      }
    LoadCount = Module->LoadCount;
-   if (Module->LoadCount > 0)
+   if (Module->LoadCount > 0 && Module->LoadCount != 0xFFFF)
      {
        Module->LoadCount--;
      }
@@ -103,7 +115,7 @@ static inline LONG LdrpDecrementLoadCount(PLDR_MODULE Module, BOOL Locked)
    return LoadCount;
 }
 
-static inline LONG LdrpIncrementLoadCount(PLDR_MODULE Module, BOOL Locked)
+static __inline LONG LdrpIncrementLoadCount(PLDR_DATA_TABLE_ENTRY Module, BOOLEAN Locked)
 {
    LONG LoadCount;
    if (!Locked)
@@ -111,7 +123,7 @@ static inline LONG LdrpIncrementLoadCount(PLDR_MODULE Module, BOOL Locked)
        RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock);
      }
    LoadCount = Module->LoadCount;
-   if (Module->LoadCount >= 0)
+   if (Module->LoadCount != 0xFFFF)
      {
        Module->LoadCount++;
      }
@@ -122,7 +134,7 @@ static inline LONG LdrpIncrementLoadCount(PLDR_MODULE Module, BOOL Locked)
    return LoadCount;
 }
 
-static inline VOID LdrpAcquireTlsSlot(PLDR_MODULE Module, ULONG Size, BOOL Locked)
+static __inline VOID LdrpAcquireTlsSlot(PLDR_DATA_TABLE_ENTRY Module, ULONG Size, BOOLEAN Locked)
 {
    if (!Locked)
      {
@@ -137,10 +149,10 @@ static inline VOID LdrpAcquireTlsSlot(PLDR_MODULE Module, ULONG Size, BOOL Locke
      }
 }
 
-static inline VOID LdrpTlsCallback(PLDR_MODULE Module, ULONG dwReason)
+static __inline VOID LdrpTlsCallback(PLDR_DATA_TABLE_ENTRY Module, ULONG dwReason)
 {
    PIMAGE_TLS_CALLBACK TlsCallback;
-   if (Module->TlsIndex >= 0 && Module->LoadCount == -1)
+   if (Module->TlsIndex != 0xFFFF && Module->LoadCount == 0xFFFF)
      {
        TlsCallback = LdrpTlsArray[Module->TlsIndex].TlsAddressOfCallBacks;
        if (TlsCallback)
@@ -149,22 +161,22 @@ static inline VOID LdrpTlsCallback(PLDR_MODULE Module, ULONG dwReason)
              {
                TRACE_LDR("%wZ - Calling tls callback at %x\n",
                          &Module->BaseDllName, TlsCallback);
-               TlsCallback(Module->BaseAddress, dwReason, NULL);
-               TlsCallback++;
+               TlsCallback(Module->DllBase, dwReason, NULL);
+               TlsCallback = (PIMAGE_TLS_CALLBACK)((ULONG_PTR)TlsCallback + sizeof(PVOID));
              }
          }
      }
 }
 
-static BOOL LdrpCallDllEntry(PLDR_MODULE Module, DWORD dwReason, PVOID lpReserved)
+static BOOLEAN LdrpCallDllEntry(PLDR_DATA_TABLE_ENTRY Module, DWORD dwReason, PVOID lpReserved)
 {
-   if (!(Module->Flags & IMAGE_DLL) ||
+   if (!(Module->Flags & LDRP_IMAGE_DLL) ||
        Module->EntryPoint == 0)
      {
        return TRUE;
      }
    LdrpTlsCallback(Module, dwReason);
-   return  ((PDLLMAIN_FUNC)Module->EntryPoint)(Module->BaseAddress, dwReason, lpReserved);
+   return  ((PDLLMAIN_FUNC)Module->EntryPoint)(Module->DllBase, dwReason, lpReserved);
 }
 
 static NTSTATUS
@@ -174,9 +186,14 @@ LdrpInitializeTlsForThread(VOID)
    PTLS_DATA TlsInfo;
    PVOID TlsData;
    ULONG i;
+   PTEB Teb = NtCurrentTeb();
 
    DPRINT("LdrpInitializeTlsForThread() called for %wZ\n", &ExeModule->BaseDllName);
 
+   Teb->StaticUnicodeString.Length = 0;
+   Teb->StaticUnicodeString.MaximumLength = sizeof(Teb->StaticUnicodeBuffer);
+   Teb->StaticUnicodeString.Buffer = Teb->StaticUnicodeBuffer;
+
    if (LdrpTlsCount > 0)
      {
        TlsPointers = RtlAllocateHeap(RtlGetProcessHeap(),
@@ -188,8 +205,8 @@ LdrpInitializeTlsForThread(VOID)
            return STATUS_NO_MEMORY;
          }
 
-       TlsData = (PVOID)TlsPointers + LdrpTlsCount * sizeof(PVOID);
-       NtCurrentTeb()->ThreadLocalStoragePointer = TlsPointers;
+       TlsData = (PVOID)((ULONG_PTR)TlsPointers + LdrpTlsCount * sizeof(PVOID));
+       Teb->ThreadLocalStoragePointer = TlsPointers;
 
        TlsInfo = LdrpTlsArray;
        for (i = 0; i < LdrpTlsCount; i++, TlsInfo++)
@@ -199,12 +216,12 @@ LdrpInitializeTlsForThread(VOID)
            if (TlsInfo->TlsDataSize)
              {
                memcpy(TlsData, TlsInfo->StartAddressOfRawData, TlsInfo->TlsDataSize);
-               TlsData += TlsInfo->TlsDataSize;
+               TlsData = (PVOID)((ULONG_PTR)TlsData + TlsInfo->TlsDataSize);
              }
            if (TlsInfo->TlsZeroSize)
              {
                memset(TlsData, 0, TlsInfo->TlsZeroSize);
-               TlsData += TlsInfo->TlsZeroSize;
+               TlsData = (PVOID)((ULONG_PTR)TlsData + TlsInfo->TlsZeroSize);
              }
          }
      }
@@ -217,9 +234,10 @@ LdrpInitializeTlsForProccess(VOID)
 {
    PLIST_ENTRY ModuleListHead;
    PLIST_ENTRY Entry;
-   PLDR_MODULE Module;
+   PLDR_DATA_TABLE_ENTRY Module;
    PIMAGE_TLS_DIRECTORY TlsDirectory;
    PTLS_DATA TlsData;
+   ULONG Size;
 
    DPRINT("LdrpInitializeTlsForProccess() called for %wZ\n", &ExeModule->BaseDllName);
 
@@ -238,21 +256,24 @@ LdrpInitializeTlsForProccess(VOID)
        Entry = ModuleListHead->Flink;
        while (Entry != ModuleListHead)
          {
-           Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
-           if (Module->LoadCount == -1 &&
-               Module->TlsIndex >= 0)
+           Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
+           if (Module->LoadCount == 0xFFFF &&
+               Module->TlsIndex != 0xFFFF)
              {
                TlsDirectory = (PIMAGE_TLS_DIRECTORY)
-                                 RtlImageDirectoryEntryToData(Module->BaseAddress,
+                                 RtlImageDirectoryEntryToData(Module->DllBase,
                                                               TRUE,
                                                               IMAGE_DIRECTORY_ENTRY_TLS,
-                                                              NULL);
-               assert(Module->TlsIndex < LdrpTlsCount);
+                                                              &Size);
+               ASSERT(Module->TlsIndex < LdrpTlsCount);
                TlsData = &LdrpTlsArray[Module->TlsIndex];
                TlsData->StartAddressOfRawData = (PVOID)TlsDirectory->StartAddressOfRawData;
                TlsData->TlsDataSize = TlsDirectory->EndAddressOfRawData - TlsDirectory->StartAddressOfRawData;
                TlsData->TlsZeroSize = TlsDirectory->SizeOfZeroFill;
-               TlsData->TlsAddressOfCallBacks = *TlsDirectory->AddressOfCallBacks;
+               if (TlsDirectory->AddressOfCallBacks)
+                 TlsData->TlsAddressOfCallBacks = *(PIMAGE_TLS_CALLBACK*)TlsDirectory->AddressOfCallBacks;
+               else
+                 TlsData->TlsAddressOfCallBacks = NULL;
                TlsData->Module = Module;
 #if 0
                DbgPrint("TLS directory for %wZ\n", &Module->BaseDllName);
@@ -269,7 +290,6 @@ LdrpInitializeTlsForProccess(VOID)
                 *   Is this region allways writable ?
                 */
                *(PULONG)TlsDirectory->AddressOfIndex = Module->TlsIndex;
-               CHECKPOINT1;
              }
            Entry = Entry->Flink;
         }
@@ -439,21 +459,21 @@ LdrAdjustDllName (PUNICODE_STRING FullDllName,
    RtlCreateUnicodeString(FullDllName, Buffer);
 }
 
-PLDR_MODULE
+PLDR_DATA_TABLE_ENTRY
 LdrAddModuleEntry(PVOID ImageBase,
                   PIMAGE_NT_HEADERS NTHeaders,
                   PWSTR FullDosName)
 {
-  PLDR_MODULE Module;
+  PLDR_DATA_TABLE_ENTRY Module;
 
-  Module = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof (LDR_MODULE));
-  assert(Module);
-  memset(Module, 0, sizeof(LDR_MODULE));
-  Module->BaseAddress = (PVOID)ImageBase;
-  Module->EntryPoint = NTHeaders->OptionalHeader.AddressOfEntryPoint;
+  Module = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof (LDR_DATA_TABLE_ENTRY));
+  ASSERT(Module);
+  memset(Module, 0, sizeof(LDR_DATA_TABLE_ENTRY));
+  Module->DllBase = (PVOID)ImageBase;
+  Module->EntryPoint = (PVOID)NTHeaders->OptionalHeader.AddressOfEntryPoint;
   if (Module->EntryPoint != 0)
-    Module->EntryPoint += (ULONG)Module->BaseAddress;
-  Module->SizeOfImage = NTHeaders->OptionalHeader.SizeOfImage;
+    Module->EntryPoint = (PVOID)((ULONG_PTR)Module->EntryPoint + (ULONG_PTR)Module->DllBase);
+  Module->SizeOfImage = LdrpGetResidentSize(NTHeaders);
   if (NtCurrentPeb()->Ldr->Initialized == TRUE)
     {
       /* loading while app is running */
@@ -463,7 +483,7 @@ LdrAddModuleEntry(PVOID ImageBase,
        * loading while app is initializing
        * dll must not be unloaded
        */
-      Module->LoadCount = -1;
+      Module->LoadCount = 0xFFFF;
     }
 
   Module->Flags = 0;
@@ -546,6 +566,7 @@ static NTSTATUS
 LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL,
                     IN PUNICODE_STRING DllName,
                     OUT PUNICODE_STRING FullDosName,
+                    IN BOOLEAN MapAsDataFile,
                     OUT PHANDLE SectionHandle)
 {
   WCHAR                 SearchPathBuffer[MAX_PATH];
@@ -556,8 +577,6 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL,
   char                  BlockBuffer [1024];
   PIMAGE_DOS_HEADER     DosHeader;
   PIMAGE_NT_HEADERS     NTHeaders;
-  PVOID                 ImageBase;
-  ULONG                 ImageSize;
   IO_STATUS_BLOCK       IoStatusBlock;
   NTSTATUS              Status;
   ULONG                 len;
@@ -616,7 +635,7 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL,
                       GENERIC_READ|SYNCHRONIZE,
                       &FileObjectAttributes,
                       &IoStatusBlock,
-                      0,
+                      FILE_SHARE_READ,
                       FILE_SYNCHRONOUS_IO_NONALERT);
   if (!NT_SUCCESS(Status))
     {
@@ -651,9 +670,9 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL,
   /*
    * Check it is a PE image file.
    */
-  if ((DosHeader->e_magic != IMAGE_DOS_MAGIC)
+  if ((DosHeader->e_magic != IMAGE_DOS_SIGNATURE)
       || (DosHeader->e_lfanew == 0L)
-      || (*(PULONG)(NTHeaders) != IMAGE_PE_MAGIC))
+      || (*(PULONG)(NTHeaders) != IMAGE_NT_SIGNATURE))
     {
       DPRINT("NTDLL format invalid\n");
       NtClose(FileHandle);
@@ -661,11 +680,6 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL,
       return STATUS_UNSUCCESSFUL;
     }
 
-  ImageBase = (PVOID) NTHeaders->OptionalHeader.ImageBase;
-  ImageSize = NTHeaders->OptionalHeader.SizeOfImage;
-
-  DPRINT("ImageBase 0x%08x\n", ImageBase);
-
   /*
    * Create a section for dll.
    */
@@ -673,8 +687,8 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL,
                            SECTION_ALL_ACCESS,
                            NULL,
                            NULL,
-                           PAGE_READWRITE,
-                           SEC_COMMIT | SEC_IMAGE,
+                           PAGE_READONLY,
+                           SEC_COMMIT | (MapAsDataFile ? 0 : SEC_IMAGE),
                            FileHandle);
   NtClose(FileHandle);
 
@@ -708,14 +722,14 @@ LdrpMapDllImageFile(IN PWSTR SearchPath OPTIONAL,
  *
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
             IN ULONG LoadFlags,
             IN PUNICODE_STRING Name,
             OUT PVOID *BaseAddress OPTIONAL)
 {
   NTSTATUS              Status;
-  PLDR_MODULE           Module;
+  PLDR_DATA_TABLE_ENTRY           Module;
 
   TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n",
             Name,
@@ -730,15 +744,15 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
 
   *BaseAddress = NULL;
 
-  Status = LdrpLoadModule(SearchPath, LoadFlags, Name, &Module);
-  if (NT_SUCCESS(Status))
+  Status = LdrpLoadModule(SearchPath, LoadFlags, Name, &Module, BaseAddress);
+  if (NT_SUCCESS(Status) && 0 == (LoadFlags & LOAD_LIBRARY_AS_DATAFILE))
     {
       RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock);
       Status = LdrpAttachProcess();
       RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
       if (NT_SUCCESS(Status))
         {
-          *BaseAddress = Module->BaseAddress;
+          *BaseAddress = Module->DllBase;
         }
    }
   return Status;
@@ -761,13 +775,13 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
  *
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 LdrFindEntryForAddress(PVOID Address,
-                       PLDR_MODULE *Module)
+                       PLDR_DATA_TABLE_ENTRY *Module)
 {
   PLIST_ENTRY ModuleListHead;
   PLIST_ENTRY Entry;
-  PLDR_MODULE ModulePtr;
+  PLDR_DATA_TABLE_ENTRY ModulePtr;
 
   DPRINT("LdrFindEntryForAddress(Address %p)\n", Address);
 
@@ -785,12 +799,12 @@ LdrFindEntryForAddress(PVOID Address,
 
   while (Entry != ModuleListHead)
     {
-      ModulePtr = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
+      ModulePtr = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
 
-      DPRINT("Scanning %wZ at %p\n", &ModulePtr->BaseDllName, ModulePtr->BaseAddress);
+      DPRINT("Scanning %wZ at %p\n", &ModulePtr->BaseDllName, ModulePtr->DllBase);
 
-      if ((Address >= ModulePtr->BaseAddress) &&
-          (Address <= (ModulePtr->BaseAddress + ModulePtr->SizeOfImage)))
+      if ((Address >= ModulePtr->DllBase) &&
+          ((ULONG_PTR)Address <= ((ULONG_PTR)ModulePtr->DllBase + ModulePtr->SizeOfImage)))
         {
           *Module = ModulePtr;
           RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
@@ -824,12 +838,12 @@ LdrFindEntryForAddress(PVOID Address,
  */
 static NTSTATUS
 LdrFindEntryForName(PUNICODE_STRING Name,
-                    PLDR_MODULE *Module,
-                    BOOL Ref)
+                    PLDR_DATA_TABLE_ENTRY *Module,
+                    BOOLEAN Ref)
 {
   PLIST_ENTRY ModuleListHead;
   PLIST_ENTRY Entry;
-  PLDR_MODULE ModulePtr;
+  PLDR_DATA_TABLE_ENTRY ModulePtr;
   BOOLEAN ContainsPath;
   UNICODE_STRING AdjustedName;
   unsigned i;
@@ -873,7 +887,7 @@ LdrFindEntryForName(PUNICODE_STRING Name,
            0 == RtlCompareUnicodeString(&LdrpLastModule->FullDllName, &AdjustedName, TRUE)))
         {
           *Module = LdrpLastModule;
-          if (Ref && (*Module)->LoadCount != -1)
+          if (Ref && (*Module)->LoadCount != 0xFFFF)
             {
               (*Module)->LoadCount++;
             }
@@ -884,7 +898,7 @@ LdrFindEntryForName(PUNICODE_STRING Name,
     }
   while (Entry != ModuleListHead)
     {
-      ModulePtr = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
+      ModulePtr = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
 
       DPRINT("Scanning %wZ %wZ\n", &ModulePtr->BaseDllName, &AdjustedName);
 
@@ -894,7 +908,7 @@ LdrFindEntryForName(PUNICODE_STRING Name,
            0 == RtlCompareUnicodeString(&ModulePtr->FullDllName, &AdjustedName, TRUE)))
         {
           *Module = LdrpLastModule = ModulePtr;
-          if (Ref && ModulePtr->LoadCount != -1)
+          if (Ref && ModulePtr->LoadCount != 0xFFFF)
             {
               ModulePtr->LoadCount++;
             }
@@ -934,7 +948,7 @@ LdrFixupForward(PCHAR ForwardName)
    UNICODE_STRING DllName;
    NTSTATUS Status;
    PCHAR p;
-   PLDR_MODULE Module;
+   PLDR_DATA_TABLE_ENTRY Module;
    PVOID BaseAddress;
 
    strcpy(NameBuffer, ForwardName);
@@ -969,9 +983,9 @@ LdrFixupForward(PCHAR ForwardName)
             return NULL;
           }
 
-        DPRINT("BaseAddress: %p\n", Module->BaseAddress);
+        DPRINT("BaseAddress: %p\n", Module->DllBase);
 
-        return LdrGetExportByName(Module->BaseAddress, p+1, -1);
+        return LdrGetExportByName(Module->DllBase, (PUCHAR)(p+1), -1);
      }
 
    return NULL;
@@ -1017,7 +1031,7 @@ LdrGetExportByOrdinal (
                         ExportDir->AddressOfFunctions
                         );
         DPRINT(
-                "LdrGetExportByOrdinal(Ordinal %d) = %x\n",
+                "LdrGetExportByOrdinal(Ordinal %d) = %p\n",
                 Ordinal,
                 RVA(BaseAddress, ExFunctions[Ordinal - ExportDir->Base] )
                 );
@@ -1063,7 +1077,6 @@ LdrGetExportByName(PVOID BaseAddress,
    PDWORD                       * ExFunctions;
    PDWORD                       * ExNames;
    USHORT                       * ExOrdinals;
-   ULONG                        i;
    PVOID                        ExName;
    ULONG                        Ordinal;
    PVOID                        Function;
@@ -1107,7 +1120,7 @@ LdrGetExportByName(PVOID BaseAddress,
    if (Hint < ExportDir->NumberOfNames)
      {
         ExName = RVA(BaseAddress, ExNames[Hint]);
-        if (strcmp(ExName, SymbolName) == 0)
+        if (strcmp(ExName, (PCHAR)SymbolName) == 0)
           {
              Ordinal = ExOrdinals[Hint];
              Function = RVA(BaseAddress, ExFunctions[Ordinal]);
@@ -1128,7 +1141,7 @@ LdrGetExportByName(PVOID BaseAddress,
      }
 
    /*
-    * Try a binary search first
+    * Binary search
     */
    minn = 0;
    maxn = ExportDir->NumberOfNames - 1;
@@ -1140,7 +1153,7 @@ LdrGetExportByName(PVOID BaseAddress,
         mid = (minn + maxn) / 2;
 
         ExName = RVA(BaseAddress, ExNames[mid]);
-        res = strcmp(ExName, SymbolName);
+        res = strcmp(ExName, (PCHAR)SymbolName);
         if (res == 0)
           {
              Ordinal = ExOrdinals[mid];
@@ -1174,31 +1187,6 @@ LdrGetExportByName(PVOID BaseAddress,
           }
      }
 
-   /*
-    * Fall back on a linear search
-    */
-   DPRINT("LdrGetExportByName(): Falling back on a linear search of export table\n");
-   for (i = 0; i < ExportDir->NumberOfNames; i++)
-     {
-        ExName = RVA(BaseAddress, ExNames[i]);
-        if (strcmp(ExName,SymbolName) == 0)
-          {
-             Ordinal = ExOrdinals[i];
-             Function = RVA(BaseAddress, ExFunctions[Ordinal]);
-             DPRINT("%x %x %x\n", Function, ExportDir, ExportDir + ExportDirSize);
-             if (((ULONG)Function >= (ULONG)ExportDir) &&
-                 ((ULONG)Function < (ULONG)ExportDir + (ULONG)ExportDirSize))
-               {
-                  DPRINT("Forward: %s\n", (PCHAR)Function);
-                  Function = LdrFixupForward((PCHAR)Function);
-               }
-             if (Function == NULL)
-               {
-                 break;
-               }
-             return Function;
-          }
-     }
    DPRINT1("LdrGetExportByName(): failed to find %s\n",SymbolName);
    return (PVOID)NULL;
 }
@@ -1257,7 +1245,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders,
     {
       Count = (RelocationDir->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) /
               sizeof(USHORT);
-      Page = ImageBase + RelocationDir->VirtualAddress;
+      Page = (PVOID)((ULONG_PTR)ImageBase + (ULONG_PTR)RelocationDir->VirtualAddress);
       TypeOffset = (PUSHORT)(RelocationDir + 1);
 
       /* Unprotect the page(s) we're about to relocate. */
@@ -1276,7 +1264,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders,
       if (RelocationDir->VirtualAddress + PAGE_SIZE <
           NTHeaders->OptionalHeader.SizeOfImage)
         {
-          ProtectPage2 = ProtectPage + PAGE_SIZE;
+          ProtectPage2 = (PVOID)((ULONG_PTR)ProtectPage + PAGE_SIZE);
           Status = NtProtectVirtualMemory(NtCurrentProcess(),
                                           &ProtectPage2,
                                           &ProtectSize,
@@ -1328,8 +1316,8 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders,
 static NTSTATUS
 LdrpGetOrLoadModule(PWCHAR SerachPath,
                     PCHAR Name,
-                    PLDR_MODULE* Module,
-                    BOOL Load)
+                    PLDR_DATA_TABLE_ENTRY* Module,
+                    BOOLEAN Load)
 {
    UNICODE_STRING DllName;
    NTSTATUS Status;
@@ -1344,7 +1332,8 @@ LdrpGetOrLoadModule(PWCHAR SerachPath,
        Status = LdrpLoadModule(SerachPath,
                                NtCurrentPeb()->Ldr->Initialized ? 0 : LDRP_PROCESS_CREATION_TIME,
                                &DllName,
-                               Module);
+                               Module,
+                               NULL);
        if (NT_SUCCESS(Status))
          {
            Status = LdrFindEntryForName (&DllName, Module, FALSE);
@@ -1359,9 +1348,9 @@ LdrpGetOrLoadModule(PWCHAR SerachPath,
 }
 
 static NTSTATUS
-LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
-                                PLDR_MODULE ImportedModule,
-                                PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory)
+LdrpProcessImportDirectoryEntry(PLDR_DATA_TABLE_ENTRY Module,
+                                PLDR_DATA_TABLE_ENTRY ImportedModule,
+                                PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory)
 {
    NTSTATUS Status;
    PVOID* ImportAddressList;
@@ -1371,22 +1360,22 @@ LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
    ULONG Ordinal;
    ULONG IATSize;
 
-   if (ImportModuleDirectory == NULL || ImportModuleDirectory->dwRVAModuleName == 0)
+   if (ImportModuleDirectory == NULL || ImportModuleDirectory->Name == 0)
      {
        return STATUS_UNSUCCESSFUL;
      }
 
    /* Get the import address list. */
-   ImportAddressList = (PVOID *)(Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionAddressList);
+   ImportAddressList = (PVOID *)((ULONG_PTR)Module->DllBase + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
 
    /* Get the list of functions to import. */
-   if (ImportModuleDirectory->dwRVAFunctionNameList != 0)
+   if (ImportModuleDirectory->OriginalFirstThunk != 0)
      {
-       FunctionNameList = (PULONG) (Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionNameList);
+       FunctionNameList = (PULONG) ((ULONG_PTR)Module->DllBase + (ULONG_PTR)ImportModuleDirectory->OriginalFirstThunk);
      }
    else
      {
-       FunctionNameList = (PULONG)(Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionAddressList);
+       FunctionNameList = (PULONG)((ULONG_PTR)Module->DllBase + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
      }
 
    /* Get the size of IAT. */
@@ -1416,7 +1405,7 @@ LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
        if ((*FunctionNameList) & 0x80000000)
          {
            Ordinal = (*FunctionNameList) & 0x7fffffff;
-           *ImportAddressList = LdrGetExportByOrdinal(ImportedModule->BaseAddress, Ordinal);
+           *ImportAddressList = LdrGetExportByOrdinal(ImportedModule->DllBase, Ordinal);
            if ((*ImportAddressList) == NULL)
              {
                DPRINT1("Failed to import #%ld from %wZ\n", Ordinal, &ImportedModule->FullDllName);
@@ -1426,8 +1415,8 @@ LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
        else
          {
            IMAGE_IMPORT_BY_NAME *pe_name;
-           pe_name = RVA(Module->BaseAddress, *FunctionNameList);
-           *ImportAddressList = LdrGetExportByName(ImportedModule->BaseAddress, pe_name->Name, pe_name->Hint);
+           pe_name = RVA(Module->DllBase, *FunctionNameList);
+           *ImportAddressList = LdrGetExportByName(ImportedModule->DllBase, pe_name->Name, pe_name->Hint);
            if ((*ImportAddressList) == NULL)
              {
                DPRINT1("Failed to import %s from %wZ\n", pe_name->Name, &ImportedModule->FullDllName);
@@ -1455,31 +1444,32 @@ LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
 
 static NTSTATUS
 LdrpProcessImportDirectory(
-   PLDR_MODULE Module,
-   PLDR_MODULE ImportedModule,
+   PLDR_DATA_TABLE_ENTRY Module,
+   PLDR_DATA_TABLE_ENTRY ImportedModule,
    PCHAR ImportedName)
 {
    NTSTATUS Status;
-   PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory;
+   PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
    PCHAR Name;
+   ULONG Size;
 
    DPRINT("LdrpProcessImportDirectory(%x '%wZ', '%s')\n",
           Module, &Module->BaseDllName, ImportedName);
 
 
-   ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY)
-                             RtlImageDirectoryEntryToData(Module->BaseAddress,
+   ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
+                             RtlImageDirectoryEntryToData(Module->DllBase,
                                                           TRUE,
                                                           IMAGE_DIRECTORY_ENTRY_IMPORT,
-                                                          NULL);
+                                                          &Size);
    if (ImportModuleDirectory == NULL)
      {
        return STATUS_UNSUCCESSFUL;
      }
 
-   while (ImportModuleDirectory->dwRVAModuleName)
+   while (ImportModuleDirectory->Name)
      {
-       Name = (PCHAR)Module->BaseAddress + ImportModuleDirectory->dwRVAModuleName;
+       Name = (PCHAR)Module->DllBase + ImportModuleDirectory->Name;
        if (0 == _stricmp(Name, ImportedName))
          {
            Status = LdrpProcessImportDirectoryEntry(Module,
@@ -1499,11 +1489,11 @@ LdrpProcessImportDirectory(
 
 
 static NTSTATUS
-LdrpAdjustImportDirectory(PLDR_MODULE Module,
-                          PLDR_MODULE ImportedModule,
-                          PUCHAR ImportedName)
+LdrpAdjustImportDirectory(PLDR_DATA_TABLE_ENTRY Module,
+                          PLDR_DATA_TABLE_ENTRY ImportedModule,
+                          PCHAR ImportedName)
 {
-   PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory;
+   PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
    NTSTATUS Status;
    PVOID* ImportAddressList;
    PVOID Start;
@@ -1515,37 +1505,38 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module,
    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);
 
-   ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY)
-                              RtlImageDirectoryEntryToData(Module->BaseAddress,
+   ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
+                              RtlImageDirectoryEntryToData(Module->DllBase,
                                                            TRUE,
                                                            IMAGE_DIRECTORY_ENTRY_IMPORT,
-                                                           NULL);
+                                                           &Size);
    if (ImportModuleDirectory == NULL)
      {
        return STATUS_UNSUCCESSFUL;
      }
 
-   while (ImportModuleDirectory->dwRVAModuleName)
+   while (ImportModuleDirectory->Name)
      {
-       Name = (PCHAR)Module->BaseAddress + ImportModuleDirectory->dwRVAModuleName;
-       if (0 == _stricmp(Name, ImportedName))
+       Name = (PCHAR)Module->DllBase + ImportModuleDirectory->Name;
+       if (0 == _stricmp(Name, (PCHAR)ImportedName))
          {
 
            /* Get the import address list. */
-           ImportAddressList = (PVOID *)(Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionAddressList);
+           ImportAddressList = (PVOID *)((ULONG_PTR)Module->DllBase + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
 
            /* Get the list of functions to import. */
-           if (ImportModuleDirectory->dwRVAFunctionNameList != 0)
+           if (ImportModuleDirectory->OriginalFirstThunk != 0)
              {
-               FunctionNameList = (PULONG) (Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionNameList);
+               FunctionNameList = (PULONG) ((ULONG_PTR)Module->DllBase + (ULONG_PTR)ImportModuleDirectory->OriginalFirstThunk);
              }
            else
              {
-               FunctionNameList = (PULONG)(Module->BaseAddress + ImportModuleDirectory->dwRVAFunctionAddressList);
+               FunctionNameList = (PULONG)((ULONG_PTR)Module->DllBase + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
              }
 
            /* Get the size of IAT. */
@@ -1569,17 +1560,17 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module,
                return(Status);
              }
 
-           NTHeaders = RtlImageNtHeader (ImportedModule->BaseAddress);
+           NTHeaders = RtlImageNtHeader (ImportedModule->DllBase);
            Start = (PVOID)NTHeaders->OptionalHeader.ImageBase;
-           End = Start + ImportedModule->SizeOfImage;
-           Offset = ImportedModule->BaseAddress - Start;
+           End = (PVOID)((ULONG_PTR)Start + ImportedModule->SizeOfImage);
+           Offset = (ULONG)((ULONG_PTR)ImportedModule->DllBase - (ULONG_PTR)Start);
 
            /* Walk through function list and fixup addresses. */
            while (*FunctionNameList != 0L)
              {
                if (*ImportAddressList >= Start && *ImportAddressList < End)
                  {
-                   (*ImportAddressList) += Offset;
+                   (*ImportAddressList) = (PVOID)((ULONG_PTR)(*ImportAddressList) + Offset);
                  }
                ImportAddressList++;
                FunctionNameList++;
@@ -1622,26 +1613,27 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module,
  */
 static NTSTATUS
 LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
-                IN PLDR_MODULE Module)
+                IN PLDR_DATA_TABLE_ENTRY Module)
 {
-   PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory;
-   PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectoryCurrent;
+   PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
+   PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectoryCurrent;
    PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptor;
    PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptorCurrent;
    PIMAGE_TLS_DIRECTORY TlsDirectory;
-   ULONG TlsSize;
+   ULONG TlsSize = 0;
    NTSTATUS Status;
-   PLDR_MODULE ImportedModule;
+   PLDR_DATA_TABLE_ENTRY ImportedModule;
    PCHAR ImportedName;
+   ULONG Size;
 
    DPRINT("LdrFixupImports(SearchPath %x, Module %x)\n", SearchPath, Module);
 
    /* Check for tls data */
    TlsDirectory = (PIMAGE_TLS_DIRECTORY)
-                     RtlImageDirectoryEntryToData(Module->BaseAddress,
+                     RtlImageDirectoryEntryToData(Module->DllBase,
                                                   TRUE,
                                                   IMAGE_DIRECTORY_ENTRY_TLS,
-                                                  NULL);
+                                                  &Size);
    if (TlsDirectory)
      {
        TlsSize = TlsDirectory->EndAddressOfRawData
@@ -1658,17 +1650,17 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
    /*
     * Process each import module.
     */
-   ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY)
-                              RtlImageDirectoryEntryToData(Module->BaseAddress,
+   ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
+                              RtlImageDirectoryEntryToData(Module->DllBase,
                                                            TRUE,
                                                            IMAGE_DIRECTORY_ENTRY_IMPORT,
-                                                           NULL);
+                                                           &Size);
 
    BoundImportDescriptor = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)
-                              RtlImageDirectoryEntryToData(Module->BaseAddress,
+                              RtlImageDirectoryEntryToData(Module->DllBase,
                                                            TRUE,
                                                            IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
-                                                           NULL);
+                                                           &Size);
 
    if (BoundImportDescriptor != NULL && ImportModuleDirectory == NULL)
      {
@@ -1707,9 +1699,9 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
              }
            else
              {
-               BOOL WrongForwarder;
+               BOOLEAN WrongForwarder;
                WrongForwarder = FALSE;
-               if (ImportedModule->Flags & IMAGE_NOT_AT_BASE)
+               if (ImportedModule->Flags & LDRP_IMAGE_NOT_AT_BASE)
                  {
                    TRACE_LDR("%wZ has stale binding to %s\n",
                              &Module->BaseDllName, ImportedName);
@@ -1723,8 +1715,8 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
                  {
                    PIMAGE_BOUND_FORWARDER_REF BoundForwarderRef;
                    ULONG i;
-                   PLDR_MODULE ForwarderModule;
-                   PUCHAR ForwarderName;
+                   PLDR_DATA_TABLE_ENTRY ForwarderModule;
+                   PCHAR ForwarderName;
 
                    BoundForwarderRef = (PIMAGE_BOUND_FORWARDER_REF)(BoundImportDescriptorCurrent + 1);
                    for (i = 0; i < BoundImportDescriptorCurrent->NumberOfModuleForwarderRefs; i++, BoundForwarderRef++)
@@ -1743,7 +1735,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
                            LdrpDecrementLoadCount(Module, FALSE);
                          }
                        if (ForwarderModule->TimeDateStamp != BoundForwarderRef->TimeDateStamp ||
-                           ForwarderModule->Flags & IMAGE_NOT_AT_BASE)
+                           ForwarderModule->Flags & LDRP_IMAGE_NOT_AT_BASE)
                          {
                            TRACE_LDR("%wZ has stale binding to %s\n",
                                      &Module->BaseDllName, ForwarderName);
@@ -1757,7 +1749,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
                      }
                  }
                if (WrongForwarder ||
-                   ImportedModule->Flags & IMAGE_NOT_AT_BASE)
+                   ImportedModule->Flags & LDRP_IMAGE_NOT_AT_BASE)
                  {
                    Status = LdrpProcessImportDirectory(Module, ImportedModule, ImportedName);
                    if (!NT_SUCCESS(Status))
@@ -1766,7 +1758,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
                        return Status;
                      }
                  }
-               else if (ImportedModule->Flags & IMAGE_NOT_AT_BASE)
+               else if (ImportedModule->Flags & LDRP_IMAGE_NOT_AT_BASE)
                  {
                    TRACE_LDR("Adjust imports for %s from %wZ\n",
                              ImportedName, &Module->BaseDllName);
@@ -1805,9 +1797,9 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
        DPRINT("ImportModuleDirectory %x\n", ImportModuleDirectory);
 
        ImportModuleDirectoryCurrent = ImportModuleDirectory;
-       while (ImportModuleDirectoryCurrent->dwRVAModuleName)
+       while (ImportModuleDirectoryCurrent->Name)
          {
-           ImportedName = (PCHAR)Module->BaseAddress + ImportModuleDirectoryCurrent->dwRVAModuleName;
+           ImportedName = (PCHAR)Module->DllBase + ImportModuleDirectoryCurrent->Name;
            TRACE_LDR("%wZ imports functions from %s\n", &Module->BaseDllName, ImportedName);
 
            Status = LdrpGetOrLoadModule(SearchPath, ImportedName, &ImportedModule, TRUE);
@@ -1872,14 +1864,14 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
  */
 PEPFUNC LdrPEStartup (PVOID  ImageBase,
                       HANDLE SectionHandle,
-                      PLDR_MODULE* Module,
+                      PLDR_DATA_TABLE_ENTRY* Module,
                       PWSTR FullDosName)
 {
    NTSTATUS             Status;
    PEPFUNC              EntryPoint = NULL;
    PIMAGE_DOS_HEADER    DosHeader;
    PIMAGE_NT_HEADERS    NTHeaders;
-   PLDR_MODULE tmpModule;
+   PLDR_DATA_TABLE_ENTRY tmpModule;
 
    DPRINT("LdrPEStartup(ImageBase %x SectionHandle %x)\n",
            ImageBase, (ULONG)SectionHandle);
@@ -1889,7 +1881,7 @@ PEPFUNC LdrPEStartup (PVOID  ImageBase,
     * to the DLL's image.
     */
    DosHeader = (PIMAGE_DOS_HEADER) ImageBase;
-   NTHeaders = (PIMAGE_NT_HEADERS) (ImageBase + DosHeader->e_lfanew);
+   NTHeaders = (PIMAGE_NT_HEADERS) ((ULONG_PTR)ImageBase + DosHeader->e_lfanew);
 
    /*
     * If the base address is different from the
@@ -1910,7 +1902,7 @@ PEPFUNC LdrPEStartup (PVOID  ImageBase,
    if (Module != NULL)
      {
        *Module = LdrAddModuleEntry(ImageBase, NTHeaders, FullDosName);
-       (*Module)->SectionHandle = SectionHandle;
+       (*Module)->SectionPointer = SectionHandle;
      }
    else
      {
@@ -1924,7 +1916,7 @@ PEPFUNC LdrPEStartup (PVOID  ImageBase,
 
    if (ImageBase != (PVOID) NTHeaders->OptionalHeader.ImageBase)
      {
-       (*Module)->Flags |= IMAGE_NOT_AT_BASE;
+       (*Module)->Flags |= LDRP_IMAGE_NOT_AT_BASE;
      }
 
    /*
@@ -1954,7 +1946,6 @@ PEPFUNC LdrPEStartup (PVOID  ImageBase,
    RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
    if (!NT_SUCCESS(Status))
      {
-       CHECKPOINT1;
        return NULL;
      }
 
@@ -1965,7 +1956,7 @@ PEPFUNC LdrPEStartup (PVOID  ImageBase,
    DPRINT("AddressOfEntryPoint = %x\n",(ULONG)NTHeaders->OptionalHeader.AddressOfEntryPoint);
    if (NTHeaders->OptionalHeader.AddressOfEntryPoint != 0)
      {
-        EntryPoint = (PEPFUNC) (ImageBase
+        EntryPoint = (PEPFUNC) ((ULONG_PTR)ImageBase
                            + NTHeaders->OptionalHeader.AddressOfEntryPoint);
      }
    DPRINT("LdrPEStartup() = %x\n",EntryPoint);
@@ -1976,16 +1967,18 @@ static NTSTATUS
 LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
                IN ULONG LoadFlags,
                IN PUNICODE_STRING Name,
-               PLDR_MODULE *Module)
+               PLDR_DATA_TABLE_ENTRY *Module,
+               PVOID *BaseAddress OPTIONAL)
 {
     UNICODE_STRING AdjustedName;
     UNICODE_STRING FullDosName;
     NTSTATUS Status;
-    PLDR_MODULE tmpModule;
+    PLDR_DATA_TABLE_ENTRY tmpModule;
     HANDLE SectionHandle;
     ULONG ViewSize;
     PVOID ImageBase;
     PIMAGE_NT_HEADERS NtHeaders;
+    BOOLEAN MappedAsDataFile;
 
     if (Module == NULL)
       {
@@ -1996,11 +1989,16 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
 
     DPRINT("%wZ\n", &AdjustedName);
 
+    MappedAsDataFile = FALSE;
     /* Test if dll is already loaded */
     Status = LdrFindEntryForName(&AdjustedName, Module, TRUE);
     if (NT_SUCCESS(Status))
       {
         RtlFreeUnicodeString(&AdjustedName);
+        if (NULL != BaseAddress)
+          {
+            *BaseAddress = (*Module)->DllBase;
+          }
       }
     else
       {
@@ -2008,13 +2006,14 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
         Status = LdrpMapKnownDll(&AdjustedName, &FullDosName, &SectionHandle);
         if (!NT_SUCCESS(Status))
           {
-            Status = LdrpMapDllImageFile(SearchPath, &AdjustedName, &FullDosName, &SectionHandle);
+            MappedAsDataFile = (0 != (LoadFlags & LOAD_LIBRARY_AS_DATAFILE));
+            Status = LdrpMapDllImageFile(SearchPath, &AdjustedName, &FullDosName,
+                                         MappedAsDataFile, &SectionHandle);
           }
         if (!NT_SUCCESS(Status))
           {
             DPRINT1("Failed to create or open dll section of '%wZ' (Status %lx)\n", &AdjustedName, Status);
             RtlFreeUnicodeString(&AdjustedName);
-            RtlFreeUnicodeString(&FullDosName);
             return Status;
           }
         RtlFreeUnicodeString(&AdjustedName);
@@ -2030,7 +2029,7 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
                                     &ViewSize,
                                     0,
                                     MEM_COMMIT,
-                                    PAGE_READWRITE);
+                                    PAGE_READONLY);
         if (!NT_SUCCESS(Status))
           {
             DPRINT1("map view of section failed (Status %x)\n", Status);
@@ -2038,6 +2037,10 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
             NtClose(SectionHandle);
             return(Status);
           }
+        if (NULL != BaseAddress)
+          {
+            *BaseAddress = ImageBase;
+          }
         /* Get and check the NT headers */
         NtHeaders = RtlImageNtHeader(ImageBase);
         if (NtHeaders == NULL)
@@ -2048,6 +2051,19 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
             RtlFreeUnicodeString(&FullDosName);
             return STATUS_UNSUCCESSFUL;
           }
+        DPRINT("Mapped %wZ at %x\n", &FullDosName, ImageBase);
+        if (MappedAsDataFile)
+          {
+            ASSERT(NULL != BaseAddress);
+            if (NULL != BaseAddress)
+              {
+                *BaseAddress = (PVOID) ((char *) *BaseAddress + 1);
+              }
+            *Module = NULL;
+            RtlFreeUnicodeString(&FullDosName);
+            NtClose(SectionHandle);
+            return STATUS_SUCCESS;
+          }
         /* If the base address is different from the
          * one the DLL is actually loaded, perform any
          * relocation. */
@@ -2066,14 +2082,14 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
               }
           }
         *Module = LdrAddModuleEntry(ImageBase, NtHeaders, FullDosName.Buffer);
-        (*Module)->SectionHandle = SectionHandle;
+        (*Module)->SectionPointer = SectionHandle;
         if (ImageBase != (PVOID) NtHeaders->OptionalHeader.ImageBase)
           {
-            (*Module)->Flags |= IMAGE_NOT_AT_BASE;
+            (*Module)->Flags |= LDRP_IMAGE_NOT_AT_BASE;
           }
         if (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL)
           {
-            (*Module)->Flags |= IMAGE_DLL;
+            (*Module)->Flags |= LDRP_IMAGE_DLL;
           }
         /* fixup the imported calls entry points */
         Status = LdrFixupImports(SearchPath, *Module);
@@ -2082,9 +2098,9 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
             DPRINT1("LdrFixupImports failed for %wZ, status=%x\n", &(*Module)->BaseDllName, Status);
             return Status;
           }
-#ifdef KDBG
+#if defined(DBG) || defined(KDBG)
         LdrpLoadUserModuleSymbols(*Module);
-#endif
+#endif /* DBG || KDBG */
         RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock);
         InsertTailList(&NtCurrentPeb()->Ldr->InInitializationOrderModuleList,
                        &(*Module)->InInitializationOrderModuleList);
@@ -2094,17 +2110,17 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
 }
 
 static NTSTATUS
-LdrpUnloadModule(PLDR_MODULE Module,
-                 BOOL Unload)
+LdrpUnloadModule(PLDR_DATA_TABLE_ENTRY Module,
+                 BOOLEAN Unload)
 {
-   PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory;
+   PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
    PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptor;
    PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptorCurrent;
    PCHAR ImportedName;
-   PLDR_MODULE ImportedModule;
+   PLDR_DATA_TABLE_ENTRY ImportedModule;
    NTSTATUS Status;
    LONG LoadCount;
-
+   ULONG Size;
 
    if (Unload)
      {
@@ -2118,15 +2134,14 @@ LdrpUnloadModule(PLDR_MODULE Module,
    if (LoadCount == 0)
      {
        /* ?????????????????? */
-       CHECKPOINT1;
      }
    else if (LoadCount == 1)
      {
        BoundImportDescriptor = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)
-                                 RtlImageDirectoryEntryToData(Module->BaseAddress,
+                                 RtlImageDirectoryEntryToData(Module->DllBase,
                                                               TRUE,
                                                               IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
-                                                              NULL);
+                                                              &Size);
        if (BoundImportDescriptor)
         {
           /* dereferencing all imported modules, use the bound import descriptor */
@@ -2156,17 +2171,17 @@ LdrpUnloadModule(PLDR_MODULE Module,
          }
        else
          {
-           ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY)
-                                      RtlImageDirectoryEntryToData(Module->BaseAddress,
+           ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
+                                      RtlImageDirectoryEntryToData(Module->DllBase,
                                                                    TRUE,
                                                                    IMAGE_DIRECTORY_ENTRY_IMPORT,
-                                                                   NULL);
+                                                                   &Size);
            if (ImportModuleDirectory)
              {
                /* dereferencing all imported modules, use the import descriptor */
-               while (ImportModuleDirectory->dwRVAModuleName)
+               while (ImportModuleDirectory->Name)
                  {
-                   ImportedName = (PCHAR)Module->BaseAddress + ImportModuleDirectory->dwRVAModuleName;
+                   ImportedName = (PCHAR)Module->DllBase + ImportModuleDirectory->Name;
                    TRACE_LDR("%wZ trys to unload %s\n", &Module->BaseDllName, ImportedName);
                    Status = LdrpGetOrLoadModule(NULL, ImportedName, &ImportedModule, FALSE);
                    if (!NT_SUCCESS(Status))
@@ -2202,33 +2217,41 @@ LdrpUnloadModule(PLDR_MODULE Module,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 LdrUnloadDll (IN PVOID BaseAddress)
 {
-   PLDR_MODULE Module;
+   PLDR_DATA_TABLE_ENTRY Module;
    NTSTATUS Status;
 
    if (BaseAddress == NULL)
      return STATUS_SUCCESS;
 
-   Status = LdrFindEntryForAddress(BaseAddress, &Module);
-   if (NT_SUCCESS(Status))
+   if (LdrMappedAsDataFile(&BaseAddress))
+     {
+       Status = NtUnmapViewOfSection(NtCurrentProcess(), BaseAddress);
+     }
+   else
      {
-       TRACE_LDR("LdrUnloadDll, , unloading %wZ\n", &Module->BaseDllName);
-       Status = LdrpUnloadModule(Module, TRUE);
+       Status = LdrFindEntryForAddress(BaseAddress, &Module);
+       if (NT_SUCCESS(Status))
+         {
+           TRACE_LDR("LdrUnloadDll, , unloading %wZ\n", &Module->BaseDllName);
+           Status = LdrpUnloadModule(Module, TRUE);
+         }
      }
+
    return Status;
 }
 
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress)
 {
     PLIST_ENTRY ModuleListHead;
     PLIST_ENTRY Entry;
-    PLDR_MODULE Module;
+    PLDR_DATA_TABLE_ENTRY Module;
     NTSTATUS Status;
 
     DPRINT("LdrDisableThreadCalloutsForDll (BaseAddress %x)\n", BaseAddress);
@@ -2239,15 +2262,15 @@ LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress)
     Entry = ModuleListHead->Flink;
     while (Entry != ModuleListHead)
       {
-        Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
+        Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
 
-        DPRINT("BaseDllName %wZ BaseAddress %x\n", &Module->BaseDllName, Module->BaseAddress);
+        DPRINT("BaseDllName %wZ BaseAddress %x\n", &Module->BaseDllName, Module->DllBase);
 
-        if (Module->BaseAddress == BaseAddress)
+        if (Module->DllBase == BaseAddress)
           {
-            if (Module->TlsIndex == -1)
+            if (Module->TlsIndex == 0xFFFF)
               {
-                Module->Flags |= DONT_CALL_FOR_THREAD;
+                Module->Flags |= LDRP_DONT_CALL_FOR_THREADS;
                 Status = STATUS_SUCCESS;
               }
             break;
@@ -2261,34 +2284,35 @@ LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
-LdrGetDllHandle(IN PWCHAR Path OPTIONAL,
-                IN ULONG Unknown2,
+NTSTATUS NTAPI
+LdrGetDllHandle(IN PWSTR DllPath OPTIONAL,
+                IN PULONG DllCharacteristics,
                 IN PUNICODE_STRING DllName,
-                OUT PVOID* BaseAddress)
+                OUT PVOID *DllHandle)
 {
-    PLDR_MODULE Module;
+    PLDR_DATA_TABLE_ENTRY Module;
     NTSTATUS Status;
 
-    TRACE_LDR("LdrGetDllHandle, searching for %wZ from %S\n", DllName, Path ? Path : L"");
+    TRACE_LDR("LdrGetDllHandle, searching for %wZ from %S\n",
+               DllName, DllPath ? DllPath : L"");
 
     /* NULL is the current executable */
     if (DllName == NULL)
       {
-        *BaseAddress = ExeModule->BaseAddress;
-        DPRINT("BaseAddress %x\n", *BaseAddress);
+        *DllHandle = ExeModule->DllBase;
+        DPRINT("BaseAddress %x\n", *DllHandle);
         return STATUS_SUCCESS;
       }
 
     Status = LdrFindEntryForName(DllName, &Module, FALSE);
     if (NT_SUCCESS(Status))
       {
-        *BaseAddress = Module->BaseAddress;
+        *DllHandle = Module->DllBase;
         return STATUS_SUCCESS;
       }
 
     DPRINT("Failed to find dll %wZ\n", DllName);
-    *BaseAddress = NULL;
+    *DllHandle = NULL;
     return STATUS_DLL_NOT_FOUND;
 }
 
@@ -2296,7 +2320,7 @@ LdrGetDllHandle(IN PWCHAR Path OPTIONAL,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 LdrGetProcedureAddress (IN PVOID BaseAddress,
                         IN PANSI_STRING Name,
                         IN ULONG Ordinal,
@@ -2317,7 +2341,7 @@ LdrGetProcedureAddress (IN PVOID BaseAddress,
    if (Name && Name->Length)
      {
        /* by name */
-       *ProcedureAddress = LdrGetExportByName(BaseAddress, Name->Buffer, 0xffff);
+       *ProcedureAddress = LdrGetExportByName(BaseAddress, (PUCHAR)Name->Buffer, 0xffff);
        if (*ProcedureAddress != NULL)
          {
            return STATUS_SUCCESS;
@@ -2357,11 +2381,11 @@ LdrGetProcedureAddress (IN PVOID BaseAddress,
  *      The loader lock must be held on enty.
  */
 static VOID
-LdrpDetachProcess(BOOL UnloadAll)
+LdrpDetachProcess(BOOLEAN UnloadAll)
 {
    PLIST_ENTRY ModuleListHead;
    PLIST_ENTRY Entry;
-   PLDR_MODULE Module;
+   PLDR_DATA_TABLE_ENTRY Module;
    static ULONG CallingCount = 0;
 
    DPRINT("LdrpDetachProcess() called for %wZ\n",
@@ -2373,21 +2397,21 @@ LdrpDetachProcess(BOOL UnloadAll)
    Entry = ModuleListHead->Blink;
    while (Entry != ModuleListHead)
      {
-       Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
-       if (((UnloadAll && Module->LoadCount <= 0) || Module->LoadCount == 0) &&
-           Module->Flags & ENTRY_PROCESSED &&
-           !(Module->Flags & UNLOAD_IN_PROGRESS))
+       Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
+       if (((UnloadAll && Module->LoadCount == 0xFFFF) || Module->LoadCount == 0) &&
+           Module->Flags & LDRP_ENTRY_PROCESSED &&
+           !(Module->Flags & LDRP_UNLOAD_IN_PROGRESS))
          {
-           Module->Flags |= UNLOAD_IN_PROGRESS;
+           Module->Flags |= LDRP_UNLOAD_IN_PROGRESS;
            if (Module == LdrpLastModule)
              {
                LdrpLastModule = NULL;
              }
-           if (Module->Flags & PROCESS_ATTACH_CALLED)
+           if (Module->Flags & LDRP_PROCESS_ATTACH_CALLED)
              {
                TRACE_LDR("Unload %wZ - Calling entry point at %x\n",
                          &Module->BaseDllName, Module->EntryPoint);
-               LdrpCallDllEntry(Module, DLL_PROCESS_DETACH, (PVOID)(Module->LoadCount == -1 ? 1 : 0));
+               LdrpCallDllEntry(Module, DLL_PROCESS_DETACH, (PVOID)(Module->LoadCount == 0xFFFF ? 1 : 0));
              }
            else
              {
@@ -2406,17 +2430,17 @@ LdrpDetachProcess(BOOL UnloadAll)
        Entry = ModuleListHead->Blink;
        while (Entry != ModuleListHead)
          {
-           Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
+           Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
            Entry = Entry->Blink;
-           if (Module->Flags & UNLOAD_IN_PROGRESS &&
-               ((UnloadAll && Module->LoadCount >= 0) || Module->LoadCount == 0))
+           if (Module->Flags & LDRP_UNLOAD_IN_PROGRESS &&
+               ((UnloadAll && Module->LoadCount != 0xFFFF) || Module->LoadCount == 0))
              {
                /* remove the module entry from the list */
-               RemoveEntryList (&Module->InLoadOrderModuleList)
+               RemoveEntryList (&Module->InLoadOrderModuleList);
                RemoveEntryList (&Module->InInitializationOrderModuleList);
 
-               NtUnmapViewOfSection (NtCurrentProcess (), Module->BaseAddress);
-               NtClose (Module->SectionHandle);
+               NtUnmapViewOfSection (NtCurrentProcess (), Module->DllBase);
+               NtClose (Module->SectionPointer);
 
                TRACE_LDR("%wZ unloaded\n", &Module->BaseDllName);
 
@@ -2455,8 +2479,8 @@ LdrpAttachProcess(VOID)
 {
    PLIST_ENTRY ModuleListHead;
    PLIST_ENTRY Entry;
-   PLDR_MODULE Module;
-   BOOL Result;
+   PLDR_DATA_TABLE_ENTRY Module;
+   BOOLEAN Result;
    NTSTATUS Status = STATUS_SUCCESS;
 
    DPRINT("LdrpAttachProcess() called for %wZ\n",
@@ -2466,27 +2490,27 @@ LdrpAttachProcess(VOID)
    Entry = ModuleListHead->Flink;
    while (Entry != ModuleListHead)
      {
-       Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
-       if (!(Module->Flags & (LOAD_IN_PROGRESS|UNLOAD_IN_PROGRESS|ENTRY_PROCESSED)))
+       Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
+       if (!(Module->Flags & (LDRP_LOAD_IN_PROGRESS|LDRP_UNLOAD_IN_PROGRESS|LDRP_ENTRY_PROCESSED)))
          {
-           Module->Flags |= LOAD_IN_PROGRESS;
+           Module->Flags |= LDRP_LOAD_IN_PROGRESS;
            TRACE_LDR("%wZ loaded - Calling init routine at %x for process attaching\n",
                      &Module->BaseDllName, Module->EntryPoint);
-           Result = LdrpCallDllEntry(Module, DLL_PROCESS_ATTACH, (PVOID)(Module->LoadCount == -1 ? 1 : 0));
+           Result = LdrpCallDllEntry(Module, DLL_PROCESS_ATTACH, (PVOID)(Module->LoadCount == 0xFFFF ? 1 : 0));
            if (!Result)
              {
                Status = STATUS_DLL_INIT_FAILED;
                break;
              }
-           if (Module->Flags & IMAGE_DLL && Module->EntryPoint != 0)
+           if (Module->Flags & LDRP_IMAGE_DLL && Module->EntryPoint != 0)
              {
-               Module->Flags |= PROCESS_ATTACH_CALLED|ENTRY_PROCESSED;
+               Module->Flags |= LDRP_PROCESS_ATTACH_CALLED|LDRP_ENTRY_PROCESSED;
              }
            else
              {
-               Module->Flags |= ENTRY_PROCESSED;
+               Module->Flags |= LDRP_ENTRY_PROCESSED;
              }
-           Module->Flags &= ~LOAD_IN_PROGRESS;
+           Module->Flags &= ~LDRP_LOAD_IN_PROGRESS;
          }
        Entry = Entry->Flink;
      }
@@ -2499,7 +2523,7 @@ LdrpAttachProcess(VOID)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 LdrShutdownProcess (VOID)
 {
   LdrpDetachProcess(TRUE);
@@ -2515,7 +2539,7 @@ LdrpAttachThread (VOID)
 {
   PLIST_ENTRY ModuleListHead;
   PLIST_ENTRY Entry;
-  PLDR_MODULE Module;
+  PLDR_DATA_TABLE_ENTRY Module;
   NTSTATUS Status;
 
   DPRINT("LdrpAttachThread() called for %wZ\n",
@@ -2532,10 +2556,10 @@ LdrpAttachThread (VOID)
 
       while (Entry != ModuleListHead)
         {
-          Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
-          if (Module->Flags & PROCESS_ATTACH_CALLED &&
-              !(Module->Flags & DONT_CALL_FOR_THREAD) &&
-              !(Module->Flags & UNLOAD_IN_PROGRESS))
+          Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
+          if (Module->Flags & LDRP_PROCESS_ATTACH_CALLED &&
+              !(Module->Flags & LDRP_DONT_CALL_FOR_THREADS) &&
+              !(Module->Flags & LDRP_UNLOAD_IN_PROGRESS))
             {
               TRACE_LDR("%wZ - Calling entry point at %x for thread attaching\n",
                         &Module->BaseDllName, Module->EntryPoint);
@@ -2545,7 +2569,7 @@ LdrpAttachThread (VOID)
         }
 
       Entry = NtCurrentPeb()->Ldr->InLoadOrderModuleList.Flink;
-      Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
+      Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
       LdrpTlsCallback(Module, DLL_THREAD_ATTACH);
     }
 
@@ -2560,12 +2584,12 @@ LdrpAttachThread (VOID)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 LdrShutdownThread (VOID)
 {
    PLIST_ENTRY ModuleListHead;
    PLIST_ENTRY Entry;
-   PLDR_MODULE Module;
+   PLDR_DATA_TABLE_ENTRY Module;
 
    DPRINT("LdrShutdownThread() called for %wZ\n",
           &ExeModule->BaseDllName);
@@ -2576,11 +2600,11 @@ LdrShutdownThread (VOID)
    Entry = ModuleListHead->Blink;
    while (Entry != ModuleListHead)
      {
-       Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
+       Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
 
-       if (Module->Flags & PROCESS_ATTACH_CALLED &&
-           !(Module->Flags & DONT_CALL_FOR_THREAD) &&
-           !(Module->Flags & UNLOAD_IN_PROGRESS))
+       if (Module->Flags & LDRP_PROCESS_ATTACH_CALLED &&
+           !(Module->Flags & LDRP_DONT_CALL_FOR_THREADS) &&
+           !(Module->Flags & LDRP_UNLOAD_IN_PROGRESS))
          {
            TRACE_LDR("%wZ - Calling entry point at %x for thread detaching\n",
                      &Module->BaseDllName, Module->EntryPoint);
@@ -2618,15 +2642,15 @@ LdrShutdownThread (VOID)
  *
  * @implemented
  */
-NTSTATUS STDCALL
-LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTIONAL,
+NTSTATUS NTAPI
+LdrQueryProcessModuleInformation(IN PRTL_PROCESS_MODULES ModuleInformation OPTIONAL,
                                  IN ULONG Size OPTIONAL,
                                  OUT PULONG ReturnedSize)
 {
   PLIST_ENTRY ModuleListHead;
   PLIST_ENTRY Entry;
-  PLDR_MODULE Module;
-  PMODULE_ENTRY ModulePtr = NULL;
+  PLDR_DATA_TABLE_ENTRY Module;
+  PRTL_PROCESS_MODULE_INFORMATION ModulePtr = NULL;
   NTSTATUS Status = STATUS_SUCCESS;
   ULONG UsedSize = sizeof(ULONG);
   ANSI_STRING AnsiString;
@@ -2652,7 +2676,7 @@ LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTION
 
   while (Entry != ModuleListHead)
     {
-      Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
+      Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
 
       DPRINT("  Module %wZ\n",
              &Module->FullDllName);
@@ -2663,31 +2687,30 @@ LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTION
         }
       else if (ModuleInformation != NULL)
         {
-          ModulePtr->Unknown0 = 0;      // FIXME: ??
-          ModulePtr->Unknown1 = 0;      // FIXME: ??
-          ModulePtr->BaseAddress = Module->BaseAddress;
-          ModulePtr->SizeOfImage = Module->SizeOfImage;
+          ModulePtr->Reserved[0] = ModulePtr->Reserved[1] = 0;      // FIXME: ??
+          ModulePtr->Base = Module->DllBase;
+          ModulePtr->Size = Module->SizeOfImage;
           ModulePtr->Flags = Module->Flags;
-          ModulePtr->Unknown2 = 0;      // FIXME: load order index ??
-          ModulePtr->Unknown3 = 0;      // FIXME: ??
+          ModulePtr->Index = 0;      // FIXME: index ??
+          ModulePtr->Unknown = 0;      // FIXME: ??
           ModulePtr->LoadCount = Module->LoadCount;
 
           AnsiString.Length = 0;
           AnsiString.MaximumLength = 256;
-          AnsiString.Buffer = ModulePtr->ModuleName;
+          AnsiString.Buffer = ModulePtr->ImageName;
           RtlUnicodeStringToAnsiString(&AnsiString,
                                        &Module->FullDllName,
                                        FALSE);
-          p = strrchr(ModulePtr->ModuleName, '\\');
+          p = strrchr(ModulePtr->ImageName, '\\');
           if (p != NULL)
-            ModulePtr->PathLength = p - ModulePtr->ModuleName + 1;
+            ModulePtr->ModuleNameOffset = p - ModulePtr->ImageName + 1;
           else
-            ModulePtr->PathLength = 0;
+            ModulePtr->ModuleNameOffset = 0;
 
           ModulePtr++;
           ModuleInformation->ModuleCount++;
         }
-      UsedSize += sizeof(MODULE_ENTRY);
+      UsedSize += sizeof(RTL_PROCESS_MODULE_INFORMATION);
 
       Entry = Entry->Flink;
     }
@@ -2772,6 +2795,33 @@ LdrpCheckImageChecksum (IN PVOID BaseAddress,
   return (BOOLEAN)(CalcSum == HeaderSum);
 }
 
+/*
+ * Compute size of an image as it is actually present in virt memory
+ * (i.e. excluding NEVER_LOAD sections)
+ */
+ULONG
+LdrpGetResidentSize(PIMAGE_NT_HEADERS NTHeaders)
+{
+  PIMAGE_SECTION_HEADER SectionHeader;
+  unsigned SectionIndex;
+  ULONG ResidentSize;
+
+  SectionHeader = (PIMAGE_SECTION_HEADER)((char *) &NTHeaders->OptionalHeader
+                                          + NTHeaders->FileHeader.SizeOfOptionalHeader);
+  ResidentSize = 0;
+  for (SectionIndex = 0; SectionIndex < NTHeaders->FileHeader.NumberOfSections; SectionIndex++)
+    {
+      if (0 == (SectionHeader->Characteristics & IMAGE_SCN_LNK_REMOVE)
+          && ResidentSize < SectionHeader->VirtualAddress + SectionHeader->Misc.VirtualSize)
+        {
+          ResidentSize = SectionHeader->VirtualAddress + SectionHeader->Misc.VirtualSize;
+        }
+      SectionHeader++;
+    }
+
+  return ResidentSize;
+}
+
 
 /***************************************************************************
  * NAME                                                         EXPORTED
@@ -2789,7 +2839,7 @@ LdrpCheckImageChecksum (IN PVOID BaseAddress,
  *
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle,
                                ULONG Unknown1,
                                ULONG Unknown2,
@@ -2806,10 +2856,10 @@ LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle,
   DPRINT ("LdrVerifyImageMatchesChecksum() called\n");
 
   Status = NtCreateSection (&SectionHandle,
-                            SECTION_MAP_EXECUTE,
+                            SECTION_MAP_READ,
                             NULL,
                             NULL,
-                            PAGE_EXECUTE,
+                            PAGE_READONLY,
                             SEC_COMMIT,
                             FileHandle);
   if (!NT_SUCCESS(Status))
@@ -2829,7 +2879,7 @@ LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle,
                                &ViewSize,
                                ViewShare,
                                0,
-                               PAGE_EXECUTE);
+                               PAGE_READONLY);
   if (!NT_SUCCESS(Status))
     {
       DPRINT1 ("NtMapViewOfSection() failed (Status %lx)\n", Status);
@@ -2883,7 +2933,7 @@ LdrVerifyImageMatchesChecksum (IN HANDLE FileHandle,
  *
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey,
                                    IN PCWSTR ValueName,
                                    IN ULONG Type,
@@ -3014,7 +3064,7 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey,
 }
 
 
-PIMAGE_BASE_RELOCATION STDCALL
+PIMAGE_BASE_RELOCATION NTAPI
 LdrProcessRelocationBlock(IN PVOID Address,
                          IN USHORT Count,
                          IN PUSHORT TypeOffset,
@@ -3037,17 +3087,17 @@ LdrProcessRelocationBlock(IN PVOID Address,
             break;
 
           case IMAGE_REL_BASED_HIGH:
-            ShortPtr = (PUSHORT)(Address + Offset);
+            ShortPtr = (PUSHORT)((ULONG_PTR)Address + Offset);
             *ShortPtr += HIWORD(Delta);
             break;
 
           case IMAGE_REL_BASED_LOW:
-            ShortPtr = (PUSHORT)(Address + Offset);
+            ShortPtr = (PUSHORT)((ULONG_PTR)Address + Offset);
             *ShortPtr += LOWORD(Delta);
             break;
 
           case IMAGE_REL_BASED_HIGHLOW:
-            LongPtr = (PULONG)(Address + Offset);
+            LongPtr = (PULONG)((ULONG_PTR)Address + Offset);
             *LongPtr += Delta;
             break;