Implemented LdrFindEntryForAddress() and LdrQueryProcessModuleInformation().

svn path=/trunk/; revision=2239
This commit is contained in:
Eric Kohl 2001-09-08 12:06:59 +00:00
parent bdea50f54c
commit 3920464d8e
5 changed files with 276 additions and 92 deletions

View file

@ -28,6 +28,28 @@ typedef struct _LDR_MODULE
#define RVA(m, b) ((ULONG)b + m)
typedef struct _MODULE_ENTRY
{
ULONG Unknown0;
ULONG Unknown1;
PVOID BaseAddress;
ULONG SizeOfImage;
ULONG Flags;
USHORT Unknown2;
USHORT Unknown3;
SHORT LoadCount;
USHORT PathLength;
CHAR ModuleName[256];
} MODULE_ENTRY, *PMODULE_ENTRY;
typedef struct _MODULE_INFORMATION
{
ULONG ModuleCount;
MODULE_ENTRY ModuleEntry[1];
} MODULE_INFORMATION, *PMODULE_INFORMATION;
PEPFUNC LdrPEStartup(PVOID ImageBase, HANDLE SectionHandle);
NTSTATUS LdrMapSections(HANDLE ProcessHandle,
PVOID ImageBase,
@ -36,44 +58,53 @@ NTSTATUS LdrMapSections(HANDLE ProcessHandle,
NTSTATUS LdrMapNTDllForProcess(HANDLE ProcessHandle,
PHANDLE NTDllSectionHandle);
NTSTATUS STDCALL
LdrDisableThreadCalloutsForDll (IN PVOID BaseAddress);
NTSTATUS STDCALL
LdrGetDllHandle (IN ULONG Unknown1,
IN ULONG Unknown2,
IN PUNICODE_STRING DllName,
OUT PVOID *BaseAddress);
NTSTATUS STDCALL
LdrGetProcedureAddress (IN PVOID BaseAddress,
IN PANSI_STRING Name,
IN ULONG Ordinal,
OUT PVOID *ProcedureAddress);
VOID STDCALL
LdrInitializeThunk (ULONG Unknown1,
ULONG Unknown2,
ULONG Unknown3,
ULONG Unknown4);
NTSTATUS STDCALL
LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
IN ULONG LoadFlags,
IN PUNICODE_STRING Name,
OUT PVOID *BaseAddress OPTIONAL);
NTSTATUS STDCALL
LdrShutdownProcess (VOID);
NTSTATUS STDCALL
LdrShutdownThread (VOID);
NTSTATUS STDCALL
LdrUnloadDll (IN PVOID BaseAddress);
VOID LdrLoadModuleSymbols(PLDR_MODULE ModuleObject);
NTSTATUS STDCALL
LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress);
NTSTATUS STDCALL
LdrGetDllHandle(IN ULONG Unknown1,
IN ULONG Unknown2,
IN PUNICODE_STRING DllName,
OUT PVOID *BaseAddress);
NTSTATUS STDCALL
LdrFindEntryForAddress(PVOID Address,
PLDR_MODULE *Module);
NTSTATUS STDCALL
LdrGetProcedureAddress(IN PVOID BaseAddress,
IN PANSI_STRING Name,
IN ULONG Ordinal,
OUT PVOID *ProcedureAddress);
VOID STDCALL
LdrInitializeThunk(ULONG Unknown1,
ULONG Unknown2,
ULONG Unknown3,
ULONG Unknown4);
NTSTATUS STDCALL
LdrLoadDll(IN PWSTR SearchPath OPTIONAL,
IN ULONG LoadFlags,
IN PUNICODE_STRING Name,
OUT PVOID *BaseAddress OPTIONAL);
NTSTATUS STDCALL
LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTIONAL,
IN ULONG Size OPTIONAL,
OUT PULONG ReturnedSize);
NTSTATUS STDCALL
LdrShutdownProcess(VOID);
NTSTATUS STDCALL
LdrShutdownThread(VOID);
NTSTATUS STDCALL
LdrUnloadDll(IN PVOID BaseAddress);
/* EOF */

View file

@ -1,4 +1,4 @@
; $Id: ntdll.def,v 1.78 2001/06/19 15:09:16 ekohl Exp $
; $Id: ntdll.def,v 1.79 2001/09/08 12:05:30 ekohl Exp $
;
; ReactOS Operating System
;
@ -34,17 +34,17 @@ KiUserCallbackDispatcher
KiUserExceptionDispatcher
LdrAccessResource@16
LdrDisableThreadCalloutsForDll@4
;LdrEnumResources
;LdrFindEntryForAddress
;LdrFindResourceDirectory_U
;LdrEnumResources@20
LdrFindEntryForAddress@8
;LdrFindResourceDirectory_U@16
LdrFindResource_U@16
LdrGetDllHandle@16
LdrGetProcedureAddress@16
LdrInitializeThunk@16
LdrLoadDll@16
;LdrProcessRelocationBlock
;LdrQueryImageFileExecutionOptions
;LdrQueryProcessModuleInformation
;LdrProcessRelocationBlock@16
;LdrQueryImageFileExecutionOptions@24
LdrQueryProcessModuleInformation@12
LdrShutdownProcess@0
LdrShutdownThread@0
LdrUnloadDll@4

View file

@ -1,4 +1,4 @@
; $Id: ntdll.edf,v 1.67 2001/06/19 15:09:16 ekohl Exp $
; $Id: ntdll.edf,v 1.68 2001/09/08 12:05:30 ekohl Exp $
;
; ReactOS Operating System
;
@ -35,7 +35,7 @@ KiUserExceptionDispatcher=KiUserExceptionDispatcher@8
LdrAccessResource=LdrAccessResource@16
LdrDisableThreadCalloutsForDll=LdrDisableThreadCalloutsForDll@4
;LdrEnumResources
;LdrFindEntryForAddress
LdrFindEntryForAddress=LdrFindEntryForAddress@8
;LdrFindResourceDirectory_U
LdrFindResource_U=LdrFindResource_U@16
LdrGetDllHandle=LdrGetDllHandle@16
@ -44,7 +44,7 @@ LdrInitializeThunk=LdrInitializeThunk@16
LdrLoadDll=LdrLoadDll@16
;LdrProcessRelocationBlock
;LdrQueryImageFileExecutionOptions
;LdrQueryProcessModuleInformation
LdrQueryProcessModuleInformation=LdrQueryProcessModuleInformation@12
LdrShutdownProcess=LdrShutdownProcess@0
LdrShutdownThread=LdrShutdownThread@0
LdrUnloadDll=LdrUnloadDll@4

View file

@ -1,4 +1,4 @@
/* $Id: utils.c,v 1.47 2001/09/01 19:36:30 rex Exp $
/* $Id: utils.c,v 1.48 2001/09/08 12:06:33 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -36,16 +36,12 @@
/* Type for a DLL's entry point */
typedef
WINBOOL
STDCALL
(* PDLLMAIN_FUNC) (
HANDLE hInst,
ULONG ul_reason_for_call,
LPVOID lpReserved
);
typedef WINBOOL STDCALL
(* PDLLMAIN_FUNC)(HANDLE hInst,
ULONG ul_reason_for_call,
LPVOID lpReserved);
static NTSTATUS LdrFindDll(PLDR_MODULE *Dll,PUNICODE_STRING Name);
static NTSTATUS LdrFindEntryForName(PUNICODE_STRING Name, PLDR_MODULE *Module);
static PVOID LdrFixupForward(PCHAR ForwardName);
static PVOID LdrGetExportByName(PVOID BaseAddress, PUCHAR SymbolName, USHORT Hint);
@ -209,7 +205,7 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
/*
* Test if dll is already loaded.
*/
if (LdrFindDll(&Module, &AdjustedName) == STATUS_SUCCESS)
if (LdrFindEntryForName(&AdjustedName, &Module) == STATUS_SUCCESS)
{
DPRINT("DLL %wZ already loaded.\n", &AdjustedName);
if (Module->LoadCount != -1)
@ -444,8 +440,8 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
/***************************************************************************
* NAME LOCAL
* LdrFindDll
* NAME EXPORTED
* LdrFindEntryForAddress
*
* DESCRIPTION
*
@ -458,42 +454,104 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
* NOTE
*
*/
static NTSTATUS LdrFindDll(PLDR_MODULE *Dll, PUNICODE_STRING Name)
NTSTATUS STDCALL
LdrFindEntryForAddress(PVOID Address,
PLDR_MODULE *Module)
{
PLIST_ENTRY ModuleListHead;
PLIST_ENTRY Entry;
PLDR_MODULE Module;
PLIST_ENTRY ModuleListHead;
PLIST_ENTRY Entry;
PLDR_MODULE ModulePtr;
DPRINT("NTDLL.LdrFindDll(Name %wZ)\n", Name);
DPRINT("NTDLL.LdrFindEntryForAddress(Address %p)\n", Address);
ModuleListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList;
Entry = ModuleListHead->Flink;
if (NtCurrentPeb()->Ldr == NULL)
return(STATUS_NO_MORE_ENTRIES);
// NULL is the current process
if ( Name == NULL )
{
*Dll = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
return STATUS_SUCCESS;
}
ModuleListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList;
Entry = ModuleListHead->Flink;
if (Entry == ModuleListHead)
return(STATUS_NO_MORE_ENTRIES);
while (Entry != ModuleListHead)
{
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
while (Entry != ModuleListHead)
{
ModulePtr = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
DPRINT("Scanning %wZ %wZ\n", &Module->BaseDllName, Name);
DPRINT("Scanning %wZ at %p\n", &ModulePtr->BaseDllName, ModulePtr->BaseAddress);
if (RtlCompareUnicodeString(&Module->BaseDllName, Name, TRUE) == 0)
{
*Dll = Module;
return STATUS_SUCCESS;
}
if ((Address >= ModulePtr->BaseAddress) &&
(Address <= (ModulePtr->BaseAddress + ModulePtr->SizeOfImage)))
{
*Module = ModulePtr;
return(STATUS_SUCCESS);
}
Entry = Entry->Flink;
}
Entry = Entry->Flink;
}
DPRINT("Failed to find dll %wZ\n", Name);
DPRINT("Failed to find module entry.\n");
return STATUS_UNSUCCESSFUL;
return(STATUS_NO_MORE_ENTRIES);
}
/***************************************************************************
* NAME LOCAL
* LdrFindEntryForName
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* REVISIONS
*
* NOTE
*
*/
static NTSTATUS
LdrFindEntryForName(PUNICODE_STRING Name,
PLDR_MODULE *Module)
{
PLIST_ENTRY ModuleListHead;
PLIST_ENTRY Entry;
PLDR_MODULE ModulePtr;
DPRINT("NTDLL.LdrFindEntryForName(Name %wZ)\n", Name);
if (NtCurrentPeb()->Ldr == NULL)
return(STATUS_NO_MORE_ENTRIES);
ModuleListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList;
Entry = ModuleListHead->Flink;
if (Entry == ModuleListHead)
return(STATUS_NO_MORE_ENTRIES);
// NULL is the current process
if (Name == NULL)
{
*Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
return(STATUS_SUCCESS);
}
while (Entry != ModuleListHead)
{
ModulePtr = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
DPRINT("Scanning %wZ %wZ\n", &ModulePtr->BaseDllName, Name);
if (RtlCompareUnicodeString(&ModulePtr->BaseDllName, Name, TRUE) == 0)
{
*Module = ModulePtr;
return(STATUS_SUCCESS);
}
Entry = Entry->Flink;
}
DPRINT("Failed to find dll %wZ\n", Name);
return(STATUS_NO_MORE_ENTRIES);
}
/**********************************************************************
@ -1658,4 +1716,104 @@ LdrShutdownThread (VOID)
return STATUS_SUCCESS;
}
/***************************************************************************
* NAME EXPORTED
* LdrQueryProcessModuleInformation
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* REVISIONS
*
* NOTE
*/
NTSTATUS STDCALL
LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTIONAL,
IN ULONG Size OPTIONAL,
OUT PULONG ReturnedSize)
{
PLIST_ENTRY ModuleListHead;
PLIST_ENTRY Entry;
PLDR_MODULE Module;
PMODULE_ENTRY ModulePtr = NULL;
NTSTATUS Status = STATUS_SUCCESS;
ULONG UsedSize = sizeof(ULONG);
ANSI_STRING AnsiString;
PCHAR p;
DPRINT("LdrQueryProcessModuleInformation() called\n");
RtlEnterCriticalSection (NtCurrentPeb()->LoaderLock);
if (ModuleInformation == NULL || Size == 0)
{
Status = STATUS_INFO_LENGTH_MISMATCH;
}
else
{
ModuleInformation->ModuleCount = 0;
ModulePtr = &ModuleInformation->ModuleEntry[0];
Status = STATUS_SUCCESS;
}
ModuleListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList;
Entry = ModuleListHead->Flink;
while (Entry != ModuleListHead)
{
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
DPRINT(" Module %wZ\n",
&Module->FullDllName);
if (UsedSize > Size)
{
Status = STATUS_INFO_LENGTH_MISMATCH;
}
else if (ModuleInformation != NULL)
{
ModulePtr->Unknown0 = 0; // FIXME: ??
ModulePtr->Unknown1 = 0; // FIXME: ??
ModulePtr->BaseAddress = Module->BaseAddress;
ModulePtr->SizeOfImage = Module->SizeOfImage;
ModulePtr->Flags = Module->Flags;
ModulePtr->Unknown2 = 0; // FIXME: load order index ??
ModulePtr->Unknown3 = 0; // FIXME: ??
ModulePtr->LoadCount = Module->LoadCount;
AnsiString.Length = 0;
AnsiString.MaximumLength = 256;
AnsiString.Buffer = ModulePtr->ModuleName;
RtlUnicodeStringToAnsiString(&AnsiString,
&Module->FullDllName,
FALSE);
p = strrchr(ModulePtr->ModuleName, '\\');
if (p != NULL)
ModulePtr->PathLength = p - ModulePtr->ModuleName + 1;
else
ModulePtr->PathLength = 0;
ModulePtr++;
ModuleInformation->ModuleCount++;
}
UsedSize += sizeof(MODULE_ENTRY);
Entry = Entry->Flink;
}
RtlLeaveCriticalSection (NtCurrentPeb()->LoaderLock);
if (ReturnedSize != 0)
*ReturnedSize = UsedSize;
DPRINT("LdrQueryProcessModuleInformation() done\n");
return(Status);
}
/* EOF */

View file

@ -12,11 +12,9 @@
STUB(KiRaiseUserExceptionDispatcher)
STUB(LdrEnumResources)
STUB(LdrFindEntryForAddress)
STUB(LdrFindResourceDirectory_U)
STUB(LdrProcessRelocationBlock)
STUB(LdrQueryImageFileExecutionOptions)
STUB(LdrQueryProcessModuleInformation)
STUB(LdrVerifyImageMatchesChecksum)
STUB(NPXEMULATORTABLE)
STUB(PfxFindPrefix)
@ -26,9 +24,6 @@ STUB(PfxRemovePrefix)
STUB(RestoreEm87Context)
STUB(RtlWalkHeap)
STUB(RtlZeroHeap)
STUB(RtlpNtEnumerateSubKey)
STUB(RtlpNtQueryValueKey)
STUB(RtlpNtSetValueKey)
STUB(RtlpUnWaitCriticalSection)
STUB(RtlpWaitForCriticalSection)
STUB(SaveEm87Context)