RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock);
current_entry =
- NtCurrentPeb()->Ldr->InInitializationOrderModuleList.Flink;
+ NtCurrentPeb()->Ldr->InInitializationOrderModuleList.Flink;
while (current_entry !=
- &NtCurrentPeb()->Ldr->InInitializationOrderModuleList)
- {
- 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;
- }
+ &NtCurrentPeb()->Ldr->InInitializationOrderModuleList)
+ {
+ 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;
+ }
RtlLeaveCriticalSection (NtCurrentPeb()->LoaderLock);
return;
}
DPRINT("ImageBase %x\n", ImageBase);
if (ImageBase <= (PVOID)0x1000)
{
- DPRINT("ImageBase is null\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
+ DPRINT("ImageBase is null\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
}
NtGlobalFlag = Peb->NtGlobalFlag;
PEDosHeader->e_lfanew == 0L ||
*(PULONG)((PUCHAR)ImageBase + PEDosHeader->e_lfanew) != IMAGE_PE_MAGIC)
{
- DbgPrint("Image has bad header\n");
- ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
+ DbgPrint("Image has bad header\n");
+ ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
}
/* normalize process parameters */
/* create process heap */
RtlInitializeHeapManager();
- Peb->ProcessHeap = RtlCreateHeap(0,
- (PVOID)HEAP_BASE,
- NTHeaders->OptionalHeader.SizeOfHeapCommit,
- NTHeaders->OptionalHeader.SizeOfHeapReserve,
- NULL,
- NULL);
+ 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);
+ DbgPrint("Failed to create process heap\n");
+ ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
}
/* initalize peb lock support */
/* initialize tls bitmap */
RtlInitializeBitMap (&TlsBitMap,
- Peb->TlsBitmapBits,
- TLS_MINIMUM_AVAILABLE);
+ 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);
+ 0,
+ sizeof(PVOID) * USER32_CALLBACK_MAXIMUM);
/* initalize loader lock */
RtlInitializeCriticalSection (&LoaderLock);
/* create loader information */
Peb->Ldr = (PPEB_LDR_DATA)RtlAllocateHeap (Peb->ProcessHeap,
- 0,
- sizeof(PEB_LDR_DATA));
+ 0,
+ sizeof(PEB_LDR_DATA));
if (Peb->Ldr == NULL)
{
- DbgPrint("Failed to create loader data\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
+ DbgPrint("Failed to create loader data\n");
+ ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
}
Peb->Ldr->Length = sizeof(PEB_LDR_DATA);
Peb->Ldr->Initialized = FALSE;
/* add entry for ntdll */
NtModule = (PLDR_MODULE)RtlAllocateHeap (Peb->ProcessHeap,
- 0,
- sizeof(LDR_MODULE));
+ 0,
+ sizeof(LDR_MODULE));
if (NtModule == NULL)
{
- DbgPrint("Failed to create loader module entry (NTDLL)\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
+ 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);
+ FullNtDllPath);
RtlCreateUnicodeString (&NtModule->BaseDllName,
- L"ntdll.dll");
+ L"ntdll.dll");
NtModule->Flags = 0;
NtModule->LoadCount = -1; /* don't unload */
NtModule->TlsIndex = 0;
NtModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
InsertTailList(&Peb->Ldr->InLoadOrderModuleList,
- &NtModule->InLoadOrderModuleList);
+ &NtModule->InLoadOrderModuleList);
InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
- &NtModule->InInitializationOrderModuleList);
+ &NtModule->InInitializationOrderModuleList);
#ifdef DBG
/* add entry for executable (becomes first list entry) */
ExeModule = (PLDR_MODULE)RtlAllocateHeap (Peb->ProcessHeap,
- 0,
- sizeof(LDR_MODULE));
+ 0,
+ sizeof(LDR_MODULE));
if (ExeModule == NULL)
{
- DbgPrint("Failed to create loader module infomation\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
+ DbgPrint("Failed to create loader module infomation\n");
+ ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
}
ExeModule->BaseAddress = Peb->ImageBaseAddress;
- if ((Peb->ProcessParameters != NULL) &&
- (Peb->ProcessParameters->ImagePathName.Length != 0))
- {
- RtlCreateUnicodeString (&ExeModule->FullDllName,
- Peb->ProcessParameters->ImagePathName.Buffer);
- RtlCreateUnicodeString (&ExeModule->BaseDllName,
- wcsrchr(ExeModule->FullDllName.Buffer, L'\\') + 1);
- }
- else
- {
- /* FIXME(???): smss.exe doesn't have a process parameter block */
- wcscpy (FullNtDllPath, SharedUserData->NtSystemRoot);
- wcscat (FullNtDllPath, L"\\system32\\smss.exe");
- RtlCreateUnicodeString (&ExeModule->BaseDllName,
- L"smss.exe");
- RtlCreateUnicodeString (&ExeModule->FullDllName,
- FullNtDllPath);
- }
+ if ((Peb->ProcessParameters == NULL) ||
+ (Peb->ProcessParameters->ImagePathName.Length == 0))
+ {
+ DbgPrint("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 = 0;
ExeModule->LoadCount = -1; /* don't unload */
ExeModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
InsertHeadList(&Peb->Ldr->InLoadOrderModuleList,
- &ExeModule->InLoadOrderModuleList);
+ &ExeModule->InLoadOrderModuleList);
#ifdef DBG
/* Check before returning that we can run the image safely. */
if (EntryPoint == NULL)
{
- DbgPrint("Failed to initialize image\n");
- ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
+ DbgPrint("Failed to initialize image\n");
+ ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
}
}