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