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