MiInitializeHardFaultPfn

NTSTATUS __stdcall MiInitializeHardFaultPfn(INT64 a1, INT64 a2, UINT64 a3, INT64 a4, INT64 NewCacheAttribute){
  int v6; 
  __int64 v9; 
  __int64 v10; 
  char v11; 
  INT64 v12; 
  int v13; 
  char v14; 
  int v15; 
  __int64 v16; 
  _MI_PFN_CACHE_ATTRIBUTE v17; 
  NTSTATUS result; 
  UINT64 SpinCount; 

  v6 = a4;
  LODWORD(v9) = MiGetContainingPageTable(a3);
  v10 = v9;
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 24), 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *(__int64 *)(a1 + 24) < 0 );
  }
  *(_QWORD *)(a1 + 24) &= 0xFFFFFFF000000000ui64;
  *(_QWORD *)(a1 + 40) |= 0x8000000000000000ui64;
  v11 = *(_BYTE *)(a1 + 34) | 0x20;
  *(_WORD *)(a1 + 32) = 1;
  *(_BYTE *)(a1 + 34) = v11;
  v12 = a2 + 32;
  if( !a2 )
    v12 = 0i64;
  *(_QWORD *)a1 = v12;
  v13 = *(_DWORD *)(a2 + 192) >> 9;
  v14 = *(_BYTE *)(a1 + 35) & 0xF8;
  v15 = *(_DWORD *)(a2 + 192) >> 12;
  *(_QWORD *)(a1 + 8) = a3;
  if( v6 )
    LOBYTE(v15) = v13;
  v16 = (v10 ^ *(_QWORD *)(a1 + 40)) & 0xFFFFFFFFFi64;
  *(_BYTE *)(a1 + 35) = v14 | v15 & 7;
  *(_QWORD *)(a1 + 40) ^= v16;
  v17 = (int)NewCacheAttribute;
  *(_BYTE *)(a1 + 34) = *(_BYTE *)(a1 + 34) & 0xF8 | 2;
  if( *(unsigned __int8 *)(a1 + 34) >> 6 != v17 )
    MiChangePageAttribute((_MMPFN *)a1, v17, 1ui64);
  MiSetPfnTbFlushStamp((_MMPFN *)a1, 0i64, 1ui64);
  *(_QWORD *)(a1 + 24) &= 0xC000000000000000ui64;
  result = -1;
  _InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
  return result;
}

Referenced by:

MiBuildMdlForMappedFileFault