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.