46 TRACE(
"PeLdrpCompareDllName: %s and %wZ, Length = %d " 106 PCHAR ExportName, ForwarderName;
115 WARN(
"DllBase == NULL!\n");
120 ThunkData =
VaToPa(ThunkData);
132 if (!ProcessForwards)
136 ThunkData->u1.AddressOfData =
142 ImportData =
VaToPa((
PVOID)ThunkData->u1.AddressOfData);
145 NameTable =
VaToPa(
RVA(DllBase, ExportDirectory->AddressOfNames));
146 OrdinalTable =
VaToPa(
RVA(DllBase, ExportDirectory->AddressOfNameOrdinals));
156 ExportName =
VaToPa(
RVA(DllBase, NameTable[Hint]));
160 if ((Hint < ExportDirectory->NumberOfNames) &&
163 Ordinal = OrdinalTable[Hint];
175 High = ExportDirectory->NumberOfNames - 1;
184 ExportName =
VaToPa(
RVA(DllBase, NameTable[Middle]));
218 ERR(
"Did not find export '%s'!\n", (
PCHAR)ImportData->
Name);
223 Ordinal = OrdinalTable[Middle];
230 if (Ordinal >= ExportDirectory->NumberOfFunctions)
232 ERR(
"Ordinal number is invalid!\n");
248 CHAR ForwardDllName[255];
252 TRACE(
"PeLdrpBindImportName(): ForwarderName %s\n", ForwarderName);
255 RtlCopyMemory(ForwardDllName, ForwarderName,
sizeof(ForwardDllName));
258 *
strrchr(ForwardDllName,
'.') =
'\0';
267 strcat(ForwardDllName,
".dll");
278 ERR(
"PeLdrpLoadAndScanReferencedDll() failed to load forwarder dll.\n");
291 if (RefExportDirectory)
299 ImportName =
strrchr(ForwarderName,
'.') + 1;
308 ImportByName->
Hint = 0;
325 ThunkData->u1 = RefThunkData.
u1;
363 ERR(
"PeLdrLoadImage() failed\n");
375 ERR(
"PeLdrAllocateDataTableEntry() failed\n");
382 TRACE(
"PeLdrScanImportDescriptorTable() calling ourselves for %S\n",
383 VaToPa((*DataTableEntry)->BaseDllName.Buffer));
387 ERR(
"PeLdrScanImportDescriptorTable() failed\n");
407 TRACE(
"PeLdrpScanImportAddressTable(): DllBase 0x%X, " 408 "ImageBase 0x%X, ThunkData 0x%X\n", DllBase, ImageBase, ThunkData);
413 ERR(
"Error, DllBase == NULL!\n");
425 TRACE(
"PeLdrpScanImportAddressTable(): ExportDirectory 0x%X\n", ExportDirectory);
428 if (ExportDirectory ==
NULL)
430 ERR(
"DllBase=%p(%p)\n", DllBase,
VaToPa(DllBase));
473 TRACE(
"PeLdrCheckForLoadedDll: DllName %s\n", DllName);
485 TRACE(
"PeLdrCheckForLoadedDll: DTE %p, EP %p, base %p name '%.*ws'\n",
494 *LoadedEntry = DataTableEntry;
496 TRACE(
"PeLdrCheckForLoadedDll: LoadedEntry %X\n", DataTableEntry);
501 ModuleEntry = ModuleEntry->
Flink;
516 ULONG ImportTableSize;
529 BaseName.
Length = ScanDTE->BaseDllName.Length;
530 TRACE(
"PeLdrScanImportDescriptorTable(): %wZ ImportTable = 0x%X\n",
531 &BaseName, ImportTable);
536 if (ImportTable ==
NULL)
540 for (;(ImportTable->
Name != 0) && (ImportTable->
FirstThunk != 0);ImportTable++)
544 TRACE(
"PeLdrScanImportDescriptorTable(): Looking at %s\n", ImportName);
556 &ScanDTE->InLoadOrderLinks,
560 ERR(
"PeLdrpLoadAndScanReferencedDll() failed\n");
571 &ScanDTE->InLoadOrderLinks);
575 ERR(
"PeLdrpScanImportAddressTable() failed: ImportName = '%s', DirectoryPath = '%s'\n",
576 ImportName, DirectoryPath);
598 TRACE(
"PeLdrAllocateDataTableEntry(, '%s', '%s', %p)\n",
604 if (DataTableEntry ==
NULL)
612 DataTableEntry->
DllBase = BaseVA;
632 while (*BaseDllName != 0)
634 *
Buffer++ = *BaseDllName++;
681 TRACE(
"Inserting DTE %p, name='%.*S' DllBase=%p \n", DataTableEntry,
687 *NewEntry = DataTableEntry;
712 ULONG VirtualSize, SizeOfRawData, NumberOfSections;
765 if (PhysicalBase ==
NULL)
770 if (PhysicalBase ==
NULL)
780 VirtualBase =
PaToVa(PhysicalBase);
782 TRACE(
"Base PA: 0x%X, VA: 0x%X\n", PhysicalBase, VirtualBase);
817 *ImageBasePA = PhysicalBase;
821 for (
i = 0;
i < NumberOfSections;
i++)
827 if (VirtualSize == 0)
828 VirtualSize = SizeOfRawData;
838 if (SizeOfRawData > VirtualSize)
839 SizeOfRawData = VirtualSize;
843 if (SizeOfRawData != 0)
855 ERR(
"PeLdrLoadImage(): Error reading section from file!\n");
861 if (SizeOfRawData < VirtualSize)
863 TRACE(
"PeLdrLoadImage(): SORD %d < VS %d\n", SizeOfRawData, VirtualSize);
889 TRACE(
"PeLdrLoadImage() done, PA = %p\n", *ImageBasePA);
#define LDRP_ENTRY_PROCESSED
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
FORCEINLINE VOID FrLdrHeapFree(PVOID MemoryPointer, ULONG Tag)
char * strcat(char *DstString, const char *SrcString)
ACPI_SIZE strlen(const char *String)
static BOOLEAN PeLdrpBindImportName(IN OUT PLIST_ENTRY ModuleListHead, IN PVOID DllBase, IN PVOID ImageBase, IN PIMAGE_THUNK_DATA ThunkData, IN PIMAGE_EXPORT_DIRECTORY ExportDirectory, IN ULONG ExportSize, IN BOOLEAN ProcessForwards, IN PCSTR DirectoryPath, IN PLIST_ENTRY Parent)
BOOLEAN PeLdrScanImportDescriptorTable(IN OUT PLIST_ENTRY ModuleListHead, IN PCCH DirectoryPath, IN PLDR_DATA_TABLE_ENTRY ScanDTE)
IN PDCB IN POEM_STRING IN PUNICODE_STRING UnicodeName
struct _IMAGE_IMPORT_DESCRIPTOR * PIMAGE_IMPORT_DESCRIPTOR
struct _IMAGE_IMPORT_BY_NAME * PIMAGE_IMPORT_BY_NAME
BOOLEAN PeLdrCheckForLoadedDll(IN OUT PLIST_ENTRY ModuleListHead, IN PCH DllName, OUT PLDR_DATA_TABLE_ENTRY *LoadedEntry)
#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
_Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
#define InsertTailList(ListHead, Entry)
#define LDRP_DRIVER_DEPENDENT_DLL
enum _TYPE_OF_MEMORY TYPE_OF_MEMORY
BOOLEAN PeLdrLoadImage(IN PCHAR FileName, IN TYPE_OF_MEMORY MemoryType, OUT PVOID *ImageBasePA)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define IMAGE_FIRST_SECTION(NtHeader)
#define LDRP_IMAGE_INTEGRITY_FORCED
VOID UiMessageBox(PCSTR Format,...)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
DBG_DEFAULT_CHANNEL(PELOADER)
struct _LIST_ENTRY * Flink
FORCEINLINE PVOID FrLdrHeapAlloc(SIZE_T MemorySize, ULONG Tag)
#define IMAGE_FILE_EXECUTABLE_IMAGE
_In_ ULONG _In_ ULONG _In_ ULONG Length
struct _LDR_DATA_TABLE_ENTRY * PLDR_DATA_TABLE_ENTRY
ARC_STATUS ArcRead(ULONG FileId, VOID *Buffer, ULONG N, ULONG *Count)
#define RtlImageDirectoryEntryToData
PVOID MmAllocateMemoryWithType(SIZE_T MemorySize, TYPE_OF_MEMORY MemoryType)
ARC_STATUS ArcSeek(ULONG FileId, LARGE_INTEGER *Position, SEEKMODE SeekMode)
union _IMAGE_THUNK_DATA32::@2074 u1
PVOID MmAllocateMemoryAtAddress(SIZE_T MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType)
BOOLEAN PeLdrAllocateDataTableEntry(IN OUT PLIST_ENTRY ModuleListHead, IN PCCH BaseDllName, IN PCCH FullDllName, IN PVOID BasePA, OUT PLDR_DATA_TABLE_ENTRY *NewEntry)
#define IMAGE_DIRECTORY_ENTRY_EXPORT
static BOOLEAN PeLdrpCompareDllName(IN PCH DllName, IN PUNICODE_STRING UnicodeName)
LIST_ENTRY InLoadOrderLinks
NTSYSAPI ULONG NTAPI LdrRelocateImageWithBias(_In_ PVOID NewAddress, _In_ LONGLONG AdditionalBias, _In_ PCCH LoaderName, _In_ ULONG Success, _In_ ULONG Conflict, _In_ ULONG Invalid)
#define IMAGE_SNAP_BY_ORDINAL(Ordinal)
UNICODE_STRING FullDllName
UNICODE_STRING BaseDllName
struct _IMAGE_EXPORT_DIRECTORY * PIMAGE_EXPORT_DIRECTORY
static BOOLEAN PeLdrpScanImportAddressTable(IN OUT PLIST_ENTRY ModuleListHead, IN PVOID DllBase, IN PVOID ImageBase, IN PIMAGE_THUNK_DATA ThunkData, IN PCSTR DirectoryPath, IN PLIST_ENTRY Parent)
char * strchr(const char *String, int ch)
ARC_STATUS ArcClose(ULONG FileId)
#define IMAGE_DIRECTORY_ENTRY_IMPORT
FORCEINLINE PVOID PaToVa(PVOID Pa)
char * strcpy(char *DstString, const char *SrcString)
ARC_STATUS ArcOpen(CHAR *Path, OPENMODE OpenMode, ULONG *FileId)
int strcmp(const char *String1, const char *String2)
#define RtlZeroMemory(Destination, Length)
static WLX_DISPATCH_VERSION_1_4 FunctionTable
FORCEINLINE PVOID VaToPa(PVOID Va)
#define IMAGE_ORDINAL(Ordinal)
IN BOOLEAN OUT PSTR Buffer
LIST_ENTRY * ModuleListHead
_Must_inspect_result_ _In_ PFILE_OBJECT _In_opt_ PLARGE_INTEGER _In_ ULONG _In_ FLT_IO_OPERATION_FLAGS _Out_opt_ PULONG BytesRead
static BOOLEAN PeLdrpLoadAndScanReferencedDll(IN OUT PLIST_ENTRY ModuleListHead, IN PCCH DirectoryPath, IN PCH ImportName, IN PLIST_ENTRY Parent OPTIONAL, OUT PLDR_DATA_TABLE_ENTRY *DataTableEntry)
PULONG MinorVersion OPTIONAL