Don't include NEVER_LOAD sections in image size.
Rename SizeOfImage to ResidentSize to avoid confusion
Modified: trunk/reactos/include/ntdll/ldr.h
Modified: trunk/reactos/lib/ntdll/ldr/startup.c
Modified: trunk/reactos/lib/ntdll/ldr/utils.c
Modified: trunk/reactos/lib/ntdll/rtl/dbgbuffer.c
Modified: trunk/reactos/lib/psapi/psapi.c
Modified: trunk/reactos/ntoskrnl/dbg/kdb_symbols.c
Modified: trunk/reactos/ntoskrnl/ke/i386/usertrap.c

Modified: trunk/reactos/include/ntdll/ldr.h
--- trunk/reactos/include/ntdll/ldr.h	2005-02-09 18:18:20 UTC (rev 13476)
+++ trunk/reactos/include/ntdll/ldr.h	2005-02-09 18:34:13 UTC (rev 13477)
@@ -59,7 +59,7 @@
    LIST_ENTRY     InInitializationOrderModuleList;	/* not used */
    PVOID          BaseAddress;
    ULONG          EntryPoint;
-   ULONG          SizeOfImage;
+   ULONG          ResidentSize;
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;
    ULONG          Flags;
@@ -92,6 +92,9 @@
 
 #endif
 
+ULONG
+LdrpGetResidentSize(PIMAGE_NT_HEADERS NTHeaders);
+
 PEPFUNC LdrPEStartup (PVOID  ImageBase,
 		      HANDLE SectionHandle,
 		      PLDR_MODULE* Module,

Modified: trunk/reactos/lib/ntdll/ldr/startup.c
--- trunk/reactos/lib/ntdll/ldr/startup.c	2005-02-09 18:18:20 UTC (rev 13476)
+++ trunk/reactos/lib/ntdll/ldr/startup.c	2005-02-09 18:34:13 UTC (rev 13477)
@@ -222,7 +222,6 @@
 	return FALSE;
 }
 
-
 /* FUNCTIONS *****************************************************************/
 
 VOID STDCALL
@@ -382,7 +381,7 @@
        NtModule->CheckSum = 0;
 
        NTHeaders = RtlImageNtHeader (NtModule->BaseAddress);
