KiTimerExpiration
INT64 __fastcall KiTimerExpiration(__int64 a1, int a2, unsigned __int64 a3, char a4, int *a5){
INT64 result;
__int64 v9;
__int64 v10;
INT64 v11;
unsigned int v12;
unsigned __int64 v13;
unsigned int v14;
unsigned int v15;
int v16;
INT64 v17;
UINT64 v18;
result = KiSelectActiveTimerTable(a1, 1);
v11 = result;
if( result )
{
v12 = *(_DWORD *)(v9 + 35584);
*(_DWORD *)(a1 + 35584) = ((_BYTE)v12 + 1) & 0xF;
*(_QWORD *)(a1 + 16i64 * v12 + 35592) = v10;
*(LARGE_INTEGER *)(a1 + 16i64 * v12 + 35600) = KeQueryPerformanceCounter(0i64);
v13 = 0i64;
v14 = (a3 >> 18) - a2 + 1;
if( v14 > 0x100 )
v13 = ((a3 >> 18) - v14 + 1) << 18;
do
{
if( v14 <= 0x100 )
{
v15 = v14;
v16 = 256 - v14;
v13 = a3;
if( 256 - v14 > 0x18 )
v16 = 24;
}
else
{
v13 += 0x4000000i64;
v15 = 256;
v16 = 0;
}
LODWORD(v18) = 0;
LODWORD(v17) = v16;
KiExpireTimerTable((struct KPRCB *)a1, v11, (unsigned int)a2, v15, v17, v13, v18, (INT64 *)a5);
if( a4 )
{
LODWORD(v18) = 1;
LODWORD(v17) = v16;
KiExpireTimerTable((struct KPRCB *)a1, v11, (unsigned int)a2, v15, v17, v13, v18, (INT64 *)a5);
}
a2 += v15;
result = 24i64;
v14 -= v15;
}
while( v14 );
if( (*(_BYTE *)(a1 + 12588) & 8) == 0 )
{
*(_DWORD *)(a1 + 32420) = 0;
result = *(unsigned int *)(a1 + 32424);
if( (unsigned int)result >= KeTimeIncrement )
{
result = (unsigned int)(result - KeTimeIncrement);
*(_DWORD *)(a1 + 32424) = result;
}
else
{
*(_DWORD *)(a1 + 32424) = 0;
}
}
}
return result;
}Referenced by:
KiTimerExpirationDpc