-/* $Id: startup.c,v 1.56 2003/11/17 02:32:45 hyperion Exp $
+/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
/* INCLUDES *****************************************************************/
-#include <reactos/config.h>
-#include <ddk/ntddk.h>
-#include <windows.h>
-#include <ntdll/ldr.h>
-#include <ntdll/rtl.h>
-#include <csrss/csrss.h>
-#include <ntdll/csr.h>
-#include <user32/callback.h>
-#include <rosrtl/string.h>
-
+#include <ntdll.h>
#define NDEBUG
-#include <ntdll/ntdll.h>
-
+#include <debug.h>
+#include <win32k/callback.h>
VOID RtlInitializeHeapManager (VOID);
VOID LdrpInitLoader(VOID);
-
+VOID NTAPI RtlpInitDeferedCriticalSection(VOID);
/* GLOBALS *******************************************************************/
extern unsigned int _image_base__;
-static CRITICAL_SECTION PebLock;
-static CRITICAL_SECTION LoaderLock;
+static RTL_CRITICAL_SECTION PebLock;
+static RTL_CRITICAL_SECTION LoaderLock;
static RTL_BITMAP TlsBitMap;
+PLDR_DATA_TABLE_ENTRY ExeModule;
+
+NTSTATUS LdrpAttachThread (VOID);
+
+VOID RtlpInitializeVectoredExceptionHandling(VOID);
-ULONG NtGlobalFlag = 0;
#define VALUE_BUFFER_SIZE 256
-BOOL FASTCALL
+BOOLEAN FASTCALL
ReadCompatibilitySetting(HANDLE Key, LPWSTR Value, PKEY_VALUE_PARTIAL_INFORMATION ValueInfo, DWORD *Buffer)
{
UNICODE_STRING ValueName;
return TRUE;
}
-BOOL FASTCALL
+VOID FASTCALL
+LoadImageFileExecutionOptions(PPEB Peb)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ ULONG Value = 0;
+ UNICODE_STRING ValueString;
+ UNICODE_STRING ImageName;
+ UNICODE_STRING ImagePathName;
+ WCHAR ValueBuffer[64];
+ ULONG ValueSize;
+
+ 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.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);
+ if (NT_SUCCESS(Status))
+ {
+ ValueString.Buffer = ValueBuffer;
+ 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=%08x\n", ValueBuffer, Value);
+ }
+ }
+ /*
+ * FIXME:
+ * read more options
+ */
+ }
+}
+
+
+
+
+BOOLEAN FASTCALL
LoadCompatibilitySettings(PPEB Peb)
{
NTSTATUS Status;
HANDLE KeyHandle;
HANDLE SubKeyHandle;
OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING KeyName;
+ 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;
return FALSE;
}
- RtlRosInitUnicodeStringFromLiteral(&KeyName,
- L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers");
-
InitializeObjectAttributes(&ObjectAttributes,
&KeyName,
OBJ_CASE_INSENSITIVE,
Peb->OSPlatformId = (ULONG)PlatformId;
/* optional service pack version numbers */
- if(ReadCompatibilitySetting(SubKeyHandle, L"SPMajorVersion", ValueInfo, &SPMajorVersion))
- Peb->SPMajorVersion = (UCHAR)SPMajorVersion;
- if(ReadCompatibilitySetting(SubKeyHandle, L"SPMinorVersion", ValueInfo, &SPMinorVersion))
- Peb->SPMinorVersion = (UCHAR)SPMinorVersion;
+ if(ReadCompatibilitySetting(SubKeyHandle, L"SPMajorVersion", ValueInfo, &SPMajorVersion) &&
+ ReadCompatibilitySetting(SubKeyHandle, L"SPMinorVersion", ValueInfo, &SPMinorVersion))
+ Peb->OSCSDVersion = ((SPMajorVersion & 0xFF) << 8) | (SPMinorVersion & 0xFF);
finish:
/* we're finished */
return FALSE;
}
-
/* FUNCTIONS *****************************************************************/
-VOID STDCALL
-__true_LdrInitializeThunk (ULONG Unknown1,
- ULONG Unknown2,
- ULONG Unknown3,
- ULONG Unknown4)
+VOID
+NTAPI
+LdrpInit(PCONTEXT Context,
+ PVOID SystemArgument1,
+ PVOID SystemArgument2)
{
PIMAGE_NT_HEADERS NTHeaders;
PEPFUNC EntryPoint;
PIMAGE_DOS_HEADER PEDosHeader;
PVOID ImageBase;
PPEB Peb;
- PLDR_MODULE NtModule; // ntdll
- PLDR_MODULE ExeModule; // executable
+ PLDR_DATA_TABLE_ENTRY NtModule; // ntdll
NLSTABLEINFO NlsTable;
WCHAR FullNtDllPath[MAX_PATH];
+ SYSTEM_BASIC_INFORMATION SystemInformation;
+ NTSTATUS Status;
- DPRINT("LdrInitializeThunk()\n");
- if (NtCurrentPeb()->Ldr != NULL && NtCurrentPeb()->Ldr->Initialized == TRUE)
+ DPRINT("LdrpInit()\n");
+ if (NtCurrentPeb()->Ldr == NULL || NtCurrentPeb()->Ldr->Initialized == FALSE)
{
- PLIST_ENTRY current_entry;
- PDLLMAIN_FUNC Entrypoint;
- PLDR_MODULE current;
-
- RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock);
- current_entry =
- NtCurrentPeb()->Ldr->InInitializationOrderModuleList.Flink;
- while (current_entry !=
- &NtCurrentPeb()->Ldr->InInitializationOrderModuleList)
+ Peb = NtCurrentPeb();
+ DPRINT("Peb %x\n", Peb);
+ ImageBase = Peb->ImageBaseAddress;
+ DPRINT("ImageBase %x\n", ImageBase);
+ if (ImageBase <= (PVOID)0x1000)
{
- current = CONTAINING_RECORD(current_entry, LDR_MODULE,
- InInitializationOrderModuleList);
- Entrypoint = (PDLLMAIN_FUNC)current->EntryPoint;
- if (Entrypoint != NULL &&
- current->BaseAddress != NtCurrentPeb()->ImageBaseAddress)
- {
- (VOID)Entrypoint(current->BaseAddress, DLL_THREAD_ATTACH, NULL);
- }
- current_entry = current_entry->Flink;
+ DPRINT("ImageBase is null\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
}
- RtlLeaveCriticalSection (NtCurrentPeb()->LoaderLock);
- return;
- }
-
- Peb = (PPEB)(PEB_BASE);
- DPRINT("Peb %x\n", Peb);
- ImageBase = Peb->ImageBaseAddress;
- DPRINT("ImageBase %x\n", ImageBase);
- if (ImageBase <= (PVOID)0x1000)
- {
- DPRINT("ImageBase is null\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
- }
- NtGlobalFlag = Peb->NtGlobalFlag;
+ /* If MZ header exists */
+ PEDosHeader = (PIMAGE_DOS_HEADER) ImageBase;
+ DPRINT("PEDosHeader %x\n", PEDosHeader);
- /* If MZ header exists */
- PEDosHeader = (PIMAGE_DOS_HEADER) ImageBase;
- DPRINT("PEDosHeader %x\n", PEDosHeader);
- if (PEDosHeader->e_magic != IMAGE_DOS_MAGIC ||
- PEDosHeader->e_lfanew == 0L ||
- *(PULONG)((PUCHAR)ImageBase + PEDosHeader->e_lfanew) != IMAGE_PE_MAGIC)
- {
- DbgPrint("Image has bad header\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
- }
+ 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_UNSUCCESSFUL);
+ }
- /* normalize process parameters */
- RtlNormalizeProcessParams (Peb->ProcessParameters);
-
- /* Initialize NLS data */
- RtlInitNlsTables (Peb->AnsiCodePageData,
- Peb->OemCodePageData,
- Peb->UnicodeCaseTableData,
- &NlsTable);
- RtlResetRtlTranslations (&NlsTable);
-
- NTHeaders = (PIMAGE_NT_HEADERS)(ImageBase + PEDosHeader->e_lfanew);
-
- /* create process heap */
- RtlInitializeHeapManager();
- Peb->ProcessHeap = RtlCreateHeap(HEAP_GROWABLE,
- (PVOID)HEAP_BASE,
- NTHeaders->OptionalHeader.SizeOfHeapReserve,
- NTHeaders->OptionalHeader.SizeOfHeapCommit,
- NULL,
- NULL);
- if (Peb->ProcessHeap == 0)
- {
- DbgPrint("Failed to create process heap\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
- }
+ /* 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_UNSUCCESSFUL);
+ }
- /* initalize peb lock support */
- RtlInitializeCriticalSection (&PebLock);
- Peb->FastPebLock = &PebLock;
- Peb->FastPebLockRoutine = (PPEBLOCKROUTINE)RtlEnterCriticalSection;
- Peb->FastPebUnlockRoutine = (PPEBLOCKROUTINE)RtlLeaveCriticalSection;
-
- /* initialize tls bitmap */
- RtlInitializeBitMap (&TlsBitMap,
- Peb->TlsBitmapBits,
- TLS_MINIMUM_AVAILABLE);
- Peb->TlsBitmap = &TlsBitMap;
- Peb->TlsExpansionCounter = TLS_MINIMUM_AVAILABLE;
-
- /* Initialize table of callbacks for the kernel. */
- Peb->KernelCallbackTable =
- RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- sizeof(PVOID) * (USER32_CALLBACK_MAXIMUM + 1));
-
- /* 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)
- {
- DbgPrint("Failed to create loader data\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
- }
- 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);
-
- /* build full ntdll path */
- wcscpy (FullNtDllPath, SharedUserData->NtSystemRoot);
- wcscat (FullNtDllPath, L"\\system32\\ntdll.dll");
-
- /* add entry for ntdll */
- NtModule = (PLDR_MODULE)RtlAllocateHeap (Peb->ProcessHeap,
- 0,
- sizeof(LDR_MODULE));
- if (NtModule == NULL)
- {
- DbgPrint("Failed to create loader module entry (NTDLL)\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
- }
- memset(NtModule, 0, sizeof(LDR_MODULE));
-
- NtModule->BaseAddress = (PVOID)&_image_base__;
- NtModule->EntryPoint = 0; /* no entry point */
- RtlCreateUnicodeString (&NtModule->FullDllName,
- FullNtDllPath);
- RtlCreateUnicodeString (&NtModule->BaseDllName,
- L"ntdll.dll");
- NtModule->Flags = 0;
- NtModule->LoadCount = -1; /* don't unload */
- NtModule->TlsIndex = 0;
- NtModule->SectionHandle = NULL;
- NtModule->CheckSum = 0;
-
- NTHeaders = RtlImageNtHeader (NtModule->BaseAddress);
- NtModule->SizeOfImage = NTHeaders->OptionalHeader.SizeOfImage;
- NtModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
-
- InsertTailList(&Peb->Ldr->InLoadOrderModuleList,
- &NtModule->InLoadOrderModuleList);
- InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
- &NtModule->InInitializationOrderModuleList);
-
-#ifdef DBG
-
- LdrpLoadUserModuleSymbols(NtModule);
-
-#endif /* DBG */
-
- /* add entry for executable (becomes first list entry) */
- ExeModule = (PLDR_MODULE)RtlAllocateHeap (Peb->ProcessHeap,
- 0,
- sizeof(LDR_MODULE));
- if (ExeModule == NULL)
- {
- DbgPrint("Failed to create loader module infomation\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
- }
- ExeModule->BaseAddress = Peb->ImageBaseAddress;
+ /* initialized vectored exception handling */
+ RtlpInitializeVectoredExceptionHandling();
+
+ /* initalize peb lock support */
+ RtlInitializeCriticalSection (&PebLock);
+ Peb->FastPebLock = &PebLock;
+ Peb->FastPebLockRoutine = (PPEBLOCKROUTINE)RtlEnterCriticalSection;
+ Peb->FastPebUnlockRoutine = (PPEBLOCKROUTINE)RtlLeaveCriticalSection;
+
+ /* initialize tls bitmap */
+ RtlInitializeBitMap (&TlsBitMap,
+ Peb->TlsBitmapBits,
+ TLS_MINIMUM_AVAILABLE);
+ Peb->TlsBitmap = &TlsBitMap;
+ Peb->TlsExpansionCounter = TLS_MINIMUM_AVAILABLE;
+
+ /* Initialize table of callbacks for the kernel. */
+ Peb->KernelCallbackTable =
+ RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ sizeof(PVOID) * (USER32_CALLBACK_MAXIMUM + 1));
+
+ /* 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_UNSUCCESSFUL);
+ }
+ 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_UNSUCCESSFUL);
+ }
+ memset(NtModule, 0, sizeof(LDR_DATA_TABLE_ENTRY));
+
+ NtModule->DllBase = (PVOID)&_image_base__;
+ 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->InLoadOrderModuleList);
+ InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
+ &NtModule->InInitializationOrderModuleList);
+
+#if defined(DBG) || defined(KDBG)
+
+ LdrpLoadUserModuleSymbols(NtModule);
+
+#endif /* DBG || KDBG */
+
+ /* 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_UNSUCCESSFUL);
+ }
+ ExeModule->DllBase = Peb->ImageBaseAddress;
- if ((Peb->ProcessParameters == NULL) ||
- (Peb->ProcessParameters->ImagePathName.Length == 0))
- {
- DbgPrint("Failed to access the process parameter block\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
- }
+ 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);
+ 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);
+ DPRINT("BaseDllName '%wZ' FullDllName '%wZ'\n",
+ &ExeModule->BaseDllName,
+ &ExeModule->FullDllName);
- ExeModule->Flags = 0;
- ExeModule->LoadCount = -1; /* don't unload */
- ExeModule->TlsIndex = 0;
- ExeModule->SectionHandle = NULL;
- ExeModule->CheckSum = 0;
+ ExeModule->Flags = LDRP_ENTRY_PROCESSED;
+ ExeModule->LoadCount = -1; /* don't unload */
+ ExeModule->TlsIndex = -1;
+ ExeModule->SectionPointer = NULL;
+ ExeModule->CheckSum = 0;
- NTHeaders = RtlImageNtHeader (ExeModule->BaseAddress);
- ExeModule->SizeOfImage = NTHeaders->OptionalHeader.SizeOfImage;
- ExeModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
+ NTHeaders = RtlImageNtHeader (ExeModule->DllBase);
+ ExeModule->SizeOfImage = LdrpGetResidentSize(NTHeaders);
+ ExeModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
- InsertHeadList(&Peb->Ldr->InLoadOrderModuleList,
- &ExeModule->InLoadOrderModuleList);
+ InsertHeadList(&Peb->Ldr->InLoadOrderModuleList,
+ &ExeModule->InLoadOrderModuleList);
- LdrpInitLoader();
+ LdrpInitLoader();
-#ifdef DBG
+#if defined(DBG) || defined(KDBG)
- LdrpLoadUserModuleSymbols(ExeModule);
+ LdrpLoadUserModuleSymbols(ExeModule);
-#endif /* DBG */
+#endif /* DBG || KDBG */
- EntryPoint = LdrPEStartup((PVOID)ImageBase, NULL, NULL, NULL);
- ExeModule->EntryPoint = (ULONG)EntryPoint;
+ EntryPoint = LdrPEStartup((PVOID)ImageBase, NULL, NULL, NULL);
+ ExeModule->EntryPoint = EntryPoint;
- /* all required dlls are loaded now */
- Peb->Ldr->Initialized = TRUE;
+ /* all required dlls are loaded now */
+ Peb->Ldr->Initialized = TRUE;
- /* Check before returning that we can run the image safely. */
- if (EntryPoint == NULL)
- {
- DbgPrint("Failed to initialize image\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
+ /* Check before returning that we can run the image safely. */
+ if (EntryPoint == NULL)
+ {
+ DPRINT1("Failed to initialize image\n");
+ ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
+ }
}
+ /* attach the thread */
+ RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock);
+ LdrpAttachThread();
+ RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
}
/* EOF */