KiIpiProcessRequests
UINT8 __stdcall KiIpiProcessRequests(KTRAP_FRAME *TrapFrame, KTRAP_FRAME *ExceptionFrame){
struct _KPRCB *CurrentPrcb;
UINT8 result;
char *v4;
__int64 v5;
char *v6;
__int64 v7;
__int64 v8;
unsigned __int64 v9;
__int64 v10;
void **v11;
int v12;
unsigned __int64 v13;
unsigned __int64 v14;
__int64 v15;
unsigned __int64 v16;
__int64 v17;
unsigned __int64 v18;
__int64 v19;
void *v20;
unsigned __int64 v21;
__int64 v22;
__int64 v23;
unsigned __int64 v24;
unsigned __int64 v25;
_QWORD v26[2];
_QWORD v27[2];
_QWORD v28[2];
UINT64 SysCallReturnValue[2];
__int128 v30;
CurrentPrcb = KeGetCurrentPrcb();
result = 0;
_m_prefetchw((char *)CurrentPrcb + 35904);
if( *((_QWORD *)CurrentPrcb + 4488) )
{
v4 = (char *)_InterlockedExchange64((volatile __int64 *)CurrentPrcb + 4488, 0i64);
if( v4 )
{
while( 1 )
{
v5 = v4 - (char *)CurrentPrcb - 44736;
v6 = v4;
v4 = *(char **)v4;
*(_OWORD *)SysCallReturnValue = 0i64;
v30 = 0i64;
v7 = (__int64)*(&KiProcessorBlock + (unsigned int)(v5 >> 6));
v22 = v7;
v8 = *((_QWORD *)v6 + 1);
if( (v8 & 0xF) == 4 )
{
v10 = v8 >> 7;
v11 = *(void ***)v10;
v12 = (1 << *(_DWORD *)(v10 + 12)) & 0xA;
v13 = *(_QWORD *)v10 + 8i64 * *(unsigned int *)(v10 + 8);
v25 = v13;
do
{
v14 = (unsigned __int64)*v11;
if( v12 && KiFlushPcid && !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
{
if( (KiFlushPcid & 2) != 0 )
{
v27[0] = 1i64;
v27[1] = v14;
_invpcid(0, v27);
}
else
{
KiSetUserTbFlushPending();
v13 = v25;
}
}
__invlpg((void *)v14);
v15 = 4096i64 << (9 * ((unsigned __int8)(v14 >> 10) & 3u));
v16 = v14 & 0x3FF;
v23 = v15;
v24 = v16;
if( (v14 & 0x3FF) != 0 )
{
do
{
v14 += v15;
if( v12 && KiFlushPcid )
{
if( !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
{
if( (KiFlushPcid & 2) != 0 )
{
v28[0] = 1i64;
v28[1] = v14;
_invpcid(0, v28);
}
else
{
KiSetUserTbFlushPending();
v16 = v24;
}
}
v15 = v23;
}
__invlpg((void *)v14);
v24 = --v16;
}
while( v16 );
v13 = v25;
}
++v11;
}
while( (unsigned __int64)v11 < v13 );
}
else
{
switch( v8 & 0xF )
{
case 1i64:
goto LABEL_5;
case 2i64:
v19 = v8 >> 7;
v20 = *(void **)v19;
if( ((1 << *(_DWORD *)(v19 + 8)) & 0xA) == 0
|| !KiFlushPcid
|| *(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
{
goto LABEL_35;
}
if( (KiFlushPcid & 2) != 0 )
{
v26[0] = 1i64;
v26[1] = v20;
_invpcid(0, v26);
__invlpg(v20);
}
else
{
KiSetUserTbFlushPending();
v7 = v22;
LABEL_35:
__invlpg(v20);
}
goto LABEL_13;
case 3i64:
if( !KiFlushPcid )
{
v21 = __readcr4();
if( (v21 & 0x20080) != 0 )
{
__writecr4(v21 ^ 0x80);
__writecr4(v21);
}
else
{
LABEL_5:
v9 = __readcr3();
__writecr3(v9);
}
goto LABEL_13;
}
v18 = __readcr3();
__writecr3(v18);
if( *(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
goto LABEL_13;
KiSetUserTbFlushPending();
break;
default:
__fastfail(0x25u);
}
}
v7 = v22;
LABEL_13:
if( _InterlockedExchangeAdd(*((volatile signed __int32 **)v6 + 6), 0xFFFFFFFF) == 1
&& _InterlockedExchangeAdd((volatile signed __int32 *)(v7 + 11652), 0xFFFFFFFF) == 1 )
{
*(_DWORD *)(v7 + 11648) = 0;
}
v17 = *((_QWORD *)CurrentPrcb + 4247);
result = 1;
if( v17 )
_InterlockedDecrement((volatile signed __int32 *)(v17 + 32));
if( !v4 )
{
v4 = (char *)_InterlockedExchange64((volatile __int64 *)CurrentPrcb + 4488, 0i64);
if( !v4 )
break;
}
}
}
}
return result;
}Referenced by:
KiIpiInterruptSubDispatch