KiMceDispatch
INT64 __fastcall KiMceDispatch(_QWORD *a1, UINT64 a2){
__m128i *v3;
int v4;
__int64 v5;
__int64 v6;
__int64 v7;
_QWORD *v8;
__m128i v9;
int v10;
int v11;
unsigned int v12;
unsigned __int64 *v13;
unsigned __int64 v14;
char v15;
unsigned __int64 v16;
__int64 v17;
unsigned __int64 v18;
_QWORD *v19;
int v20;
_BYTE *v21;
char *v22;
__int64 v23;
char v24;
int v26[8];
__int64 v27;
INT64 v28;
v3 = (__m128i *)*((_QWORD *)KeGetPcr() + 7);
v4 = *((_DWORD *)KeGetPcr() + 105);
v5 = *((_QWORD *)KeGetPcr() + 1);
LODWORD(v27) = v3[4];
HIDWORD(v27) = _mm_cvtsi128_si32(_mm_srli_si128(v3[4], 8));
v6 = v27;
v7 = *(_QWORD *)(v27 + 5120);
v8 = *(_QWORD **)(v27 + 5128);
v9 = _mm_srli_si128(*(__m128i *)(v27 + 16 * ((unsigned int)a2 + 32i64)), 8);
LODWORD(v28) = *(_OWORD *)(v27 + 16 * ((unsigned int)a2 + 32i64));
HIDWORD(v28) = _mm_cvtsi128_si32(v9);
_InterlockedOr((volatile signed __int32 *)(v6 + 5168), 1u);
v10 = *(_DWORD *)(v6 + 5172);
if( v4 != v10 )
{
while( (*(_DWORD *)(v6 + 5168) & 2) != 0 )
_mm_pause();
_InterlockedOr(v26, 0);
v10 = *(_DWORD *)(v6 + 5172);
}
v11 = 4096;
if( v4 == v10 )
{
if( (*(_DWORD *)(v7 + 2452) & 0x20000) == 0 )
{
**(_QWORD **)(v7 + 1216) = 0xA3A03F5891C8B4E8ui64;
**(_QWORD **)(v7 + 1224) = 0i64;
**(_QWORD **)(v7 + 1232) = 0i64;
**(_QWORD **)(v7 + 1240) = 0i64;
}
v12 = 1;
v13 = (unsigned __int64 *)(v5 + 36);
do
{
v14 = *v13;
if( *v13 )
{
v15 = *(_BYTE *)(v7 + 2171);
v16 = a1[3];
v17 = *(unsigned int *)(v7 + 2228);
if( (v15 & 8) != 0 )
v17 = 464i64;
if( v16 <= v14 && v16 > v14 - v17 )
break;
if( (v15 & 8) != 0 )
{
v18 = *(_QWORD *)(v14 + 8);
if( v16 <= v18 && v16 > v18 - (unsigned int)(*(_DWORD *)(v7 + 2228) - 32) )
break;
}
}
++v12;
++v13;
}
while( v12 < 8 );
if( v12 == 8 && *a1 - (_QWORD)v8 < 0x1000ui64 )
{
v19 = (_QWORD *)a1[3];
if( *v19 == v7 + 2201 )
{
*a1 = *v19;
a1[3] = v19 + 1;
}
}
v20 = 4;
*(_QWORD *)(v7 + 2206) = 0xC3C3C3C3C3C3C3C3ui64;
v21 = (_BYTE *)(v7 + 2214);
do
{
*v21++ = -61;
--v20;
}
while( v20 );
_InterlockedAnd((volatile signed __int32 *)(v6 + 5168), 0xFFFFFFFD);
}
if( (*(_DWORD *)(v6 + 5168) & 4) == 0 )
{
v22 = (char *)(v6 + 1024);
v23 = 512i64;
do
{
v11 -= 8;
*v8 = *(_QWORD *)v22;
v22 += 8;
++v8;
--v23;
}
while( v23 );
for( ; v11; --v11 )
{
v24 = *v22++;
*(_BYTE *)v8 = v24;
v8 = (_QWORD *)((char *)v8 + 1);
}
}
*(_QWORD *)(v6 + 5136) = v7 + 2170;
return v28;
}Referenced by:
KiMceLinkage