AlpcpCleanupProcessViews
void __fastcall AlpcpCleanupProcessViews(__int64 a1){
_ETHREAD *CurrentThread;
_QWORD *v2;
volatile INT64 *v3;
const void *v4;
unsigned int v5;
unsigned __int64 v6;
__int64 v7;
unsigned int v8;
unsigned __int64 v9;
__int64 v10;
__int64 v11;
void *v12;
_QWORD *v13;
const void *v14;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v2 = (_QWORD *)(a1 + 2056);
--*((_WORD *)CurrentThread + 242);
v3 = (volatile INT64 *)(a1 + 2048);
v4 = 0i64;
v5 = 0;
v6 = 0i64;
ExAcquirePushLockExclusiveEx(a1 + 2048, 0i64);
v13 = v2;
while( (_QWORD *)*v2 != v2 )
{
v7 = *v2 - 80i64;
v8 = v5 + 1;
v9 = 0i64;
if( v4 == (const void *)v7 )
v9 = v6;
v5 = 0;
if( v4 == (const void *)v7 )
v5 = v8;
v10 = *v2 - 80i64;
if( v4 == (const void *)v7 )
v10 = (__int64)v4;
v14 = (const void *)v10;
LODWORD(v11) = AlpcpReferenceBlob((PVOID)v7);
v12 = (void *)(v7 & -(__int64)(v11 != 0));
if( (_InterlockedExchangeAdd64(v3, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v3);
KeAbPostRelease((PVOID)v3);
if( v9 )
{
v6 = v9;
if( v5 > 0x64 )
{
v2 = v13;
if( *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - v9 - KUSER_SHARED_DATA.InterruptTimeBias > 0x23C34600 )
{
DbgPrintEx(0x69u, 0, "ALPC: View @ %p is stuck.\n", v14);
if( (_BYTE)KdDebuggerEnabled )
__debugbreak();
v5 = 0;
v6 = 0i64;
}
}
}
else
{
v2 = v13;
v6 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - KUSER_SHARED_DATA.InterruptTimeBias;
}
if( v12 )
{
AlpcpForceUnlinkSecureView((ULONG_PTR)v12);
AlpcpDereferenceBlobEx(v12, 1i64);
}
ExAcquirePushLockExclusiveEx((UINT64)v3, 0i64);
v4 = v14;
}
if( (_InterlockedExchangeAdd64(v3, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v3);
KeAbPostRelease((PVOID)v3);
KeLeaveCriticalRegion();
}Referenced by:
LpcExitProcess