KiMcheckFastForward
NTSTATUS __stdcall KiMcheckFastForward(PVOID BugCheckParameter4){
char v1;
char v2;
char *v3;
unsigned int v4;
UINT64 v5;
unsigned __int64 v6;
struct _KPRCB *CurrentPrcb;
__int64 v8;
int v9;
__int64 v10;
__int64 v11;
__int64 v12;
__int64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
v2 = v1;
v3 = (char *)BugCheckParameter4;
v4 = 0;
if( (*((_BYTE *)BugCheckParameter4 + 368) & 1) == 0 )
{
if( KiRspInIstStack(3ui64, *((_QWORD *)BugCheckParameter4 + 48)) )
_InterlockedAdd(&KiMcheckRecursive, 1u);
if( KiRspInIstStack(2ui64, v5) )
{
v4 |= 2u;
_InterlockedAdd(&dword_140C2AD64, 1u);
}
v6 = *((_QWORD *)v3 + 45);
if( v6 >= (unsigned __int64)&KiMcheckExitMceTailMceBegin && v6 < (unsigned __int64)&KiMcheckExitMceTailMceEnd )
{
v4 |= 4u;
_InterlockedAdd(&dword_140C2AD68, 1u);
}
if( v6 >= (unsigned __int64)&KiMcheckExitMceTailNmiBegin && v6 < (unsigned __int64)KiMcheckExitMceTailNmiEnd )
{
v4 |= 4u;
_InterlockedAdd(&dword_140C2AD68, 1u);
}
if( (_BYTE)KiKvaShadow )
{
if( v6 >= (unsigned __int64)&KiKernelIstMceExitMceTailMceBegin
&& v6 < (unsigned __int64)&KiKernelIstMceExitMceTailMceEnd )
{
v4 |= 4u;
_InterlockedAdd(&dword_140C2AD6C, 1u);
}
if( (_BYTE)KiKvaShadow
&& v6 >= (unsigned __int64)&KiKernelIstMceExitMceTailNmiBegin
&& v6 < (unsigned __int64)&KiKernelIstMceExitMceTailNmiEnd )
{
v4 |= 4u;
_InterlockedAdd(&dword_140C2AD6C, 1u);
}
}
}
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(v8) = v4 & 1;
if( v2 || (v4 & 1) != 0 )
{
_InterlockedAdd(&dword_140C2AD78, 1u);
if( (v4 & 1) != 0 )
_InterlockedAdd(&dword_140C2AD80, 1u);
v9 = 1;
}
else
{
_InterlockedAdd(&dword_140C2AD7C, 1u);
v9 = 0;
}
v10 = 0i64;
if( (_BYTE)KiKvaShadow )
{
v11 = *((_QWORD *)CurrentPrcb - 47);
if( !v2 )
{
v10 = *(_QWORD *)(v11 + 44);
goto LABEL_29;
}
v10 = *(_QWORD *)(v11 + 52);
}
if( !v2 )
{
LABEL_29:
v12 = 36048i64;
if( v9 )
goto LABEL_31;
goto LABEL_30;
}
if( (v4 & 1) != 0 )
KeBugCheckEx(0x111u, v4, *((_QWORD *)v3 + 48), *((_QWORD *)v3 + 45), (ULONG_PTR)v3);
LABEL_30:
v12 = 35968i64;
LABEL_31:
if( (v4 & 4) != 0 )
{
_InterlockedAdd(&dword_140C2AD84, 1u);
v13 = *(_QWORD *)((char *)CurrentPrcb + v12 + 64);
if( (_BYTE)KiKvaShadow )
{
*(_QWORD *)(v10 + 16) = v13;
*(_QWORD *)(v10 + 24) = *(_QWORD *)((char *)CurrentPrcb + v12 + 72);
if( (*((_BYTE *)CurrentPrcb + v12 + 72) & 3) != 0
&& *(_BYTE *)(*(_QWORD *)(*((_QWORD *)CurrentPrcb + 1) + 544i64) + 912i64) != 1 )
{
_InterlockedAdd(&dword_140C2AD88, 1u);
_interlockedbittestandreset((volatile signed __int32 *)CurrentPrcb + 9126, 0);
v14 = __readcr4();
if( (v14 & 0x20080) != 0 )
{
__writecr4(v14 ^ 0x80);
__writecr4(v14);
}
else
{
v15 = __readcr3();
__writecr3(v15);
}
}
}
else
{
*((_QWORD *)v3 + 13) = v13;
}
*(_OWORD *)(v3 + 360) = *(_OWORD *)((char *)CurrentPrcb + v12);
*(_OWORD *)(v3 + 376) = *(_OWORD *)((char *)CurrentPrcb + v12 + 16);
*((_QWORD *)v3 + 49) = *(_QWORD *)((char *)CurrentPrcb + v12 + 32);
*((_QWORD *)v3 + 6) = *(_QWORD *)((char *)CurrentPrcb + v12 + 40);
*((_QWORD *)v3 + 7) = *(_QWORD *)((char *)CurrentPrcb + v12 + 48);
v8 = *(_QWORD *)((char *)CurrentPrcb + v12 + 56);
*((_QWORD *)v3 + 8) = v8;
_InterlockedAdd(&dword_140C2AD74, 1u);
*(_WORD *)((char *)CurrentPrcb + v12 + 8) = 0;
}
if( !v2 )
{
_InterlockedAdd(&dword_140C2AD70, 1u);
*(_OWORD *)((char *)CurrentPrcb + v12) = *(_OWORD *)(v3 + 360);
*(_OWORD *)((char *)CurrentPrcb + v12 + 16) = *(_OWORD *)(v3 + 376);
*(_QWORD *)((char *)CurrentPrcb + v12 + 32) = *((_QWORD *)v3 + 49);
*(_QWORD *)((char *)CurrentPrcb + v12 + 40) = *((_QWORD *)v3 + 6);
*(_QWORD *)((char *)CurrentPrcb + v12 + 48) = *((_QWORD *)v3 + 7);
*(_QWORD *)((char *)CurrentPrcb + v12 + 56) = *((_QWORD *)v3 + 8);
v8 = *((_QWORD *)v3 + 13);
*(_QWORD *)((char *)CurrentPrcb + v12 + 64) = v8;
if( (_BYTE)KiKvaShadow )
{
*(_QWORD *)((char *)CurrentPrcb + v12 + 64) = *(_QWORD *)(v10 + 16);
v8 = *(_QWORD *)(v10 + 24);
*(_QWORD *)((char *)CurrentPrcb + v12 + 72) = v8;
}
}
return v8;
}Referenced by:
KiMcheckAbort
KiNmiInterruptStart