-       NtModule->SizeOfImage = NTHeaders->OptionalHeader.SizeOfImage;
+       NtModule->ResidentSize = LdrpGetResidentSize(NTHeaders);
        NtModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
 
        InsertTailList(&Peb->Ldr->InLoadOrderModuleList,
@@ -430,7 +429,7 @@
        ExeModule->CheckSum = 0;
 
        NTHeaders = RtlImageNtHeader (ExeModule->BaseAddress);
-       ExeModule->SizeOfImage = NTHeaders->OptionalHeader.SizeOfImage;
+       ExeModule->ResidentSize = LdrpGetResidentSize(NTHeaders);
        ExeModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
 
        InsertHeadList(&Peb->Ldr->InLoadOrderModuleList,

Modified: trunk/reactos/lib/ntdll/ldr/utils.c
--- trunk/reactos/lib/ntdll/ldr/utils.c	2005-02-09 18:18:20 UTC (rev 13476)
+++ trunk/reactos/lib/ntdll/ldr/utils.c	2005-02-09 18:34:13 UTC (rev 13477)
@@ -468,7 +468,7 @@
   Module->EntryPoint = NTHeaders->OptionalHeader.AddressOfEntryPoint;
   if (Module->EntryPoint != 0)
     Module->EntryPoint += (ULONG)Module->BaseAddress;
-  Module->SizeOfImage = NTHeaders->OptionalHeader.SizeOfImage;
+  Module->ResidentSize = LdrpGetResidentSize(NTHeaders);
   if (NtCurrentPeb()->Ldr->Initialized == TRUE)
     {
       /* loading while app is running */
@@ -799,7 +799,7 @@
       DPRINT("Scanning %wZ at %p\n", &ModulePtr->BaseDllName, ModulePtr->BaseAddress);
 
       if ((Address >= ModulePtr->BaseAddress) &&
-          (Address <= (ModulePtr->BaseAddress + ModulePtr->SizeOfImage)))
+          (Address <= (ModulePtr->BaseAddress + ModulePtr->ResidentSize)))
         {
           *Module = ModulePtr;
           RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
@@ -1581,7 +1581,7 @@
 
            NTHeaders = RtlImageNtHeader (ImportedModule->BaseAddress);
            Start = (PVOID)NTHeaders->OptionalHeader.ImageBase;
-           End = Start + ImportedModule->SizeOfImage;
+           End = Start + ImportedModule->ResidentSize;
            Offset = ImportedModule->BaseAddress - Start;
 
            /* Walk through function list and fixup addresses. */
@@ -2708,7 +2708,7 @@
         {
           ModulePtr->Reserved[0] = ModulePtr->Reserved[1] = 0;      // FIXME: ??
           ModulePtr->Base = Module->BaseAddress;
-          ModulePtr->Size = Module->SizeOfImage;
+          ModulePtr->Size = Module->ResidentSize;
           ModulePtr->Flags = Module->Flags;
           ModulePtr->Index = 0;      // FIXME: index ??
           ModulePtr->Unknown = 0;      // FIXME: ??
@@ -2814,7 +2814,34 @@
   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
  *      LdrVerifyImageMatchesChecksum

Modified: trunk/reactos/lib/ntdll/rtl/dbgbuffer.c
--- trunk/reactos/lib/ntdll/rtl/dbgbuffer.c	2005-02-09 18:18:20 UTC (rev 13476)
+++ trunk/reactos/lib/ntdll/rtl/dbgbuffer.c	2005-02-09 18:34:13 UTC (rev 13477)
@@ -219,7 +219,7 @@
         {
           ModulePtr->Reserved[0] = ModulePtr->Reserved[1] = 0;      // FIXME: ??
           ModulePtr->Base        = lmModule.BaseAddress;
-          ModulePtr->Size        = lmModule.SizeOfImage;
+          ModulePtr->Size        = lmModule.ResidentSize;
           ModulePtr->Flags       = lmModule.Flags;
           ModulePtr->Index       = 0;      // FIXME:  ??
           ModulePtr->Unknown     = 0;      // FIXME: ??

Modified: trunk/reactos/lib/psapi/psapi.c
--- trunk/reactos/lib/psapi/psapi.c	2005-02-09 18:18:20 UTC (rev 13476)
+++ trunk/reactos/lib/psapi/psapi.c	2005-02-09 18:34:13 UTC (rev 13477)
@@ -521,10 +521,10 @@
       }
 
       /* image size */
-      if(nSize >= sizeof(CurrentModule->SizeOfImage))
+      if(nSize >= sizeof(CurrentModule->ResidentSize))
       {
-        Context->lpmodinfo->SizeOfImage = CurrentModule->SizeOfImage;
-        nSize -= sizeof(CurrentModule->SizeOfImage);
+        Context->lpmodinfo->SizeOfImage = CurrentModule->ResidentSize;
+        nSize -= sizeof(CurrentModule->ResidentSize);
       }
 
       /* entry point */

Modified: trunk/reactos/ntoskrnl/dbg/kdb_symbols.c
--- trunk/reactos/ntoskrnl/dbg/kdb_symbols.c	2005-02-09 18:18:20 UTC (rev 13476)
+++ trunk/reactos/ntoskrnl/dbg/kdb_symbols.c	2005-02-09 18:34:13 UTC (rev 13477)
@@ -92,7 +92,7 @@
       current = CONTAINING_RECORD(current_entry, LDR_MODULE, InLoadOrderModuleList);
 
       if ((Address != NULL && (Address >= (PVOID)current->BaseAddress &&
-                               Address < (PVOID)((char *)current->BaseAddress + current->SizeOfImage))) ||
+                               Address < (PVOID)((char *)current->BaseAddress + current->ResidentSize))) ||
           (Name != NULL && _wcsicmp(current->BaseDllName.Buffer, Name) == 0) ||
           (Index >= 0 && Count++ == Index))
         {
@@ -102,7 +102,7 @@
 	  wcsncpy(pInfo->Name, current->BaseDllName.Buffer, Length);
 	  pInfo->Name[Length] = L'\0';
           pInfo->Base = (ULONG_PTR)current->BaseAddress;
-          pInfo->Size = current->SizeOfImage;
+          pInfo->Size = current->ResidentSize;
           pInfo->RosSymInfo = current->RosSymInfo;
           return TRUE;
         }

Modified: trunk/reactos/ntoskrnl/ke/i386/usertrap.c
--- trunk/reactos/ntoskrnl/ke/i386/usertrap.c	2005-02-09 18:18:20 UTC (rev 13476)
+++ trunk/reactos/ntoskrnl/ke/i386/usertrap.c	2005-02-09 18:34:13 UTC (rev 13477)
@@ -1,4 +1,4 @@
-/* $Id:$
+/* $Id$
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -54,7 +54,7 @@
 	  CONTAINING_RECORD(current_entry, LDR_MODULE, InLoadOrderModuleList);
 	
 	if (address >= (PVOID)current->BaseAddress &&
-	    address < (PVOID)((char*)current->BaseAddress + current->SizeOfImage))
+	    address < (PVOID)((char*)current->BaseAddress + current->ResidentSize))
 	  {
             RelativeAddress = 
 	      (ULONG_PTR) address - (ULONG_PTR)current->BaseAddress;