PnprQuiesceProcessorDpc

void __fastcall PnprQuiesceProcessorDpc(
        struct _KDPC *Dpc,
        PVOID DeferredContext,
        PVOID SystemArgument1,
        PVOID SystemArgument2){
  unsigned int v4; 
  int v5; 
  bool v6; 
  __int64 v7; 
  __int64 Group; 
  __int64 v9; 
  bool v10; 
  __int64 v11; 
  _LARGE_INTEGER v12; 
  _KDPC *v13; 
  _KTIMER *v14; 
  __int64 v15; 
  int v16; 
  int v17; 
  _XSTATE_SAVE XStateSave; 
  int v19; 
  _PROCESSOR_NUMBER ProcNumber; 
  UINT64 Id; 
  __int64 v22; 

  ProcNumber = 0;
  v4 = (unsigned int)SystemArgument2;
  LODWORD(Id) = 0;
  v5 = (int)SystemArgument1;
  v22 = 0i64;
  memset(&XStateSave, 0, sizeof(XStateSave));
  v6 = 1;
  v7 = PnprContext;
  *(_BYTE *)DeferredContext = 1;
  _InterlockedAdd((volatile signed __int32 *)(v7 + 184), 1u);
  while( *(_DWORD *)(PnprContext + 184) < (int)SystemArgument1 )
    _mm_pause();
  if( (*(_DWORD *)(PnprContext + 64) & 0x20) != 0 )
  {
    _disable();
    v6 = (v19 & 0x200) != 0;
    _InterlockedAdd((volatile signed __int32 *)(PnprContext + 192), 1u);
    while( *(_DWORD *)(PnprContext + 192) < (int)SystemArgument1 )
      _mm_pause();
  }
  if( KeGetProcessorNumberFromIndex((unsigned int)SystemArgument2, &ProcNumber) < 0 )
    goto LABEL_53;
  Group = ProcNumber.Group;
  v9 = 1i64 << ProcNumber.Number;
  if( ((1i64 << ProcNumber.Number) & *(_QWORD *)(**(_QWORD **)(PnprContext + 16) + 8i64 * ProcNumber.Group)) == 0 )
    goto LABEL_26;
  while( *(int *)(PnprContext + 200) < 1 )
    _mm_pause();
  KeSuspendClockTimerSafe();
  KeSaveIptStateBeforeProcessorGoesOffline();
  v10 = 0;
  if( ((KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64) != 0 )
    v10 = KeSaveExtendedAndSupervisorState(
            (KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64,
            &XStateSave) >= 0;
  if( (int)HalGetProcessorIdByNtNumber(v4, &Id) < 0 )
LABEL_53:
    __fastfail(5u);
  if( (*(_DWORD *)(PnprContext + 20896) & 2) != 0 )
  {
    LOBYTE(v11) = 1;
    (*(void(__fastcall **)(_QWORD, _QWORD, __int64))(PnprContext + 20936))(
      *(_QWORD *)(PnprContext + 20880),
      (unsigned int)Id,
      v11);
  }
  if( (*(_DWORD *)(PnprContext + 64) & 0x20) != 0 )
    ((void(__fastcall *)(_QWORD, __int64 *))off_140C006E8[0])(*(_QWORD *)(PnprContext + 20872), &v22);
  ((void(__fastcall *)(_QWORD))off_140C00680[0])(*(_QWORD *)(PnprContext + 20872));
  if( (*(_DWORD *)(PnprContext + 20896) & 2) != 0 )
    (*(void(__fastcall **)(_QWORD, _QWORD, _QWORD))(PnprContext + 20936))(
      *(_QWORD *)(PnprContext + 20880),
      (unsigned int)Id,
      0i64);
  KeResumeClockTimerSafe();
  v14 = (_KTIMER *)*(unsigned int *)(PnprContext + 64);
  if( ((unsigned __int8)v14 & 0x20) != 0 && v6 )
    _enable();
  KeRestoreProcessorSpecificFeatures(v14, v12, v13);
  if( v10 )
    KeRestoreExtendedAndSupervisorState(&XStateSave);
  KeRestoreIptStateAfterProcessorComesOnline();
  _InterlockedAdd((volatile signed __int32 *)(PnprContext + 204), 1u);
LABEL_26:
  if( *(_DWORD *)(*(_QWORD *)(PnprContext + 24) + 4i64) && (*(_DWORD *)(PnprContext + 64) & 8) == 0 )
  {
    while( *(int *)(PnprContext + 200) < 2 )
      _mm_pause();
    if( (int)PnprMirrorMarkedPages() < 0 )
    {
      v15 = PnprContext;
      v16 = *(_DWORD *)(PnprContext + 20984);
      if( !v16 )
        v16 = 2258;
      *(_DWORD *)(PnprContext + 20984) = v16;
      v17 = *(_DWORD *)(v15 + 20988);
      if( !v17 )
        v17 = 1;
      *(_DWORD *)(v15 + 20988) = v17;
    }
    _InterlockedAdd((volatile signed __int32 *)(PnprContext + 204), 1u);
  }
  while( *(int *)(PnprContext + 200) < 4 )
    _mm_pause();
  PnprGetStackLimits((_QWORD *)(PnprContext + 216 + 8i64 * v4), (UINT64 *)(PnprContext + 10456 + 8i64 * v4));
  _InterlockedAdd((volatile signed __int32 *)(PnprContext + 204), 1u);
  while( *(int *)(PnprContext + 200) < 5 )
    _mm_pause();
  if( (*(_DWORD *)(PnprContext + 64) & 0x20) != 0 )
  {
    while( *(int *)(PnprContext + 200) < 6 )
      _mm_pause();
    if( (v9 & *(_QWORD *)(**(_QWORD **)(PnprContext + 16) + 8 * Group)) != 0 )
    {
      ((void(__fastcall *)(__int64))off_140C006F0[0])(v22);
    }
    else if( v6 )
    {
      _enable();
    }
  }
  _InterlockedAdd((volatile signed __int32 *)(PnprContext + 188), 1u);
  while( *(_DWORD *)(PnprContext + 188) < v5 )
    _mm_pause();
}

Referenced by:

No references.