LdrRelocateImageWithBias
UINT32 __stdcall LdrRelocateImageWithBias(
PVOID NewAddress,
LONGLONG AdditionalBias,
PCCH LoaderName,
UINT32 Success,
UINT32 Conflict,
UINT32 Invalid){
UINT32 v6;
IMAGE_NT_HEADERS *v8;
unsigned __int16 Magic;
unsigned __int64 ImageBase_high;
_IMAGE_BASE_RELOCATION *v11;
int v12;
DWORD SizeOfBlock;
IMAGE_NT_HEADERS *v15;
UINT64 Size;
v6 = 0;
LODWORD(Size) = 0;
v15 = 0i64;
if( RtlImageNtHeaderEx(1ui64, NewAddress, 0i64, &v15) < 0 )
return -1073741701;
v8 = v15;
Magic = v15->OptionalHeader.Magic;
if( Magic == 267 )
{
ImageBase_high = HIDWORD(v15->OptionalHeader.ImageBase);
}
else
{
if( Magic != 523 )
return -1073741701;
ImageBase_high = v15->OptionalHeader.ImageBase;
}
LODWORD(v11) = RtlImageDirectoryEntryToData(NewAddress, 1u, 5u, &Size);
if( !v11 )
return(v8->FileHeader.Characteristics & 1) != 0 ? 0xC0000018 : 0;
v12 = Size;
if( !(_DWORD)Size )
return(v8->FileHeader.Characteristics & 1) != 0 ? 0xC0000018 : 0;
while( 1 )
{
SizeOfBlock = v11->SizeOfBlock;
v12 -= SizeOfBlock;
v11 = LdrProcessRelocationBlockLongLong(
v8->FileHeader.Machine,
(UINT64)NewAddress + v11->VirtualAddress,
(SizeOfBlock - 8) >> 1,
(UINT16 *)&v11[1],
(INT64)NewAddress - ImageBase_high);
if( !v11 )
break;
if( !v12 )
return v6;
}
return -1073741701;
}Referenced by:
MiMapSystemImageWithLargePage