- Fix/update w32api PE headers
authorAlex Ionescu <aionescu@gmail.com>
Thu, 28 Jul 2005 22:43:24 +0000 (22:43 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Thu, 28 Jul 2005 22:43:24 +0000 (22:43 +0000)
 - Implement proper PEB creation, set all necessary fields and read data from PE Header and Config Directory. Fixes "corruption" issue with console apps.

svn path=/trunk/; revision=16846

reactos/lib/kernel32/process/create.c
reactos/ntoskrnl/mm/process.c
reactos/w32api/include/winnt.h

index 04f59d0..f745774 100644 (file)
@@ -1380,7 +1380,7 @@ GetAppName:
     lpProcessInformation->hThread = hThread;
     DPRINT("hThread[%lx]: %lx inside hProcess[%lx]: %lx\n", hThread,
             ClientId.UniqueThread, ClientId.UniqueProcess, hProcess);
-    hProcess =  hThread = NULL;
+    hProcess = hThread = NULL;
             
     /* De-allocate heap strings */
     if (NameBuffer) RtlFreeHeap(GetProcessHeap(), 0, NameBuffer);
index b74f4f1..788d7a5 100644 (file)
@@ -16,6 +16,7 @@
 extern ULONG NtMajorVersion;\r
 extern ULONG NtMinorVersion;\r
 extern ULONG NtOSCSDVersion;\r
+extern ULONG NtGlobalFlag;\r
 \r
 /* FUNCTIONS *****************************************************************/\r
 \r
@@ -220,7 +221,10 @@ MmCreatePeb(PEPROCESS Process)
     LARGE_INTEGER SectionOffset;\r
     ULONG ViewSize = 0;\r
     PVOID TableBase = NULL;\r
+    PIMAGE_NT_HEADERS NtHeaders;\r
+    PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigData;\r
     NTSTATUS Status;\r
+    KAFFINITY ProcessAffinityMask = 0;\r
     SectionOffset.QuadPart = (ULONGLONG)0;\r
 \r
     DPRINT("MmCreatePeb\n");\r
@@ -257,18 +261,88 @@ MmCreatePeb(PEPROCESS Process)
     /* Set up data */\r
     DPRINT("Setting up PEB\n");\r
     Peb->ImageBaseAddress = Process->SectionBaseAddress;\r
+    Peb->InheritedAddressSpace = 0;\r
+    Peb->Mutant = NULL;\r
+\r
+    /* NLS */\r
+    Peb->AnsiCodePageData = (char*)TableBase + NlsAnsiTableOffset;\r
+    Peb->OemCodePageData = (char*)TableBase + NlsOemTableOffset;\r
+    Peb->UnicodeCaseTableData = (char*)TableBase + NlsUnicodeTableOffset;\r
+\r
+    /* Default Version Data (could get changed below) */\r
     Peb->OSMajorVersion = NtMajorVersion;\r
     Peb->OSMinorVersion = NtMinorVersion;\r
     Peb->OSBuildNumber = 2195;\r
-    Peb->OSPlatformId = 2; //VER_PLATFORM_WIN32_NT;\r
+    Peb->OSPlatformId = 2; /* VER_PLATFORM_WIN32_NT */\r
     Peb->OSCSDVersion = NtOSCSDVersion;\r
-    Peb->AnsiCodePageData = (char*)TableBase + NlsAnsiTableOffset;\r
-    Peb->OemCodePageData = (char*)TableBase + NlsOemTableOffset;\r
-    Peb->UnicodeCaseTableData = (char*)TableBase + NlsUnicodeTableOffset;\r
+\r
+    /* Heap and Debug Data */\r
     Peb->NumberOfProcessors = KeNumberProcessors;\r
     Peb->BeingDebugged = (BOOLEAN)(Process->DebugPort != NULL ? TRUE : FALSE);\r
+    Peb->NtGlobalFlag = NtGlobalFlag;\r
+    /*Peb->HeapSegmentReserve = MmHeapSegmentReserve;\r
+    Peb->HeapSegmentCommit = MmHeapSegmentCommit;\r
+    Peb->HeapDeCommitTotalFreeThreshold = MmHeapDeCommitTotalFreeThreshold;\r
+    Peb->HeapDeCommitFreeBlockThreshold = MmHeapDeCommitFreeBlockThreshold;*/\r
+    Peb->NumberOfHeaps = 0;\r
+    Peb->MaximumNumberOfHeaps = (PAGE_SIZE - sizeof(PEB)) / sizeof(PVOID);\r
+    Peb->ProcessHeaps = (PVOID*)Peb + 1;\r
+\r
+    /* Image Data */\r
+    if ((NtHeaders = RtlImageNtHeader(Peb->ImageBaseAddress)))\r
+    {\r
+        /* Get the Image Config Data too */\r
+        ImageConfigData = RtlImageDirectoryEntryToData(Peb->ImageBaseAddress,\r
+                                                       TRUE,\r
+                                                       IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG,\r
+                                                       &ViewSize);\r
+\r
+        /* Write subsystem data */\r
+        Peb->ImageSubSystem = NtHeaders->OptionalHeader.Subsystem;\r
+        Peb->ImageSubSystemMajorVersion = NtHeaders->OptionalHeader.MajorSubsystemVersion;\r
+        Peb->ImageSubSystemMinorVersion = NtHeaders->OptionalHeader.MinorSubsystemVersion;\r
+\r
+        /* Write Version Data */\r
+        if (NtHeaders->OptionalHeader.Win32VersionValue)\r
+        {\r
+            Peb->OSMajorVersion = NtHeaders->OptionalHeader.Win32VersionValue & 0xFF;\r
+            Peb->OSMinorVersion = (NtHeaders->OptionalHeader.Win32VersionValue >> 8) & 0xFF;\r
+            Peb->OSBuildNumber = (NtHeaders->OptionalHeader.Win32VersionValue >> 16) & 0x3FFF;\r
+\r
+            /* Lie about the version if requested */\r
+            if (ImageConfigData && ImageConfigData->CSDVersion)\r
+            {\r
+                Peb->OSCSDVersion = ImageConfigData->CSDVersion;\r
+            }\r
+\r
+            /* Set the Platform ID */\r
+            Peb->OSPlatformId = (NtHeaders->OptionalHeader.Win32VersionValue >> 30) ^ 2;\r
+        }\r
 \r
+        /* Check for affinity override */\r
+        if (ImageConfigData && ImageConfigData->ProcessAffinityMask)\r
+        {\r
+            ProcessAffinityMask = ImageConfigData->ProcessAffinityMask;\r
+        }\r
+\r
+        /* Check if the image is not safe for SMP */\r
+        if (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_UP_SYSTEM_ONLY)\r
+        {\r
+            /* FIXME: Choose one randomly */\r
+            Peb->ImageProcessAffinityMask = 1;\r
+        }\r
+        else\r
+        {\r
+            /* Use affinity from Image Header */\r
+            Peb->ImageProcessAffinityMask = ProcessAffinityMask;\r
+        }\r
+    }\r
+\r
+    /* Misc data */\r
+    Peb->SessionId = Process->Session;\r
     Process->Peb = Peb;\r
+\r
+    /* Detach from the Process */\r
     KeDetachProcess();\r
 \r
     DPRINT("MmCreatePeb: Peb created at %p\n", Peb);\r
index 6409dd3..58ccc56 100644 (file)
@@ -2554,7 +2554,7 @@ typedef struct _IMAGE_OPTIONAL_HEADER32 {
        WORD MinorImageVersion;
        WORD MajorSubsystemVersion;
        WORD MinorSubsystemVersion;
-       DWORD Reserved1;
+       DWORD Win32VersionValue;
        DWORD SizeOfImage;
        DWORD SizeOfHeaders;
        DWORD CheckSum;
@@ -2900,20 +2900,26 @@ typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
        DWORD Reserved;
 } IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
 typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
-       DWORD Characteristics;
-       DWORD TimeDateStamp;
-       WORD MajorVersion;
-       WORD MinorVersion;
-       DWORD GlobalFlagsClear;
-       DWORD GlobalFlagsSet;
-       DWORD CriticalSectionDefaultTimeout;
-       DWORD DeCommitFreeBlockThreshold;
-       DWORD DeCommitTotalFreeThreshold;
-       PVOID LockPrefixTable;
-       DWORD MaximumAllocationSize;
-       DWORD VirtualMemoryThreshold;
-       DWORD ProcessHeapFlags;
-       DWORD Reserved[4];
+    DWORD Size;
+    DWORD TimeDateStamp;
+    WORD MajorVersion;
+    WORD MinorVersion;
+    DWORD GlobalFlagsClear;
+    DWORD GlobalFlagsSet;
+    DWORD CriticalSectionDefaultTimeout;
+    DWORD DeCommitFreeBlockThreshold;
+    DWORD DeCommitTotalFreeThreshold;
+    DWORD LockPrefixTable;
+    DWORD MaximumAllocationSize;
+    DWORD VirtualMemoryThreshold;
+    DWORD ProcessHeapFlags;
+    DWORD ProcessAffinityMask;
+    WORD CSDVersion;
+    WORD Reserved1;
+    DWORD EditList;
+    DWORD SecurityCookie;
+    DWORD SEHandlerTable;
+    DWORD SEHandlerCount;
 } IMAGE_LOAD_CONFIG_DIRECTORY,*PIMAGE_LOAD_CONFIG_DIRECTORY;
 typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
        DWORD BeginAddress;