HalSendNMI
NTSTATUS __stdcall HalSendNMI(_KAFFINITY_EX *Affinity){
__int16 v2;
int v3;
unsigned __int16 Count;
unsigned __int8 v5;
unsigned __int16 i;
__int64 v7;
__int64 v8;
unsigned int *v9;
__int64 v10;
unsigned __int64 Mask;
int v12;
bool v13;
__int64(__fastcall *v14)(_QWORD, int *, __int128 *, _QWORD, __int64 *);
unsigned __int64 v15;
unsigned __int16 v16;
__int64 v17;
__int64(__fastcall *v18)(_QWORD, int *, __int128 *, _QWORD, __int64 *);
unsigned __int64 v19;
__int64 v20;
unsigned __int64 v21;
__int64(__fastcall *v22)(_QWORD, int *, __int128 *, _QWORD, __int64 *);
_PROCESSOR_NUMBER ProcNumber;
__int128 v25;
__int64 v26;
__int64 v27;
int v28[2];
int v29[2];
int v30[4];
__int64 v31;
__int64 v32;
__int64 v33;
_GROUP_AFFINITY Result;
unsigned __int16 v35;
__int16 v36[87];
int v37;
v27 = 0x2FFFFFFFFi64;
_disable();
v2 = v37;
v3 = v37 & 0x200;
Result = 0i64;
memset(v36, 0i64, 0xA6u);
v26 = 0i64;
Count = Affinity->Count;
v25 = 0i64;
if( dword_140C4B7A0.Count < Count )
Count = dword_140C4B7A0.Count;
v5 = 0;
v35 = Count;
for( i = 0; i < v35; *(_QWORD *)&v36[4 * v7 + 3] = qword_140C4B7A8[v7] & Affinity->Bitmap[v7] )
v7 = i++;
LODWORD(v8) = 20;
*(_DWORD *)&v36[1] = 0;
v36[0] = 20;
if( i < 0x14u )
{
do
{
v8 = i++;
*(_QWORD *)&v36[4 * v8 + 3] = 0i64;
}
while( i < (unsigned int)v36[0] );
}
if( !*(&CmpDummyThreadEvent + 7160) )
{
if( !*(&stru_140CF2E80 + 6616) )
{
v15 = Affinity->Bitmap[0];
v16 = 0;
LODWORD(v25) = 5;
DWORD2(v25) = 0;
while( 1 )
{
while( v15 )
{
_BitScanForward64((unsigned __int64 *)&v17, v15);
v15 &= ~(1i64 << v17);
LODWORD(v8) = 3 * KiProcessorNumberToIndexMappingTable[64 * v16 + (unsigned __int8)v17];
if( *(_DWORD *)(qword_140C50630
+ 24i64 * (unsigned int)KiProcessorNumberToIndexMappingTable[64 * v16 + (unsigned __int8)v17]) == 5 )
{
LODWORD(v8) = *(_DWORD *)(qword_140C50630
+ 24i64
* (unsigned int)KiProcessorNumberToIndexMappingTable[64 * v16 + (unsigned __int8)v17]
+ 8);
DWORD2(v25) |= v8;
}
}
if( ++v16 >= Affinity->Count )
break;
LODWORD(v8) = v16;
v15 = Affinity->Bitmap[v16];
}
if( DWORD2(v25) )
{
v29[1] = *(_DWORD *)(qword_140C50700 + 20);
v29[0] = *(_DWORD *)(qword_140C50700 + 16);
v32 = v27;
v18 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, __int64 *))(Controller + 120);
_disable();
LODWORD(v8) = v18(*(_QWORD *)(Controller + 16), v29, &v25, 0i64, &v32);
if( (v2 & 0x200) != 0 )
_enable();
if( (int)v8 < 0 )
goto LABEL_41;
}
}
goto LABEL_33;
}
v9 = (unsigned int *)*(&stru_140CF2E80 + 808);
ProcNumber = 0;
if( *(&stru_140CF2E80 + 808) >= *(&stru_140CF2E80 + 809) )
{
LABEL_33:
v19 = *(_QWORD *)&v36[3];
LOWORD(v20) = 0;
do
{
while( !v19 )
{
v20 = (unsigned __int16)(v20 + 1);
if( (unsigned int)v20 >= v35 )
goto LABEL_41;
v19 = *(_QWORD *)&v36[4 * v20 + 3];
}
_BitScanForward64(&v21, v19);
LODWORD(v25) = 4;
v19 &= ~(1i64 << v21);
DWORD2(v25) = *(_DWORD *)(qword_140C50630
+ 24i64
* (unsigned int)KiProcessorNumberToIndexMappingTable[64 * (unsigned __int16)v20
+ (unsigned __int8)v21]
+ 8);
v30[1] = *(_DWORD *)(qword_140C50700 + 20);
v30[0] = *(_DWORD *)(qword_140C50700 + 16);
v22 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, __int64 *))(Controller + 120);
v33 = v27;
_disable();
LODWORD(v8) = v22(*(_QWORD *)(Controller + 16), v30, &v25, 0i64, &v33);
if( (v2 & 0x200) != 0 )
_enable();
}
while( (int)v8 >= 0 );
goto LABEL_41;
}
v10 = v27;
while( 1 )
{
KeAndGroupAffinityEx(Affinity, (_GROUP_AFFINITY *)(v9 + 2), &Result);
if( (_DWORD)v8 )
{
Mask = Result.Mask;
v12 = 0;
LODWORD(v25) = 6;
v13 = Result.Mask == 0;
*((_QWORD *)&v25 + 1) = *v9;
ProcNumber.Group = Result.Group;
while( 1 )
{
ProcNumber.Number = v5;
if( v13 )
break;
if( (Mask & 1) != 0 )
{
v12 |= *(_DWORD *)(qword_140C50630
+ 24i64 * (unsigned int)KeGetProcessorIndexFromNumber(&ProcNumber.Group)
+ 12);
HIDWORD(v25) = v12;
}
++v5;
Mask >>= 1;
v13 = Mask == 0;
}
v31 = v10;
v28[1] = *(_DWORD *)(qword_140C50700 + 20);
v28[0] = *(_DWORD *)(qword_140C50700 + 16);
v14 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, __int64 *))(Controller + 120);
_disable();
LODWORD(v8) = v14(*(_QWORD *)(Controller + 16), v28, &v25, 0i64, &v31);
if( (v2 & 0x200) != 0 )
_enable();
v5 = 0;
if( (int)v8 < 0 )
break;
}
v9 += 6;
if( (unsigned __int64)v9 >= *(&stru_140CF2E80 + 809) )
goto LABEL_33;
}
LABEL_41:
if( v3 )
_enable();
return v8;
}Referenced by:
HalpNmiReboot
KiSendFreeze