KiFlushQueueApc
_LIST_ENTRY *__stdcall KiFlushQueueApc(_ETHREAD *Thread, CHAR ApcMode){
__int64 v2;
unsigned __int8 CurrentIrql;
char *v6;
_LIST_ENTRY *v7;
_LIST_ENTRY *v8;
_LIST_ENTRY *v9;
UINT64 SpinCount;
UINT64 v11;
v2 = ApcMode;
if( ApcMode == 1 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Thread + 8) );
}
if( *((_ETHREAD **)Thread + 21) == (_ETHREAD *)((char *)Thread + 168) )
{
KiReleaseThreadLockSafe((INT64)Thread);
__writecr8(CurrentIrql);
return 0i64;
}
}
else
{
if( *((_ETHREAD **)Thread + 2 * ApcMode + 19) == (_ETHREAD *)((char *)Thread + 16 * ApcMode + 152) )
return 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(v11) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
{
do
KeYieldProcessorEx(&v11);
while( *((_QWORD *)Thread + 8) );
}
}
v6 = (char *)Thread + 16 * v2 + 152;
v7 = *(_LIST_ENTRY **)v6;
if( *(char **)v6 == v6 )
{
v7 = 0i64;
}
else
{
v8 = (_LIST_ENTRY *)*((_QWORD *)v6 + 1);
if( (char *)v7->Blink != v6 || (char *)v8->Flink != v6 )
__fastfail(3u);
v8->Flink = v7;
v7->Blink = v8;
v9 = v7;
do
{
BYTE2(v9[4].Flink) = 0;
v9 = v9->Flink;
}
while( v9 != v7 );
*((_QWORD *)v6 + 1) = v6;
*(_QWORD *)v6 = v6;
}
KiReleaseThreadLockSafe((INT64)Thread);
__writecr8(CurrentIrql);
return v7;
}Referenced by:
KeRundownApcQueues