KiProcessControlProtection
NTSTATUS __stdcall KiProcessControlProtection(INT64 a1){
unsigned __int8 CurrentIrql;
unsigned __int64 v2;
unsigned __int64 v3;
INT64 v5;
NTSTATUS v6;
__int64 v7;
v7 = *(_QWORD *)(a1 + 360);
v6 = 2;
CurrentIrql = KeGetCurrentIrql();
if( !CurrentIrql )
{
KeGetCurrentIrql();
__writecr8(1ui64);
}
if( *(_WORD *)(a1 + 368) == 51 && *(_QWORD *)(a1 + 352) == 1i64 )
{
v2 = __readmsr(0x6A7u);
if( (v2 & 7) == 0 )
{
v3 = *(_QWORD *)(a1 + 384);
if( (v3 & 7) != 0 )
ExRaiseDatatypeMisalignment();
if( v3 + 8 > 0x7FFFFFFF0000i64 || v3 + 8 < v3 )
MEMORY[0x7FFFFFFF0000] = 0;
v5 = *(_QWORD *)v3;
if( (unsigned __int64)(*(_QWORD *)v3 - 0x10000i64) <= 0x7FFFFFFDFFFFi64
&& (unsigned __int64)(v7 - 0x10000) <= 0x7FFFFFFDFFFFi64 )
{
if( v5 == KeRaiseExceptionForReturnAddressHijack )
{
*(_QWORD *)v3 = *(_QWORD *)v2;
v6 = 3;
}
else
{
do
{
v2 += 8i64;
if( *(_QWORD *)v2 < 0x10000ui64 )
break;
if( *(_QWORD *)v2 == v5 )
{
__writemsr(0x6A7u, v2);
v6 = 1;
break;
}
}
while( (v2 & 0xFFF) != 0 || (*(_DWORD *)&KeGetCurrentThread()[1].gapD8[8] & 1) == 0 );
}
}
}
}
if( !CurrentIrql )
__writecr8(0i64);
return v6;
}Referenced by:
KiControlProtectionFault