From 35d933901773f6ab21f1313b794cd8c11e59c145 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 5 Dec 2006 18:28:08 +0000 Subject: [PATCH] A necessary hack for PE relocation within physical address space (in FreeLdr). Using it removes code duplication from FreeLdr / winldr. To get rid of this hack, either freeldr should be fully switched to virtual paged mode (which is not good) or code must be duplicated inside freeldr. svn path=/trunk/; revision=25070 --- reactos/lib/rtl/image.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/reactos/lib/rtl/image.c b/reactos/lib/rtl/image.c index 1df8af534c1..097115df5a5 100644 --- a/reactos/lib/rtl/image.c +++ b/reactos/lib/rtl/image.c @@ -226,6 +226,10 @@ LdrProcessRelocationBlockLongLong( return (PIMAGE_BASE_RELOCATION)TypeOffset; } +/* NOTE: When this function is called with LoaderName == "FLx86" + it's going to behave differently: it will perform all + relocations as needed, but will access only valid physical + addresses (not virtual addresses) */ ULONG NTAPI LdrRelocateImageWithBias( @@ -250,10 +254,10 @@ LdrRelocateImageWithBias( if (NtHeaders == NULL) return Invalid; - if (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_RELOCS_STRIPPED) + /*if (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_RELOCS_STRIPPED) { return Conflict; - } + }*/ RelocationDDir = &NtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; @@ -262,7 +266,19 @@ LdrRelocateImageWithBias( return Success; } - Delta = (ULONG_PTR)BaseAddress - NtHeaders->OptionalHeader.ImageBase + AdditionalBias; + /* ROS/FreeLoader/arch-specific stuff, for relocating while being in PA mode */ + if ((LoaderName != NULL) && (!strncmp(LoaderName, "FLx86", 5))) + { + /* Calculate it, converting BaseAddress to a virtual address */ + Delta = ((ULONG_PTR)BaseAddress | 0x80000000) - + NtHeaders->OptionalHeader.ImageBase + AdditionalBias; + } + else + { + /* Calculate it as usual */ + Delta = (ULONG_PTR)BaseAddress - NtHeaders->OptionalHeader.ImageBase + AdditionalBias; + } + RelocationDir = (PIMAGE_BASE_RELOCATION)((ULONG_PTR)BaseAddress + RelocationDDir->VirtualAddress); RelocationEnd = (PIMAGE_BASE_RELOCATION)((ULONG_PTR)RelocationDir + RelocationDDir->Size); -- 2.17.1