MiCreateFixupRecord
NTSTATUS __stdcall MiCreateFixupRecord(
_CONTROL_AREA *ControlArea,
VOID *ImageBase,
UINT64 RvaStart,
UINT64 SignificantOffset,
UINT64 FixupLength,
UINT16 *NextOffset,
_MI_DYNAMIC_RELOCATIONS *DynamicRelocations){
unsigned __int64 v7;
__int64 v9;
__int16 v10;
unsigned int v11;
int v12;
_WORD *Pool;
_WORD *v14;
unsigned int v15;
__int64 v16;
v7 = (unsigned int)RvaStart;
if( (unsigned int)(RvaStart + 4096) >> 12 >= ControlArea->Segment->TotalNumberOfPtes )
return -1073741819;
v9 = 0i64;
HIDWORD(v16) = 0;
v10 = *NextOffset >> 12;
v11 = 4096 - SignificantOffset;
if( (RvaStart & 0xFFF) < (unsigned int)(4096 - SignificantOffset) )
{
v12 = FixupLength;
if( (_DWORD)FixupLength == 4 )
{
LODWORD(v16) = *(_DWORD *)((char *)ImageBase + (unsigned int)RvaStart);
v9 = v16;
}
else
{
v9 = *(_QWORD *)((char *)ImageBase + (unsigned int)RvaStart);
}
}
else
{
*NextOffset &= 0xFFFu;
v12 = FixupLength;
}
Pool = MiAllocatePool(256i64, 0x20ui64, 0x72466D4Dui64);
v14 = Pool;
if( !Pool )
return -1073741670;
Pool[8] = v10;
v15 = v7 + v12;
*((_DWORD *)v14 + 3) = v7 + v12;
if( (v7 & 0xFFF) < v11 )
{
*((_DWORD *)v14 + 2) = v7;
*((_QWORD *)v14 + 3) = v9;
*(_QWORD *)(*(_QWORD *)DynamicRelocations + 8 * (v7 >> 12)) |= 1ui64;
v15 = *((_DWORD *)v14 + 3);
}
else
{
*((_DWORD *)v14 + 2) = (v7 & 0xFFFFF000) + 4096;
}
*(_QWORD *)(*(_QWORD *)DynamicRelocations + 8 * ((unsigned __int64)v15 >> 12)) |= 1ui64;
*(_QWORD *)v14 = *((_QWORD *)DynamicRelocations + 2);
*((_QWORD *)DynamicRelocations + 2) = v14;
return 0;
}Referenced by:
MiScanRelocationPage