Author: dgorbachev
Date: Fri Dec 26 07:50:35 2008
New Revision: 38354
URL:
http://svn.reactos.org/svn/reactos?rev=38354&view=rev
Log:
[FORMATTING] Fix indentation.
Modified:
trunk/reactos/dll/ntdll/ldr/startup.c
Modified: trunk/reactos/dll/ntdll/ldr/startup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/ldr/startup.c?re…
==============================================================================
--- trunk/reactos/dll/ntdll/ldr/startup.c [iso-8859-1] (original)
+++ trunk/reactos/dll/ntdll/ldr/startup.c [iso-8859-1] Fri Dec 26 07:50:35 2008
@@ -1,7 +1,7 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
- * FILE: lib/ntdll/ldr/startup.c
+ * FILE: dll/ntdll/ldr/startup.c
* PURPOSE: Process startup for PE executables
* PROGRAMMERS: Jean Michault
* Rex Jolliff (rex(a)lvcablemodem.com)
@@ -14,52 +14,56 @@
#include <debug.h>
#include <win32k/callback.h>
-VOID RtlInitializeHeapManager (VOID);
+VOID RtlInitializeHeapManager(VOID);
VOID LdrpInitLoader(VOID);
VOID NTAPI RtlpInitDeferedCriticalSection(VOID);
+NTSTATUS LdrpAttachThread(VOID);
+VOID RtlpInitializeVectoredExceptionHandling(VOID);
/* GLOBALS *******************************************************************/
-
+PLDR_DATA_TABLE_ENTRY ExeModule;
static RTL_CRITICAL_SECTION PebLock;
static RTL_CRITICAL_SECTION LoaderLock;
static RTL_BITMAP TlsBitMap;
static RTL_BITMAP TlsExpansionBitMap;
-PLDR_DATA_TABLE_ENTRY ExeModule;
-
-NTSTATUS LdrpAttachThread (VOID);
-
-VOID RtlpInitializeVectoredExceptionHandling(VOID);
-
#define VALUE_BUFFER_SIZE 256
-BOOLEAN FASTCALL
-ReadCompatibilitySetting(HANDLE Key, LPWSTR Value, PKEY_VALUE_PARTIAL_INFORMATION
ValueInfo, DWORD *Buffer)
+/* FUNCTIONS *****************************************************************/
+
+BOOLEAN
+FASTCALL
+ReadCompatibilitySetting(HANDLE Key,
+ LPWSTR Value,
+ PKEY_VALUE_PARTIAL_INFORMATION ValueInfo,
+ DWORD * Buffer)
{
- UNICODE_STRING ValueName;
- NTSTATUS Status;
- ULONG Length;
-
- RtlInitUnicodeString(&ValueName, Value);
- Status = NtQueryValueKey(Key,
- &ValueName,
- KeyValuePartialInformation,
- ValueInfo,
- VALUE_BUFFER_SIZE,
- &Length);
-
- if (!NT_SUCCESS(Status) || (ValueInfo->Type != REG_DWORD))
- {
- RtlFreeUnicodeString(&ValueName);
- return FALSE;
- }
- RtlCopyMemory(Buffer, &ValueInfo->Data[0], sizeof(DWORD));
- RtlFreeUnicodeString(&ValueName);
- return TRUE;
+ UNICODE_STRING ValueName;
+ NTSTATUS Status;
+ ULONG Length;
+
+ RtlInitUnicodeString(&ValueName, Value);
+ Status = NtQueryValueKey(Key,
+ &ValueName,
+ KeyValuePartialInformation,
+ ValueInfo,
+ VALUE_BUFFER_SIZE,
+ &Length);
+
+ if (!NT_SUCCESS(Status) || (ValueInfo->Type != REG_DWORD))
+ {
+ RtlFreeUnicodeString(&ValueName);
+ return FALSE;
+ }
+
+ RtlCopyMemory(Buffer, &ValueInfo->Data[0], sizeof(DWORD));
+ RtlFreeUnicodeString(&ValueName);
+ return TRUE;
}
-VOID FASTCALL
+VOID
+FASTCALL
LoadImageFileExecutionOptions(PPEB Peb)
{
NTSTATUS Status = STATUS_SUCCESS;
@@ -72,170 +76,179 @@
if (Peb->ProcessParameters &&
Peb->ProcessParameters->ImagePathName.Length > 0)
- {
+ {
DPRINT("%wZ\n", &Peb->ProcessParameters->ImagePathName);
ImagePathName = Peb->ProcessParameters->ImagePathName;
ImageName.Buffer = ImagePathName.Buffer + ImagePathName.Length / sizeof(WCHAR);
ImageName.Length = 0;
+
while (ImagePathName.Buffer < ImageName.Buffer)
{
ImageName.Buffer--;
if (*ImageName.Buffer == L'\\')
{
- ImageName.Buffer++;
- break;
+ ImageName.Buffer++;
+ break;
}
}
- ImageName.Length = ImagePathName.Length - (ImageName.Buffer -
ImagePathName.Buffer) * sizeof(WCHAR);
- ImageName.MaximumLength = ImageName.Length + ImagePathName.MaximumLength -
ImagePathName.Length;
+
+ ImageName.Length = ImagePathName.Length -
+ (ImageName.Buffer - ImagePathName.Buffer) * sizeof(WCHAR);
+ ImageName.MaximumLength = ImageName.Length +
+ ImagePathName.MaximumLength - ImagePathName.Length;
DPRINT("%wZ\n", &ImageName);
/* global flag */
- Status = LdrQueryImageFileExecutionOptions (&ImageName,
- L"GlobalFlag",
- REG_SZ,
- (PVOID)ValueBuffer,
- sizeof(ValueBuffer),
- &ValueSize);
+ Status = LdrQueryImageFileExecutionOptions(&ImageName,
+ L"GlobalFlag",
+ REG_SZ,
+ (PVOID)ValueBuffer,
+ sizeof(ValueBuffer),
+ &ValueSize);
if (NT_SUCCESS(Status))
- {
+ {
ValueString.Buffer = ValueBuffer;
- ValueString.Length = ValueSize - sizeof(WCHAR);
- ValueString.MaximumLength = sizeof(ValueBuffer);
- Status = RtlUnicodeStringToInteger(&ValueString, 16, &Value);
+ ValueString.Length = ValueSize - sizeof(WCHAR);
+ ValueString.MaximumLength = sizeof(ValueBuffer);
+ Status = RtlUnicodeStringToInteger(&ValueString, 16, &Value);
if (NT_SUCCESS(Status))
- {
+ {
Peb->NtGlobalFlag |= Value;
- DPRINT("GlobalFlag: Key='%S', Value=0x%lx\n", ValueBuffer,
Value);
- }
- }
+ DPRINT("GlobalFlag: Key='%S', Value=0x%lx\n",
ValueBuffer, Value);
+ }
+ }
/*
- * FIXME:
- * read more options
+ * FIXME:
+ * read more options
*/
- }
+ }
}
-
-
-
-BOOLEAN FASTCALL
+BOOLEAN
+FASTCALL
LoadCompatibilitySettings(PPEB Peb)
{
- NTSTATUS Status;
- HANDLE UserKey = NULL;
- HANDLE KeyHandle;
- HANDLE SubKeyHandle;
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING KeyName = RTL_CONSTANT_STRING(
- L"Software\\Microsoft\\Windows
NT\\CurrentVersion\\AppCompatFlags\\Layers");
- UNICODE_STRING ValueName;
- UCHAR ValueBuffer[VALUE_BUFFER_SIZE];
- PKEY_VALUE_PARTIAL_INFORMATION ValueInfo;
- ULONG Length;
- DWORD MajorVersion, MinorVersion, BuildNumber, PlatformId,
- SPMajorVersion, SPMinorVersion= 0;
-
- if(Peb->ProcessParameters &&
- (Peb->ProcessParameters->ImagePathName.Length > 0))
- {
- Status = RtlOpenCurrentUser(KEY_READ,
- &UserKey);
- if (!NT_SUCCESS(Status))
- {
- return FALSE;
- }
-
- InitializeObjectAttributes(&ObjectAttributes,
- &KeyName,
- OBJ_CASE_INSENSITIVE,
- UserKey,
- NULL);
-
- Status = NtOpenKey(&KeyHandle,
- KEY_QUERY_VALUE,
- &ObjectAttributes);
-
- if (!NT_SUCCESS(Status))
- {
- if (UserKey) NtClose(UserKey);
- return FALSE;
- }
-
- /* query version name for application */
- ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer;
- Status = NtQueryValueKey(KeyHandle,
- &Peb->ProcessParameters->ImagePathName,
- KeyValuePartialInformation,
- ValueBuffer,
- VALUE_BUFFER_SIZE,
- &Length);
-
- if (!NT_SUCCESS(Status) || (ValueInfo->Type != REG_SZ))
- {
- NtClose(KeyHandle);
- if (UserKey) NtClose(UserKey);
- return FALSE;
- }
-
- ValueName.Length = ValueInfo->DataLength;
- ValueName.MaximumLength = ValueInfo->DataLength;
- ValueName.Buffer = (PWSTR)ValueInfo->Data;
-
- /* load version info */
- InitializeObjectAttributes(&ObjectAttributes,
- &ValueName,
- OBJ_CASE_INSENSITIVE,
- KeyHandle,
- NULL);
-
- Status = NtOpenKey(&SubKeyHandle,
- KEY_QUERY_VALUE,
- &ObjectAttributes);
-
- if (!NT_SUCCESS(Status))
- {
- NtClose(KeyHandle);
- if (UserKey) NtClose(UserKey);
- return FALSE;
- }
-
- DPRINT("Loading version information for: %wZ\n", &ValueName);
-
- /* read settings from registry */
- if(!ReadCompatibilitySetting(SubKeyHandle, L"MajorVersion", ValueInfo,
&MajorVersion))
- goto finish;
- if(!ReadCompatibilitySetting(SubKeyHandle, L"MinorVersion", ValueInfo,
&MinorVersion))
- goto finish;
- if(!ReadCompatibilitySetting(SubKeyHandle, L"BuildNumber", ValueInfo,
&BuildNumber))
- goto finish;
- if(!ReadCompatibilitySetting(SubKeyHandle, L"PlatformId", ValueInfo,
&PlatformId))
- goto finish;
-
- /* now assign the settings */
- Peb->OSMajorVersion = (ULONG)MajorVersion;
- Peb->OSMinorVersion = (ULONG)MinorVersion;
- Peb->OSBuildNumber = (USHORT)BuildNumber;
- Peb->OSPlatformId = (ULONG)PlatformId;
-
- /* optional service pack version numbers */
- if(ReadCompatibilitySetting(SubKeyHandle, L"SPMajorVersion", ValueInfo,
&SPMajorVersion) &&
- ReadCompatibilitySetting(SubKeyHandle, L"SPMinorVersion", ValueInfo,
&SPMinorVersion))
- Peb->OSCSDVersion = ((SPMajorVersion & 0xFF) << 8) | (SPMinorVersion
& 0xFF);
+ NTSTATUS Status;
+ HANDLE UserKey = NULL;
+ HANDLE KeyHandle;
+ HANDLE SubKeyHandle;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING KeyName = RTL_CONSTANT_STRING(
+ L"Software\\Microsoft\\Windows
NT\\CurrentVersion\\AppCompatFlags\\Layers");
+ UNICODE_STRING ValueName;
+ UCHAR ValueBuffer[VALUE_BUFFER_SIZE];
+ PKEY_VALUE_PARTIAL_INFORMATION ValueInfo;
+ ULONG Length;
+ DWORD MajorVersion, MinorVersion, BuildNumber, PlatformId,
+ SPMajorVersion, SPMinorVersion = 0;
+
+ if (Peb->ProcessParameters &&
+ (Peb->ProcessParameters->ImagePathName.Length > 0))
+ {
+ Status = RtlOpenCurrentUser(KEY_READ, &UserKey);
+ if (!NT_SUCCESS(Status))
+ {
+ return FALSE;
+ }
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ UserKey,
+ NULL);
+
+ Status = NtOpenKey(&KeyHandle, KEY_QUERY_VALUE, &ObjectAttributes);
+
+ if (!NT_SUCCESS(Status))
+ {
+ if (UserKey)
+ NtClose(UserKey);
+ return FALSE;
+ }
+
+ /* query version name for application */
+ ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION) ValueBuffer;
+ Status = NtQueryValueKey(KeyHandle,
+ &Peb->ProcessParameters->ImagePathName,
+ KeyValuePartialInformation,
+ ValueBuffer,
+ VALUE_BUFFER_SIZE,
+ &Length);
+
+ if (!NT_SUCCESS(Status) || (ValueInfo->Type != REG_SZ))
+ {
+ NtClose(KeyHandle);
+ if (UserKey)
+ NtClose(UserKey);
+ return FALSE;
+ }
+
+ ValueName.Length = ValueInfo->DataLength;
+ ValueName.MaximumLength = ValueInfo->DataLength;
+ ValueName.Buffer = (PWSTR) ValueInfo->Data;
+
+ /* load version info */
+ InitializeObjectAttributes(&ObjectAttributes,
+ &ValueName,
+ OBJ_CASE_INSENSITIVE,
+ KeyHandle,
+ NULL);
+
+ Status = NtOpenKey(&SubKeyHandle, KEY_QUERY_VALUE, &ObjectAttributes);
+
+ if (!NT_SUCCESS(Status))
+ {
+ NtClose(KeyHandle);
+ if (UserKey)
+ NtClose(UserKey);
+ return FALSE;
+ }
+
+ DPRINT("Loading version information for: %wZ\n", &ValueName);
+
+ /* read settings from registry */
+ if (!ReadCompatibilitySetting(SubKeyHandle, L"MajorVersion", ValueInfo,
&MajorVersion))
+ goto finish;
+ if (!ReadCompatibilitySetting(SubKeyHandle, L"MinorVersion", ValueInfo,
&MinorVersion))
+ goto finish;
+ if (!ReadCompatibilitySetting(SubKeyHandle, L"BuildNumber", ValueInfo,
&BuildNumber))
+ goto finish;
+ if (!ReadCompatibilitySetting(SubKeyHandle, L"PlatformId", ValueInfo,
&PlatformId))
+ goto finish;
+
+ /* now assign the settings */
+ Peb->OSMajorVersion = (ULONG) MajorVersion;
+ Peb->OSMinorVersion = (ULONG) MinorVersion;
+ Peb->OSBuildNumber = (USHORT) BuildNumber;
+ Peb->OSPlatformId = (ULONG) PlatformId;
+
+ /* optional service pack version numbers */
+ if (ReadCompatibilitySetting(SubKeyHandle,
+ L"SPMajorVersion",
+ ValueInfo,
+ &SPMajorVersion) &&
+ ReadCompatibilitySetting(SubKeyHandle,
+ L"SPMinorVersion",
+ ValueInfo,
+ &SPMinorVersion))
+ {
+ Peb->OSCSDVersion = ((SPMajorVersion & 0xFF) << 8) |
+ (SPMinorVersion & 0xFF);
+ }
finish:
- /* we're finished */
- NtClose(SubKeyHandle);
- NtClose(KeyHandle);
- if (UserKey) NtClose(UserKey);
- return TRUE;
- }
- return FALSE;
+ /* we're finished */
+ NtClose(SubKeyHandle);
+ NtClose(KeyHandle);
+ if (UserKey)
+ NtClose(UserKey);
+ return TRUE;
+ }
+
+ return FALSE;
}
-
-/* FUNCTIONS *****************************************************************/
VOID
NTAPI
@@ -243,259 +256,256 @@
PVOID SystemArgument1,
PVOID SystemArgument2)
{
- PIMAGE_NT_HEADERS NTHeaders;
- PEPFUNC EntryPoint;
- PIMAGE_DOS_HEADER PEDosHeader;
- PVOID ImageBase;
- PPEB Peb = NtCurrentPeb();
- PLDR_DATA_TABLE_ENTRY NtModule; // ntdll
- NLSTABLEINFO NlsTable;
- WCHAR FullNtDllPath[MAX_PATH];
- SYSTEM_BASIC_INFORMATION SystemInformation;
- NTSTATUS Status;
- PVOID BaseAddress = SystemArgument1;
-
- DPRINT("LdrpInit()\n");
- DPRINT("Peb %p\n", Peb);
- ImageBase = Peb->ImageBaseAddress;
- DPRINT("ImageBase %p\n", ImageBase);
-
- if (NtCurrentPeb()->Ldr == NULL)
- {
- if (ImageBase <= (PVOID)0x1000)
- {
- DPRINT("ImageBase is null\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_INVALID_IMAGE_FORMAT);
- }
-
- /* If MZ header exists */
- PEDosHeader = (PIMAGE_DOS_HEADER) ImageBase;
- DPRINT("PEDosHeader %p\n", PEDosHeader);
-
- if (PEDosHeader->e_magic != IMAGE_DOS_SIGNATURE ||
- PEDosHeader->e_lfanew == 0L ||
- *(PULONG)((PUCHAR)ImageBase + PEDosHeader->e_lfanew) !=
IMAGE_NT_SIGNATURE)
- {
- DPRINT1("Image has bad header\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_INVALID_IMAGE_FORMAT);
- }
-
- /* normalize process parameters */
- RtlNormalizeProcessParams (Peb->ProcessParameters);
-
- /* Initialize NLS data */
- RtlInitNlsTables (Peb->AnsiCodePageData,
- Peb->OemCodePageData,
- Peb->UnicodeCaseTableData,
- &NlsTable);
- RtlResetRtlTranslations (&NlsTable);
-
- NTHeaders = (PIMAGE_NT_HEADERS)((ULONG_PTR)ImageBase + PEDosHeader->e_lfanew);
-
- /* Get number of processors */
- DPRINT("Here\n");
- Status = ZwQuerySystemInformation(SystemBasicInformation,
- &SystemInformation,
- sizeof(SYSTEM_BASIC_INFORMATION),
- NULL);
- DPRINT("Here2\n");
- if (!NT_SUCCESS(Status))
- {
- ZwTerminateProcess(NtCurrentProcess(), Status);
- }
-
- Peb->NumberOfProcessors = SystemInformation.NumberOfProcessors;
-
- /* Initialize Critical Section Data */
- RtlpInitDeferedCriticalSection();
-
- /* create process heap */
- RtlInitializeHeapManager();
- Peb->ProcessHeap = RtlCreateHeap(HEAP_GROWABLE,
- NULL,
- NTHeaders->OptionalHeader.SizeOfHeapReserve,
- NTHeaders->OptionalHeader.SizeOfHeapCommit,
- NULL,
- NULL);
- if (Peb->ProcessHeap == 0)
- {
- DPRINT1("Failed to create process heap\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_INSUFFICIENT_RESOURCES);
- }
-
- /* initialized vectored exception handling */
- RtlpInitializeVectoredExceptionHandling();
-
- /* initalize peb lock support */
- RtlInitializeCriticalSection (&PebLock);
- Peb->FastPebLock = &PebLock;
- Peb->FastPebLockRoutine = (PPEBLOCKROUTINE)RtlEnterCriticalSection;
- Peb->FastPebUnlockRoutine = (PPEBLOCKROUTINE)RtlLeaveCriticalSection;
-
- /* initialize tls bitmaps */
- RtlInitializeBitMap (&TlsBitMap,
- Peb->TlsBitmapBits,
- TLS_MINIMUM_AVAILABLE);
- RtlInitializeBitMap (&TlsExpansionBitMap,
- Peb->TlsExpansionBitmapBits,
- TLS_EXPANSION_SLOTS);
-
- Peb->TlsBitmap = &TlsBitMap;
- Peb->TlsExpansionBitmap = &TlsExpansionBitMap;
- Peb->TlsExpansionCounter = TLS_MINIMUM_AVAILABLE;
-
- /* Initialize table of callbacks for the kernel. */
- Peb->KernelCallbackTable =
- RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- sizeof(PVOID) * (USER32_CALLBACK_MAXIMUM + 1));
- if (Peb->KernelCallbackTable == NULL)
- {
- DPRINT1("Failed to create callback table\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_INSUFFICIENT_RESOURCES);
- }
-
- /* initalize loader lock */
- RtlInitializeCriticalSection (&LoaderLock);
- Peb->LoaderLock = &LoaderLock;
-
- /* create loader information */
- Peb->Ldr = (PPEB_LDR_DATA)RtlAllocateHeap (Peb->ProcessHeap,
- 0,
- sizeof(PEB_LDR_DATA));
- if (Peb->Ldr == NULL)
- {
- DPRINT1("Failed to create loader data\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_INSUFFICIENT_RESOURCES);
- }
- Peb->Ldr->Length = sizeof(PEB_LDR_DATA);
- Peb->Ldr->Initialized = FALSE;
- Peb->Ldr->SsHandle = NULL;
- InitializeListHead(&Peb->Ldr->InLoadOrderModuleList);
- InitializeListHead(&Peb->Ldr->InMemoryOrderModuleList);
- InitializeListHead(&Peb->Ldr->InInitializationOrderModuleList);
-
- /* Load compatibility settings */
- LoadCompatibilitySettings(Peb);
-
- /* Load execution options */
- LoadImageFileExecutionOptions(Peb);
-
- /* build full ntdll path */
- wcscpy (FullNtDllPath, SharedUserData->NtSystemRoot);
- wcscat (FullNtDllPath, L"\\system32\\ntdll.dll");
-
- /* add entry for ntdll */
- NtModule = (PLDR_DATA_TABLE_ENTRY)RtlAllocateHeap (Peb->ProcessHeap,
- 0,
- sizeof(LDR_DATA_TABLE_ENTRY));
- if (NtModule == NULL)
- {
- DPRINT1("Failed to create loader module entry (NTDLL)\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_INSUFFICIENT_RESOURCES);
- }
- memset(NtModule, 0, sizeof(LDR_DATA_TABLE_ENTRY));
-
- NtModule->DllBase = BaseAddress;
- NtModule->EntryPoint = 0; /* no entry point */
- RtlCreateUnicodeString (&NtModule->FullDllName,
- FullNtDllPath);
- RtlCreateUnicodeString (&NtModule->BaseDllName,
- L"ntdll.dll");
- NtModule->Flags = LDRP_IMAGE_DLL|LDRP_ENTRY_PROCESSED;
-
- NtModule->LoadCount = -1; /* don't unload */
- NtModule->TlsIndex = -1;
- NtModule->SectionPointer = NULL;
- NtModule->CheckSum = 0;
-
- NTHeaders = RtlImageNtHeader (NtModule->DllBase);
- NtModule->SizeOfImage = LdrpGetResidentSize(NTHeaders);
- NtModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
-
- InsertTailList(&Peb->Ldr->InLoadOrderModuleList,
- &NtModule->InLoadOrderLinks);
- InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
- &NtModule->InInitializationOrderModuleList);
+ PIMAGE_NT_HEADERS NTHeaders;
+ PEPFUNC EntryPoint;
+ PIMAGE_DOS_HEADER PEDosHeader;
+ PVOID ImageBase;
+ PPEB Peb = NtCurrentPeb();
+ PLDR_DATA_TABLE_ENTRY NtModule; // ntdll
+ NLSTABLEINFO NlsTable;
+ WCHAR FullNtDllPath[MAX_PATH];
+ SYSTEM_BASIC_INFORMATION SystemInformation;
+ NTSTATUS Status;
+ PVOID BaseAddress = SystemArgument1;
+
+ DPRINT("LdrpInit()\n");
+ DPRINT("Peb %p\n", Peb);
+ ImageBase = Peb->ImageBaseAddress;
+ DPRINT("ImageBase %p\n", ImageBase);
+
+ if (NtCurrentPeb()->Ldr == NULL)
+ {
+ if (ImageBase <= (PVOID) 0x1000)
+ {
+ DPRINT("ImageBase is null\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_INVALID_IMAGE_FORMAT);
+ }
+
+ /* If MZ header exists */
+ PEDosHeader = (PIMAGE_DOS_HEADER) ImageBase;
+ DPRINT("PEDosHeader %p\n", PEDosHeader);
+
+ if (PEDosHeader->e_magic != IMAGE_DOS_SIGNATURE ||
+ PEDosHeader->e_lfanew == 0L ||
+ *(PULONG)((PUCHAR)ImageBase + PEDosHeader->e_lfanew) != IMAGE_NT_SIGNATURE)
+ {
+ DPRINT1("Image has bad header\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_INVALID_IMAGE_FORMAT);
+ }
+
+ /* normalize process parameters */
+ RtlNormalizeProcessParams(Peb->ProcessParameters);
+
+ /* Initialize NLS data */
+ RtlInitNlsTables(Peb->AnsiCodePageData,
+ Peb->OemCodePageData,
+ Peb->UnicodeCaseTableData,
+ &NlsTable);
+ RtlResetRtlTranslations(&NlsTable);
+
+ NTHeaders = (PIMAGE_NT_HEADERS)((ULONG_PTR)ImageBase + PEDosHeader->e_lfanew);
+
+ /* Get number of processors */
+ DPRINT("Here\n");
+ Status = ZwQuerySystemInformation(SystemBasicInformation,
+ &SystemInformation,
+ sizeof(SYSTEM_BASIC_INFORMATION),
+ NULL);
+ DPRINT("Here2\n");
+ if (!NT_SUCCESS(Status))
+ {
+ ZwTerminateProcess(NtCurrentProcess(), Status);
+ }
+
+ Peb->NumberOfProcessors = SystemInformation.NumberOfProcessors;
+
+ /* Initialize Critical Section Data */
+ RtlpInitDeferedCriticalSection();
+
+ /* create process heap */
+ RtlInitializeHeapManager();
+ Peb->ProcessHeap = RtlCreateHeap(HEAP_GROWABLE,
+ NULL,
+ NTHeaders->OptionalHeader.SizeOfHeapReserve,
+ NTHeaders->OptionalHeader.SizeOfHeapCommit,
+ NULL,
+ NULL);
+ if (Peb->ProcessHeap == 0)
+ {
+ DPRINT1("Failed to create process heap\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ /* initialized vectored exception handling */
+ RtlpInitializeVectoredExceptionHandling();
+
+ /* initalize peb lock support */
+ RtlInitializeCriticalSection(&PebLock);
+ Peb->FastPebLock = &PebLock;
+ Peb->FastPebLockRoutine = (PPEBLOCKROUTINE)RtlEnterCriticalSection;
+ Peb->FastPebUnlockRoutine = (PPEBLOCKROUTINE)RtlLeaveCriticalSection;
+
+ /* initialize tls bitmaps */
+ RtlInitializeBitMap(&TlsBitMap, Peb->TlsBitmapBits, TLS_MINIMUM_AVAILABLE);
+ RtlInitializeBitMap(&TlsExpansionBitMap, Peb->TlsExpansionBitmapBits,
TLS_EXPANSION_SLOTS);
+
+ Peb->TlsBitmap = &TlsBitMap;
+ Peb->TlsExpansionBitmap = &TlsExpansionBitMap;
+ Peb->TlsExpansionCounter = TLS_MINIMUM_AVAILABLE;
+
+ /* Initialize table of callbacks for the kernel. */
+ Peb->KernelCallbackTable = RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ sizeof(PVOID) *
+ (USER32_CALLBACK_MAXIMUM + 1));
+ if (Peb->KernelCallbackTable == NULL)
+ {
+ DPRINT1("Failed to create callback table\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ /* initalize loader lock */
+ RtlInitializeCriticalSection(&LoaderLock);
+ Peb->LoaderLock = &LoaderLock;
+
+ /* create loader information */
+ Peb->Ldr = (PPEB_LDR_DATA) RtlAllocateHeap(Peb->ProcessHeap,
+ 0,
+ sizeof(PEB_LDR_DATA));
+ if (Peb->Ldr == NULL)
+ {
+ DPRINT1("Failed to create loader data\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ Peb->Ldr->Length = sizeof(PEB_LDR_DATA);
+ Peb->Ldr->Initialized = FALSE;
+ Peb->Ldr->SsHandle = NULL;
+ InitializeListHead(&Peb->Ldr->InLoadOrderModuleList);
+ InitializeListHead(&Peb->Ldr->InMemoryOrderModuleList);
+ InitializeListHead(&Peb->Ldr->InInitializationOrderModuleList);
+
+ /* Load compatibility settings */
+ LoadCompatibilitySettings(Peb);
+
+ /* Load execution options */
+ LoadImageFileExecutionOptions(Peb);
+
+ /* build full ntdll path */
+ wcscpy(FullNtDllPath, SharedUserData->NtSystemRoot);
+ wcscat(FullNtDllPath, L"\\system32\\ntdll.dll");
+
+ /* add entry for ntdll */
+ NtModule = (PLDR_DATA_TABLE_ENTRY)
+ RtlAllocateHeap(Peb->ProcessHeap,
+ 0,
+ sizeof(LDR_DATA_TABLE_ENTRY));
+ if (NtModule == NULL)
+ {
+ DPRINT1("Failed to create loader module entry (NTDLL)\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_INSUFFICIENT_RESOURCES);
+ }
+ memset(NtModule, 0, sizeof(LDR_DATA_TABLE_ENTRY));
+
+ NtModule->DllBase = BaseAddress;
+ NtModule->EntryPoint = 0; /* no entry point */
+ RtlCreateUnicodeString(&NtModule->FullDllName, FullNtDllPath);
+ RtlCreateUnicodeString(&NtModule->BaseDllName, L"ntdll.dll");
+ NtModule->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED;
+
+ NtModule->LoadCount = -1; /* don't unload */
+ NtModule->TlsIndex = -1;
+ NtModule->SectionPointer = NULL;
+ NtModule->CheckSum = 0;
+
+ NTHeaders = RtlImageNtHeader(NtModule->DllBase);
+ NtModule->SizeOfImage = LdrpGetResidentSize(NTHeaders);
+ NtModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
+
+ InsertTailList(&Peb->Ldr->InLoadOrderModuleList,
+ &NtModule->InLoadOrderLinks);
+ InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
+ &NtModule->InInitializationOrderModuleList);
#if defined(DBG) || defined(KDBG)
- LdrpLoadUserModuleSymbols(NtModule);
+ LdrpLoadUserModuleSymbols(NtModule);
#endif /* DBG || KDBG */
- }
-
- if (NtCurrentPeb()->Ldr->Initialized == FALSE)
- {
- /* add entry for executable (becomes first list entry) */
- ExeModule = (PLDR_DATA_TABLE_ENTRY)RtlAllocateHeap (Peb->ProcessHeap,
- 0,
- sizeof(LDR_DATA_TABLE_ENTRY));
- if (ExeModule == NULL)
- {
- DPRINT1("Failed to create loader module infomation\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_INSUFFICIENT_RESOURCES);
- }
- ExeModule->DllBase = Peb->ImageBaseAddress;
-
- if ((Peb->ProcessParameters == NULL) ||
- (Peb->ProcessParameters->ImagePathName.Length == 0))
- {
- DPRINT1("Failed to access the process parameter block\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
- }
-
- RtlCreateUnicodeString(&ExeModule->FullDllName,
- Peb->ProcessParameters->ImagePathName.Buffer);
- RtlCreateUnicodeString(&ExeModule->BaseDllName,
- wcsrchr(ExeModule->FullDllName.Buffer, L'\\') +
1);
-
- DPRINT("BaseDllName '%wZ' FullDllName '%wZ'\n",
- &ExeModule->BaseDllName,
- &ExeModule->FullDllName);
-
- ExeModule->Flags = LDRP_ENTRY_PROCESSED;
- ExeModule->LoadCount = -1; /* don't unload */
- ExeModule->TlsIndex = -1;
- ExeModule->SectionPointer = NULL;
- ExeModule->CheckSum = 0;
-
- NTHeaders = RtlImageNtHeader (ExeModule->DllBase);
- ExeModule->SizeOfImage = LdrpGetResidentSize(NTHeaders);
- ExeModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
-
- InsertHeadList(&Peb->Ldr->InLoadOrderModuleList,
- &ExeModule->InLoadOrderLinks);
-
- LdrpInitLoader();
+ }
+
+ if (NtCurrentPeb()->Ldr->Initialized == FALSE)
+ {
+ /* add entry for executable (becomes first list entry) */
+ ExeModule = (PLDR_DATA_TABLE_ENTRY)
+ RtlAllocateHeap(Peb->ProcessHeap,
+ 0,
+ sizeof(LDR_DATA_TABLE_ENTRY));
+ if (ExeModule == NULL)
+ {
+ DPRINT1("Failed to create loader module infomation\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ ExeModule->DllBase = Peb->ImageBaseAddress;
+
+ if ((Peb->ProcessParameters == NULL) ||
+ (Peb->ProcessParameters->ImagePathName.Length == 0))
+ {
+ DPRINT1("Failed to access the process parameter block\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
+ }
+
+ RtlCreateUnicodeString(&ExeModule->FullDllName,
+ Peb->ProcessParameters->ImagePathName.Buffer);
+ RtlCreateUnicodeString(&ExeModule->BaseDllName,
+ wcsrchr(ExeModule->FullDllName.Buffer, L'\\') +
1);
+
+ DPRINT("BaseDllName '%wZ' FullDllName '%wZ'\n",
&ExeModule->BaseDllName, &ExeModule->FullDllName);
+
+ ExeModule->Flags = LDRP_ENTRY_PROCESSED;
+ ExeModule->LoadCount = -1; /* don't unload */
+ ExeModule->TlsIndex = -1;
+ ExeModule->SectionPointer = NULL;
+ ExeModule->CheckSum = 0;
+
+ NTHeaders = RtlImageNtHeader(ExeModule->DllBase);
+ ExeModule->SizeOfImage = LdrpGetResidentSize(NTHeaders);
+ ExeModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
+
+ InsertHeadList(&Peb->Ldr->InLoadOrderModuleList,
+ &ExeModule->InLoadOrderLinks);
+
+ LdrpInitLoader();
#if defined(DBG) || defined(KDBG)
- LdrpLoadUserModuleSymbols(ExeModule);
+ LdrpLoadUserModuleSymbols(ExeModule);
#endif /* DBG || KDBG */
- EntryPoint = LdrPEStartup((PVOID)ImageBase, NULL, NULL, NULL);
- ExeModule->EntryPoint = EntryPoint;
-
- /* all required dlls are loaded now */
- Peb->Ldr->Initialized = TRUE;
-
- /* Check before returning that we can run the image safely. */
- if (EntryPoint == NULL)
- {
- DPRINT1("Failed to initialize image\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_INVALID_IMAGE_FORMAT);
- }
-
- /* Break into debugger */
- if (Peb->BeingDebugged) DbgBreakPoint();
- }
-
- /* attach the thread */
- RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock);
- LdrpAttachThread();
- RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
+ EntryPoint = LdrPEStartup((PVOID)ImageBase, NULL, NULL, NULL);
+ ExeModule->EntryPoint = EntryPoint;
+
+ /* all required dlls are loaded now */
+ Peb->Ldr->Initialized = TRUE;
+
+ /* Check before returning that we can run the image safely. */
+ if (EntryPoint == NULL)
+ {
+ DPRINT1("Failed to initialize image\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_INVALID_IMAGE_FORMAT);
+ }
+
+ /* Break into debugger */
+ if (Peb->BeingDebugged)
+ DbgBreakPoint();
+ }
+
+ /* attach the thread */
+ RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock);
+ LdrpAttachThread();
+ RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
}
/* EOF */