AlpcpFlushQueue
VOID __fastcall AlpcpFlushQueue(INT64 a1, UINT64 *a2, UINT64 a3){
unsigned int v4;
__int64 v6;
ULONG_PTR v7;
volatile INT64 *v8;
volatile INT64 *v9;
__int64 v10;
v4 = a3;
if( (unsigned int)a3 <= 2 )
{
v6 = 136i64;
}
else
{
v6 = 176i64;
if( (_DWORD)a3 != 3 )
v6 = 200i64;
}
ExAcquirePushLockExclusiveEx(v6 + a1, 0i64);
while( 1 )
{
v7 = *a2;
if( (UINT64 *)*a2 == a2 )
break;
AlpcpReferenceBlob((PVOID)*a2);
if( v4 > 2 )
{
if( v4 == 3 )
v9 = (volatile INT64 *)(a1 + 176);
else
v9 = (volatile INT64 *)(a1 + 200);
}
else
{
v9 = (volatile INT64 *)(a1 + 136);
}
if( (_InterlockedExchangeAdd64(v9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v9);
KeAbPostRelease((PVOID)v9);
AlpcpLockForCachedReferenceBlob((PVOID)v7);
--*(_WORD *)(v7 - 30);
if( *(_QWORD *)(v7 + 16) == a1 )
AlpcpCancelMessage((_ALPC_PORT *)a1, (_KALPC_MESSAGE *)v7, 0x10000ui64);
else
AlpcpUnlockMessage(v7);
if( v4 > 2 )
{
v10 = 176i64;
if( v4 != 3 )
v10 = 200i64;
}
else
{
v10 = 136i64;
}
ExAcquirePushLockExclusiveEx(v10 + a1, 0i64);
}
if( v4 > 2 )
{
if( v4 == 3 )
v8 = (volatile INT64 *)(a1 + 176);
else
v8 = (volatile INT64 *)(a1 + 200);
}
else
{
v8 = (volatile INT64 *)(a1 + 136);
}
if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v8);
KeAbPostRelease((PVOID)v8);
}Referenced by:
AlpcpFlushMessagesPort