mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 12:53:09 +00:00
[NTDLL/LDR]
- Implement misc utility functions needed for monstrous LdrpInitializeProcess(). Currently unused. svn path=/trunk/; revision=51113
This commit is contained in:
parent
46afc9aa8c
commit
1df2f8464a
2 changed files with 117 additions and 1 deletions
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
/* INCLUDES ******************************************************************/
|
/* INCLUDES ******************************************************************/
|
||||||
|
|
||||||
extern BOOLEAN ShowSnaps;
|
#define LDR_HASH_TABLE_ENTRIES 32
|
||||||
|
|
||||||
typedef struct _LDRP_TLS_DATA
|
typedef struct _LDRP_TLS_DATA
|
||||||
{
|
{
|
||||||
|
@ -24,6 +24,8 @@ typedef BOOL
|
||||||
/* Global data */
|
/* Global data */
|
||||||
extern RTL_CRITICAL_SECTION LdrpLoaderLock;
|
extern RTL_CRITICAL_SECTION LdrpLoaderLock;
|
||||||
extern BOOLEAN LdrpInLdrInit;
|
extern BOOLEAN LdrpInLdrInit;
|
||||||
|
extern LIST_ENTRY LdrpHashTable[LDR_HASH_TABLE_ENTRIES];
|
||||||
|
extern BOOLEAN ShowSnaps;
|
||||||
|
|
||||||
/* ldrinit.c */
|
/* ldrinit.c */
|
||||||
NTSTATUS NTAPI LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL);
|
NTSTATUS NTAPI LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL);
|
||||||
|
@ -34,6 +36,7 @@ VOID NTAPI LdrpFreeTls(VOID);
|
||||||
VOID NTAPI LdrpTlsCallback(PVOID BaseAddress, ULONG Reason);
|
VOID NTAPI LdrpTlsCallback(PVOID BaseAddress, ULONG Reason);
|
||||||
BOOLEAN NTAPI LdrpCallDllEntry(PDLLMAIN_FUNC EntryPoint, PVOID BaseAddress, ULONG Reason, PVOID Context);
|
BOOLEAN NTAPI LdrpCallDllEntry(PDLLMAIN_FUNC EntryPoint, PVOID BaseAddress, ULONG Reason, PVOID Context);
|
||||||
NTSTATUS NTAPI LdrpInitializeProcess(PCONTEXT Context, PVOID SystemArgument1);
|
NTSTATUS NTAPI LdrpInitializeProcess(PCONTEXT Context, PVOID SystemArgument1);
|
||||||
|
VOID NTAPI LdrpInitFailure(NTSTATUS Status);
|
||||||
|
|
||||||
|
|
||||||
/* ldrpe.c */
|
/* ldrpe.c */
|
||||||
|
@ -48,6 +51,11 @@ LdrpSnapThunk(IN PVOID ExportBase,
|
||||||
IN BOOLEAN Static,
|
IN BOOLEAN Static,
|
||||||
IN LPSTR DllName);
|
IN LPSTR DllName);
|
||||||
|
|
||||||
|
NTSTATUS NTAPI
|
||||||
|
LdrpWalkImportDescriptor(IN LPWSTR DllPath OPTIONAL,
|
||||||
|
IN PLDR_DATA_TABLE_ENTRY LdrEntry);
|
||||||
|
|
||||||
|
|
||||||
/* ldrutils.c */
|
/* ldrutils.c */
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
LdrpGetProcedureAddress(IN PVOID BaseAddress,
|
LdrpGetProcedureAddress(IN PVOID BaseAddress,
|
||||||
|
@ -55,6 +63,13 @@ LdrpGetProcedureAddress(IN PVOID BaseAddress,
|
||||||
IN ULONG Ordinal,
|
IN ULONG Ordinal,
|
||||||
OUT PVOID *ProcedureAddress,
|
OUT PVOID *ProcedureAddress,
|
||||||
IN BOOLEAN ExecuteInit);
|
IN BOOLEAN ExecuteInit);
|
||||||
|
|
||||||
|
PLDR_DATA_TABLE_ENTRY NTAPI
|
||||||
|
LdrpAllocateDataTableEntry(IN PVOID BaseAddress);
|
||||||
|
|
||||||
|
VOID NTAPI
|
||||||
|
LdrpInsertMemoryTableEntry(IN PLDR_DATA_TABLE_ENTRY LdrEntry);
|
||||||
|
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
LdrpLoadDll(IN BOOLEAN Redirected,
|
LdrpLoadDll(IN BOOLEAN Redirected,
|
||||||
IN PWSTR DllPath OPTIONAL,
|
IN PWSTR DllPath OPTIONAL,
|
||||||
|
@ -66,6 +81,26 @@ LdrpLoadDll(IN BOOLEAN Redirected,
|
||||||
ULONG NTAPI
|
ULONG NTAPI
|
||||||
LdrpClearLoadInProgress();
|
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 */
|
/* FIXME: Cleanup this mess */
|
||||||
typedef NTSTATUS (NTAPI *PEPFUNC)(PPEB);
|
typedef NTSTATUS (NTAPI *PEPFUNC)(PPEB);
|
||||||
NTSTATUS LdrMapSections(HANDLE ProcessHandle,
|
NTSTATUS LdrMapSections(HANDLE ProcessHandle,
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
PLDR_DATA_TABLE_ENTRY LdrpLoadedDllHandleCache;
|
PLDR_DATA_TABLE_ENTRY LdrpLoadedDllHandleCache;
|
||||||
|
|
||||||
|
#define LDR_GET_HASH_ENTRY(x) (RtlUpcaseUnicodeChar((x)) & (LDR_HASH_TABLE_ENTRIES - 1))
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
|
@ -82,6 +84,85 @@ LdrpTlsCallback(PVOID BaseAddress, ULONG Reason)
|
||||||
_SEH2_END;
|
_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
|
BOOLEAN
|
||||||
NTAPI
|
NTAPI
|
||||||
LdrpCheckForLoadedDllHandle(IN PVOID Base,
|
LdrpCheckForLoadedDllHandle(IN PVOID Base,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue