extern ULONG NtMajorVersion;\r
extern ULONG NtMinorVersion;\r
extern ULONG NtOSCSDVersion;\r
+extern ULONG NtGlobalFlag;\r
\r
/* FUNCTIONS *****************************************************************/\r
\r
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
/* 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
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
- DWORD Reserved1;
+ DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
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;