diff --git a/reactos/dll/ntdll/include/ntdllp.h b/reactos/dll/ntdll/include/ntdllp.h index fcb04a98a6e..097f8522d1c 100644 --- a/reactos/dll/ntdll/include/ntdllp.h +++ b/reactos/dll/ntdll/include/ntdllp.h @@ -8,7 +8,7 @@ /* INCLUDES ******************************************************************/ -extern BOOLEAN ShowSnaps; +#define LDR_HASH_TABLE_ENTRIES 32 typedef struct _LDRP_TLS_DATA { @@ -24,6 +24,8 @@ typedef BOOL /* Global data */ extern RTL_CRITICAL_SECTION LdrpLoaderLock; extern BOOLEAN LdrpInLdrInit; +extern LIST_ENTRY LdrpHashTable[LDR_HASH_TABLE_ENTRIES]; +extern BOOLEAN ShowSnaps; /* ldrinit.c */ NTSTATUS NTAPI LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL); @@ -34,6 +36,7 @@ VOID NTAPI LdrpFreeTls(VOID); VOID NTAPI LdrpTlsCallback(PVOID BaseAddress, ULONG Reason); BOOLEAN NTAPI LdrpCallDllEntry(PDLLMAIN_FUNC EntryPoint, PVOID BaseAddress, ULONG Reason, PVOID Context); NTSTATUS NTAPI LdrpInitializeProcess(PCONTEXT Context, PVOID SystemArgument1); +VOID NTAPI LdrpInitFailure(NTSTATUS Status); /* ldrpe.c */ @@ -48,6 +51,11 @@ LdrpSnapThunk(IN PVOID ExportBase, IN BOOLEAN Static, IN LPSTR DllName); +NTSTATUS NTAPI +LdrpWalkImportDescriptor(IN LPWSTR DllPath OPTIONAL, + IN PLDR_DATA_TABLE_ENTRY LdrEntry); + + /* ldrutils.c */ NTSTATUS NTAPI LdrpGetProcedureAddress(IN PVOID BaseAddress, @@ -55,6 +63,13 @@ LdrpGetProcedureAddress(IN PVOID BaseAddress, IN ULONG Ordinal, OUT PVOID *ProcedureAddress, IN BOOLEAN ExecuteInit); + +PLDR_DATA_TABLE_ENTRY NTAPI +LdrpAllocateDataTableEntry(IN PVOID BaseAddress); + +VOID NTAPI +LdrpInsertMemoryTableEntry(IN PLDR_DATA_TABLE_ENTRY LdrEntry); + NTSTATUS NTAPI LdrpLoadDll(IN BOOLEAN Redirected, IN PWSTR DllPath OPTIONAL, @@ -66,6 +81,26 @@ LdrpLoadDll(IN BOOLEAN Redirected, ULONG NTAPI LdrpClearLoadInProgress(); +BOOLEAN NTAPI +LdrpCheckForLoadedDll(IN PWSTR DllPath, + IN PUNICODE_STRING DllName, + IN BOOLEAN Flag, + IN BOOLEAN RedirectedDll, + OUT PLDR_DATA_TABLE_ENTRY *LdrEntry); + +NTSTATUS NTAPI +LdrpMapDll(IN PWSTR SearchPath OPTIONAL, + IN PWSTR DllPath2, + IN PWSTR DllName OPTIONAL, + IN PULONG DllCharacteristics, + IN BOOLEAN Static, + IN BOOLEAN Redirect, + OUT PLDR_DATA_TABLE_ENTRY *DataTableEntry); + +PVOID NTAPI +LdrpFetchAddressOfEntryPoint(PVOID ImageBase); + + /* FIXME: Cleanup this mess */ typedef NTSTATUS (NTAPI *PEPFUNC)(PPEB); NTSTATUS LdrMapSections(HANDLE ProcessHandle, diff --git a/reactos/dll/ntdll/ldr/ldrutils.c b/reactos/dll/ntdll/ldr/ldrutils.c index 87ae93b2be6..38eb702f395 100644 --- a/reactos/dll/ntdll/ldr/ldrutils.c +++ b/reactos/dll/ntdll/ldr/ldrutils.c @@ -17,6 +17,8 @@ PLDR_DATA_TABLE_ENTRY LdrpLoadedDllHandleCache; +#define LDR_GET_HASH_ENTRY(x) (RtlUpcaseUnicodeChar((x)) & (LDR_HASH_TABLE_ENTRIES - 1)) + /* FUNCTIONS *****************************************************************/ BOOLEAN @@ -82,6 +84,85 @@ LdrpTlsCallback(PVOID BaseAddress, ULONG Reason) _SEH2_END; } +PVOID +NTAPI +LdrpFetchAddressOfEntryPoint(PVOID ImageBase) +{ + PIMAGE_NT_HEADERS NtHeaders; + ULONG_PTR EntryPoint; + + /* Get entry point offset from NT headers */ + NtHeaders = RtlImageNtHeader(ImageBase); + EntryPoint = NtHeaders->OptionalHeader.AddressOfEntryPoint; + + /* If it's 0 - return so */ + if (!EntryPoint) return NULL; + + /* Add image base */ + EntryPoint += (ULONG_PTR)ImageBase; + + /* Return calculated pointer */ + return (PVOID)EntryPoint; +} + +NTSTATUS +NTAPI +LdrpMapDll(IN PWSTR SearchPath OPTIONAL, + IN PWSTR DllPath2, + IN PWSTR DllName OPTIONAL, + IN PULONG DllCharacteristics, + IN BOOLEAN Static, + IN BOOLEAN Redirect, + OUT PLDR_DATA_TABLE_ENTRY *DataTableEntry) +{ + UNIMPLEMENTED; + return STATUS_SUCCESS; +} + +PLDR_DATA_TABLE_ENTRY +NTAPI +LdrpAllocateDataTableEntry(IN PVOID BaseAddress) +{ + PLDR_DATA_TABLE_ENTRY LdrEntry = NULL; + PIMAGE_NT_HEADERS NtHeader = RtlImageNtHeader(BaseAddress); + + /* Make sure the header is valid */ + if (NtHeader) + { + /* Allocate an entry */ + LdrEntry = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(LDR_DATA_TABLE_ENTRY)); + + /* Make sure we got one */ + if (LdrEntry) + { + /* Set it up */ + LdrEntry->DllBase = BaseAddress; + LdrEntry->SizeOfImage = NtHeader->OptionalHeader.SizeOfImage; + LdrEntry->TimeDateStamp = NtHeader->FileHeader.TimeDateStamp; + } + } + + /* Return the entry */ + return LdrEntry; +} + +VOID +NTAPI +LdrpInsertMemoryTableEntry(IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + PPEB_LDR_DATA PebData = NtCurrentPeb()->Ldr; + ULONG i; + + /* Get the Hash entry */ + i = LDR_GET_HASH_ENTRY(LdrEntry->BaseDllName.Buffer[0]); + + InsertTailList(&LdrpHashTable[i], &LdrEntry->HashLinks); + InsertTailList(&PebData->InLoadOrderModuleList, &LdrEntry->InLoadOrderLinks); + InsertTailList(&PebData->InMemoryOrderModuleList, &LdrEntry->InMemoryOrderModuleList); +} + BOOLEAN NTAPI LdrpCheckForLoadedDllHandle(IN PVOID Base,