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.