PnprQuiesceProcessors

INT64 __stdcall PnprQuiesceProcessors(){
  void *v0; 
  __int128 v1; 
  unsigned __int64 v2; 
  __int128 v3; 
  __int128 v4; 
  __int128 v5; 
  __int128 v6; 
  __int128 v7; 
  __int128 v8; 
  __int128 v9; 
  _DWORD *v10; 
  int v11; 
  int v12; 
  int v13; 
  __int128 v14; 
  __int128 v15; 
  __int128 v16; 
  __int128 v17; 
  __int128 v18; 
  __int128 v19; 
  __int128 v20; 
  __int128 v21; 
  INT64 v22; 
  unsigned int MillisecondCounter; 
  UINT64 v24; 
  UINT64 v25; 
  int v26; 
  unsigned __int64 v27; 
  __int128 v28; 
  unsigned int v29; 
  __int128 v30; 
  __int128 v31; 
  __int128 v32; 
  __int128 v33; 
  __int128 v34; 
  __int128 v35; 
  __int128 v36; 
  __int128 v37; 
  __int64 v38; 
  __int64 v39; 
  __int64 v40; 
  int v41; 
  UINT64 v42; 
  int v43; 
  int v44; 
  __int128 v45; 
  __int128 v46; 
  __int128 v47; 
  __int128 v48; 
  __int128 v49; 
  __int128 v50; 
  __int128 v51; 
  __int128 v52; 
  unsigned __int64 v53; 
  int i; 
  char DeferredContext; 
  unsigned int DeferredContext_4; 
  unsigned __int16 *v57[2]; 
  __int16 v58; 
  int v59; 
  __int16 v60; 
  struct _KDPC Dpc; 
  __int128 result; 
  __int128 v63; 
  __int128 v64; 
  __int128 v65; 
  __int128 v66; 
  __int128 v67; 
  __int128 v68; 
  __int128 v69; 
  __int128 v70; 
  __int128 v71; 
  INT64 v72; 
  memset((INT64)&result, 0i64);
  v59 = 0;
  v60 = 0;
  DeferredContext_4 = 0;
  memset((INT64)&Dpc, 0i64);
  v0 = (void *)*(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];
  result = *(_OWORD *)&KeActiveProcessors.Count;
  v3 = *(_OWORD *)&KeActiveProcessors.Bitmap[3];
  v63 = v1;
  v4 = *(_OWORD *)&KeActiveProcessors.Bitmap[5];
  v64 = v3;
  v5 = *(_OWORD *)&KeActiveProcessors.Bitmap[7];
  v65 = v4;
  v6 = *(_OWORD *)&KeActiveProcessors.Bitmap[9];
  v66 = v5;
  v7 = *(_OWORD *)&KeActiveProcessors.Bitmap[11];
  v67 = v6;
  v8 = *(_OWORD *)&KeActiveProcessors.Bitmap[15];
  v68 = v7;
  v69 = *(_OWORD *)&KeActiveProcessors.Bitmap[13];
  v9 = *(_OWORD *)&KeActiveProcessors.Bitmap[17];
  v70 = v8;
  v71 = v9;
  v72 = v2;
  KeRemoveProcessorAffinityEx((unsigned __int16 *)&result, *(_DWORD *)(PnprContext + 180));
  v57[1] = *((unsigned __int16 **)&result + 1);
  v57[0] = (unsigned __int16 *)&result;
  v58 = 0;
  while( !(unsigned int)KeEnumerateNextProcessor(&DeferredContext_4, v57) )
  {
    if( !Dpc.DpcData )
      Dpc.Number = DeferredContext_4 + 1280;
    DeferredContext = 0;
    KeInsertQueueDpc(&Dpc, v0, (PVOID)DeferredContext_4);
    while( !DeferredContext )
      _mm_pause();
  }
  if( (*(_DWORD *)(PnprContext + 64) & 0x20) != 0 && (int)off_140C006D8[0]() < 0 )
  {
    v10 = (_DWORD *)PnprContext;
    v11 = 2447;
  }
  else
  {
    ((void(__fastcall *)(_QWORD, _QWORD))off_140C00688[0])(0i64, *(_QWORD *)(PnprContext + 20872));
    KeSuspendClockTimerSafe();
    MillisecondCounter = PnprGetMillisecondCounter(0);
    v24 = PnprContext;
    *(_QWORD *)(PnprContext + 20992) = MillisecondCounter;
    _InterlockedAdd((volatile signed __int32 *)(v24 + 184), 1u);
    while( *(_DWORD *)(PnprContext + 184) < (int)v0 )
      _mm_pause();
    v25 = PnprContext;
    if( (*(_DWORD *)(PnprContext + 64) & 0x20) != 0 )
    {
      _InterlockedAdd((volatile signed __int32 *)(PnprContext + 192), 1u);
      while( *(_DWORD *)(PnprContext + 192) < (int)v0 )
        _mm_pause();
      LOBYTE(v25) = 1;
      (*(void(__fastcall **)(_QWORD, UINT64))(PnprContext + 20976))(*(_QWORD *)(PnprContext + 20880), v25);
      v26 = PnprGetMillisecondCounter(0);
      v25 = PnprContext;
      *(_DWORD *)(PnprContext + 21000) = v26;
    }
    v27 = KeActiveProcessors.Bitmap[19];
    v28 = *(_OWORD *)&KeActiveProcessors.Bitmap[1];
    v29 = 0;
    result = *(_OWORD *)&KeActiveProcessors.Count;
    v30 = *(_OWORD *)&KeActiveProcessors.Bitmap[3];
    v63 = v28;
    v31 = *(_OWORD *)&KeActiveProcessors.Bitmap[5];
    v64 = v30;
    v32 = *(_OWORD *)&KeActiveProcessors.Bitmap[7];
    v65 = v31;
    v33 = *(_OWORD *)&KeActiveProcessors.Bitmap[9];
    v66 = v32;
    v34 = *(_OWORD *)&KeActiveProcessors.Bitmap[11];
    v67 = v33;
    v35 = *(_OWORD *)&KeActiveProcessors.Bitmap[13];
    v68 = v34;
    v36 = *(_OWORD *)&KeActiveProcessors.Bitmap[15];
    v69 = v35;
    v37 = *(_OWORD *)&KeActiveProcessors.Bitmap[17];
    v70 = v36;
    v71 = v37;
    v72 = v27;
    v38 = *(_QWORD *)(v25 + 16);
    if( *(_DWORD *)(v38 + 8) )
    {
      do
      {
        v39 = v29++;
        KeActiveProcessors.Bitmap[v39] &= ~*(_QWORD *)(*(_QWORD *)v38 + 8 * v39);
      }
      while( v29 < *(_DWORD *)(v38 + 8) );
    }
    v10 = (_DWORD *)PnprContext;
    v40 = *(_QWORD *)(PnprContext + 16);
    *(_QWORD *)(PnprContext + 200) = 1i64;
    if( !*(_DWORD *)(v40 + 16)
      || (v41 = PnprGetMillisecondCounter(0),
          v42 = PnprContext,
          *(_DWORD *)(PnprContext + 21004) = v41,
          v43 = ((__int64(__fastcall *)(__int64, _QWORD))off_140C00688[0])(1i64, *(_QWORD *)(v42 + 20872)),
          v44 = PnprGetMillisecondCounter(0),
          v10 = (_DWORD *)PnprContext,
          *(_DWORD *)(PnprContext + 21008) = v44,
          v43 >= 0) )
    {
      *(_OWORD *)&KeActiveProcessors.Count = result;
      v45 = v64;
      *(_OWORD *)&KeActiveProcessors.Bitmap[1] = v63;
      v46 = v65;
      *(_OWORD *)&KeActiveProcessors.Bitmap[3] = v45;
      v47 = v66;
      *(_OWORD *)&KeActiveProcessors.Bitmap[5] = v46;
      v48 = v67;
      *(_OWORD *)&KeActiveProcessors.Bitmap[7] = v47;
      v49 = v68;
      *(_OWORD *)&KeActiveProcessors.Bitmap[9] = v48;
      v50 = v69;
      *(_OWORD *)&KeActiveProcessors.Bitmap[11] = v49;
      v51 = v70;
      *(_OWORD *)&KeActiveProcessors.Bitmap[13] = v50;
      v52 = v71;
      v53 = v72;
      *(_OWORD *)&KeActiveProcessors.Bitmap[15] = v51;
      *(_OWORD *)&KeActiveProcessors.Bitmap[17] = v52;
      KeActiveProcessors.Bitmap[19] = v53;
      for( i = v10[51]; ; i = *(_DWORD *)(PnprContext + 204) )
      {
        v22 = PnprContext;
        if( i >= *(_DWORD *)(*(_QWORD *)(PnprContext + 16) + 16i64) )
          break;
        _mm_pause();
      }
      return v22;
    }
    v11 = 2532;
  }
  v12 = v10[5246];
  if( !v12 )
    v12 = v11;
  v10[5246] = v12;
  v13 = v10[5247];
  if( !v13 )
    v13 = 1;
  v10[5247] = v13;
  *(_OWORD *)&KeActiveProcessors.Count = result;
  v14 = v64;
  *(_OWORD *)&KeActiveProcessors.Bitmap[1] = v63;
  v15 = v65;
  *(_OWORD *)&KeActiveProcessors.Bitmap[3] = v14;
  v16 = v66;
  *(_OWORD *)&KeActiveProcessors.Bitmap[5] = v15;
  v17 = v67;
  *(_OWORD *)&KeActiveProcessors.Bitmap[7] = v16;
  v18 = v68;
  *(_OWORD *)&KeActiveProcessors.Bitmap[9] = v17;
  v19 = v69;
  *(_OWORD *)&KeActiveProcessors.Bitmap[11] = v18;
  v20 = v70;
  *(_OWORD *)&KeActiveProcessors.Bitmap[13] = v19;
  v21 = v71;
  v22 = v72;
  *(_OWORD *)&KeActiveProcessors.Bitmap[15] = v20;
  *(_OWORD *)&KeActiveProcessors.Bitmap[17] = v21;
  KeActiveProcessors.Bitmap[19] = v22;
  return v22;
}

Referenced by:

PnprQuiesce