MiFillMapFileInfo

INT64 __fastcall MiFillMapFileInfo(INT64 a1, INT64 a2){
  unsigned __int64 *v3; 
  int v5; 
  unsigned __int64 v6; 
  __int64 v7; 
  unsigned __int64 v8; 
  _FILE_OBJECT *v9; 
  unsigned int SessionId; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  INT64 result; 
  _SUBSECTION *ContainingSubsection; 
  v3 = (unsigned __int64 *)(a2 + 16);
  ContainingSubsection = 0i64;
  v5 = *(_DWORD *)(a1 + 48);
  v6 = *(_QWORD *)(a1 + 112) & 0xFFFFFFFFFFFFFFFEui64;
  v7 = **(_QWORD **)(a1 + 72);
  v8 = *(unsigned int *)(a1 + 24) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 32) << 32);
  *(_QWORD *)(a2 + 16) = 0i64;
  if( *(_QWORD *)(v7 + 64) )
  {
    v9 = MiReferenceControlAreaFile((_CONTROL_AREA *)v7);
    *(_QWORD *)(a2 + 8) = v9->FsContext;
    MiDereferenceControlAreaFile(v7, (unsigned __int64)v9);
    MiGetProtoPteAddress((_MMVAD *)a1, v8, 0i64, &ContainingSubsection);
    SessionId = MmGetSessionIdEx(v6);
    v11 = *v3 ^ (MiStartingOffset((__int64)ContainingSubsection, *(_QWORD *)(a1 + 80), SessionId) ^ *v3) & 0xFFFFFFFFFFFFi64;
    *v3 = v11;
    if( (v5 & 0x70) == 32 )
    {
      if( (*(_DWORD *)(a1 + 48) & 0xF80) == 896 )
      {
        v12 = v11 & 0xFF7FFFFFFFFFFFFFui64;
        v13 = 0x40000000000000i64;
      }
      else
      {
        v12 = v11 & 0xFFBFFFFFFFFFFFFFui64;
        v13 = 0x80000000000000i64;
      }
      v14 = v13 | v12;
    }
    else
    {
      v14 = v11 & 0xFF3FFFFFFFFFFFFFui64;
    }
  }
  else
  {
    v14 = 0xC0000000000000i64;
    *(_QWORD *)(a2 + 8) = *(_QWORD *)(a1 + 80);
  }
  *v3 = v14;
  v15 = ((unsigned __int64)(*(_DWORD *)(a1 + 64) & 0x1000000) << 29) | *v3 & 0xFFDFFFFFFFFFFFFFui64;
  *v3 = v15;
  *(_DWORD *)(a2 + 40) = *(_DWORD *)(v6 + 1088);
  *(_QWORD *)a2 = v8 << 12;
  *(_QWORD *)(a2 + 24) = ((*(unsigned int *)(a1 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 33) << 32))
                        - (*(unsigned int *)(a1 + 24) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 32) << 32))
                        + 1) << 12;
  *v3 = v15 ^ (v15 ^ ((unsigned __int64)*(unsigned int *)(a1 + 48) << 41)) & 0x1F000000000000i64;
  result = *(unsigned int *)(a1 + 52);
  LODWORD(result) = result & 0x7FFFFFFF;
  *(_QWORD *)(a2 + 32) = (result | ((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31)) << 12;
  return result;
}

Referenced by:

MiLogMapFileEvent
MmEnumerateAddressSpaceAndReferenceImages