AlpcpDispatchReplyToPort
INT64 __fastcall AlpcpDispatchReplyToPort(INT64 a1){
ULONG_PTR v2;
__int64 v3;
__int64 v4;
__int64 *v5;
INT64 *v6;
UINT64 v7;
__int64 v8;
__int64 v9;
NTSTATUS v10;
_ETHREAD *CurrentThread;
__int16 v13;
int v14;
__int16 v15;
unsigned int v16;
int v17[22];
int v18;
_ALPC_PORT *PortObject;
v2 = *(_QWORD *)(a1 + 8);
v3 = *(_QWORD *)a1;
v18 = *(_DWORD *)(a1 + 48);
*(_QWORD *)(a1 + 32) = 0i64;
*(_QWORD *)(a1 + 24) = 0i64;
*(_QWORD *)(a1 + 40) = 0i64;
v4 = *(_QWORD *)(v2 + 24);
PortObject = (_ALPC_PORT *)v3;
if( ((*(_DWORD *)(v4 + 416) >> 1) & 3) == 1 )
{
v5 = *(__int64 **)(v3 + 16);
v6 = v5 - 2;
ExAcquirePushLockSharedEx((UINT64)(v5 - 2), 0i64);
v8 = *v5;
v9 = *v5;
if( v3 == v4 )
goto LABEL_7;
}
else
{
v5 = *(__int64 **)(v4 + 16);
v6 = v5 - 2;
v7 = (UINT64)(v5 - 2);
if( ((*(_DWORD *)(v4 + 416) >> 1) & 3) == 2 )
{
ExAcquirePushLockSharedEx(v7, 0i64);
v8 = v5[2];
v9 = v8;
goto LABEL_7;
}
ExAcquirePushLockSharedEx(v7, 0i64);
v8 = *v5;
}
v9 = v5[1];
LABEL_7:
if( (*(_DWORD *)(v3 + 416) & 0x20) != 0 && (*(_DWORD *)(v3 + 256) & 0x1000) == 0
|| (*(_DWORD *)(v4 + 416) & 0x20) != 0 && (*(_DWORD *)(v4 + 256) & 0x1000) == 0 )
{
if( _InterlockedCompareExchange64(v6, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v6);
KeAbPostRelease(v6);
v10 = -1073741769;
LABEL_22:
AlpcpCancelMessage(PortObject, (_KALPC_MESSAGE *)v2, 0x10000ui64);
return(unsigned int)v10;
}
if( (unsigned __int64)*(unsigned __int16 *)(a1 + 52) <= *(_QWORD *)(v8 + 272) )
{
v10 = AlpcpReferenceReplyTargetPorts((PADAPTER_OBJECT)v8, (PADAPTER_OBJECT)v9);
if( v10 < 0 )
{
if( _InterlockedCompareExchange64(v6, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v6);
KeAbPostRelease(v6);
goto LABEL_22;
}
*(_QWORD *)(v2 + 200) = 0i64;
if( *(_WORD *)(a1 + 54) == 11 )
{
ExAcquirePushLockExclusiveEx(v4 + 352, 0i64);
*(_DWORD *)(v4 + 416) &= ~8u;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v4 + 352), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v4 + 352));
KeAbPostRelease((PVOID)(v4 + 352));
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
*(_WORD *)(v2 + 242) = *(_WORD *)(a1 + 52);
*(_WORD *)(v2 + 240) = *(_WORD *)(a1 + 52) - 40;
v13 = *(_WORD *)(a1 + 54);
*(_WORD *)(v2 + 244) = v13;
*(_WORD *)(v2 + 246) = *(_WORD *)(a1 + 56);
v14 = *(_DWORD *)(v2 + 40);
*(_OWORD *)(v2 + 248) = *(_OWORD *)((char *)CurrentThread + 1144);
if( (v18 & 0x10000) != 0 )
{
v15 = v13 & 0xDFFF;
v16 = v14 | 0x200;
}
else
{
v15 = v13 | 0x2000;
v16 = v14 & 0xFFFFFDFF;
}
*(_DWORD *)(v2 + 40) = v16;
*(_WORD *)(v2 + 244) = v15;
*(_DWORD *)(v2 + 40) |= 0x8000u;
_InterlockedOr(v17, 0);
AlpcpClearOwnerPortMessage(v2);
AlpcpSetOwnerPortMessage(v2, PortObject);
*(_DWORD *)(v2 + 44) = _InterlockedIncrement((volatile signed __int32 *)(v9 + 400));
*(_QWORD *)(v2 + 120) = *(_QWORD *)(v9 + 56);
HalPutDmaAdapter((PADAPTER_OBJECT)v9);
if( *(_QWORD *)(v2 + 16) )
AlpcpRemoveMessageFromPendingQueue((_KALPC_MESSAGE *)v2);
ExAcquirePushLockSharedEx(v8 + 352, 0i64);
if( (v18 & 0x20000) != 0 )
{
*(_DWORD *)(v2 + 40) &= ~0x100u;
*(_WORD *)(v2 - 30) += 2;
*(_QWORD *)(v2 + 32) = CurrentThread;
_InterlockedExchange64((volatile __int64 *)CurrentThread + 165, v2);
}
*(_QWORD *)(a1 + 32) = v8;
*(_QWORD *)(a1 + 16) = v5;
if( (*(_BYTE *)(v2 + 160) & 1) != 0 )
*(_DWORD *)(a1 + 48) |= 8u;
AlpcpCompleteDispatchMessage(a1);
return 0i64;
}
else
{
if( _InterlockedCompareExchange64(v6, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v6);
KeAbPostRelease(v6);
AlpcpUnlockMessage(v2);
return 3221225507i64;
}
}Referenced by:
AlpcpDispatchMessage
AlpcpSendMessage