AlpcpReceiveDirectMessagePort
INT64 __fastcall AlpcpReceiveDirectMessagePort(INT64 *a1, INT64 a2, INT64 a3, UINT64 *a4, INT64 a5){
INT64 result;
INT64 v7;
__int64 v8;
unsigned int v9;
int v10;
int v11;
volatile signed __int64 *v12;
int v13;
volatile signed __int64 *v14;
volatile signed __int64 *v15;
unsigned int v16;
int v17;
volatile INT64 *v18;
UINT64 v19;
__int64 BugCheckParameter2[2];
BugCheckParameter2[0] = 0i64;
if( !(_DWORD)a2 )
return 3221225485i64;
v7 = *a1;
result = AlpcpLookupMessage(*a1, a2, a3, (INT64)a4, (UINT64 *)BugCheckParameter2);
if( (int)result >= 0 )
{
v8 = BugCheckParameter2[0];
if( v7 != *(_QWORD *)(BugCheckParameter2[0] + 16) )
{
v9 = -1073740030;
LABEL_12:
AlpcpUnlockMessage(BugCheckParameter2[0]);
return v9;
}
v10 = *(_DWORD *)(BugCheckParameter2[0] + 40);
if( (v10 & 0x10000) == 0 || (v11 = 1, v7 != *(_QWORD *)(BugCheckParameter2[0] + 64)) )
v11 = 0;
if( (v10 & 7) != 4 && !v11 )
{
v9 = -1073741811;
goto LABEL_12;
}
v12 = (volatile signed __int64 *)(v7 + 352);
ExAcquirePushLockSharedEx(v7 + 352, 0i64);
v13 = *(_DWORD *)(v7 + 416);
if( (v13 & 0x40) != 0 )
{
AlpcpUnlockMessage(v8);
if( _InterlockedCompareExchange64(v12, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v7 + 352));
KeAbPostRelease((PVOID)(v7 + 352));
return 3221227264i64;
}
if( (v13 & 0x10) != 0 )
{
AlpcpUnlockMessage(v8);
if( _InterlockedCompareExchange64(v12, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v7 + 352));
KeAbPostRelease((PVOID)(v7 + 352));
return 3221225537i64;
}
v14 = (volatile signed __int64 *)(v7 + 136);
if( v11 )
{
ExAcquirePushLockExclusiveEx(v7 + 136, 0i64);
*(_DWORD *)(v8 + 40) &= ~0x10000u;
v15 = (volatile signed __int64 *)(v7 + 200);
**(_QWORD **)(v8 + 88) = *(_QWORD *)(v8 + 80);
*(_QWORD *)(*(_QWORD *)(v8 + 80) + 8i64) = *(_QWORD *)(v8 + 88);
--*(_DWORD *)(v7 + 464);
}
else
{
v15 = (volatile signed __int64 *)(v7 + 200);
ExAcquirePushLockExclusiveEx(v7 + 200, 0i64);
--*(_DWORD *)(v7 + 460);
*(_DWORD *)(v8 + 40) &= 0xFFFFFFF8;
*(_QWORD *)(v8 + 16) = 0i64;
**(_QWORD **)(v8 + 8) = *(_QWORD *)v8;
*(_QWORD *)(*(_QWORD *)v8 + 8i64) = *(_QWORD *)(v8 + 8);
}
if( !v11 )
{
v16 = (*(_QWORD *)(v8 + 136) != 0i64 ? 0x80000000 : 0) | 0x40000000;
if( !*(_QWORD *)(v8 + 144) )
v16 = *(_QWORD *)(v8 + 136) != 0i64 ? 0x80000000 : 0;
v17 = v16 | 0x10000000;
if( !*(_QWORD *)(v8 + 152) )
v17 = v16;
if( (v17 & (unsigned int)a5) != 0 )
{
*(_WORD *)(v8 + 244) |= 0x2000u;
AlpcpInsertMessagePendingQueue(v7, v8);
goto LABEL_31;
}
*(_WORD *)(v8 + 244) &= ~0x2000u;
}
--*(_WORD *)(v8 - 30);
if( v11 )
{
if( (_InterlockedExchangeAdd64(v14, 0xFFFFFFFFFFFFFFFFui64) & 6) != 2 )
goto LABEL_34;
v18 = (volatile INT64 *)(v7 + 136);
goto LABEL_33;
}
LABEL_31:
v14 = v15;
if( (_InterlockedExchangeAdd64(v15, 0xFFFFFFFFFFFFFFFFui64) & 6) != 2 )
{
LABEL_34:
KeAbPostRelease((PVOID)v14);
if( _InterlockedCompareExchange64(v12, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v7 + 352));
KeAbPostRelease((PVOID)(v7 + 352));
v19 = BugCheckParameter2[0];
if( AlpcpLogEnabled )
AlpcpLogReceiveMessage(BugCheckParameter2[0]);
*a4 = v19;
return 0i64;
}
v18 = v15;
LABEL_33:
ExfTryToWakePushLock(v18);
goto LABEL_34;
}
return result;
}Referenced by:
AlpcpReceiveMessage