KeStallExecutionProcessor
VOID *__stdcall KeStallExecutionProcessor(UINT32 MicroSeconds){
void *v1;
void *v2;
unsigned __int64 v3;
_KDPC *v5;
char v6;
int DeferredContext;
__int64 v8;
__int64 v9;
void *v10;
void *v11;
__int64 v12;
unsigned __int64 v13;
unsigned int v14;
unsigned __int128 v15;
unsigned __int64 v16;
unsigned __int64 Mask;
__int64 v18;
PVOID v19;
__int64 v20;
__int64 v21;
__int64 v22;
__int64 v23;
signed __int64 v24;
int v25;
__int64 v26;
bool v27;
__int64 v28;
unsigned __int64 v29;
signed __int64 v30;
unsigned int v31;
int v33[8];
_GROUP_AFFINITY Affinity;
_GROUP_AFFINITY PreviousAffinity;
int v36;
if( HalpTimerProcessorsFrozen )
{
v19 = HalpAlwaysOnCounter;
if( HalpAlwaysOnCounter )
{
if( *((_DWORD *)HalpAlwaysOnCounter + 55) == 64 )
{
HalpTimerGetInternalData((_KDPC *)HalpAlwaysOnCounter, v1, v2, (PVOID)v3);
(*((void(__fastcall **)(__int64))v19 + 14))(v20);
}
else
{
do
{
v21 = *((_QWORD *)v19 + 26);
do
{
v22 = *((_QWORD *)v19 + 25);
HalpTimerGetInternalData((_KDPC *)v19, v1, v2, (PVOID)v3);
v3 = (*((__int64(__fastcall **)(__int64))v19 + 14))(v23);
_InterlockedOr(v33, 0);
v24 = *((_QWORD *)v19 + 25);
}
while( v22 != v24 );
}
while( v21 != *((_QWORD *)v19 + 26) );
v25 = *((_DWORD *)v19 + 55);
if( ((v22 ^ v3) & (1i64 << ((unsigned __int8)v25 - 1))) != 0 )
{
v26 = 1i64 << v25;
v27 = v25 == 64;
v28 = -1i64;
if( !v27 )
v28 = v26 - 1;
v29 = v22 & v28;
v30 = v3 | v22 ^ v29;
if( v3 < v29 )
v30 += v26;
_InterlockedCompareExchange64((volatile signed __int64 *)v19 + 25, v30, v24);
}
}
}
KiCheckStall(KeGetCurrentPrcb(), 0);
}
v5 = HalpStallCounter;
v6 = 0;
Affinity = 0i64;
DeferredContext = (int)HalpStallCounter[3].DeferredContext;
PreviousAffinity = 0i64;
if( (DeferredContext & 1) != 0
&& (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) >= 2
&& KeGetCurrentIrql() < 2u
&& (v36 & 0x200) != 0
&& ((__int64)v5[2].DpcData & 0x20) == 0 )
{
v6 = 1;
v31 = KiProcessorIndexToNumberMappingTable[KeGetPcr()->Prcb.Number];
Affinity.Reserved[1] = 0;
Affinity.Reserved[2] = 0;
*(_DWORD *)&Affinity.Group = (unsigned __int16)(v31 >> 6);
Affinity.Mask = 1i64 << (v31 & 0x3F);
KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
}
HalpTimerGetInternalData(v5, v1, v2, (PVOID)v3);
v9 = ((__int64(__fastcall *)(__int64))v5[1].SystemArgument2)(v8);
HalpProcessorFence();
v12 = 0i64;
Affinity.Mask = 1i64 << HIDWORD(v5[3].DeferredRoutine);
v13 = v9;
v14 = 0;
v15 = (*(_QWORD *)&v5[3].TargetInfoAsUlong * (unsigned __int64)(10 * MicroSeconds) + 9999999)
* (unsigned __int128)0xD6BF94D5E57A42BDui64;
v16 = (*(_QWORD *)&v5[3].TargetInfoAsUlong * (unsigned __int64)(10 * MicroSeconds) + 9999999) / 0x989680 + 1;
if( (*(_QWORD *)&v5[3].TargetInfoAsUlong * (unsigned __int64)(10 * MicroSeconds) + 9999999) / 0x989680 != -1i64 )
{
Mask = Affinity.Mask;
do
{
if( (++v14 & dword_140C4A13C) == 0 && qword_140C4A140 )
qword_140C4A140(v14, *((_QWORD *)&v15 + 1), v10);
else
_mm_pause();
HalpTimerGetInternalData(v5, *((PVOID *)&v15 + 1), v10, v11);
*(_QWORD *)&v15 = ((__int64(__fastcall *)(__int64))v5[1].SystemArgument2)(v18);
if( (unsigned __int64)v15 < v13 )
v12 += Mask;
v13 = v15;
}
while( (__int64)v15 + v12 - v9 < v16 );
}
if( v6 )
*(_QWORD *)&v15 = KeRevertToUserGroupAffinityThread(&PreviousAffinity);
return(VOID *)v15;
}Referenced by:
BgpFwDisplayBugCheckProgressUpdate
BgpFwDisplayBugCheckScreen
ExpWaitForBootDevices
HalpApicStartProcessor
HalpInterruptResetThisProcessor
HalpInterruptWaitForProcessorStartUp
HalpNmiReboot
HalpPowerWriteResetCommand
HalpSfiTimerArm
HalpSfiTimerInitialize
HalpTimerMeasureFrequencies
HalpTimerMeasureProcessorsWorker
HalpTimerTestHypervisorTimer
HalpTimerWaitForPhase0Interrupt
HalpUsbLegacyStopOhciInterrupt
HalpUsbLegacyStopUhciInterrupt
HdlspBugCheckProcessing
HsaGetPageFault
HvlPrepareForRootCrashdump
IoWriteCrashDump
IvtInitializeIommu
IvtUpdateGlobalCommand
KeBugCheck2
KeFreezeExecution