KiExecuteAllDpcs
__int64 __fastcall KiExecuteAllDpcs(__int64 a1, __int64 a2, _DWORD *a3, unsigned int a4){
__int64 v4;
_DWORD *v5;
__int64 v6;
__int64 v7;
__int64 result;
volatile signed __int32 *v10;
struct _KPRCB *CurrentPrcb;
int v12;
__int64 *v13;
__int64 v14;
ULONG_PTR v15;
__int64 *v16;
_QWORD *v17;
__int64 v18;
ULONG_PTR v19;
__int64 v20;
int v21;
__int64 v22;
struct _KPRCB *v23;
unsigned __int64 v24;
__int64 v25;
bool v26;
__int64 v27;
__int64 v28;
__int64 v29;
unsigned __int64 v30;
__int64 v31;
_DWORD *v32;
INT64 v33;
unsigned __int64 v34;
unsigned __int64 v35;
unsigned __int64 v36;
unsigned __int64 v37;
INT64 v38;
INT64 v39;
unsigned __int64 v40;
ULONG_PTR v41;
int v42;
__int16 v43;
unsigned int v44;
unsigned int v45;
__int64 v46;
__int64 v47;
__int64 v48;
UINT64 v49;
LARGE_INTEGER PerformanceCounter;
INT64 SystemTimePrecise;
int v52;
ULONG_PTR v53;
__int64 v54;
__int64 v55;
ULONG_PTR BugCheckParameter4;
UINT64 Flag;
__int64 v59;
__int64 v60;
ULONG_PTR BugCheckParameter2;
ULONG_PTR v62;
int v63;
unsigned int v64;
__int64 v65;
ULONG_PTR BugCheckParameter3;
__int16 *v67;
__int64 v68;
__int64 v69;
ULONG_PTR v70;
ULONG_PTR v71;
__int64 v72;
__int64 v73;
__int128 v74;
ULONG_PTR v75;
__int128 v76;
__int128 v77;
EVENT_DATA_DESCRIPTOR EventData;
ULONG_PTR *p_BugCheckParameter2;
__int64 v80;
v4 = a4;
v69 = a2;
v5 = a3;
BugCheckParameter2 = 0i64;
v65 = 0i64;
v6 = a4;
v7 = a1 + 40 * (a4 + 312i64);
result = *(unsigned int *)(v7 + 24);
v74 = 0i64;
v76 = 0i64;
v77 = 0i64;
if( (_DWORD)result )
{
v67 = 0i64;
v73 = *(_QWORD *)(a1 + 11664);
while( 1 )
{
v10 = (volatile signed __int32 *)(v7 + 16);
CurrentPrcb = KeGetCurrentPrcb();
if( *((_QWORD *)CurrentPrcb + 4247) && *((_BYTE *)CurrentPrcb + 32) <= 1u && *((_BYTE *)CurrentPrcb + 32) == 1 )
{
v5 = a3;
v6 = v4;
}
if( _interlockedbittestandset64(v10, 0i64) )
{
KxWaitForSpinLockAndAcquire((UINT64 *)(v7 + 16));
v5 = a3;
v6 = v4;
}
v12 = 0;
if( *(int *)(v7 + 24) <= 1 )
{
_InterlockedAnd16((volatile signed __int16 *)(a1 + 2 * v6 + 12588), 0xFFEDu);
if( !*(_DWORD *)(v7 + 24) )
break;
}
v13 = *(__int64 **)v7;
v14 = **(_QWORD **)v7;
*(_QWORD *)v7 = v14;
if( !v14 )
*(_QWORD *)(v7 + 8) = v7;
v15 = v13[2];
v16 = v13 - 1;
BugCheckParameter2 = v15;
v17 = (_QWORD *)v16[7];
v18 = v16[4];
v19 = v16[5];
v20 = v16[6];
v16[7] = 0i64;
v21 = *(_DWORD *)(v7 + 24) - 1;
v59 = v18;
*(_DWORD *)(v7 + 24) = v21;
*(_QWORD *)(v7 + 32) = v16;
v22 = *(_QWORD *)(a1 + 33976);
v62 = v19;
v60 = v20;
if( v22 && !(_DWORD)v4 )
{
v21 = *(_DWORD *)(v22 + 28) - 1;
*(_DWORD *)(v22 + 28) = v21;
}
_InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
v23 = KeGetCurrentPrcb();
v24 = *((_QWORD *)v23 + 4247);
if( v24 && *((_BYTE *)v23 + 32) <= 1u && !v21 )
{
v5 = a3;
v19 = v62;
}
_enable();
if( v67 )
{
v25 = qword_140D238A0;
v63 = 0;
if( qword_140D238A0 )
{
v24 = *(unsigned int *)(qword_140D238A0 + 4224);
v26 = !_BitScanForward((unsigned int *)&v27, v24);
v63 = v27;
if( !v26 )
{
do
{
v24 = ((_DWORD)v24 - 1) & (unsigned int)v24;
v28 = 32i64 * (unsigned int)v27 + qword_140D238A0 + 4260;
if( v28 && (*(_DWORD *)(v28 + 4) & 0x80u) != 0 )
v12 |= 1 << *(_BYTE *)(qword_140D238A0 + 2 * v27 + 4209);
v26 = !_BitScanForward((unsigned int *)&v27, v24);
}
while( !v26 );
v20 = v60;
v63 = v27;
}
}
else
{
LOBYTE(v12) = 30;
}
if( (v12 & 2) != 0 )
{
PerformanceCounter = KeQueryPerformanceCounter(0i64);
v5 = a3;
v18 = v59;
v20 = v60;
*(LARGE_INTEGER *)&v76 = PerformanceCounter;
v29 = 0i64;
}
else
{
v29 = 0i64;
*(_QWORD *)&v76 = 0i64;
}
if( (v12 & 4) != 0 )
{
SystemTimePrecise = RtlGetSystemTimePrecise();
v5 = a3;
v18 = v59;
v20 = v60;
*((_QWORD *)&v76 + 1) = SystemTimePrecise;
v29 = 0i64;
}
else
{
*((_QWORD *)&v76 + 1) = 0i64;
}
if( (v12 & 8) != 0 )
{
v30 = __rdtsc();
v24 = (unsigned __int64)HIDWORD(v30) << 32;
*(_QWORD *)&v77 = v30;
v29 = 0i64;
}
else
{
*(_QWORD *)&v77 = 0i64;
}
if( (v12 & 0x10) != 0 )
{
v68 = 0i64;
((void(__fastcall *)(__int64 *, unsigned __int64, __int64, __int64))off_140C009E0[0])(&v68, v24, v25, v20);
v29 = v68;
v5 = a3;
v18 = v59;
}
v19 = v62;
*((_QWORD *)&v77 + 1) = v29;
}
v31 = ((*v5)++ & 0xF) + 1i64;
v32 = &v5[4 * v31];
*(_QWORD *)v32 = BugCheckParameter2;
v32[2] = KUSER_SHARED_DATA.TickCount.LowPart;
v33 = *(_QWORD *)(a1 + 33960);
LODWORD(BugCheckParameter3) = *(_DWORD *)(v69 + 484);
*(_DWORD *)(a1 + 32412) = 0;
if( v33 && *(_QWORD *)(a1 + 33968) != v33 && *(_DWORD *)(a1 + 31724) < *(_DWORD *)(a1 + 31732) )
{
*(_QWORD *)(a1 + 33968) = v33;
memset(v33, 0i64);
v18 = v59;
v19 = v62;
}
v34 = __rdtsc();
*(_QWORD *)(a1 + 11664) = v17;
v35 = v34;
if( v17 != (_QWORD *)1 )
v17[4] = v34;
if( !(_DWORD)v4 )
*(_BYTE *)(a1 + 12586) = 1;
((void(__fastcall *)(__int64 *, __int64, ULONG_PTR))BugCheckParameter2)(v16, v18, v19);
v36 = __rdtsc();
v37 = v36;
if( !(_DWORD)v4 )
{
*(_BYTE *)(a1 + 12586) = 0;
v38 = *(_QWORD *)(a1 + 12432);
v39 = v36 - v35;
if( v38 )
{
v52 = *(_DWORD *)(v38 + 4) >> 5;
v72 = -1i64 << (*(_BYTE *)(v38 + 4) & 0x1F);
v53 = BugCheckParameter2 & v72;
v71 = (BugCheckParameter2 & v72) >> 56;
v70 = (BugCheckParameter2 & v72) >> 40;
v62 = (BugCheckParameter2 & v72) >> 16;
if( v52 )
{
v75 = BugCheckParameter2 & v72;
v54 = *(_QWORD *)(v38 + 8)
+ 8i64
* (((unsigned int)v71
+ 37
* ((unsigned __int8)((BugCheckParameter2 & v72) >> 48)
+ 37
* ((unsigned __int8)v70
+ 37
* ((unsigned __int8)((BugCheckParameter2 & v72) >> 32)
+ 37
* ((((unsigned int)BugCheckParameter2 & (unsigned int)v72) >> 24)
+ 37
* ((unsigned __int8)v62
+ 37
* ((unsigned __int8)((unsigned __int16)(BugCheckParameter2 & v72) >> 8)
+ 37 * ((unsigned __int8)v53 + 11623883)))))))) & (v52 - 1));
while( 1 )
{
v54 = *(_QWORD *)v54;
if( (v54 & 1) != 0 )
break;
if( v53 == (v72 & *(_QWORD *)(v54 + 8)) )
{
v55 = *(_QWORD *)(v54 + 16) >> 2;
*(_BYTE *)(v54 + 24) = 1;
*(_QWORD *)(v54 + 16) = v55 + ((unsigned __int64)(3 * v39) >> 2);
goto LABEL_37;
}
}
}
KiInsertNewDpcRuntime(v38, BugCheckParameter2, v39);
}
}
LABEL_37:
if( v17 != (_QWORD *)1 )
{
v40 = v37 - v17[4];
v17[3] += v40;
v17[10] += v40;
++v17[5];
++v17[11];
}
v41 = (unsigned int)BugCheckParameter3;
v32[3] = KUSER_SHARED_DATA.TickCount.LowPart;
if( (_DWORD)v41 != *(_DWORD *)(v69 + 484) )
KeBugCheckEx(0xC7u, 4ui64, BugCheckParameter2, v41, *(unsigned int *)(v69 + 484));
if( v67 )
{
v42 = *((_DWORD *)v67 + 1);
v43 = *v67;
p_BugCheckParameter2 = &BugCheckParameter2;
v80 = 8i64;
v44 = *(_DWORD *)(EtwpHostSiloState + 4224);
v26 = !_BitScanForward(&v45, v44);
v64 = v45;
if( !v26 )
{
do
{
v44 &= v44 - 1;
v46 = v45;
v47 = 32i64 * v45 + EtwpHostSiloState + 4260;
if( v47 )
{
if( (*(_DWORD *)(v47 + 4) & 0x80u) != 0 )
{
v48 = *(unsigned __int8 *)(EtwpHostSiloState + 2 * v46 + 4209);
v49 = *(unsigned __int8 *)(EtwpHostSiloState + 2 * v46 + 4208);
LODWORD(Flag) = v42;
*(_QWORD *)&EventData.Size = 8i64;
LOWORD(BugCheckParameter4) = v43;
EventData.Ptr = (unsigned __int64)(&v75 + v48);
EtwpLogKernelEvent(&EventData, EtwpHostSiloState, v49, 2u, BugCheckParameter4, Flag);
}
}
v26 = !_BitScanForward(&v45, v44);
}
while( !v26 );
v64 = v45;
}
}
_disable();
if( !*(_DWORD *)(v7 + 24) )
goto LABEL_48;
v5 = a3;
v6 = v4;
}
KxReleaseSpinLock((UINT64 *)(v7 + 16));
LABEL_48:
result = v73;
*(_QWORD *)(a1 + 11664) = v73;
}
return result;
}Referenced by:
KiExecuteDpc
KiRetireDpcList