PnprQuiesceProcessors

unsigned __int64 PnprQuiesceProcessors(){
  INT64 v0; 
  __int128 v1; 
  unsigned __int64 v2; 
  __int128 v3; 
  __int128 v4; 
  __int128 v5; 
  __int128 v6; 
  __int128 v7; 
  __int128 v8; 
  __int128 v9; 
  int v10; 
  _DWORD *v11; 
  int v12; 
  int v13; 
  int v14; 
  __int128 v15; 
  __int128 v16; 
  __int128 v17; 
  __int128 v18; 
  __int128 v19; 
  __int128 v20; 
  __int128 v21; 
  __int128 v22; 
  unsigned __int64 result; 
  unsigned int MillisecondCounter; 
  __int64 v25; 
  __int64 v26; 
  int v27; 
  unsigned __int64 v28; 
  __int128 v29; 
  unsigned int v30; 
  __int128 v31; 
  __int128 v32; 
  __int128 v33; 
  __int128 v34; 
  __int128 v35; 
  __int128 v36; 
  __int128 v37; 
  __int128 v38; 
  __int64 v39; 
  __int64 v40; 
  __int64 v41; 
  int v42; 
  __int64 v43; 
  int v44; 
  int v45; 
  __int128 v46; 
  __int128 v47; 
  __int128 v48; 
  __int128 v49; 
  __int128 v50; 
  __int128 v51; 
  __int128 v52; 
  __int128 v53; 
  unsigned __int64 v54; 
  int i; 
  char DeferredContext; 
  unsigned int DeferredContext_4; 
  _KAFFINITY_ENUMERATION_CONTEXT Context; 
  _KDPC Dpc; 
  _KAFFINITY_EX Affinity; 

  memset(&Affinity, 0i64, sizeof(Affinity));
  *(_DWORD *)(&Context.CurrentIndex + 1) = 0;
  *(&Context.CurrentIndex + 3) = 0;
  DeferredContext_4 = 0;
  memset(&Dpc, 0i64, sizeof(Dpc));
  v0 = *(unsigned int *)(PnprContext + 176);
  KeGetCurrentIrql();
  __writecr8(2ui64);
  KeInitializeDpc(&Dpc, (PKDEFERRED_ROUTINE)PnprQuiesceProcessorDpc, &DeferredContext);
  Dpc.Importance = 2;
  v1 = *(_OWORD *)&KeActiveProcessors.Bitmap[1];
  v2 = KeActiveProcessors.Bitmap[19];
  *(_OWORD *)&Affinity.Count = *(_OWORD *)&KeActiveProcessors.Count;
  v3 = *(_OWORD *)&KeActiveProcessors.Bitmap[3];
  *(_OWORD *)&Affinity.Bitmap[1] = v1;
  v4 = *(_OWORD *)&KeActiveProcessors.Bitmap[5];
  *(_OWORD *)&Affinity.Bitmap[3] = v3;
  v5 = *(_OWORD *)&KeActiveProcessors.Bitmap[7];
  *(_OWORD *)&Affinity.Bitmap[5] = v4;
  v6 = *(_OWORD *)&KeActiveProcessors.Bitmap[9];
  *(_OWORD *)&Affinity.Bitmap[7] = v5;
  v7 = *(_OWORD *)&KeActiveProcessors.Bitmap[11];
  *(_OWORD *)&Affinity.Bitmap[9] = v6;
  v8 = *(_OWORD *)&KeActiveProcessors.Bitmap[15];
  *(_OWORD *)&Affinity.Bitmap[11] = v7;
  *(_OWORD *)&Affinity.Bitmap[13] = *(_OWORD *)&KeActiveProcessors.Bitmap[13];
  v9 = *(_OWORD *)&KeActiveProcessors.Bitmap[17];
  *(_OWORD *)&Affinity.Bitmap[15] = v8;
  *(_OWORD *)&Affinity.Bitmap[17] = v9;
  Affinity.Bitmap[19] = v2;
  KeRemoveProcessorAffinityEx(&Affinity.Count, *(unsigned int *)(PnprContext + 180));
  Context.CurrentMask = Affinity.Bitmap[0];
  Context.Affinity = &Affinity;
  Context.CurrentIndex = 0;
  while( 1 )
  {
    KeEnumerateNextProcessor((UINT64 *)&DeferredContext_4, &Context);
    if( v10 )
      break;
    if( !Dpc.DpcData )
      Dpc.Number = DeferredContext_4 + 1280;
    DeferredContext = 0;
    KeInsertQueueDpc((UINT64)&Dpc, v0, DeferredContext_4);
    while( !DeferredContext )
      _mm_pause();
  }
  if( (*(_DWORD *)(PnprContext + 64) & 0x20) != 0 && (int)off_140C006D8[0]() < 0 )
  {
    v11 = (_DWORD *)PnprContext;
    v12 = 2447;
  }
  else
  {
    ((void(__fastcall *)(_QWORD, _QWORD))off_140C00688[0])(0i64, *(_QWORD *)(PnprContext + 20872));
    KeSuspendClockTimerSafe();
    MillisecondCounter = PnprGetMillisecondCounter(0);
    v25 = PnprContext;
    *(_QWORD *)(PnprContext + 20992) = MillisecondCounter;
    _InterlockedAdd((volatile signed __int32 *)(v25 + 184), 1u);
    while( *(_DWORD *)(PnprContext + 184) < (int)v0 )
      _mm_pause();
    v26 = PnprContext;
    if( (*(_DWORD *)(PnprContext + 64) & 0x20) != 0 )
    {
      _InterlockedAdd((volatile signed __int32 *)(PnprContext + 192), 1u);
      while( *(_DWORD *)(PnprContext + 192) < (int)v0 )
        _mm_pause();
      LOBYTE(v26) = 1;
      (*(void(__fastcall **)(_QWORD, __int64))(PnprContext + 20976))(*(_QWORD *)(PnprContext + 20880), v26);
      v27 = PnprGetMillisecondCounter(0);
      v26 = PnprContext;
      *(_DWORD *)(PnprContext + 21000) = v27;
    }
    v28 = KeActiveProcessors.Bitmap[19];
    v29 = *(_OWORD *)&KeActiveProcessors.Bitmap[1];
    v30 = 0;
    *(_OWORD *)&Affinity.Count = *(_OWORD *)&KeActiveProcessors.Count;
    v31 = *(_OWORD *)&KeActiveProcessors.Bitmap[3];
    *(_OWORD *)&Affinity.Bitmap[1] = v29;
    v32 = *(_OWORD *)&KeActiveProcessors.Bitmap[5];
    *(_OWORD *)&Affinity.Bitmap[3] = v31;
    v33 = *(_OWORD *)&KeActiveProcessors.Bitmap[7];
    *(_OWORD *)&Affinity.Bitmap[5] = v32;
    v34 = *(_OWORD *)&KeActiveProcessors.Bitmap[9];
    *(_OWORD *)&Affinity.Bitmap[7] = v33;
    v35 = *(_OWORD *)&KeActiveProcessors.Bitmap[11];
    *(_OWORD *)&Affinity.Bitmap[9] = v34;
    v36 = *(_OWORD *)&KeActiveProcessors.Bitmap[13];
    *(_OWORD *)&Affinity.Bitmap[11] = v35;
    v37 = *(_OWORD *)&KeActiveProcessors.Bitmap[15];
    *(_OWORD *)&Affinity.Bitmap[13] = v36;
    v38 = *(_OWORD *)&KeActiveProcessors.Bitmap[17];
    *(_OWORD *)&Affinity.Bitmap[15] = v37;
    *(_OWORD *)&Affinity.Bitmap[17] = v38;
    Affinity.Bitmap[19] = v28;
    v39 = *(_QWORD *)(v26 + 16);
    if( *(_DWORD *)(v39 + 8) )
    {
      do
      {
        v40 = v30++;
        KeActiveProcessors.Bitmap[v40] &= ~*(_QWORD *)(*(_QWORD *)v39 + 8 * v40);
      }
      while( v30 < *(_DWORD *)(v39 + 8) );
    }
    v11 = (_DWORD *)PnprContext;
    v41 = *(_QWORD *)(PnprContext + 16);
    *(_QWORD *)(PnprContext + 200) = 1i64;
    if( !*(_DWORD *)(v41 + 16)
      || (v42 = PnprGetMillisecondCounter(0),
          v43 = PnprContext,
          *(_DWORD *)(PnprContext + 21004) = v42,
          v44 = ((__int64(__fastcall *)(__int64, _QWORD))off_140C00688[0])(1i64, *(_QWORD *)(v43 + 20872)),
          v45 = PnprGetMillisecondCounter(0),
          v11 = (_DWORD *)PnprContext,
          *(_DWORD *)(PnprContext + 21008) = v45,
          v44 >= 0) )
    {
      *(_OWORD *)&KeActiveProcessors.Count = *(_OWORD *)&Affinity.Count;
      v46 = *(_OWORD *)&Affinity.Bitmap[3];
      *(_OWORD *)&KeActiveProcessors.Bitmap[1] = *(_OWORD *)&Affinity.Bitmap[1];
      v47 = *(_OWORD *)&Affinity.Bitmap[5];
      *(_OWORD *)&KeActiveProcessors.Bitmap[3] = v46;
      v48 = *(_OWORD *)&Affinity.Bitmap[7];
      *(_OWORD *)&KeActiveProcessors.Bitmap[5] = v47;
      v49 = *(_OWORD *)&Affinity.Bitmap[9];
      *(_OWORD *)&KeActiveProcessors.Bitmap[7] = v48;
      v50 = *(_OWORD *)&Affinity.Bitmap[11];
      *(_OWORD *)&KeActiveProcessors.Bitmap[9] = v49;
      v51 = *(_OWORD *)&Affinity.Bitmap[13];
      *(_OWORD *)&KeActiveProcessors.Bitmap[11] = v50;
      v52 = *(_OWORD *)&Affinity.Bitmap[15];
      *(_OWORD *)&KeActiveProcessors.Bitmap[13] = v51;
      v53 = *(_OWORD *)&Affinity.Bitmap[17];
      v54 = Affinity.Bitmap[19];
      *(_OWORD *)&KeActiveProcessors.Bitmap[15] = v52;
      *(_OWORD *)&KeActiveProcessors.Bitmap[17] = v53;
      KeActiveProcessors.Bitmap[19] = v54;
      for( i = v11[51]; ; i = *(_DWORD *)(PnprContext + 204) )
      {
        result = PnprContext;
        if( i >= *(_DWORD *)(*(_QWORD *)(PnprContext + 16) + 16i64) )
          break;
        _mm_pause();
      }
      return result;
    }
    v12 = 2532;
  }
  v13 = v11[5246];
  if( !v13 )
    v13 = v12;
  v11[5246] = v13;
  v14 = v11[5247];
  if( !v14 )
    v14 = 1;
  v11[5247] = v14;
  *(_OWORD *)&KeActiveProcessors.Count = *(_OWORD *)&Affinity.Count;
  v15 = *(_OWORD *)&Affinity.Bitmap[3];
  *(_OWORD *)&KeActiveProcessors.Bitmap[1] = *(_OWORD *)&Affinity.Bitmap[1];
  v16 = *(_OWORD *)&Affinity.Bitmap[5];
  *(_OWORD *)&KeActiveProcessors.Bitmap[3] = v15;
  v17 = *(_OWORD *)&Affinity.Bitmap[7];
  *(_OWORD *)&KeActiveProcessors.Bitmap[5] = v16;
  v18 = *(_OWORD *)&Affinity.Bitmap[9];
  *(_OWORD *)&KeActiveProcessors.Bitmap[7] = v17;
  v19 = *(_OWORD *)&Affinity.Bitmap[11];
  *(_OWORD *)&KeActiveProcessors.Bitmap[9] = v18;
  v20 = *(_OWORD *)&Affinity.Bitmap[13];
  *(_OWORD *)&KeActiveProcessors.Bitmap[11] = v19;
  v21 = *(_OWORD *)&Affinity.Bitmap[15];
  *(_OWORD *)&KeActiveProcessors.Bitmap[13] = v20;
  v22 = *(_OWORD *)&Affinity.Bitmap[17];
  result = Affinity.Bitmap[19];
  *(_OWORD *)&KeActiveProcessors.Bitmap[15] = v21;
  *(_OWORD *)&KeActiveProcessors.Bitmap[17] = v22;
  KeActiveProcessors.Bitmap[19] = result;
  return result;
}

Referenced by:

PnprQuiesce