mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 06:33:01 +00:00
- Implemented fast loading of bounded images.
- Implemented handling of tls sections. - Fixed referencing of loaded dlls. svn path=/trunk/; revision=7498
This commit is contained in:
parent
d3fbd8e582
commit
446ec6d27b
4 changed files with 1533 additions and 743 deletions
|
@ -13,6 +13,15 @@ typedef BOOL STDCALL_FUNC
|
|||
ULONG ul_reason_for_call,
|
||||
LPVOID lpReserved);
|
||||
|
||||
/* Module flags */
|
||||
#define IMAGE_DLL 0x00000004
|
||||
#define LOAD_IN_PROGRESS 0x00001000
|
||||
#define UNLOAD_IN_PROGRESS 0x00002000
|
||||
#define ENTRY_PROCESSED 0x00004000
|
||||
#define DONT_CALL_FOR_THREAD 0x00040000
|
||||
#define PROCESS_ATTACH_CALLED 0x00080000
|
||||
#define IMAGE_NOT_AT_BASE 0x00200000
|
||||
|
||||
typedef struct _LDR_MODULE
|
||||
{
|
||||
LIST_ENTRY InLoadOrderModuleList;
|
||||
|
@ -67,7 +76,7 @@ typedef struct _MODULE_INFORMATION
|
|||
MODULE_ENTRY ModuleEntry[1];
|
||||
} MODULE_INFORMATION, *PMODULE_INFORMATION;
|
||||
|
||||
#if defined(KDBG) || defined(DBG)
|
||||
#ifdef KDBG
|
||||
|
||||
VOID
|
||||
LdrpLoadUserModuleSymbols(PLDR_MODULE LdrModule);
|
||||
|
@ -90,7 +99,7 @@ NTSTATUS STDCALL
|
|||
LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress);
|
||||
|
||||
NTSTATUS STDCALL
|
||||
LdrGetDllHandle(IN ULONG Unknown1,
|
||||
LdrGetDllHandle(IN PWCHAR Path OPTIONAL,
|
||||
IN ULONG Unknown2,
|
||||
IN PUNICODE_STRING DllName,
|
||||
OUT PVOID *BaseAddress);
|
||||
|
|
|
@ -15,12 +15,14 @@
|
|||
|
||||
#ifdef NDEBUG
|
||||
#if defined(__GNUC__)
|
||||
#define TRACE_LDR(args...) if (NtGlobalFlag & FLG_SHOW_LDR_SNAPS) { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(args); }
|
||||
#define DPRINT(args...)
|
||||
#else
|
||||
#define DPRINT
|
||||
#endif /* __GNUC__ */
|
||||
#define CHECKPOINT
|
||||
#else
|
||||
#define TRACE_LDR(args...) do { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(args); } while(0)
|
||||
#define DPRINT(args...) do { DbgPrint("(NTDLL:%s:%d) ",__FILE__,__LINE__); DbgPrint(args); } while(0)
|
||||
#define CHECKPOINT do { DbgPrint("(NTDLL:%s:%d) Checkpoint\n",__FILE__,__LINE__); } while(0)
|
||||
#endif
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: startup.c,v 1.56 2003/11/17 02:32:45 hyperion Exp $
|
||||
/* $Id: startup.c,v 1.57 2004/01/07 10:09:03 hbirr Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -27,7 +27,6 @@
|
|||
VOID RtlInitializeHeapManager (VOID);
|
||||
VOID LdrpInitLoader(VOID);
|
||||
|
||||
|
||||
/* GLOBALS *******************************************************************/
|
||||
|
||||
|
||||
|
@ -36,9 +35,13 @@ extern unsigned int _image_base__;
|
|||
static CRITICAL_SECTION PebLock;
|
||||
static CRITICAL_SECTION LoaderLock;
|
||||
static RTL_BITMAP TlsBitMap;
|
||||
PLDR_MODULE ExeModule;
|
||||
|
||||
ULONG NtGlobalFlag = 0;
|
||||
|
||||
NTSTATUS LdrpAttachThread (VOID);
|
||||
|
||||
|
||||
#define VALUE_BUFFER_SIZE 256
|
||||
|
||||
BOOL FASTCALL
|
||||
|
@ -66,6 +69,45 @@ ReadCompatibilitySetting(HANDLE Key, LPWSTR Value, PKEY_VALUE_PARTIAL_INFORMATIO
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
VOID FASTCALL
|
||||
LoadImageFileExecutionOptions(PPEB Peb)
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
ULONG Value = 0;
|
||||
UNICODE_STRING ValueString;
|
||||
WCHAR ValueBuffer[64];
|
||||
ULONG ValueSize;
|
||||
|
||||
if (Peb->ProcessParameters &&
|
||||
Peb->ProcessParameters->ImagePathName.Length > 0)
|
||||
{
|
||||
/* global flag */
|
||||
Status = LdrQueryImageFileExecutionOptions (&Peb->ProcessParameters->ImagePathName,
|
||||
L"GlobalFlag",
|
||||
REG_SZ,
|
||||
(PVOID)ValueBuffer,
|
||||
sizeof(ValueBuffer),
|
||||
&ValueSize);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
ValueString.Buffer = ValueBuffer + 1;
|
||||
ValueString.Length = ValueSize - 2 * sizeof(WCHAR);
|
||||
ValueString.MaximumLength = sizeof(ValueBuffer);
|
||||
RtlUnicodeStringToInteger(&ValueString, 16, &Value);
|
||||
Peb->NtGlobalFlag |= Value;
|
||||
DPRINT("GlobalFlag: Key='%S', Value=%08x\n", ValueBuffer, Value);
|
||||
}
|
||||
/*
|
||||
* FIXME:
|
||||
* read more options
|
||||
*/
|
||||
}
|
||||
NtGlobalFlag = Peb->NtGlobalFlag;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
BOOL FASTCALL
|
||||
LoadCompatibilitySettings(PPEB Peb)
|
||||
{
|
||||
|
@ -198,37 +240,12 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
|||
PVOID ImageBase;
|
||||
PPEB Peb;
|
||||
PLDR_MODULE NtModule; // ntdll
|
||||
PLDR_MODULE ExeModule; // executable
|
||||
NLSTABLEINFO NlsTable;
|
||||
WCHAR FullNtDllPath[MAX_PATH];
|
||||
|
||||
DPRINT("LdrInitializeThunk()\n");
|
||||
if (NtCurrentPeb()->Ldr != NULL && NtCurrentPeb()->Ldr->Initialized == TRUE)
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
Peb = (PPEB)(PEB_BASE);
|
||||
DPRINT("Peb %x\n", Peb);
|
||||
ImageBase = Peb->ImageBaseAddress;
|
||||
|
@ -239,8 +256,6 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
|||
ZwTerminateProcess(NtCurrentProcess(), STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
NtGlobalFlag = Peb->NtGlobalFlag;
|
||||
|
||||
/* If MZ header exists */
|
||||
PEDosHeader = (PIMAGE_DOS_HEADER) ImageBase;
|
||||
DPRINT("PEDosHeader %x\n", PEDosHeader);
|
||||
|
@ -320,6 +335,9 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
|||
/* Load compatibility settings */
|
||||
LoadCompatibilitySettings(Peb);
|
||||
|
||||
/* Load execution options */
|
||||
LoadImageFileExecutionOptions(Peb);
|
||||
|
||||
/* build full ntdll path */
|
||||
wcscpy (FullNtDllPath, SharedUserData->NtSystemRoot);
|
||||
wcscat (FullNtDllPath, L"\\system32\\ntdll.dll");
|
||||
|
@ -341,9 +359,10 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
|||
FullNtDllPath);
|
||||
RtlCreateUnicodeString (&NtModule->BaseDllName,
|
||||
L"ntdll.dll");
|
||||
NtModule->Flags = 0;
|
||||
NtModule->Flags = IMAGE_DLL|ENTRY_PROCESSED;
|
||||
|
||||
NtModule->LoadCount = -1; /* don't unload */
|
||||
NtModule->TlsIndex = 0;
|
||||
NtModule->TlsIndex = -1;
|
||||
NtModule->SectionHandle = NULL;
|
||||
NtModule->CheckSum = 0;
|
||||
|
||||
|
@ -356,7 +375,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
|||
InsertTailList(&Peb->Ldr->InInitializationOrderModuleList,
|
||||
&NtModule->InInitializationOrderModuleList);
|
||||
|
||||
#ifdef DBG
|
||||
#ifdef KDBG
|
||||
|
||||
LdrpLoadUserModuleSymbols(NtModule);
|
||||
|
||||
|
@ -389,9 +408,9 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
|||
&ExeModule->BaseDllName,
|
||||
&ExeModule->FullDllName);
|
||||
|
||||
ExeModule->Flags = 0;
|
||||
ExeModule->Flags = ENTRY_PROCESSED;
|
||||
ExeModule->LoadCount = -1; /* don't unload */
|
||||
ExeModule->TlsIndex = 0;
|
||||
ExeModule->TlsIndex = -1;
|
||||
ExeModule->SectionHandle = NULL;
|
||||
ExeModule->CheckSum = 0;
|
||||
|
||||
|
@ -404,7 +423,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
|||
|
||||
LdrpInitLoader();
|
||||
|
||||
#ifdef DBG
|
||||
#ifdef KDBG
|
||||
|
||||
LdrpLoadUserModuleSymbols(ExeModule);
|
||||
|
||||
|
@ -423,5 +442,10 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
|||
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
}
|
||||
/* attach the thread */
|
||||
RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock);
|
||||
LdrpAttachThread();
|
||||
RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue