mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 04:20:46 +00:00
Use LDR_DATA_TABLE_ENTRY instead of LDR_MODULE. the former is the actual structure. would be wise to fix the defs too.
svn path=/trunk/; revision=16203
This commit is contained in:
parent
1595459dbc
commit
77f673dd82
18 changed files with 196 additions and 192 deletions
|
@ -167,7 +167,7 @@ BOOLEAN ListUserModules( PPEB peb )
|
||||||
{
|
{
|
||||||
PLIST_ENTRY UserModuleListHead;
|
PLIST_ENTRY UserModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
PPEB_LDR_DATA Ldr;
|
PPEB_LDR_DATA Ldr;
|
||||||
|
|
||||||
ENTER_FUNC();
|
ENTER_FUNC();
|
||||||
|
@ -179,7 +179,7 @@ BOOLEAN ListUserModules( PPEB peb )
|
||||||
Entry = UserModuleListHead->Flink;
|
Entry = UserModuleListHead->Flink;
|
||||||
while (Entry != UserModuleListHead)
|
while (Entry != UserModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
//DbgPrint("Module: %x, BaseAddress: %x\n", Module, Module->BaseAddress);
|
//DbgPrint("Module: %x, BaseAddress: %x\n", Module, Module->BaseAddress);
|
||||||
|
|
||||||
DPRINT((0,"FullName: %S, BaseName: %S, Length: %ld, EntryPoint: %x, BaseAddress: %x\n", Module->FullDllName.Buffer,
|
DPRINT((0,"FullName: %S, BaseName: %S, Length: %ld, EntryPoint: %x, BaseAddress: %x\n", Module->FullDllName.Buffer,
|
||||||
|
|
|
@ -89,7 +89,7 @@ typedef NTSTATUS NTAPI (*PSYSMOD_ENUM_ROUTINE)
|
||||||
typedef NTSTATUS NTAPI (*PPROCMOD_ENUM_ROUTINE)
|
typedef NTSTATUS NTAPI (*PPROCMOD_ENUM_ROUTINE)
|
||||||
(
|
(
|
||||||
IN HANDLE ProcessHandle,
|
IN HANDLE ProcessHandle,
|
||||||
IN PLDR_MODULE CurrentModule,
|
IN PLDR_DATA_TABLE_ENTRY CurrentModule,
|
||||||
IN OUT PVOID CallbackContext
|
IN OUT PVOID CallbackContext
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -25,10 +25,8 @@
|
||||||
#ifndef __EPSAPI_H_INCLUDED__
|
#ifndef __EPSAPI_H_INCLUDED__
|
||||||
#define __EPSAPI_H_INCLUDED__
|
#define __EPSAPI_H_INCLUDED__
|
||||||
|
|
||||||
/* INCLUDES */
|
/* Remove soon */
|
||||||
#include <ntdll/ldr.h> /* FIXME: USE LDR_DATA_TABLE_ENTRY */
|
#include <ntdll/ldr.h>
|
||||||
|
|
||||||
/* OBJECTS */
|
|
||||||
|
|
||||||
/* TYPES */
|
/* TYPES */
|
||||||
typedef NTSTATUS (NTAPI *PPROC_ENUM_ROUTINE)(IN PSYSTEM_PROCESS_INFORMATION CurrentProcess,
|
typedef NTSTATUS (NTAPI *PPROC_ENUM_ROUTINE)(IN PSYSTEM_PROCESS_INFORMATION CurrentProcess,
|
||||||
|
@ -41,7 +39,7 @@ typedef NTSTATUS (NTAPI *PSYSMOD_ENUM_ROUTINE)(IN PSYSTEM_MODULE_INFORMATION_ENT
|
||||||
IN OUT PVOID CallbackContext);
|
IN OUT PVOID CallbackContext);
|
||||||
|
|
||||||
typedef NTSTATUS (NTAPI *PPROCMOD_ENUM_ROUTINE)(IN HANDLE ProcessHandle,
|
typedef NTSTATUS (NTAPI *PPROCMOD_ENUM_ROUTINE)(IN HANDLE ProcessHandle,
|
||||||
IN PLDR_MODULE CurrentModule,
|
IN PLDR_DATA_TABLE_ENTRY CurrentModule,
|
||||||
IN OUT PVOID CallbackContext);
|
IN OUT PVOID CallbackContext);
|
||||||
|
|
||||||
/* CONSTANTS */
|
/* CONSTANTS */
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
/*
|
/*
|
||||||
* General type for status information
|
* General type for status information
|
||||||
*/
|
*/
|
||||||
|
#ifndef __USE_W32API
|
||||||
typedef enum _NT_PRODUCT_TYPE
|
typedef enum _NT_PRODUCT_TYPE
|
||||||
{
|
{
|
||||||
NtProductWinNt = 1,
|
NtProductWinNt = 1,
|
||||||
|
|
|
@ -43,6 +43,7 @@ typedef struct _PEB_LDR_DATA
|
||||||
PVOID EntryInProgress;
|
PVOID EntryInProgress;
|
||||||
} PEB_LDR_DATA, *PPEB_LDR_DATA;
|
} PEB_LDR_DATA, *PPEB_LDR_DATA;
|
||||||
|
|
||||||
|
#if 0
|
||||||
typedef struct _LDR_DATA_TABLE_ENTRY
|
typedef struct _LDR_DATA_TABLE_ENTRY
|
||||||
{
|
{
|
||||||
LIST_ENTRY InLoadOrderModuleList;
|
LIST_ENTRY InLoadOrderModuleList;
|
||||||
|
@ -63,6 +64,7 @@ typedef struct _LDR_DATA_TABLE_ENTRY
|
||||||
PVOID LoadedImports;
|
PVOID LoadedImports;
|
||||||
PVOID EntryPointActivationContext;
|
PVOID EntryPointActivationContext;
|
||||||
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
|
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct _LDR_RESOURCE_INFO
|
typedef struct _LDR_RESOURCE_INFO
|
||||||
{
|
{
|
||||||
|
|
|
@ -54,29 +54,32 @@ LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTION
|
||||||
#define PROCESS_ATTACH_CALLED 0x00080000
|
#define PROCESS_ATTACH_CALLED 0x00080000
|
||||||
#define IMAGE_NOT_AT_BASE 0x00200000
|
#define IMAGE_NOT_AT_BASE 0x00200000
|
||||||
|
|
||||||
typedef struct _LDR_MODULE
|
typedef struct _LDR_DATA_TABLE_ENTRY
|
||||||
{
|
{
|
||||||
LIST_ENTRY InLoadOrderModuleList;
|
LIST_ENTRY InLoadOrderModuleList;
|
||||||
LIST_ENTRY InMemoryOrderModuleList; /* not used */
|
LIST_ENTRY InMemoryOrderModuleList;
|
||||||
LIST_ENTRY InInitializationOrderModuleList; /* not used */
|
LIST_ENTRY InInitializationOrderModuleList;
|
||||||
PVOID BaseAddress;
|
PVOID DllBase;
|
||||||
ULONG EntryPoint;
|
PVOID EntryPoint;
|
||||||
ULONG ResidentSize;
|
ULONG SizeOfImage;
|
||||||
UNICODE_STRING FullDllName;
|
UNICODE_STRING FullDllName;
|
||||||
UNICODE_STRING BaseDllName;
|
UNICODE_STRING BaseDllName;
|
||||||
ULONG Flags;
|
ULONG Flags;
|
||||||
SHORT LoadCount;
|
SHORT LoadCount; /* FIXME: HACK!!! FIX ASAP */
|
||||||
SHORT TlsIndex;
|
SHORT TlsIndex; /* FIXME: HACK!!! FIX ASAP */
|
||||||
HANDLE SectionHandle;
|
LIST_ENTRY HashLinks;
|
||||||
|
PVOID SectionPointer;
|
||||||
ULONG CheckSum;
|
ULONG CheckSum;
|
||||||
ULONG TimeDateStamp;
|
ULONG TimeDateStamp;
|
||||||
|
PVOID LoadedImports;
|
||||||
|
PVOID EntryPointActivationContext;
|
||||||
#if defined(DBG) || defined(KDBG)
|
#if defined(DBG) || defined(KDBG)
|
||||||
PROSSYM_INFO RosSymInfo;
|
PROSSYM_INFO RosSymInfo; /* FIXME: THIS _REALLY_ NEEDS TO GO (TLS?)!!! */
|
||||||
#endif /* KDBG */
|
#endif /* KDBG */
|
||||||
} LDR_MODULE, *PLDR_MODULE;
|
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
|
||||||
|
|
||||||
typedef struct _LDR_SYMBOL_INFO {
|
typedef struct _LDR_SYMBOL_INFO {
|
||||||
PLDR_MODULE ModuleObject;
|
PLDR_DATA_TABLE_ENTRY ModuleObject;
|
||||||
ULONG_PTR ImageBase;
|
ULONG_PTR ImageBase;
|
||||||
PVOID SymbolsBuffer;
|
PVOID SymbolsBuffer;
|
||||||
ULONG SymbolsBufferLength;
|
ULONG SymbolsBufferLength;
|
||||||
|
@ -90,7 +93,7 @@ typedef struct _LDR_SYMBOL_INFO {
|
||||||
#if defined(KDBG) || defined(DBG)
|
#if defined(KDBG) || defined(DBG)
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
LdrpLoadUserModuleSymbols(PLDR_MODULE LdrModule);
|
LdrpLoadUserModuleSymbols(PLDR_DATA_TABLE_ENTRY LdrModule);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -99,7 +102,7 @@ LdrpGetResidentSize(PIMAGE_NT_HEADERS NTHeaders);
|
||||||
|
|
||||||
PEPFUNC LdrPEStartup (PVOID ImageBase,
|
PEPFUNC LdrPEStartup (PVOID ImageBase,
|
||||||
HANDLE SectionHandle,
|
HANDLE SectionHandle,
|
||||||
PLDR_MODULE* Module,
|
PLDR_DATA_TABLE_ENTRY* Module,
|
||||||
PWSTR FullDosName);
|
PWSTR FullDosName);
|
||||||
NTSTATUS LdrMapSections(HANDLE ProcessHandle,
|
NTSTATUS LdrMapSections(HANDLE ProcessHandle,
|
||||||
PVOID ImageBase,
|
PVOID ImageBase,
|
||||||
|
@ -120,7 +123,7 @@ LdrGetDllHandle(IN PWCHAR Path OPTIONAL,
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
LdrFindEntryForAddress(IN PVOID Address,
|
LdrFindEntryForAddress(IN PVOID Address,
|
||||||
OUT PLDR_MODULE *Module);
|
OUT PLDR_DATA_TABLE_ENTRY *Module);
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
LdrGetProcedureAddress(IN PVOID BaseAddress,
|
LdrGetProcedureAddress(IN PVOID BaseAddress,
|
||||||
|
|
|
@ -49,7 +49,7 @@ PsaEnumerateProcessModules(IN HANDLE ProcessHandle,
|
||||||
|
|
||||||
while(Current != ListHead)
|
while(Current != ListHead)
|
||||||
{
|
{
|
||||||
PLDR_MODULE LoaderModule = CONTAINING_RECORD(Current, LDR_MODULE, InLoadOrderModuleList);
|
PLDR_DATA_TABLE_ENTRY LoaderModule = CONTAINING_RECORD(Current, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
|
|
||||||
/* return the current module to the callback */
|
/* return the current module to the callback */
|
||||||
Status = Callback(ProcessHandle, LoaderModule, CallbackContext);
|
Status = Callback(ProcessHandle, LoaderModule, CallbackContext);
|
||||||
|
@ -73,7 +73,7 @@ PsaEnumerateProcessModules(IN HANDLE ProcessHandle,
|
||||||
{
|
{
|
||||||
PROCESS_BASIC_INFORMATION BasicInformation;
|
PROCESS_BASIC_INFORMATION BasicInformation;
|
||||||
PPEB_LDR_DATA LoaderData;
|
PPEB_LDR_DATA LoaderData;
|
||||||
LDR_MODULE LoaderModule;
|
LDR_DATA_TABLE_ENTRY LoaderModule;
|
||||||
PLIST_ENTRY ListHead, Current;
|
PLIST_ENTRY ListHead, Current;
|
||||||
|
|
||||||
/* query the process basic information (includes the PEB address) */
|
/* query the process basic information (includes the PEB address) */
|
||||||
|
@ -116,7 +116,7 @@ PsaEnumerateProcessModules(IN HANDLE ProcessHandle,
|
||||||
{
|
{
|
||||||
/* read the current module */
|
/* read the current module */
|
||||||
Status = NtReadVirtualMemory(ProcessHandle,
|
Status = NtReadVirtualMemory(ProcessHandle,
|
||||||
CONTAINING_RECORD(Current, LDR_MODULE, InLoadOrderModuleList),
|
CONTAINING_RECORD(Current, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList),
|
||||||
&LoaderModule,
|
&LoaderModule,
|
||||||
sizeof(LoaderModule),
|
sizeof(LoaderModule),
|
||||||
NULL);
|
NULL);
|
||||||
|
|
|
@ -268,7 +268,7 @@ GetModuleFileNameA (
|
||||||
ANSI_STRING FileName;
|
ANSI_STRING FileName;
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
PPEB Peb;
|
PPEB Peb;
|
||||||
ULONG Length = 0;
|
ULONG Length = 0;
|
||||||
|
|
||||||
|
@ -283,8 +283,8 @@ GetModuleFileNameA (
|
||||||
|
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
if (Module->BaseAddress == (PVOID)hModule)
|
if (Module->DllBase == (PVOID)hModule)
|
||||||
{
|
{
|
||||||
if (nSize * sizeof(WCHAR) < Module->FullDllName.Length)
|
if (nSize * sizeof(WCHAR) < Module->FullDllName.Length)
|
||||||
{
|
{
|
||||||
|
@ -336,7 +336,7 @@ GetModuleFileNameW (
|
||||||
UNICODE_STRING FileName;
|
UNICODE_STRING FileName;
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
PPEB Peb;
|
PPEB Peb;
|
||||||
ULONG Length = 0;
|
ULONG Length = 0;
|
||||||
|
|
||||||
|
@ -350,9 +350,9 @@ GetModuleFileNameW (
|
||||||
Entry = ModuleListHead->Flink;
|
Entry = ModuleListHead->Flink;
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
|
|
||||||
if (Module->BaseAddress == (PVOID)hModule)
|
if (Module->DllBase == (PVOID)hModule)
|
||||||
{
|
{
|
||||||
if (nSize * sizeof(WCHAR) < Module->FullDllName.Length)
|
if (nSize * sizeof(WCHAR) < Module->FullDllName.Length)
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,7 +21,7 @@ ULONG
|
||||||
LdrpGetResidentSize(PIMAGE_NT_HEADERS NTHeaders);
|
LdrpGetResidentSize(PIMAGE_NT_HEADERS NTHeaders);
|
||||||
PEPFUNC LdrPEStartup (PVOID ImageBase,
|
PEPFUNC LdrPEStartup (PVOID ImageBase,
|
||||||
HANDLE SectionHandle,
|
HANDLE SectionHandle,
|
||||||
PLDR_MODULE* Module,
|
PLDR_DATA_TABLE_ENTRY* Module,
|
||||||
PWSTR FullDosName);
|
PWSTR FullDosName);
|
||||||
#if 0
|
#if 0
|
||||||
typedef BOOL
|
typedef BOOL
|
||||||
|
@ -36,7 +36,7 @@ RtlpInitDeferedCriticalSection(
|
||||||
);
|
);
|
||||||
#if defined(KDBG) || defined(DBG)
|
#if defined(KDBG) || defined(DBG)
|
||||||
VOID
|
VOID
|
||||||
LdrpLoadUserModuleSymbols(PLDR_MODULE LdrModule);
|
LdrpLoadUserModuleSymbols(PLDR_DATA_TABLE_ENTRY LdrModule);
|
||||||
#endif
|
#endif
|
||||||
extern HANDLE WindowsApiPort;
|
extern HANDLE WindowsApiPort;
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ extern unsigned int _image_base__;
|
||||||
static RTL_CRITICAL_SECTION PebLock;
|
static RTL_CRITICAL_SECTION PebLock;
|
||||||
static RTL_CRITICAL_SECTION LoaderLock;
|
static RTL_CRITICAL_SECTION LoaderLock;
|
||||||
static RTL_BITMAP TlsBitMap;
|
static RTL_BITMAP TlsBitMap;
|
||||||
PLDR_MODULE ExeModule;
|
PLDR_DATA_TABLE_ENTRY ExeModule;
|
||||||
|
|
||||||
NTSTATUS LdrpAttachThread (VOID);
|
NTSTATUS LdrpAttachThread (VOID);
|
||||||
|
|
||||||
|
@ -225,7 +225,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
PIMAGE_DOS_HEADER PEDosHeader;
|
PIMAGE_DOS_HEADER PEDosHeader;
|
||||||
PVOID ImageBase;
|
PVOID ImageBase;
|
||||||
PPEB Peb;
|
PPEB Peb;
|
||||||
PLDR_MODULE NtModule; // ntdll
|
PLDR_DATA_TABLE_ENTRY NtModule; // ntdll
|
||||||
NLSTABLEINFO NlsTable;
|
NLSTABLEINFO NlsTable;
|
||||||
WCHAR FullNtDllPath[MAX_PATH];
|
WCHAR FullNtDllPath[MAX_PATH];
|
||||||
SYSTEM_BASIC_INFORMATION SystemInformation;
|
SYSTEM_BASIC_INFORMATION SystemInformation;
|
||||||
|
@ -350,17 +350,17 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
wcscat (FullNtDllPath, L"\\system32\\ntdll.dll");
|
wcscat (FullNtDllPath, L"\\system32\\ntdll.dll");
|
||||||
|
|
||||||
/* add entry for ntdll */
|
/* add entry for ntdll */
|
||||||
NtModule = (PLDR_MODULE)RtlAllocateHeap (Peb->ProcessHeap,
|
NtModule = (PLDR_DATA_TABLE_ENTRY)RtlAllocateHeap (Peb->ProcessHeap,
|
||||||
0,
|
0,
|
||||||
sizeof(LDR_MODULE));
|
sizeof(LDR_DATA_TABLE_ENTRY));
|
||||||
if (NtModule == NULL)
|
if (NtModule == NULL)
|
||||||
{
|
{
|
||||||
DPRINT1("Failed to create loader module entry (NTDLL)\n");
|
DPRINT1("Failed to create loader module entry (NTDLL)\n");
|
||||||
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
memset(NtModule, 0, sizeof(LDR_MODULE));
|
memset(NtModule, 0, sizeof(LDR_DATA_TABLE_ENTRY));
|
||||||
|
|
||||||
NtModule->BaseAddress = (PVOID)&_image_base__;
|
NtModule->DllBase = (PVOID)&_image_base__;
|
||||||
NtModule->EntryPoint = 0; /* no entry point */
|
NtModule->EntryPoint = 0; /* no entry point */
|
||||||
RtlCreateUnicodeString (&NtModule->FullDllName,
|
RtlCreateUnicodeString (&NtModule->FullDllName,
|
||||||
FullNtDllPath);
|
FullNtDllPath);
|
||||||
|
@ -370,11 +370,11 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
|
|
||||||
NtModule->LoadCount = -1; /* don't unload */
|
NtModule->LoadCount = -1; /* don't unload */
|
||||||
NtModule->TlsIndex = -1;
|
NtModule->TlsIndex = -1;
|
||||||
NtModule->SectionHandle = NULL;
|
NtModule->SectionPointer = NULL;
|
||||||
NtModule->CheckSum = 0;
|
NtModule->CheckSum = 0;
|
||||||
|
|
||||||
NTHeaders = RtlImageNtHeader (NtModule->BaseAddress);
|
NTHeaders = RtlImageNtHeader (NtModule->DllBase);
|
||||||
NtModule->ResidentSize = LdrpGetResidentSize(NTHeaders);
|
NtModule->SizeOfImage = LdrpGetResidentSize(NTHeaders);
|
||||||
NtModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
|
NtModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
|
||||||
|
|
||||||
InsertTailList(&Peb->Ldr->InLoadOrderModuleList,
|
InsertTailList(&Peb->Ldr->InLoadOrderModuleList,
|
||||||
|
@ -389,15 +389,15 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
#endif /* DBG || KDBG */
|
#endif /* DBG || KDBG */
|
||||||
|
|
||||||
/* add entry for executable (becomes first list entry) */
|
/* add entry for executable (becomes first list entry) */
|
||||||
ExeModule = (PLDR_MODULE)RtlAllocateHeap (Peb->ProcessHeap,
|
ExeModule = (PLDR_DATA_TABLE_ENTRY)RtlAllocateHeap (Peb->ProcessHeap,
|
||||||
0,
|
0,
|
||||||
sizeof(LDR_MODULE));
|
sizeof(LDR_DATA_TABLE_ENTRY));
|
||||||
if (ExeModule == NULL)
|
if (ExeModule == NULL)
|
||||||
{
|
{
|
||||||
DPRINT1("Failed to create loader module infomation\n");
|
DPRINT1("Failed to create loader module infomation\n");
|
||||||
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
ZwTerminateProcess(NtCurrentProcess(),STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
ExeModule->BaseAddress = Peb->ImageBaseAddress;
|
ExeModule->DllBase = Peb->ImageBaseAddress;
|
||||||
|
|
||||||
if ((Peb->ProcessParameters == NULL) ||
|
if ((Peb->ProcessParameters == NULL) ||
|
||||||
(Peb->ProcessParameters->ImagePathName.Length == 0))
|
(Peb->ProcessParameters->ImagePathName.Length == 0))
|
||||||
|
@ -418,11 +418,11 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
ExeModule->Flags = ENTRY_PROCESSED;
|
ExeModule->Flags = ENTRY_PROCESSED;
|
||||||
ExeModule->LoadCount = -1; /* don't unload */
|
ExeModule->LoadCount = -1; /* don't unload */
|
||||||
ExeModule->TlsIndex = -1;
|
ExeModule->TlsIndex = -1;
|
||||||
ExeModule->SectionHandle = NULL;
|
ExeModule->SectionPointer = NULL;
|
||||||
ExeModule->CheckSum = 0;
|
ExeModule->CheckSum = 0;
|
||||||
|
|
||||||
NTHeaders = RtlImageNtHeader (ExeModule->BaseAddress);
|
NTHeaders = RtlImageNtHeader (ExeModule->DllBase);
|
||||||
ExeModule->ResidentSize = LdrpGetResidentSize(NTHeaders);
|
ExeModule->SizeOfImage = LdrpGetResidentSize(NTHeaders);
|
||||||
ExeModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
|
ExeModule->TimeDateStamp = NTHeaders->FileHeader.TimeDateStamp;
|
||||||
|
|
||||||
InsertHeadList(&Peb->Ldr->InLoadOrderModuleList,
|
InsertHeadList(&Peb->Ldr->InLoadOrderModuleList,
|
||||||
|
@ -437,7 +437,7 @@ __true_LdrInitializeThunk (ULONG Unknown1,
|
||||||
#endif /* DBG || KDBG */
|
#endif /* DBG || KDBG */
|
||||||
|
|
||||||
EntryPoint = LdrPEStartup((PVOID)ImageBase, NULL, NULL, NULL);
|
EntryPoint = LdrPEStartup((PVOID)ImageBase, NULL, NULL, NULL);
|
||||||
ExeModule->EntryPoint = (ULONG)EntryPoint;
|
ExeModule->EntryPoint = EntryPoint;
|
||||||
|
|
||||||
/* all required dlls are loaded now */
|
/* all required dlls are loaded now */
|
||||||
Peb->Ldr->Initialized = TRUE;
|
Peb->Ldr->Initialized = TRUE;
|
||||||
|
|
|
@ -42,7 +42,7 @@ typedef struct _TLS_DATA
|
||||||
DWORD TlsDataSize;
|
DWORD TlsDataSize;
|
||||||
DWORD TlsZeroSize;
|
DWORD TlsZeroSize;
|
||||||
PIMAGE_TLS_CALLBACK TlsAddressOfCallBacks;
|
PIMAGE_TLS_CALLBACK TlsAddressOfCallBacks;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
} TLS_DATA, *PTLS_DATA;
|
} TLS_DATA, *PTLS_DATA;
|
||||||
|
|
||||||
static PTLS_DATA LdrpTlsArray = NULL;
|
static PTLS_DATA LdrpTlsArray = NULL;
|
||||||
|
@ -50,18 +50,18 @@ static ULONG LdrpTlsCount = 0;
|
||||||
static ULONG LdrpTlsSize = 0;
|
static ULONG LdrpTlsSize = 0;
|
||||||
static HANDLE LdrpKnownDllsDirHandle = NULL;
|
static HANDLE LdrpKnownDllsDirHandle = NULL;
|
||||||
static UNICODE_STRING LdrpKnownDllPath = {0, 0, NULL};
|
static UNICODE_STRING LdrpKnownDllPath = {0, 0, NULL};
|
||||||
static PLDR_MODULE LdrpLastModule = NULL;
|
static PLDR_DATA_TABLE_ENTRY LdrpLastModule = NULL;
|
||||||
extern PLDR_MODULE ExeModule;
|
extern PLDR_DATA_TABLE_ENTRY ExeModule;
|
||||||
|
|
||||||
/* PROTOTYPES ****************************************************************/
|
/* PROTOTYPES ****************************************************************/
|
||||||
|
|
||||||
static NTSTATUS LdrFindEntryForName(PUNICODE_STRING Name, PLDR_MODULE *Module, BOOLEAN Ref);
|
static NTSTATUS LdrFindEntryForName(PUNICODE_STRING Name, PLDR_DATA_TABLE_ENTRY *Module, BOOLEAN Ref);
|
||||||
static PVOID LdrFixupForward(PCHAR ForwardName);
|
static PVOID LdrFixupForward(PCHAR ForwardName);
|
||||||
static PVOID LdrGetExportByName(PVOID BaseAddress, PUCHAR SymbolName, USHORT Hint);
|
static PVOID LdrGetExportByName(PVOID BaseAddress, PUCHAR SymbolName, USHORT Hint);
|
||||||
static NTSTATUS LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
|
static NTSTATUS LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
|
||||||
IN ULONG LoadFlags,
|
IN ULONG LoadFlags,
|
||||||
IN PUNICODE_STRING Name,
|
IN PUNICODE_STRING Name,
|
||||||
OUT PLDR_MODULE *Module,
|
OUT PLDR_DATA_TABLE_ENTRY *Module,
|
||||||
OUT PVOID *BaseAddress OPTIONAL);
|
OUT PVOID *BaseAddress OPTIONAL);
|
||||||
static NTSTATUS LdrpAttachProcess(VOID);
|
static NTSTATUS LdrpAttachProcess(VOID);
|
||||||
static VOID LdrpDetachProcess(BOOLEAN UnloadAll);
|
static VOID LdrpDetachProcess(BOOLEAN UnloadAll);
|
||||||
|
@ -71,7 +71,7 @@ static VOID LdrpDetachProcess(BOOLEAN UnloadAll);
|
||||||
#if defined(DBG) || defined(KDBG)
|
#if defined(DBG) || defined(KDBG)
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
LdrpLoadUserModuleSymbols(PLDR_MODULE LdrModule)
|
LdrpLoadUserModuleSymbols(PLDR_DATA_TABLE_ENTRY LdrModule)
|
||||||
{
|
{
|
||||||
NtSystemDebugControl(
|
NtSystemDebugControl(
|
||||||
DebugDbgLoadSymbols,
|
DebugDbgLoadSymbols,
|
||||||
|
@ -96,7 +96,7 @@ LdrMappedAsDataFile(PVOID *BaseAddress)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline LONG LdrpDecrementLoadCount(PLDR_MODULE Module, BOOLEAN Locked)
|
static inline LONG LdrpDecrementLoadCount(PLDR_DATA_TABLE_ENTRY Module, BOOLEAN Locked)
|
||||||
{
|
{
|
||||||
LONG LoadCount;
|
LONG LoadCount;
|
||||||
if (!Locked)
|
if (!Locked)
|
||||||
|
@ -115,7 +115,7 @@ static inline LONG LdrpDecrementLoadCount(PLDR_MODULE Module, BOOLEAN Locked)
|
||||||
return LoadCount;
|
return LoadCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline LONG LdrpIncrementLoadCount(PLDR_MODULE Module, BOOLEAN Locked)
|
static inline LONG LdrpIncrementLoadCount(PLDR_DATA_TABLE_ENTRY Module, BOOLEAN Locked)
|
||||||
{
|
{
|
||||||
LONG LoadCount;
|
LONG LoadCount;
|
||||||
if (!Locked)
|
if (!Locked)
|
||||||
|
@ -134,7 +134,7 @@ static inline LONG LdrpIncrementLoadCount(PLDR_MODULE Module, BOOLEAN Locked)
|
||||||
return LoadCount;
|
return LoadCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline VOID LdrpAcquireTlsSlot(PLDR_MODULE Module, ULONG Size, BOOLEAN Locked)
|
static inline VOID LdrpAcquireTlsSlot(PLDR_DATA_TABLE_ENTRY Module, ULONG Size, BOOLEAN Locked)
|
||||||
{
|
{
|
||||||
if (!Locked)
|
if (!Locked)
|
||||||
{
|
{
|
||||||
|
@ -149,7 +149,7 @@ static inline VOID LdrpAcquireTlsSlot(PLDR_MODULE Module, ULONG Size, BOOLEAN Lo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline VOID LdrpTlsCallback(PLDR_MODULE Module, ULONG dwReason)
|
static inline VOID LdrpTlsCallback(PLDR_DATA_TABLE_ENTRY Module, ULONG dwReason)
|
||||||
{
|
{
|
||||||
PIMAGE_TLS_CALLBACK TlsCallback;
|
PIMAGE_TLS_CALLBACK TlsCallback;
|
||||||
if (Module->TlsIndex >= 0 && Module->LoadCount == -1)
|
if (Module->TlsIndex >= 0 && Module->LoadCount == -1)
|
||||||
|
@ -161,14 +161,14 @@ static inline VOID LdrpTlsCallback(PLDR_MODULE Module, ULONG dwReason)
|
||||||
{
|
{
|
||||||
TRACE_LDR("%wZ - Calling tls callback at %x\n",
|
TRACE_LDR("%wZ - Calling tls callback at %x\n",
|
||||||
&Module->BaseDllName, TlsCallback);
|
&Module->BaseDllName, TlsCallback);
|
||||||
TlsCallback(Module->BaseAddress, dwReason, NULL);
|
TlsCallback(Module->DllBase, dwReason, NULL);
|
||||||
TlsCallback++;
|
TlsCallback++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOLEAN LdrpCallDllEntry(PLDR_MODULE Module, DWORD dwReason, PVOID lpReserved)
|
static BOOLEAN LdrpCallDllEntry(PLDR_DATA_TABLE_ENTRY Module, DWORD dwReason, PVOID lpReserved)
|
||||||
{
|
{
|
||||||
if (!(Module->Flags & IMAGE_DLL) ||
|
if (!(Module->Flags & IMAGE_DLL) ||
|
||||||
Module->EntryPoint == 0)
|
Module->EntryPoint == 0)
|
||||||
|
@ -176,7 +176,7 @@ static BOOLEAN LdrpCallDllEntry(PLDR_MODULE Module, DWORD dwReason, PVOID lpRese
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
LdrpTlsCallback(Module, dwReason);
|
LdrpTlsCallback(Module, dwReason);
|
||||||
return ((PDLLMAIN_FUNC)Module->EntryPoint)(Module->BaseAddress, dwReason, lpReserved);
|
return ((PDLLMAIN_FUNC)Module->EntryPoint)(Module->DllBase, dwReason, lpReserved);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
|
@ -234,7 +234,7 @@ LdrpInitializeTlsForProccess(VOID)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
PIMAGE_TLS_DIRECTORY TlsDirectory;
|
PIMAGE_TLS_DIRECTORY TlsDirectory;
|
||||||
PTLS_DATA TlsData;
|
PTLS_DATA TlsData;
|
||||||
|
|
||||||
|
@ -255,12 +255,12 @@ LdrpInitializeTlsForProccess(VOID)
|
||||||
Entry = ModuleListHead->Flink;
|
Entry = ModuleListHead->Flink;
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
if (Module->LoadCount == -1 &&
|
if (Module->LoadCount == -1 &&
|
||||||
Module->TlsIndex >= 0)
|
Module->TlsIndex >= 0)
|
||||||
{
|
{
|
||||||
TlsDirectory = (PIMAGE_TLS_DIRECTORY)
|
TlsDirectory = (PIMAGE_TLS_DIRECTORY)
|
||||||
RtlImageDirectoryEntryToData(Module->BaseAddress,
|
RtlImageDirectoryEntryToData(Module->DllBase,
|
||||||
TRUE,
|
TRUE,
|
||||||
IMAGE_DIRECTORY_ENTRY_TLS,
|
IMAGE_DIRECTORY_ENTRY_TLS,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -458,21 +458,21 @@ LdrAdjustDllName (PUNICODE_STRING FullDllName,
|
||||||
RtlCreateUnicodeString(FullDllName, Buffer);
|
RtlCreateUnicodeString(FullDllName, Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
PLDR_MODULE
|
PLDR_DATA_TABLE_ENTRY
|
||||||
LdrAddModuleEntry(PVOID ImageBase,
|
LdrAddModuleEntry(PVOID ImageBase,
|
||||||
PIMAGE_NT_HEADERS NTHeaders,
|
PIMAGE_NT_HEADERS NTHeaders,
|
||||||
PWSTR FullDosName)
|
PWSTR FullDosName)
|
||||||
{
|
{
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
|
|
||||||
Module = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof (LDR_MODULE));
|
Module = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof (LDR_DATA_TABLE_ENTRY));
|
||||||
ASSERT(Module);
|
ASSERT(Module);
|
||||||
memset(Module, 0, sizeof(LDR_MODULE));
|
memset(Module, 0, sizeof(LDR_DATA_TABLE_ENTRY));
|
||||||
Module->BaseAddress = (PVOID)ImageBase;
|
Module->DllBase = (PVOID)ImageBase;
|
||||||
Module->EntryPoint = NTHeaders->OptionalHeader.AddressOfEntryPoint;
|
Module->EntryPoint = (PVOID)NTHeaders->OptionalHeader.AddressOfEntryPoint;
|
||||||
if (Module->EntryPoint != 0)
|
if (Module->EntryPoint != 0)
|
||||||
Module->EntryPoint += (ULONG)Module->BaseAddress;
|
Module->EntryPoint += (ULONG)Module->DllBase;
|
||||||
Module->ResidentSize = LdrpGetResidentSize(NTHeaders);
|
Module->SizeOfImage = LdrpGetResidentSize(NTHeaders);
|
||||||
if (NtCurrentPeb()->Ldr->Initialized == TRUE)
|
if (NtCurrentPeb()->Ldr->Initialized == TRUE)
|
||||||
{
|
{
|
||||||
/* loading while app is running */
|
/* loading while app is running */
|
||||||
|
@ -728,7 +728,7 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
|
||||||
OUT PVOID *BaseAddress OPTIONAL)
|
OUT PVOID *BaseAddress OPTIONAL)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
|
|
||||||
TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n",
|
TRACE_LDR("LdrLoadDll, loading %wZ%s%S\n",
|
||||||
Name,
|
Name,
|
||||||
|
@ -751,7 +751,7 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
|
||||||
RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
|
RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
*BaseAddress = Module->BaseAddress;
|
*BaseAddress = Module->DllBase;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -776,11 +776,11 @@ LdrLoadDll (IN PWSTR SearchPath OPTIONAL,
|
||||||
*/
|
*/
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
LdrFindEntryForAddress(PVOID Address,
|
LdrFindEntryForAddress(PVOID Address,
|
||||||
PLDR_MODULE *Module)
|
PLDR_DATA_TABLE_ENTRY *Module)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE ModulePtr;
|
PLDR_DATA_TABLE_ENTRY ModulePtr;
|
||||||
|
|
||||||
DPRINT("LdrFindEntryForAddress(Address %p)\n", Address);
|
DPRINT("LdrFindEntryForAddress(Address %p)\n", Address);
|
||||||
|
|
||||||
|
@ -798,12 +798,12 @@ LdrFindEntryForAddress(PVOID Address,
|
||||||
|
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
ModulePtr = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
|
ModulePtr = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
|
|
||||||
DPRINT("Scanning %wZ at %p\n", &ModulePtr->BaseDllName, ModulePtr->BaseAddress);
|
DPRINT("Scanning %wZ at %p\n", &ModulePtr->BaseDllName, ModulePtr->DllBase);
|
||||||
|
|
||||||
if ((Address >= ModulePtr->BaseAddress) &&
|
if ((Address >= ModulePtr->DllBase) &&
|
||||||
(Address <= (ModulePtr->BaseAddress + ModulePtr->ResidentSize)))
|
(Address <= (ModulePtr->DllBase + ModulePtr->SizeOfImage)))
|
||||||
{
|
{
|
||||||
*Module = ModulePtr;
|
*Module = ModulePtr;
|
||||||
RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
|
RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock);
|
||||||
|
@ -837,12 +837,12 @@ LdrFindEntryForAddress(PVOID Address,
|
||||||
*/
|
*/
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
LdrFindEntryForName(PUNICODE_STRING Name,
|
LdrFindEntryForName(PUNICODE_STRING Name,
|
||||||
PLDR_MODULE *Module,
|
PLDR_DATA_TABLE_ENTRY *Module,
|
||||||
BOOLEAN Ref)
|
BOOLEAN Ref)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE ModulePtr;
|
PLDR_DATA_TABLE_ENTRY ModulePtr;
|
||||||
BOOLEAN ContainsPath;
|
BOOLEAN ContainsPath;
|
||||||
UNICODE_STRING AdjustedName;
|
UNICODE_STRING AdjustedName;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
@ -897,7 +897,7 @@ LdrFindEntryForName(PUNICODE_STRING Name,
|
||||||
}
|
}
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
ModulePtr = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
|
ModulePtr = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
|
|
||||||
DPRINT("Scanning %wZ %wZ\n", &ModulePtr->BaseDllName, &AdjustedName);
|
DPRINT("Scanning %wZ %wZ\n", &ModulePtr->BaseDllName, &AdjustedName);
|
||||||
|
|
||||||
|
@ -947,7 +947,7 @@ LdrFixupForward(PCHAR ForwardName)
|
||||||
UNICODE_STRING DllName;
|
UNICODE_STRING DllName;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCHAR p;
|
PCHAR p;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
PVOID BaseAddress;
|
PVOID BaseAddress;
|
||||||
|
|
||||||
strcpy(NameBuffer, ForwardName);
|
strcpy(NameBuffer, ForwardName);
|
||||||
|
@ -982,9 +982,9 @@ LdrFixupForward(PCHAR ForwardName)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINT("BaseAddress: %p\n", Module->BaseAddress);
|
DPRINT("BaseAddress: %p\n", Module->DllBase);
|
||||||
|
|
||||||
return LdrGetExportByName(Module->BaseAddress, (PUCHAR)(p+1), -1);
|
return LdrGetExportByName(Module->DllBase, (PUCHAR)(p+1), -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1341,7 +1341,7 @@ LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders,
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
LdrpGetOrLoadModule(PWCHAR SerachPath,
|
LdrpGetOrLoadModule(PWCHAR SerachPath,
|
||||||
PCHAR Name,
|
PCHAR Name,
|
||||||
PLDR_MODULE* Module,
|
PLDR_DATA_TABLE_ENTRY* Module,
|
||||||
BOOLEAN Load)
|
BOOLEAN Load)
|
||||||
{
|
{
|
||||||
UNICODE_STRING DllName;
|
UNICODE_STRING DllName;
|
||||||
|
@ -1373,8 +1373,8 @@ LdrpGetOrLoadModule(PWCHAR SerachPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
|
LdrpProcessImportDirectoryEntry(PLDR_DATA_TABLE_ENTRY Module,
|
||||||
PLDR_MODULE ImportedModule,
|
PLDR_DATA_TABLE_ENTRY ImportedModule,
|
||||||
PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory)
|
PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -1391,16 +1391,16 @@ LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the import address list. */
|
/* Get the import address list. */
|
||||||
ImportAddressList = (PVOID *)(Module->BaseAddress + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
|
ImportAddressList = (PVOID *)(Module->DllBase + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
|
||||||
|
|
||||||
/* Get the list of functions to import. */
|
/* Get the list of functions to import. */
|
||||||
if (ImportModuleDirectory->OriginalFirstThunk != 0)
|
if (ImportModuleDirectory->OriginalFirstThunk != 0)
|
||||||
{
|
{
|
||||||
FunctionNameList = (PULONG) (Module->BaseAddress + (ULONG_PTR)ImportModuleDirectory->OriginalFirstThunk);
|
FunctionNameList = (PULONG) (Module->DllBase + (ULONG_PTR)ImportModuleDirectory->OriginalFirstThunk);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FunctionNameList = (PULONG)(Module->BaseAddress + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
|
FunctionNameList = (PULONG)(Module->DllBase + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the size of IAT. */
|
/* Get the size of IAT. */
|
||||||
|
@ -1430,7 +1430,7 @@ LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
|
||||||
if ((*FunctionNameList) & 0x80000000)
|
if ((*FunctionNameList) & 0x80000000)
|
||||||
{
|
{
|
||||||
Ordinal = (*FunctionNameList) & 0x7fffffff;
|
Ordinal = (*FunctionNameList) & 0x7fffffff;
|
||||||
*ImportAddressList = LdrGetExportByOrdinal(ImportedModule->BaseAddress, Ordinal);
|
*ImportAddressList = LdrGetExportByOrdinal(ImportedModule->DllBase, Ordinal);
|
||||||
if ((*ImportAddressList) == NULL)
|
if ((*ImportAddressList) == NULL)
|
||||||
{
|
{
|
||||||
DPRINT1("Failed to import #%ld from %wZ\n", Ordinal, &ImportedModule->FullDllName);
|
DPRINT1("Failed to import #%ld from %wZ\n", Ordinal, &ImportedModule->FullDllName);
|
||||||
|
@ -1440,8 +1440,8 @@ LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
IMAGE_IMPORT_BY_NAME *pe_name;
|
IMAGE_IMPORT_BY_NAME *pe_name;
|
||||||
pe_name = RVA(Module->BaseAddress, *FunctionNameList);
|
pe_name = RVA(Module->DllBase, *FunctionNameList);
|
||||||
*ImportAddressList = LdrGetExportByName(ImportedModule->BaseAddress, pe_name->Name, pe_name->Hint);
|
*ImportAddressList = LdrGetExportByName(ImportedModule->DllBase, pe_name->Name, pe_name->Hint);
|
||||||
if ((*ImportAddressList) == NULL)
|
if ((*ImportAddressList) == NULL)
|
||||||
{
|
{
|
||||||
DPRINT1("Failed to import %s from %wZ\n", pe_name->Name, &ImportedModule->FullDllName);
|
DPRINT1("Failed to import %s from %wZ\n", pe_name->Name, &ImportedModule->FullDllName);
|
||||||
|
@ -1469,8 +1469,8 @@ LdrpProcessImportDirectoryEntry(PLDR_MODULE Module,
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
LdrpProcessImportDirectory(
|
LdrpProcessImportDirectory(
|
||||||
PLDR_MODULE Module,
|
PLDR_DATA_TABLE_ENTRY Module,
|
||||||
PLDR_MODULE ImportedModule,
|
PLDR_DATA_TABLE_ENTRY ImportedModule,
|
||||||
PCHAR ImportedName)
|
PCHAR ImportedName)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -1482,7 +1482,7 @@ LdrpProcessImportDirectory(
|
||||||
|
|
||||||
|
|
||||||
ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
|
ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
|
||||||
RtlImageDirectoryEntryToData(Module->BaseAddress,
|
RtlImageDirectoryEntryToData(Module->DllBase,
|
||||||
TRUE,
|
TRUE,
|
||||||
IMAGE_DIRECTORY_ENTRY_IMPORT,
|
IMAGE_DIRECTORY_ENTRY_IMPORT,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -1493,7 +1493,7 @@ LdrpProcessImportDirectory(
|
||||||
|
|
||||||
while (ImportModuleDirectory->Name)
|
while (ImportModuleDirectory->Name)
|
||||||
{
|
{
|
||||||
Name = (PCHAR)Module->BaseAddress + ImportModuleDirectory->Name;
|
Name = (PCHAR)Module->DllBase + ImportModuleDirectory->Name;
|
||||||
if (0 == _stricmp(Name, ImportedName))
|
if (0 == _stricmp(Name, ImportedName))
|
||||||
{
|
{
|
||||||
Status = LdrpProcessImportDirectoryEntry(Module,
|
Status = LdrpProcessImportDirectoryEntry(Module,
|
||||||
|
@ -1513,8 +1513,8 @@ LdrpProcessImportDirectory(
|
||||||
|
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
LdrpAdjustImportDirectory(PLDR_MODULE Module,
|
LdrpAdjustImportDirectory(PLDR_DATA_TABLE_ENTRY Module,
|
||||||
PLDR_MODULE ImportedModule,
|
PLDR_DATA_TABLE_ENTRY ImportedModule,
|
||||||
PCHAR ImportedName)
|
PCHAR ImportedName)
|
||||||
{
|
{
|
||||||
PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
|
PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
|
||||||
|
@ -1534,7 +1534,7 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module,
|
||||||
Module, &Module->BaseDllName, ImportedModule, &ImportedModule->BaseDllName, ImportedName);
|
Module, &Module->BaseDllName, ImportedModule, &ImportedModule->BaseDllName, ImportedName);
|
||||||
|
|
||||||
ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
|
ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
|
||||||
RtlImageDirectoryEntryToData(Module->BaseAddress,
|
RtlImageDirectoryEntryToData(Module->DllBase,
|
||||||
TRUE,
|
TRUE,
|
||||||
IMAGE_DIRECTORY_ENTRY_IMPORT,
|
IMAGE_DIRECTORY_ENTRY_IMPORT,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -1545,21 +1545,21 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module,
|
||||||
|
|
||||||
while (ImportModuleDirectory->Name)
|
while (ImportModuleDirectory->Name)
|
||||||
{
|
{
|
||||||
Name = (PCHAR)Module->BaseAddress + ImportModuleDirectory->Name;
|
Name = (PCHAR)Module->DllBase + ImportModuleDirectory->Name;
|
||||||
if (0 == _stricmp(Name, (PCHAR)ImportedName))
|
if (0 == _stricmp(Name, (PCHAR)ImportedName))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Get the import address list. */
|
/* Get the import address list. */
|
||||||
ImportAddressList = (PVOID *)(Module->BaseAddress + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
|
ImportAddressList = (PVOID *)(Module->DllBase + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
|
||||||
|
|
||||||
/* Get the list of functions to import. */
|
/* Get the list of functions to import. */
|
||||||
if (ImportModuleDirectory->OriginalFirstThunk != 0)
|
if (ImportModuleDirectory->OriginalFirstThunk != 0)
|
||||||
{
|
{
|
||||||
FunctionNameList = (PULONG) (Module->BaseAddress + (ULONG_PTR)ImportModuleDirectory->OriginalFirstThunk);
|
FunctionNameList = (PULONG) (Module->DllBase + (ULONG_PTR)ImportModuleDirectory->OriginalFirstThunk);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FunctionNameList = (PULONG)(Module->BaseAddress + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
|
FunctionNameList = (PULONG)(Module->DllBase + (ULONG_PTR)ImportModuleDirectory->FirstThunk);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the size of IAT. */
|
/* Get the size of IAT. */
|
||||||
|
@ -1583,10 +1583,10 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module,
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTHeaders = RtlImageNtHeader (ImportedModule->BaseAddress);
|
NTHeaders = RtlImageNtHeader (ImportedModule->DllBase);
|
||||||
Start = (PVOID)NTHeaders->OptionalHeader.ImageBase;
|
Start = (PVOID)NTHeaders->OptionalHeader.ImageBase;
|
||||||
End = Start + ImportedModule->ResidentSize;
|
End = Start + ImportedModule->SizeOfImage;
|
||||||
Offset = ImportedModule->BaseAddress - Start;
|
Offset = ImportedModule->DllBase - Start;
|
||||||
|
|
||||||
/* Walk through function list and fixup addresses. */
|
/* Walk through function list and fixup addresses. */
|
||||||
while (*FunctionNameList != 0L)
|
while (*FunctionNameList != 0L)
|
||||||
|
@ -1636,7 +1636,7 @@ LdrpAdjustImportDirectory(PLDR_MODULE Module,
|
||||||
*/
|
*/
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
||||||
IN PLDR_MODULE Module)
|
IN PLDR_DATA_TABLE_ENTRY Module)
|
||||||
{
|
{
|
||||||
PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
|
PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
|
||||||
PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectoryCurrent;
|
PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectoryCurrent;
|
||||||
|
@ -1645,14 +1645,14 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
||||||
PIMAGE_TLS_DIRECTORY TlsDirectory;
|
PIMAGE_TLS_DIRECTORY TlsDirectory;
|
||||||
ULONG TlsSize = 0;
|
ULONG TlsSize = 0;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PLDR_MODULE ImportedModule;
|
PLDR_DATA_TABLE_ENTRY ImportedModule;
|
||||||
PCHAR ImportedName;
|
PCHAR ImportedName;
|
||||||
|
|
||||||
DPRINT("LdrFixupImports(SearchPath %x, Module %x)\n", SearchPath, Module);
|
DPRINT("LdrFixupImports(SearchPath %x, Module %x)\n", SearchPath, Module);
|
||||||
|
|
||||||
/* Check for tls data */
|
/* Check for tls data */
|
||||||
TlsDirectory = (PIMAGE_TLS_DIRECTORY)
|
TlsDirectory = (PIMAGE_TLS_DIRECTORY)
|
||||||
RtlImageDirectoryEntryToData(Module->BaseAddress,
|
RtlImageDirectoryEntryToData(Module->DllBase,
|
||||||
TRUE,
|
TRUE,
|
||||||
IMAGE_DIRECTORY_ENTRY_TLS,
|
IMAGE_DIRECTORY_ENTRY_TLS,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -1673,13 +1673,13 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
||||||
* Process each import module.
|
* Process each import module.
|
||||||
*/
|
*/
|
||||||
ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
|
ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
|
||||||
RtlImageDirectoryEntryToData(Module->BaseAddress,
|
RtlImageDirectoryEntryToData(Module->DllBase,
|
||||||
TRUE,
|
TRUE,
|
||||||
IMAGE_DIRECTORY_ENTRY_IMPORT,
|
IMAGE_DIRECTORY_ENTRY_IMPORT,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
BoundImportDescriptor = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)
|
BoundImportDescriptor = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)
|
||||||
RtlImageDirectoryEntryToData(Module->BaseAddress,
|
RtlImageDirectoryEntryToData(Module->DllBase,
|
||||||
TRUE,
|
TRUE,
|
||||||
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
|
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -1737,7 +1737,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
||||||
{
|
{
|
||||||
PIMAGE_BOUND_FORWARDER_REF BoundForwarderRef;
|
PIMAGE_BOUND_FORWARDER_REF BoundForwarderRef;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
PLDR_MODULE ForwarderModule;
|
PLDR_DATA_TABLE_ENTRY ForwarderModule;
|
||||||
PCHAR ForwarderName;
|
PCHAR ForwarderName;
|
||||||
|
|
||||||
BoundForwarderRef = (PIMAGE_BOUND_FORWARDER_REF)(BoundImportDescriptorCurrent + 1);
|
BoundForwarderRef = (PIMAGE_BOUND_FORWARDER_REF)(BoundImportDescriptorCurrent + 1);
|
||||||
|
@ -1821,7 +1821,7 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
||||||
ImportModuleDirectoryCurrent = ImportModuleDirectory;
|
ImportModuleDirectoryCurrent = ImportModuleDirectory;
|
||||||
while (ImportModuleDirectoryCurrent->Name)
|
while (ImportModuleDirectoryCurrent->Name)
|
||||||
{
|
{
|
||||||
ImportedName = (PCHAR)Module->BaseAddress + ImportModuleDirectoryCurrent->Name;
|
ImportedName = (PCHAR)Module->DllBase + ImportModuleDirectoryCurrent->Name;
|
||||||
TRACE_LDR("%wZ imports functions from %s\n", &Module->BaseDllName, ImportedName);
|
TRACE_LDR("%wZ imports functions from %s\n", &Module->BaseDllName, ImportedName);
|
||||||
|
|
||||||
Status = LdrpGetOrLoadModule(SearchPath, ImportedName, &ImportedModule, TRUE);
|
Status = LdrpGetOrLoadModule(SearchPath, ImportedName, &ImportedModule, TRUE);
|
||||||
|
@ -1886,14 +1886,14 @@ LdrFixupImports(IN PWSTR SearchPath OPTIONAL,
|
||||||
*/
|
*/
|
||||||
PEPFUNC LdrPEStartup (PVOID ImageBase,
|
PEPFUNC LdrPEStartup (PVOID ImageBase,
|
||||||
HANDLE SectionHandle,
|
HANDLE SectionHandle,
|
||||||
PLDR_MODULE* Module,
|
PLDR_DATA_TABLE_ENTRY* Module,
|
||||||
PWSTR FullDosName)
|
PWSTR FullDosName)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PEPFUNC EntryPoint = NULL;
|
PEPFUNC EntryPoint = NULL;
|
||||||
PIMAGE_DOS_HEADER DosHeader;
|
PIMAGE_DOS_HEADER DosHeader;
|
||||||
PIMAGE_NT_HEADERS NTHeaders;
|
PIMAGE_NT_HEADERS NTHeaders;
|
||||||
PLDR_MODULE tmpModule;
|
PLDR_DATA_TABLE_ENTRY tmpModule;
|
||||||
|
|
||||||
DPRINT("LdrPEStartup(ImageBase %x SectionHandle %x)\n",
|
DPRINT("LdrPEStartup(ImageBase %x SectionHandle %x)\n",
|
||||||
ImageBase, (ULONG)SectionHandle);
|
ImageBase, (ULONG)SectionHandle);
|
||||||
|
@ -1924,7 +1924,7 @@ PEPFUNC LdrPEStartup (PVOID ImageBase,
|
||||||
if (Module != NULL)
|
if (Module != NULL)
|
||||||
{
|
{
|
||||||
*Module = LdrAddModuleEntry(ImageBase, NTHeaders, FullDosName);
|
*Module = LdrAddModuleEntry(ImageBase, NTHeaders, FullDosName);
|
||||||
(*Module)->SectionHandle = SectionHandle;
|
(*Module)->SectionPointer = SectionHandle;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1989,13 +1989,13 @@ static NTSTATUS
|
||||||
LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
|
LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
|
||||||
IN ULONG LoadFlags,
|
IN ULONG LoadFlags,
|
||||||
IN PUNICODE_STRING Name,
|
IN PUNICODE_STRING Name,
|
||||||
PLDR_MODULE *Module,
|
PLDR_DATA_TABLE_ENTRY *Module,
|
||||||
PVOID *BaseAddress OPTIONAL)
|
PVOID *BaseAddress OPTIONAL)
|
||||||
{
|
{
|
||||||
UNICODE_STRING AdjustedName;
|
UNICODE_STRING AdjustedName;
|
||||||
UNICODE_STRING FullDosName;
|
UNICODE_STRING FullDosName;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PLDR_MODULE tmpModule;
|
PLDR_DATA_TABLE_ENTRY tmpModule;
|
||||||
HANDLE SectionHandle;
|
HANDLE SectionHandle;
|
||||||
ULONG ViewSize;
|
ULONG ViewSize;
|
||||||
PVOID ImageBase;
|
PVOID ImageBase;
|
||||||
|
@ -2019,7 +2019,7 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
|
||||||
RtlFreeUnicodeString(&AdjustedName);
|
RtlFreeUnicodeString(&AdjustedName);
|
||||||
if (NULL != BaseAddress)
|
if (NULL != BaseAddress)
|
||||||
{
|
{
|
||||||
*BaseAddress = (*Module)->BaseAddress;
|
*BaseAddress = (*Module)->DllBase;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2104,7 +2104,7 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*Module = LdrAddModuleEntry(ImageBase, NtHeaders, FullDosName.Buffer);
|
*Module = LdrAddModuleEntry(ImageBase, NtHeaders, FullDosName.Buffer);
|
||||||
(*Module)->SectionHandle = SectionHandle;
|
(*Module)->SectionPointer = SectionHandle;
|
||||||
if (ImageBase != (PVOID) NtHeaders->OptionalHeader.ImageBase)
|
if (ImageBase != (PVOID) NtHeaders->OptionalHeader.ImageBase)
|
||||||
{
|
{
|
||||||
(*Module)->Flags |= IMAGE_NOT_AT_BASE;
|
(*Module)->Flags |= IMAGE_NOT_AT_BASE;
|
||||||
|
@ -2132,14 +2132,14 @@ LdrpLoadModule(IN PWSTR SearchPath OPTIONAL,
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
LdrpUnloadModule(PLDR_MODULE Module,
|
LdrpUnloadModule(PLDR_DATA_TABLE_ENTRY Module,
|
||||||
BOOLEAN Unload)
|
BOOLEAN Unload)
|
||||||
{
|
{
|
||||||
PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
|
PIMAGE_IMPORT_DESCRIPTOR ImportModuleDirectory;
|
||||||
PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptor;
|
PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptor;
|
||||||
PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptorCurrent;
|
PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundImportDescriptorCurrent;
|
||||||
PCHAR ImportedName;
|
PCHAR ImportedName;
|
||||||
PLDR_MODULE ImportedModule;
|
PLDR_DATA_TABLE_ENTRY ImportedModule;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
LONG LoadCount;
|
LONG LoadCount;
|
||||||
|
|
||||||
|
@ -2160,7 +2160,7 @@ LdrpUnloadModule(PLDR_MODULE Module,
|
||||||
else if (LoadCount == 1)
|
else if (LoadCount == 1)
|
||||||
{
|
{
|
||||||
BoundImportDescriptor = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)
|
BoundImportDescriptor = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)
|
||||||
RtlImageDirectoryEntryToData(Module->BaseAddress,
|
RtlImageDirectoryEntryToData(Module->DllBase,
|
||||||
TRUE,
|
TRUE,
|
||||||
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
|
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -2194,7 +2194,7 @@ LdrpUnloadModule(PLDR_MODULE Module,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
|
ImportModuleDirectory = (PIMAGE_IMPORT_DESCRIPTOR)
|
||||||
RtlImageDirectoryEntryToData(Module->BaseAddress,
|
RtlImageDirectoryEntryToData(Module->DllBase,
|
||||||
TRUE,
|
TRUE,
|
||||||
IMAGE_DIRECTORY_ENTRY_IMPORT,
|
IMAGE_DIRECTORY_ENTRY_IMPORT,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -2203,7 +2203,7 @@ LdrpUnloadModule(PLDR_MODULE Module,
|
||||||
/* dereferencing all imported modules, use the import descriptor */
|
/* dereferencing all imported modules, use the import descriptor */
|
||||||
while (ImportModuleDirectory->Name)
|
while (ImportModuleDirectory->Name)
|
||||||
{
|
{
|
||||||
ImportedName = (PCHAR)Module->BaseAddress + ImportModuleDirectory->Name;
|
ImportedName = (PCHAR)Module->DllBase + ImportModuleDirectory->Name;
|
||||||
TRACE_LDR("%wZ trys to unload %s\n", &Module->BaseDllName, ImportedName);
|
TRACE_LDR("%wZ trys to unload %s\n", &Module->BaseDllName, ImportedName);
|
||||||
Status = LdrpGetOrLoadModule(NULL, ImportedName, &ImportedModule, FALSE);
|
Status = LdrpGetOrLoadModule(NULL, ImportedName, &ImportedModule, FALSE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -2242,7 +2242,7 @@ LdrpUnloadModule(PLDR_MODULE Module,
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
LdrUnloadDll (IN PVOID BaseAddress)
|
LdrUnloadDll (IN PVOID BaseAddress)
|
||||||
{
|
{
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
if (BaseAddress == NULL)
|
if (BaseAddress == NULL)
|
||||||
|
@ -2273,7 +2273,7 @@ LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("LdrDisableThreadCalloutsForDll (BaseAddress %x)\n", BaseAddress);
|
DPRINT("LdrDisableThreadCalloutsForDll (BaseAddress %x)\n", BaseAddress);
|
||||||
|
@ -2284,11 +2284,11 @@ LdrDisableThreadCalloutsForDll(IN PVOID BaseAddress)
|
||||||
Entry = ModuleListHead->Flink;
|
Entry = ModuleListHead->Flink;
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
|
|
||||||
DPRINT("BaseDllName %wZ BaseAddress %x\n", &Module->BaseDllName, Module->BaseAddress);
|
DPRINT("BaseDllName %wZ BaseAddress %x\n", &Module->BaseDllName, Module->DllBase);
|
||||||
|
|
||||||
if (Module->BaseAddress == BaseAddress)
|
if (Module->DllBase == BaseAddress)
|
||||||
{
|
{
|
||||||
if (Module->TlsIndex == -1)
|
if (Module->TlsIndex == -1)
|
||||||
{
|
{
|
||||||
|
@ -2312,7 +2312,7 @@ LdrGetDllHandle(IN PWCHAR Path OPTIONAL,
|
||||||
IN PUNICODE_STRING DllName,
|
IN PUNICODE_STRING DllName,
|
||||||
OUT PVOID* BaseAddress)
|
OUT PVOID* BaseAddress)
|
||||||
{
|
{
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
TRACE_LDR("LdrGetDllHandle, searching for %wZ from %S\n", DllName, Path ? Path : L"");
|
TRACE_LDR("LdrGetDllHandle, searching for %wZ from %S\n", DllName, Path ? Path : L"");
|
||||||
|
@ -2320,7 +2320,7 @@ LdrGetDllHandle(IN PWCHAR Path OPTIONAL,
|
||||||
/* NULL is the current executable */
|
/* NULL is the current executable */
|
||||||
if (DllName == NULL)
|
if (DllName == NULL)
|
||||||
{
|
{
|
||||||
*BaseAddress = ExeModule->BaseAddress;
|
*BaseAddress = ExeModule->DllBase;
|
||||||
DPRINT("BaseAddress %x\n", *BaseAddress);
|
DPRINT("BaseAddress %x\n", *BaseAddress);
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -2328,7 +2328,7 @@ LdrGetDllHandle(IN PWCHAR Path OPTIONAL,
|
||||||
Status = LdrFindEntryForName(DllName, &Module, FALSE);
|
Status = LdrFindEntryForName(DllName, &Module, FALSE);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
*BaseAddress = Module->BaseAddress;
|
*BaseAddress = Module->DllBase;
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2406,7 +2406,7 @@ LdrpDetachProcess(BOOLEAN UnloadAll)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
static ULONG CallingCount = 0;
|
static ULONG CallingCount = 0;
|
||||||
|
|
||||||
DPRINT("LdrpDetachProcess() called for %wZ\n",
|
DPRINT("LdrpDetachProcess() called for %wZ\n",
|
||||||
|
@ -2418,7 +2418,7 @@ LdrpDetachProcess(BOOLEAN UnloadAll)
|
||||||
Entry = ModuleListHead->Blink;
|
Entry = ModuleListHead->Blink;
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
|
||||||
if (((UnloadAll && Module->LoadCount <= 0) || Module->LoadCount == 0) &&
|
if (((UnloadAll && Module->LoadCount <= 0) || Module->LoadCount == 0) &&
|
||||||
Module->Flags & ENTRY_PROCESSED &&
|
Module->Flags & ENTRY_PROCESSED &&
|
||||||
!(Module->Flags & UNLOAD_IN_PROGRESS))
|
!(Module->Flags & UNLOAD_IN_PROGRESS))
|
||||||
|
@ -2451,7 +2451,7 @@ LdrpDetachProcess(BOOLEAN UnloadAll)
|
||||||
Entry = ModuleListHead->Blink;
|
Entry = ModuleListHead->Blink;
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
|
||||||
Entry = Entry->Blink;
|
Entry = Entry->Blink;
|
||||||
if (Module->Flags & UNLOAD_IN_PROGRESS &&
|
if (Module->Flags & UNLOAD_IN_PROGRESS &&
|
||||||
((UnloadAll && Module->LoadCount >= 0) || Module->LoadCount == 0))
|
((UnloadAll && Module->LoadCount >= 0) || Module->LoadCount == 0))
|
||||||
|
@ -2460,8 +2460,8 @@ LdrpDetachProcess(BOOLEAN UnloadAll)
|
||||||
RemoveEntryList (&Module->InLoadOrderModuleList);
|
RemoveEntryList (&Module->InLoadOrderModuleList);
|
||||||
RemoveEntryList (&Module->InInitializationOrderModuleList);
|
RemoveEntryList (&Module->InInitializationOrderModuleList);
|
||||||
|
|
||||||
NtUnmapViewOfSection (NtCurrentProcess (), Module->BaseAddress);
|
NtUnmapViewOfSection (NtCurrentProcess (), Module->DllBase);
|
||||||
NtClose (Module->SectionHandle);
|
NtClose (Module->SectionPointer);
|
||||||
|
|
||||||
TRACE_LDR("%wZ unloaded\n", &Module->BaseDllName);
|
TRACE_LDR("%wZ unloaded\n", &Module->BaseDllName);
|
||||||
|
|
||||||
|
@ -2500,7 +2500,7 @@ LdrpAttachProcess(VOID)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
BOOLEAN Result;
|
BOOLEAN Result;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
@ -2511,7 +2511,7 @@ LdrpAttachProcess(VOID)
|
||||||
Entry = ModuleListHead->Flink;
|
Entry = ModuleListHead->Flink;
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
|
||||||
if (!(Module->Flags & (LOAD_IN_PROGRESS|UNLOAD_IN_PROGRESS|ENTRY_PROCESSED)))
|
if (!(Module->Flags & (LOAD_IN_PROGRESS|UNLOAD_IN_PROGRESS|ENTRY_PROCESSED)))
|
||||||
{
|
{
|
||||||
Module->Flags |= LOAD_IN_PROGRESS;
|
Module->Flags |= LOAD_IN_PROGRESS;
|
||||||
|
@ -2560,7 +2560,7 @@ LdrpAttachThread (VOID)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("LdrpAttachThread() called for %wZ\n",
|
DPRINT("LdrpAttachThread() called for %wZ\n",
|
||||||
|
@ -2577,7 +2577,7 @@ LdrpAttachThread (VOID)
|
||||||
|
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
|
||||||
if (Module->Flags & PROCESS_ATTACH_CALLED &&
|
if (Module->Flags & PROCESS_ATTACH_CALLED &&
|
||||||
!(Module->Flags & DONT_CALL_FOR_THREAD) &&
|
!(Module->Flags & DONT_CALL_FOR_THREAD) &&
|
||||||
!(Module->Flags & UNLOAD_IN_PROGRESS))
|
!(Module->Flags & UNLOAD_IN_PROGRESS))
|
||||||
|
@ -2590,7 +2590,7 @@ LdrpAttachThread (VOID)
|
||||||
}
|
}
|
||||||
|
|
||||||
Entry = NtCurrentPeb()->Ldr->InLoadOrderModuleList.Flink;
|
Entry = NtCurrentPeb()->Ldr->InLoadOrderModuleList.Flink;
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
LdrpTlsCallback(Module, DLL_THREAD_ATTACH);
|
LdrpTlsCallback(Module, DLL_THREAD_ATTACH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2610,7 +2610,7 @@ LdrShutdownThread (VOID)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
|
|
||||||
DPRINT("LdrShutdownThread() called for %wZ\n",
|
DPRINT("LdrShutdownThread() called for %wZ\n",
|
||||||
&ExeModule->BaseDllName);
|
&ExeModule->BaseDllName);
|
||||||
|
@ -2621,7 +2621,7 @@ LdrShutdownThread (VOID)
|
||||||
Entry = ModuleListHead->Blink;
|
Entry = ModuleListHead->Blink;
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
|
||||||
|
|
||||||
if (Module->Flags & PROCESS_ATTACH_CALLED &&
|
if (Module->Flags & PROCESS_ATTACH_CALLED &&
|
||||||
!(Module->Flags & DONT_CALL_FOR_THREAD) &&
|
!(Module->Flags & DONT_CALL_FOR_THREAD) &&
|
||||||
|
@ -2670,7 +2670,7 @@ LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTION
|
||||||
{
|
{
|
||||||
PLIST_ENTRY ModuleListHead;
|
PLIST_ENTRY ModuleListHead;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PLDR_MODULE Module;
|
PLDR_DATA_TABLE_ENTRY Module;
|
||||||
PDEBUG_MODULE_INFORMATION ModulePtr = NULL;
|
PDEBUG_MODULE_INFORMATION ModulePtr = NULL;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
ULONG UsedSize = sizeof(ULONG);
|
ULONG UsedSize = sizeof(ULONG);
|
||||||
|
@ -2697,7 +2697,7 @@ LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTION
|
||||||
|
|
||||||
while (Entry != ModuleListHead)
|
while (Entry != ModuleListHead)
|
||||||
{
|
{
|
||||||
Module = CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList);
|
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
|
|
||||||
DPRINT(" Module %wZ\n",
|
DPRINT(" Module %wZ\n",
|
||||||
&Module->FullDllName);
|
&Module->FullDllName);
|
||||||
|
@ -2709,8 +2709,8 @@ LdrQueryProcessModuleInformation(IN PMODULE_INFORMATION ModuleInformation OPTION
|
||||||
else if (ModuleInformation != NULL)
|
else if (ModuleInformation != NULL)
|
||||||
{
|
{
|
||||||
ModulePtr->Reserved[0] = ModulePtr->Reserved[1] = 0; // FIXME: ??
|
ModulePtr->Reserved[0] = ModulePtr->Reserved[1] = 0; // FIXME: ??
|
||||||
ModulePtr->Base = Module->BaseAddress;
|
ModulePtr->Base = Module->DllBase;
|
||||||
ModulePtr->Size = Module->ResidentSize;
|
ModulePtr->Size = Module->SizeOfImage;
|
||||||
ModulePtr->Flags = Module->Flags;
|
ModulePtr->Flags = Module->Flags;
|
||||||
ModulePtr->Index = 0; // FIXME: index ??
|
ModulePtr->Index = 0; // FIXME: index ??
|
||||||
ModulePtr->Unknown = 0; // FIXME: ??
|
ModulePtr->Unknown = 0; // FIXME: ??
|
||||||
|
|
|
@ -101,7 +101,7 @@ RtlpQueryRemoteProcessModules(HANDLE ProcessHandle,
|
||||||
{
|
{
|
||||||
PROCESS_BASIC_INFORMATION pbiInfo;
|
PROCESS_BASIC_INFORMATION pbiInfo;
|
||||||
PPEB_LDR_DATA ppldLdrData;
|
PPEB_LDR_DATA ppldLdrData;
|
||||||
LDR_MODULE lmModule;
|
LDR_DATA_TABLE_ENTRY lmModule;
|
||||||
PLIST_ENTRY pleListHead;
|
PLIST_ENTRY pleListHead;
|
||||||
PLIST_ENTRY pleCurEntry;
|
PLIST_ENTRY pleCurEntry;
|
||||||
|
|
||||||
|
@ -178,9 +178,9 @@ RtlpQueryRemoteProcessModules(HANDLE ProcessHandle,
|
||||||
|
|
||||||
/* read the current module */
|
/* read the current module */
|
||||||
Status = NtReadVirtualMemory ( ProcessHandle,
|
Status = NtReadVirtualMemory ( ProcessHandle,
|
||||||
CONTAINING_RECORD(pleCurEntry, LDR_MODULE, InLoadOrderModuleList),
|
CONTAINING_RECORD(pleCurEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList),
|
||||||
&lmModule,
|
&lmModule,
|
||||||
sizeof(LDR_MODULE),
|
sizeof(LDR_DATA_TABLE_ENTRY),
|
||||||
NULL );
|
NULL );
|
||||||
|
|
||||||
/* Import module name from remote Process user space. */
|
/* Import module name from remote Process user space. */
|
||||||
|
@ -210,8 +210,8 @@ RtlpQueryRemoteProcessModules(HANDLE ProcessHandle,
|
||||||
else if (ModuleInformation != NULL)
|
else if (ModuleInformation != NULL)
|
||||||
{
|
{
|
||||||
ModulePtr->Reserved[0] = ModulePtr->Reserved[1] = 0; // FIXME: ??
|
ModulePtr->Reserved[0] = ModulePtr->Reserved[1] = 0; // FIXME: ??
|
||||||
ModulePtr->Base = lmModule.BaseAddress;
|
ModulePtr->Base = lmModule.DllBase;
|
||||||
ModulePtr->Size = lmModule.ResidentSize;
|
ModulePtr->Size = lmModule.SizeOfImage;
|
||||||
ModulePtr->Flags = lmModule.Flags;
|
ModulePtr->Flags = lmModule.Flags;
|
||||||
ModulePtr->Index = 0; // FIXME: ??
|
ModulePtr->Index = 0; // FIXME: ??
|
||||||
ModulePtr->Unknown = 0; // FIXME: ??
|
ModulePtr->Unknown = 0; // FIXME: ??
|
||||||
|
|
|
@ -101,7 +101,7 @@ typedef struct _ENUM_PROCESS_MODULES_CONTEXT
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
EnumProcessModulesCallback(IN HANDLE ProcessHandle,
|
EnumProcessModulesCallback(IN HANDLE ProcessHandle,
|
||||||
IN PLDR_MODULE CurrentModule,
|
IN PLDR_DATA_TABLE_ENTRY CurrentModule,
|
||||||
IN OUT PVOID CallbackContext)
|
IN OUT PVOID CallbackContext)
|
||||||
{
|
{
|
||||||
PENUM_PROCESS_MODULES_CONTEXT Context = (PENUM_PROCESS_MODULES_CONTEXT)CallbackContext;
|
PENUM_PROCESS_MODULES_CONTEXT Context = (PENUM_PROCESS_MODULES_CONTEXT)CallbackContext;
|
||||||
|
@ -113,7 +113,7 @@ EnumProcessModulesCallback(IN HANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return current process */
|
/* return current process */
|
||||||
*Context->lphModule = CurrentModule->BaseAddress;
|
*Context->lphModule = CurrentModule->DllBase;
|
||||||
|
|
||||||
/* go to next array slot */
|
/* go to next array slot */
|
||||||
Context->lphModule++;
|
Context->lphModule++;
|
||||||
|
@ -386,13 +386,13 @@ typedef struct _GET_MODULE_INFORMATION_CONTEXT
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
GetModuleInformationCallback(IN HANDLE ProcessHandle,
|
GetModuleInformationCallback(IN HANDLE ProcessHandle,
|
||||||
IN PLDR_MODULE CurrentModule,
|
IN PLDR_DATA_TABLE_ENTRY CurrentModule,
|
||||||
IN OUT PVOID CallbackContext)
|
IN OUT PVOID CallbackContext)
|
||||||
{
|
{
|
||||||
PGET_MODULE_INFORMATION_CONTEXT Context = (PGET_MODULE_INFORMATION_CONTEXT)CallbackContext;
|
PGET_MODULE_INFORMATION_CONTEXT Context = (PGET_MODULE_INFORMATION_CONTEXT)CallbackContext;
|
||||||
|
|
||||||
/* found the module we were looking for */
|
/* found the module we were looking for */
|
||||||
if(CurrentModule->BaseAddress == Context->hModule)
|
if(CurrentModule->DllBase == Context->hModule)
|
||||||
{
|
{
|
||||||
/* we want the module name */
|
/* we want the module name */
|
||||||
if(Context->Flags.bWantName)
|
if(Context->Flags.bWantName)
|
||||||
|
@ -514,17 +514,17 @@ exitWithStatus:
|
||||||
ULONG nSize = Context->nBufSize;
|
ULONG nSize = Context->nBufSize;
|
||||||
|
|
||||||
/* base address */
|
/* base address */
|
||||||
if(nSize >= sizeof(CurrentModule->BaseAddress))
|
if(nSize >= sizeof(CurrentModule->DllBase))
|
||||||
{
|
{
|
||||||
Context->lpmodinfo->lpBaseOfDll = CurrentModule->BaseAddress;
|
Context->lpmodinfo->lpBaseOfDll = CurrentModule->DllBase;
|
||||||
nSize -= sizeof(CurrentModule->BaseAddress);
|
nSize -= sizeof(CurrentModule->DllBase);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* image size */
|
/* image size */
|
||||||
if(nSize >= sizeof(CurrentModule->ResidentSize))
|
if(nSize >= sizeof(CurrentModule->SizeOfImage))
|
||||||
{
|
{
|
||||||
Context->lpmodinfo->SizeOfImage = CurrentModule->ResidentSize;
|
Context->lpmodinfo->SizeOfImage = CurrentModule->SizeOfImage;
|
||||||
nSize -= sizeof(CurrentModule->ResidentSize);
|
nSize -= sizeof(CurrentModule->SizeOfImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* entry point */
|
/* entry point */
|
||||||
|
|
|
@ -35,7 +35,7 @@ NtSystemDebugControl(DEBUG_CONTROL_CODE ControlCode,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DebugDbgLoadSymbols:
|
case DebugDbgLoadSymbols:
|
||||||
KDB_LOADUSERMODULE_HOOK((PLDR_MODULE) InputBuffer);
|
KDB_LOADUSERMODULE_HOOK((PLDR_DATA_TABLE_ENTRY) InputBuffer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -18,7 +18,7 @@ struct _KD_DISPATCH_TABLE;
|
||||||
#if defined(KDBG) || defined(DBG)
|
#if defined(KDBG) || defined(DBG)
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
KdbSymLoadUserModuleSymbols(IN PLDR_MODULE LdrModule);
|
KdbSymLoadUserModuleSymbols(IN PLDR_DATA_TABLE_ENTRY LdrModule);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
KdbSymFreeProcessSymbols(IN PEPROCESS Process);
|
KdbSymFreeProcessSymbols(IN PEPROCESS Process);
|
||||||
|
|
|
@ -51,7 +51,7 @@ KdbpSymFindUserModule(IN PVOID Address OPTIONAL,
|
||||||
OUT PKDB_MODULE_INFO pInfo)
|
OUT PKDB_MODULE_INFO pInfo)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
PLDR_MODULE current;
|
PLDR_DATA_TABLE_ENTRY current;
|
||||||
PEPROCESS CurrentProcess;
|
PEPROCESS CurrentProcess;
|
||||||
PPEB Peb = NULL;
|
PPEB Peb = NULL;
|
||||||
INT Count = 0;
|
INT Count = 0;
|
||||||
|
@ -72,10 +72,10 @@ KdbpSymFindUserModule(IN PVOID Address OPTIONAL,
|
||||||
while (current_entry != &Peb->Ldr->InLoadOrderModuleList &&
|
while (current_entry != &Peb->Ldr->InLoadOrderModuleList &&
|
||||||
current_entry != NULL)
|
current_entry != NULL)
|
||||||
{
|
{
|
||||||
current = CONTAINING_RECORD(current_entry, LDR_MODULE, InLoadOrderModuleList);
|
current = CONTAINING_RECORD(current_entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
|
|
||||||
if ((Address != NULL && (Address >= (PVOID)current->BaseAddress &&
|
if ((Address != NULL && (Address >= (PVOID)current->DllBase &&
|
||||||
Address < (PVOID)((char *)current->BaseAddress + current->ResidentSize))) ||
|
Address < (PVOID)((char *)current->DllBase + current->SizeOfImage))) ||
|
||||||
(Name != NULL && _wcsicmp(current->BaseDllName.Buffer, Name) == 0) ||
|
(Name != NULL && _wcsicmp(current->BaseDllName.Buffer, Name) == 0) ||
|
||||||
(Index >= 0 && Count++ == Index))
|
(Index >= 0 && Count++ == Index))
|
||||||
{
|
{
|
||||||
|
@ -84,8 +84,8 @@ KdbpSymFindUserModule(IN PVOID Address OPTIONAL,
|
||||||
Length = 255;
|
Length = 255;
|
||||||
wcsncpy(pInfo->Name, current->BaseDllName.Buffer, Length);
|
wcsncpy(pInfo->Name, current->BaseDllName.Buffer, Length);
|
||||||
pInfo->Name[Length] = L'\0';
|
pInfo->Name[Length] = L'\0';
|
||||||
pInfo->Base = (ULONG_PTR)current->BaseAddress;
|
pInfo->Base = (ULONG_PTR)current->DllBase;
|
||||||
pInfo->Size = current->ResidentSize;
|
pInfo->Size = current->SizeOfImage;
|
||||||
pInfo->RosSymInfo = current->RosSymInfo;
|
pInfo->RosSymInfo = current->RosSymInfo;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -488,7 +488,7 @@ KdbpSymUnloadModuleSymbols(IN PROSSYM_INFO RosSymInfo)
|
||||||
* \param LdrModule Pointer to the module to load symbols for.
|
* \param LdrModule Pointer to the module to load symbols for.
|
||||||
*/
|
*/
|
||||||
VOID
|
VOID
|
||||||
KdbSymLoadUserModuleSymbols(IN PLDR_MODULE LdrModule)
|
KdbSymLoadUserModuleSymbols(IN PLDR_DATA_TABLE_ENTRY LdrModule)
|
||||||
{
|
{
|
||||||
static WCHAR Prefix[] = L"\\??\\";
|
static WCHAR Prefix[] = L"\\??\\";
|
||||||
UNICODE_STRING KernelName;
|
UNICODE_STRING KernelName;
|
||||||
|
@ -521,7 +521,7 @@ VOID
|
||||||
KdbSymFreeProcessSymbols(IN PEPROCESS Process)
|
KdbSymFreeProcessSymbols(IN PEPROCESS Process)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY CurrentEntry;
|
PLIST_ENTRY CurrentEntry;
|
||||||
PLDR_MODULE Current;
|
PLDR_DATA_TABLE_ENTRY Current;
|
||||||
PEPROCESS CurrentProcess;
|
PEPROCESS CurrentProcess;
|
||||||
PPEB Peb;
|
PPEB Peb;
|
||||||
|
|
||||||
|
@ -538,7 +538,7 @@ KdbSymFreeProcessSymbols(IN PEPROCESS Process)
|
||||||
while (CurrentEntry != &Peb->Ldr->InLoadOrderModuleList &&
|
while (CurrentEntry != &Peb->Ldr->InLoadOrderModuleList &&
|
||||||
CurrentEntry != NULL)
|
CurrentEntry != NULL)
|
||||||
{
|
{
|
||||||
Current = CONTAINING_RECORD(CurrentEntry, LDR_MODULE, InLoadOrderModuleList);
|
Current = CONTAINING_RECORD(CurrentEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
|
|
||||||
KdbpSymUnloadModuleSymbols(Current->RosSymInfo);
|
KdbpSymUnloadModuleSymbols(Current->RosSymInfo);
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ BOOLEAN
|
||||||
print_user_address(PVOID address)
|
print_user_address(PVOID address)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
PLDR_MODULE current;
|
PLDR_DATA_TABLE_ENTRY current;
|
||||||
PEPROCESS CurrentProcess;
|
PEPROCESS CurrentProcess;
|
||||||
PPEB Peb = NULL;
|
PPEB Peb = NULL;
|
||||||
ULONG_PTR RelativeAddress;
|
ULONG_PTR RelativeAddress;
|
||||||
|
@ -51,13 +51,13 @@ print_user_address(PVOID address)
|
||||||
current_entry != NULL)
|
current_entry != NULL)
|
||||||
{
|
{
|
||||||
current =
|
current =
|
||||||
CONTAINING_RECORD(current_entry, LDR_MODULE, InLoadOrderModuleList);
|
CONTAINING_RECORD(current_entry, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
|
||||||
|
|
||||||
if (address >= (PVOID)current->BaseAddress &&
|
if (address >= (PVOID)current->DllBase &&
|
||||||
address < (PVOID)((char*)current->BaseAddress + current->ResidentSize))
|
address < (PVOID)((char*)current->DllBase + current->SizeOfImage))
|
||||||
{
|
{
|
||||||
RelativeAddress =
|
RelativeAddress =
|
||||||
(ULONG_PTR) address - (ULONG_PTR)current->BaseAddress;
|
(ULONG_PTR) address - (ULONG_PTR)current->DllBase;
|
||||||
DbgPrint("<%wZ: %x>", ¤t->BaseDllName, RelativeAddress);
|
DbgPrint("<%wZ: %x>", ¤t->BaseDllName, RelativeAddress);
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#define NTOS_MODE_USER
|
#define NTOS_MODE_USER
|
||||||
|
#define READY_FOR_NEW_NTDLL
|
||||||
#include <ndk/ntndk.h>
|
#include <ndk/ntndk.h>
|
||||||
|
|
||||||
#include <rosrtl/string.h>
|
#include <rosrtl/string.h>
|
||||||
|
|
Loading…
Reference in a new issue