MiScanRelocationPage
NTSTATUS __stdcall MiScanRelocationPage(
VOID *ImageBase,
UINT64 Rva,
UINT64 NumberOfEntries,
UINT16 *NextOffset,
_CONTROL_AREA *ControlArea,
_MI_DYNAMIC_RELOCATIONS *DynamicRelocations){
_CONTROL_AREA *v6;
__int64 v8;
unsigned int v9;
unsigned int v10;
int v11;
int v12;
int v13;
VOID *v14;
unsigned int i;
__int16 v16;
unsigned __int16 v17;
UINT64 v18;
NTSTATUS result;
unsigned int v20;
UINT64 FixupLength;
v6 = ControlArea;
v8 = (unsigned int)Rva;
v9 = 0;
v10 = 0;
v11 = 0;
v12 = 0;
v13 = NumberOfEntries;
v14 = ImageBase;
for( i = ControlArea->Segment->u2.ImageInformation->InternalImageInformation.SizeOfHeaders; v13; ++NextOffset )
{
--v13;
v16 = *NextOffset >> 12;
v17 = *NextOffset & 0xFFF;
if( v16 )
{
if( v16 == 3 )
{
if( v17 > 0xFFCu )
{
v11 = 1;
v9 = 2;
v10 = 4;
}
}
else
{
if( v16 != 10 )
return -1073741207;
if( v17 > 0xFF8u )
{
v11 = 1;
v10 = 8;
}
v20 = 0;
if( v17 <= 0xFF8u )
v20 = v9;
v9 = v20;
}
}
if( v16 )
{
if( (v8 & 0xFFF) != 0 && v17 + (unsigned int)(v8 & 0xFFF) > 0xFFE )
return -1073741207;
v18 = v17 + (unsigned int)v8;
if( (unsigned int)v18 < i )
return -1073741207;
}
else
{
v18 = (unsigned int)v8 + v17;
}
if( v11 == 1 )
{
if( v12 == 1 )
return -1073741701;
LODWORD(FixupLength) = v10;
result = MiCreateFixupRecord(v6, v14, v18, v9, FixupLength, NextOffset, DynamicRelocations);
if( result < 0 )
return result;
if( (MiFlags & 0x40000) != 0 && (v6->u2.WritableUserReferences & 0xC0000) != 0 )
{
ControlArea = 0i64;
if( (MiOffsetToProtos(v6, v8 + v17 + (unsigned __int64)v10, (UINT64 *)&ControlArea)->u.LongFlags & 4) != 0 )
return -1073741701;
}
v14 = ImageBase;
v11 = 0;
v12 = 1;
}
}
return 0;
}Referenced by:
MiRelocateImage