PnprQuiesceProcessorDpc

VOID __fastcall PnprQuiesceProcessorDpc(
        _KDPC *Dpc,
        VOID *DeferredContext,
        VOID *SystemArgument1,
        VOID *SystemArgument2){
  unsigned int v4; 
  int v5; 
  bool v6; 
  UINT64 v7; 
  UINT8 *v8; 
  INT64 v9; 
  __int64 Group; 
  __int64 v11; 
  bool v12; 
  __int64 v13; 
  _LARGE_INTEGER v14; 
  _KDPC *v15; 
  _KTIMER *v16; 
  INT64 v17; 
  UINT64 v18; 
  int v19; 
  int v20; 
  XSTATE_SAVE XStateSave; 
  int v22; 
  struct _PROCESSOR_NUMBER ProcNumber; 
  UINT64 Id; 
  __int64 v25; 
  ProcNumber = 0;
  v4 = (unsigned int)SystemArgument2;
  LODWORD(Id) = 0;
  v5 = (int)SystemArgument1;
  v25 = 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 = (v22 & 0x200) != 0;
    _InterlockedAdd((volatile signed __int32 *)(PnprContext + 192), 1u);
    while( *(_DWORD *)(PnprContext + 192) < (int)SystemArgument1 )
      _mm_pause();
  }
  if( KeGetProcessorNumberFromIndex((ULONG)SystemArgument2, &ProcNumber) < 0 )
    goto LABEL_53;
  v9 = PnprContext;
  Group = ProcNumber.Group;
  v11 = 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();
  v12 = 0;
  if( ((KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64) != 0 )
    v12 = (int)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(v13) = 1;
    (*(void(__fastcall **)(_QWORD, _QWORD, __int64))(PnprContext + 20936))(
      *(_QWORD *)(PnprContext + 20880),
      (unsigned int)Id,
      v13);
  }
  if( (*(_DWORD *)(PnprContext + 64) & 0x20) != 0 )
    ((void(__fastcall *)(_QWORD, __int64 *))off_140C006E8[0])(*(_QWORD *)(PnprContext + 20872), &v25);
  ((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();
  v16 = (_KTIMER *)*(unsigned int *)(PnprContext + 64);
  if( ((unsigned __int8)v16 & 0x20) != 0 && v6 )
    _enable();
  KeRestoreProcessorSpecificFeatures(v16, v14, v15);
  if( v12 )
    KeRestoreExtendedAndSupervisorState(&XStateSave);
  KeRestoreIptStateAfterProcessorComesOnline();
  _InterlockedAdd((volatile signed __int32 *)(PnprContext + 204), 1u);
LABEL_26:
  v17 = PnprContext;
  if( *(_DWORD *)(*(_QWORD *)(PnprContext + 24) + 4i64) && (*(_DWORD *)(PnprContext + 64) & 8) == 0 )
  {
    if( *(int *)(PnprContext + 200) < 2 )
    {
      do
      {
        _mm_pause();
        v17 = *(unsigned int *)(PnprContext + 200);
      }
      while( (int)v17 < 2 );
    }
    if( (int)PnprMirrorMarkedPages(v17, v9, v8) < 0 )
    {
      v18 = PnprContext;
      v19 = *(_DWORD *)(PnprContext + 20984);
      if( !v19 )
        v19 = 2258;
      *(_DWORD *)(PnprContext + 20984) = v19;
      v20 = *(_DWORD *)(v18 + 20988);
      if( !v20 )
        v20 = 1;
      *(_DWORD *)(v18 + 20988) = v20;
    }
    _InterlockedAdd((volatile signed __int32 *)(PnprContext + 204), 1u);
  }
  while( *(int *)(PnprContext + 200) < 4 )
    _mm_pause();
  PnprGetStackLimits((UINT64 *)(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( (v11 & *(_QWORD *)(**(_QWORD **)(PnprContext + 16) + 8 * Group)) != 0 )
    {
      ((void(__fastcall *)(__int64))off_140C006F0[0])(v25);
    }
    else if( v6 )
    {
      _enable();
    }
  }
  _InterlockedAdd((volatile signed __int32 *)(PnprContext + 188), 1u);
  while( *(_DWORD *)(PnprContext + 188) < v5 )
    _mm_pause();
}

Referenced by:

No references.