KiCancelTimer
UINT8 __stdcall KiCancelTimer(_KTIMER *Timer, UINT8 ReleaseTimer){
UINT8 v2;
UINT8 v3;
__int64 v5;
__int64 v6;
struct _KPRCB *CurrentPrcb;
__int64 v8;
char *v9;
volatile signed __int32 *v10;
unsigned __int16 v11;
__int64 v12;
unsigned __int64 v13;
_KTIMER **v14;
__int64 v15;
unsigned int v16;
int v17;
volatile signed __int32 *v19;
unsigned __int64 v20;
__int64 v21;
__int64 v22;
struct _KPRCB *v23;
__int64 v24;
int v25;
UINT64 SpinCount;
int v28;
UINT64 v29;
UINT64 v30;
INT64 v31;
INT64 v32;
__int64 v33;
v33 = 0i64;
v2 = 0;
LODWORD(SpinCount) = 0;
v3 = ReleaseTimer;
while( 1 )
{
HIDWORD(SpinCount) = 0;
while( _interlockedbittestandset((volatile signed __int32 *)Timer, 7u) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
while( (*(_DWORD *)Timer & 0x80u) != 0 );
}
if( (*((_BYTE *)Timer + 3) & 0xC0) == 0 )
break;
v5 = *((unsigned __int16 *)Timer + 28);
v6 = *((unsigned __int8 *)Timer + 2);
CurrentPrcb = KeGetCurrentPrcb();
v8 = v6;
v28 = 0;
v9 = (char *)*(&KiProcessorBlock + v5) + 14656;
v10 = (volatile signed __int32 *)&v9[0x2000 * (unsigned __int64)*((unsigned __int16 *)Timer + 29) + 512 + 32 * v6];
while( _interlockedbittestandset64(v10, 0i64) )
{
do
KeYieldProcessorEx((UINT64 *)&v28);
while( *(_QWORD *)v10 );
v22 = *((_QWORD *)CurrentPrcb + 4247);
if( v22 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v22 + 24);
}
if( *((char *)Timer + 3) >= 0 )
{
v11 = *((_WORD *)Timer + 29);
v12 = *((_QWORD *)Timer + 4);
v13 = 32 * (((unsigned __int64)v11 << 8) + v8 + 16);
v14 = (_KTIMER **)*((_QWORD *)Timer + 5);
v15 = 32 * (((v11 ^ 1i64) << 8) + v8 + 16);
if( *(_KTIMER **)(v12 + 8) != (_KTIMER *)((char *)Timer + 32) || *v14 != (_KTIMER *)((char *)Timer + 32) )
__fastfail(3u);
*v14 = (_KTIMER *)v12;
*(_QWORD *)(v12 + 8) = v14;
if( v14 != (_KTIMER **)v12 )
{
LABEL_10:
_InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
v16 = -1073741953;
v17 = -1073741825;
LABEL_11:
if( !v3 )
v16 = v17;
_InterlockedAnd((volatile signed __int32 *)Timer, v16);
return 1;
}
*(_DWORD *)&v9[v13 + 28] = -1;
if( v11 )
{
v19 = (volatile signed __int32 *)&v9[32 * v8 + 512];
v32 = (INT64)v19;
v31 = (INT64)KeGetCurrentPrcb();
if( _interlockedbittestandset64(v19, 0i64) )
{
_mm_pause();
v19 = 0i64;
}
if( v19 )
goto LABEL_19;
_InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
v23 = KeGetCurrentPrcb();
v19 = (volatile signed __int32 *)v32;
HIDWORD(v29) = 0;
while( _interlockedbittestandset64(v19, 0i64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&v29 + 4));
while( *(_QWORD *)v19 );
v24 = *((_QWORD *)v23 + 4247);
if( v24 && *((_BYTE *)v23 + 32) <= 1u )
{
v25 = *(_DWORD *)(v24 + 24) + 1;
*(_DWORD *)(v24 + 24) = v25;
}
}
v10 = (volatile signed __int32 *)&v9[32 * v8 + 8704];
v32 = (INT64)KeGetCurrentPrcb();
LODWORD(v30) = 0;
while( _interlockedbittestandset64(v10, 0i64) )
{
do
KeYieldProcessorEx(&v30);
while( *(_QWORD *)v10 );
}
}
else
{
v19 = (volatile signed __int32 *)&v9[32 * v8 + 8704];
v31 = (INT64)KeGetCurrentPrcb();
LODWORD(v29) = 0;
while( _interlockedbittestandset64(v19, 0i64) )
{
do
KeYieldProcessorEx(&v29);
while( *(_QWORD *)v19 );
}
}
v3 = ReleaseTimer;
LABEL_19:
if( *(_DWORD *)&v9[v13 + 28] == -1 && *(_DWORD *)&v9[v15 + 28] == -1 )
{
if( KiSerializeTimerExpiration )
{
v20 = v8 & 0x3F;
v21 = 8i64 * ((unsigned int)v8 >> 6);
}
else
{
v20 = (unsigned __int8)*(v9 - 14447);
v21 = v8 << 6;
}
_interlockedbittestandreset64(
(volatile signed __int32 *)(qword_140CFC7A8[2 * (unsigned __int8)*(v9 - 14448)] + v21),
v20);
}
_InterlockedAnd64((volatile signed __int64 *)v19, 0i64);
goto LABEL_10;
}
_InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
if( _InterlockedExchange64((volatile __int64 *)&v9[8 * (*((_BYTE *)Timer + 3) & 0x3F)], 0i64) )
{
v16 = 16777087;
v17 = 0xFFFFFF;
goto LABEL_11;
}
_InterlockedAnd((volatile signed __int32 *)Timer, 0xFFFFFF7F);
LODWORD(SpinCount) = 0;
while( *((char *)Timer + 3) < 0 )
KeYieldProcessorEx(&SpinCount);
}
if( v3 )
_InterlockedAnd((volatile signed __int32 *)Timer, 0xFFFFFF7F);
return v2;
}Referenced by:
ExpCancelTimer
KeCancelTimer
KeCancelTimerInternal
KeSetTimerEx
KiSetTimerEx
KiSuspendThread
KiSwapThread