mirror of
https://github.com/reactos/reactos.git
synced 2024-07-01 18:24:24 +00:00
- Give winldr's PE loader its own debug mask.
svn path=/trunk/; revision=40032
This commit is contained in:
parent
093a0db906
commit
0eec102951
|
@ -34,6 +34,7 @@
|
|||
#define DPRINT_LINUX 0x00000200 // OR this with DebugPrintMask to enable Linux messages
|
||||
#define DPRINT_HWDETECT 0x00000400 // OR this with DebugPrintMask to enable hardware detection messages
|
||||
#define DPRINT_WINDOWS 0x00000800 // OR this with DebugPrintMask to enable messages from Windows loader
|
||||
#define DPRINT_PELOADER 0x00001000 // OR this with DebugPrintMask to enable messages from PE images loader
|
||||
|
||||
extern char* g_file;
|
||||
extern int g_line;
|
||||
|
|
|
@ -56,7 +56,7 @@ WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
PLDR_DATA_TABLE_ENTRY DataTableEntry;
|
||||
LIST_ENTRY *ModuleEntry;
|
||||
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrCheckForLoadedDll: DllName %X, LoadedEntry: %X\n",
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrCheckForLoadedDll: DllName %X, LoadedEntry: %X\n",
|
||||
DllName, LoadedEntry);
|
||||
|
||||
/* Just go through each entry in the LoadOrderList and compare loaded module's
|
||||
|
@ -69,7 +69,7 @@ WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
LDR_DATA_TABLE_ENTRY,
|
||||
InLoadOrderLinks);
|
||||
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrCheckForLoadedDll: DTE %p, EP %p\n",
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrCheckForLoadedDll: DTE %p, EP %p\n",
|
||||
DataTableEntry, DataTableEntry->EntryPoint);
|
||||
|
||||
/* Compare names */
|
||||
|
@ -79,7 +79,7 @@ WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
to the caller and increase load count for it */
|
||||
*LoadedEntry = DataTableEntry;
|
||||
DataTableEntry->LoadCount++;
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrCheckForLoadedDll: LoadedEntry %X\n", DataTableEntry);
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrCheckForLoadedDll: LoadedEntry %X\n", DataTableEntry);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -111,7 +111,7 @@ WinLdrScanImportDescriptorTable(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
BaseName.Buffer = VaToPa(ScanDTE->BaseDllName.Buffer);
|
||||
BaseName.MaximumLength = ScanDTE->BaseDllName.MaximumLength;
|
||||
BaseName.Length = ScanDTE->BaseDllName.Length;
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrScanImportDescriptorTable(): %wZ ImportTable = 0x%X\n",
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrScanImportDescriptorTable(): %wZ ImportTable = 0x%X\n",
|
||||
&BaseName, ImportTable);
|
||||
}
|
||||
|
||||
|
@ -124,7 +124,7 @@ WinLdrScanImportDescriptorTable(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
{
|
||||
/* Get pointer to the name */
|
||||
ImportName = (PCH)VaToPa(RVA(ScanDTE->DllBase, ImportTable->Name));
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrScanImportDescriptorTable(): Looking at %s\n", ImportName);
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrScanImportDescriptorTable(): Looking at %s\n", ImportName);
|
||||
|
||||
/* In case we get a reference to ourselves - just skip it */
|
||||
if (WinLdrpCompareDllName(ImportName, &ScanDTE->BaseDllName))
|
||||
|
@ -140,7 +140,7 @@ WinLdrScanImportDescriptorTable(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
|
||||
if (!Status)
|
||||
{
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrpLoadAndScanReferencedDll() failed\n");
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrpLoadAndScanReferencedDll() failed\n");
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
@ -154,7 +154,7 @@ WinLdrScanImportDescriptorTable(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
|
||||
if (!Status)
|
||||
{
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrpScanImportAddressTable() failed\n");
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrpScanImportAddressTable() failed\n");
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
@ -337,7 +337,7 @@ WinLdrLoadImage(IN PCHAR FileName,
|
|||
/* This is the real image base - in form of a virtual address */
|
||||
VirtualBase = PaToVa(PhysicalBase);
|
||||
|
||||
DPRINTM(DPRINT_WINDOWS, "Base PA: 0x%X, VA: 0x%X\n", PhysicalBase, VirtualBase);
|
||||
DPRINTM(DPRINT_PELOADER, "Base PA: 0x%X, VA: 0x%X\n", PhysicalBase, VirtualBase);
|
||||
|
||||
/* Set to 0 position and fully load the file image */
|
||||
FsSetFilePointer(FileHandle, 0);
|
||||
|
@ -390,14 +390,14 @@ WinLdrLoadImage(IN PCHAR FileName,
|
|||
/* Seek to the correct position */
|
||||
FsSetFilePointer(FileHandle, SectionHeader->PointerToRawData);
|
||||
|
||||
DPRINTM(DPRINT_WINDOWS, "SH->VA: 0x%X\n", SectionHeader->VirtualAddress);
|
||||
DPRINTM(DPRINT_PELOADER, "SH->VA: 0x%X\n", SectionHeader->VirtualAddress);
|
||||
|
||||
/* Read this section from the file, size = SizeOfRawData */
|
||||
Status = FsReadFile(FileHandle, SizeOfRawData, &BytesRead, (PUCHAR)PhysicalBase + SectionHeader->VirtualAddress);
|
||||
|
||||
if (!Status && (BytesRead == 0))
|
||||
{
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrLoadImage(): Error reading section from file!\n");
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrLoadImage(): Error reading section from file!\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -405,7 +405,7 @@ WinLdrLoadImage(IN PCHAR FileName,
|
|||
/* Size of data is less than the virtual size - fill up the remainder with zeroes */
|
||||
if (SizeOfRawData < VirtualSize)
|
||||
{
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrLoadImage(): SORD %d < VS %d\n", SizeOfRawData, VirtualSize);
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrLoadImage(): SORD %d < VS %d\n", SizeOfRawData, VirtualSize);
|
||||
RtlZeroMemory((PVOID)(SectionHeader->VirtualAddress + (ULONG)PhysicalBase + SizeOfRawData), VirtualSize - SizeOfRawData);
|
||||
}
|
||||
|
||||
|
@ -423,7 +423,7 @@ WinLdrLoadImage(IN PCHAR FileName,
|
|||
/* Relocate the image, if it needs it */
|
||||
if (NtHeaders->OptionalHeader.ImageBase != (ULONG)VirtualBase)
|
||||
{
|
||||
DPRINTM(DPRINT_WINDOWS, "Relocating %p -> %p\n",
|
||||
DPRINTM(DPRINT_PELOADER, "Relocating %p -> %p\n",
|
||||
NtHeaders->OptionalHeader.ImageBase, VirtualBase);
|
||||
Status = (BOOLEAN)LdrRelocateImageWithBias(PhysicalBase,
|
||||
(ULONG_PTR)VirtualBase - (ULONG_PTR)PhysicalBase,
|
||||
|
@ -453,7 +453,7 @@ WinLdrpCompareDllName(IN PCH DllName,
|
|||
UnicodeNamePA.Length = UnicodeName->Length;
|
||||
UnicodeNamePA.MaximumLength = UnicodeName->MaximumLength;
|
||||
UnicodeNamePA.Buffer = VaToPa(UnicodeName->Buffer);
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrpCompareDllName: %s and %wZ, Length = %d "
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrpCompareDllName: %s and %wZ, Length = %d "
|
||||
"UN->Length %d\n", DllName, &UnicodeNamePA, Length, UnicodeName->Length);
|
||||
|
||||
if ((Length * sizeof(WCHAR)) > UnicodeName->Length)
|
||||
|
@ -500,13 +500,13 @@ WinLdrpBindImportName(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
LONG High, Low, Middle, Result;
|
||||
ULONG Hint;
|
||||
|
||||
//DPRINTM(DPRINT_WINDOWS, "WinLdrpBindImportName(): DllBase 0x%X, ImageBase 0x%X, ThunkData 0x%X, ExportDirectory 0x%X, ExportSize %d, ProcessForwards 0x%X\n",
|
||||
//DPRINTM(DPRINT_PELOADER, "WinLdrpBindImportName(): DllBase 0x%X, ImageBase 0x%X, ThunkData 0x%X, ExportDirectory 0x%X, ExportSize %d, ProcessForwards 0x%X\n",
|
||||
// DllBase, ImageBase, ThunkData, ExportDirectory, ExportSize, ProcessForwards);
|
||||
|
||||
/* Check passed DllBase param */
|
||||
if(DllBase == NULL)
|
||||
{
|
||||
DPRINTM(DPRINT_WINDOWS, "WARNING: DllBase == NULL!\n");
|
||||
DPRINTM(DPRINT_PELOADER, "WARNING: DllBase == NULL!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -518,7 +518,7 @@ WinLdrpBindImportName(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
{
|
||||
/* Yes, calculate the ordinal */
|
||||
Ordinal = (ULONG)(IMAGE_ORDINAL(ThunkData->u1.Ordinal) - (UINT32)ExportDirectory->Base);
|
||||
//DPRINTM(DPRINT_WINDOWS, "WinLdrpBindImportName(): Ordinal %d\n", Ordinal);
|
||||
//DPRINTM(DPRINT_PELOADER, "WinLdrpBindImportName(): Ordinal %d\n", Ordinal);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -526,22 +526,22 @@ WinLdrpBindImportName(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
if (!ProcessForwards)
|
||||
{
|
||||
/* AddressOfData in thunk entry will become a virtual address (from relative) */
|
||||
//DPRINTM(DPRINT_WINDOWS, "WinLdrpBindImportName(): ThunkData->u1.AOD was %p\n", ThunkData->u1.AddressOfData);
|
||||
//DPRINTM(DPRINT_PELOADER, "WinLdrpBindImportName(): ThunkData->u1.AOD was %p\n", ThunkData->u1.AddressOfData);
|
||||
ThunkData->u1.AddressOfData =
|
||||
(ULONG)RVA(ImageBase, ThunkData->u1.AddressOfData);
|
||||
//DPRINTM(DPRINT_WINDOWS, "WinLdrpBindImportName(): ThunkData->u1.AOD became %p\n", ThunkData->u1.AddressOfData);
|
||||
//DPRINTM(DPRINT_PELOADER, "WinLdrpBindImportName(): ThunkData->u1.AOD became %p\n", ThunkData->u1.AddressOfData);
|
||||
}
|
||||
|
||||
/* Get pointers to Name and Ordinal tables (RVA -> VA) */
|
||||
NameTable = (PULONG)VaToPa(RVA(DllBase, ExportDirectory->AddressOfNames));
|
||||
OrdinalTable = (PUSHORT)VaToPa(RVA(DllBase, ExportDirectory->AddressOfNameOrdinals));
|
||||
|
||||
//DPRINTM(DPRINT_WINDOWS, "NameTable 0x%X, OrdinalTable 0x%X, ED->AddressOfNames 0x%X, ED->AOFO 0x%X\n",
|
||||
//DPRINTM(DPRINT_PELOADER, "NameTable 0x%X, OrdinalTable 0x%X, ED->AddressOfNames 0x%X, ED->AOFO 0x%X\n",
|
||||
// NameTable, OrdinalTable, ExportDirectory->AddressOfNames, ExportDirectory->AddressOfNameOrdinals);
|
||||
|
||||
/* Get the hint, convert it to a physical pointer */
|
||||
Hint = ((PIMAGE_IMPORT_BY_NAME)VaToPa((PVOID)ThunkData->u1.AddressOfData))->Hint;
|
||||
//DPRINTM(DPRINT_WINDOWS, "HintIndex %d\n", Hint);
|
||||
//DPRINTM(DPRINT_PELOADER, "HintIndex %d\n", Hint);
|
||||
|
||||
/* If Hint is less than total number of entries in the export directory,
|
||||
and import name == export name, then we can just get it from the OrdinalTable */
|
||||
|
@ -554,14 +554,14 @@ WinLdrpBindImportName(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
)
|
||||
{
|
||||
Ordinal = OrdinalTable[Hint];
|
||||
//DPRINTM(DPRINT_WINDOWS, "WinLdrpBindImportName(): Ordinal %d\n", Ordinal);
|
||||
//DPRINTM(DPRINT_PELOADER, "WinLdrpBindImportName(): Ordinal %d\n", Ordinal);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* It's not the easy way, we have to lookup import name in the name table.
|
||||
Let's use a binary search for this task. */
|
||||
|
||||
//DPRINTM(DPRINT_WINDOWS, "WinLdrpBindImportName() looking up the import name using binary search...\n");
|
||||
//DPRINTM(DPRINT_PELOADER, "WinLdrpBindImportName() looking up the import name using binary search...\n");
|
||||
|
||||
/* Low boundary is set to 0, and high boundary to the maximum index */
|
||||
Low = 0;
|
||||
|
@ -577,11 +577,11 @@ WinLdrpBindImportName(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
Result = strcmp(VaToPa(&((PIMAGE_IMPORT_BY_NAME)VaToPa((PVOID)ThunkData->u1.AddressOfData))->Name[0]),
|
||||
(PCHAR)VaToPa(RVA(DllBase, NameTable[Middle])));
|
||||
|
||||
/*DPRINTM(DPRINT_WINDOWS, "Binary search: comparing Import '__', Export '%s'\n",*/
|
||||
/*DPRINTM(DPRINT_PELOADER, "Binary search: comparing Import '__', Export '%s'\n",*/
|
||||
/*VaToPa(&((PIMAGE_IMPORT_BY_NAME)VaToPa(ThunkData->u1.AddressOfData))->Name[0]),*/
|
||||
/*(PCHAR)VaToPa(RVA(DllBase, NameTable[Middle])));*/
|
||||
|
||||
/*DPRINTM(DPRINT_WINDOWS, "TE->u1.AOD %p, fulladdr %p\n",
|
||||
/*DPRINTM(DPRINT_PELOADER, "TE->u1.AOD %p, fulladdr %p\n",
|
||||
ThunkData->u1.AddressOfData,
|
||||
((PIMAGE_IMPORT_BY_NAME)VaToPa(ThunkData->u1.AddressOfData))->Name );*/
|
||||
|
||||
|
@ -608,21 +608,21 @@ WinLdrpBindImportName(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
if (High < Low)
|
||||
{
|
||||
//Print(L"Error in binary search\n");
|
||||
DPRINTM(DPRINT_WINDOWS, "Error in binary search!\n");
|
||||
DPRINTM(DPRINT_PELOADER, "Error in binary search!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Everything allright, get the ordinal */
|
||||
Ordinal = OrdinalTable[Middle];
|
||||
|
||||
//DPRINTM(DPRINT_WINDOWS, "WinLdrpBindImportName() found Ordinal %d\n", Ordinal);
|
||||
//DPRINTM(DPRINT_PELOADER, "WinLdrpBindImportName() found Ordinal %d\n", Ordinal);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check ordinal number for validity! */
|
||||
if (Ordinal >= ExportDirectory->NumberOfFunctions)
|
||||
{
|
||||
DPRINTM(DPRINT_WINDOWS, "Ordinal number is invalid!\n");
|
||||
DPRINTM(DPRINT_PELOADER, "Ordinal number is invalid!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -647,12 +647,12 @@ WinLdrpBindImportName(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
/* Strip out its extension */
|
||||
*strchr(ForwardDllName,'.') = '\0';
|
||||
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrpBindImportName(): ForwardDllName %s\n", ForwardDllName);
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrpBindImportName(): ForwardDllName %s\n", ForwardDllName);
|
||||
if (!WinLdrCheckForLoadedDll(WinLdrBlock, ForwardDllName, &DataTableEntry))
|
||||
{
|
||||
/* We can't continue if DLL couldn't be loaded, so bomb out with an error */
|
||||
//Print(L"Error loading DLL!\n");
|
||||
DPRINTM(DPRINT_WINDOWS, "Error loading DLL!\n");
|
||||
DPRINTM(DPRINT_PELOADER, "Error loading DLL!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -728,7 +728,7 @@ WinLdrpLoadAndScanReferencedDll(PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
strcpy(FullDllName, DirectoryPath);
|
||||
strcat(FullDllName, ImportName);
|
||||
|
||||
DPRINTM(DPRINT_WINDOWS, "Loading referenced DLL: %s\n", FullDllName);
|
||||
DPRINTM(DPRINT_PELOADER, "Loading referenced DLL: %s\n", FullDllName);
|
||||
//Print(L"Loading referenced DLL: %s\n", FullDllName);
|
||||
|
||||
/* Load the image */
|
||||
|
@ -736,7 +736,7 @@ WinLdrpLoadAndScanReferencedDll(PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
|
||||
if (!Status)
|
||||
{
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrLoadImage() failed\n");
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrLoadImage() failed\n");
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -749,20 +749,20 @@ WinLdrpLoadAndScanReferencedDll(PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
|
||||
if (!Status)
|
||||
{
|
||||
DPRINTM(DPRINT_WINDOWS,
|
||||
DPRINTM(DPRINT_PELOADER,
|
||||
"WinLdrAllocateDataTableEntry() failed with Status=0x%X\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Scan its dependencies too */
|
||||
DPRINTM(DPRINT_WINDOWS,
|
||||
DPRINTM(DPRINT_PELOADER,
|
||||
"WinLdrScanImportDescriptorTable() calling ourselves for %S\n",
|
||||
VaToPa((*DataTableEntry)->BaseDllName.Buffer));
|
||||
Status = WinLdrScanImportDescriptorTable(WinLdrBlock, DirectoryPath, *DataTableEntry);
|
||||
|
||||
if (!Status)
|
||||
{
|
||||
DPRINTM(DPRINT_WINDOWS,
|
||||
DPRINTM(DPRINT_PELOADER,
|
||||
"WinLdrScanImportDescriptorTable() failed with Status=0x%X\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
@ -780,7 +780,7 @@ WinLdrpScanImportAddressTable(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
BOOLEAN Status;
|
||||
ULONG ExportSize;
|
||||
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrpScanImportAddressTable(): DllBase 0x%X, "
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrpScanImportAddressTable(): DllBase 0x%X, "
|
||||
"ImageBase 0x%X, ThunkData 0x%X\n", DllBase, ImageBase, ThunkData);
|
||||
|
||||
/* Obtain the export table from the DLL's base */
|
||||
|
@ -798,7 +798,7 @@ WinLdrpScanImportAddressTable(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
|
|||
&ExportSize);
|
||||
}
|
||||
|
||||
DPRINTM(DPRINT_WINDOWS, "WinLdrpScanImportAddressTable(): ExportDirectory 0x%X\n", ExportDirectory);
|
||||
DPRINTM(DPRINT_PELOADER, "WinLdrpScanImportAddressTable(): ExportDirectory 0x%X\n", ExportDirectory);
|
||||
|
||||
/* If pointer to Export Directory is */
|
||||
if (ExportDirectory == NULL)
|
||||
|
|
Loading…
Reference in a new issue