KiSendFreeze

VOID __stdcall KiSendFreeze(_KAFFINITY_EX *Affinity, UINT8 Wait){
  int v4; 
  __int64 v5; 
  signed __int32 v6; 
  unsigned __int16 *v7[2]; 
  __int16 v8; 
  int v9; 
  __int16 v10; 
  unsigned int v11; 
  v9 = 0;
  v10 = 0;
  v4 = 0;
  v8 = 0;
  v11 = 0;
  v7[1] = (unsigned __int16 *)Affinity->Bitmap[0];
  v7[0] = &Affinity->Count;
  while( !(unsigned int)KeEnumerateNextProcessor(&v11, v7) )
  {
    v5 = (__int64)*(&KiProcessorBlock + v11);
    v6 = _InterlockedCompareExchange((volatile signed __int32 *)(v5 + 11656), 5, 0);
    if( Wait )
    {
      if( v6 )
      {
        do
        {
          do
            _mm_pause();
          while( *(_DWORD *)(v5 + 11656) );
        }
        while( _InterlockedCompareExchange((volatile signed __int32 *)(v5 + 11656), 5, 0) );
      }
LABEL_7:
      ++v4;
    }
    else
    {
      if( !v6 )
        goto LABEL_7;
      KeRemoveProcessorAffinityEx(&Affinity->Count, v11);
    }
  }
  if( v4 )
    HalSendNMI((__int64)Affinity);
}

Referenced by:

KeBugCheck2
KeFreezeExecution