MiInitializeHardFaultPfn
INT64 __fastcall MiInitializeHardFaultPfn(INT64 a1, INT64 a2, UINT64 a3, INT64 a4, INT64 a5){
int v6;
UINT64 ContainingPageTable;
char v10;
INT64 v11;
int v12;
char v13;
int v14;
__int64 v15;
INT64 v16;
INT64 result;
UINT64 SpinCount;
v6 = a4;
ContainingPageTable = MiGetContainingPageTable(a3);
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;
v10 = *(_BYTE *)(a1 + 34) | 0x20;
*(_WORD *)(a1 + 32) = 1;
*(_BYTE *)(a1 + 34) = v10;
v11 = a2 + 32;
if( !a2 )
v11 = 0i64;
*(_QWORD *)a1 = v11;
v12 = *(_DWORD *)(a2 + 192) >> 9;
v13 = *(_BYTE *)(a1 + 35) & 0xF8;
v14 = *(_DWORD *)(a2 + 192) >> 12;
*(_QWORD *)(a1 + 8) = a3;
if( v6 )
LOBYTE(v14) = v12;
v15 = (ContainingPageTable ^ *(_QWORD *)(a1 + 40)) & 0xFFFFFFFFFi64;
*(_BYTE *)(a1 + 35) = v13 | v14 & 7;
*(_QWORD *)(a1 + 40) ^= v15;
v16 = (unsigned int)a5;
*(_BYTE *)(a1 + 34) = *(_BYTE *)(a1 + 34) & 0xF8 | 2;
if( *(unsigned __int8 *)(a1 + 34) >> 6 != (_DWORD)v16 )
MiChangePageAttribute(a1, v16, 1);
MiSetPfnTbFlushStamp((_MMPFN *)a1, 0i64, 1ui64);
*(_QWORD *)(a1 + 24) &= 0xC000000000000000ui64;
result = 0x7FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
return result;
}Referenced by:
MiBuildMdlForMappedFileFault