AlpcpCancelMessage
INT64 __fastcall AlpcpCancelMessage(_ALPC_PORT *PortObject, _KALPC_MESSAGE *Message, UINT64 Flags){
int v3;
INT64 v5;
int v7;
int v8;
INT64 v9;
unsigned __int64 v10;
int v11;
BOOL v12;
INT64 *v13;
INT64 *v14;
INT64 *v15;
int v16;
INT64 *v17;
int v18;
unsigned int v19;
UINT64 v20;
void *v21;
void *v22;
__int64 v23;
int v24;
volatile INT64 *v25;
int v26;
int v28[8];
int v29;
int v30;
INT64 v31;
int v32;
v32 = Flags;
v3 = *((_DWORD *)Message + 10);
v5 = *((_QWORD *)Message + 2);
v31 = v5;
v7 = v3 & 7;
v8 = v3 & 0x80;
v30 = v7;
v9 = 0i64;
v10 = 0i64;
if( ((*((_DWORD *)PortObject + 104) >> 1) & 3) != 1 )
{
v11 = v3 & 0x78;
v12 = 0;
if( ((*((_DWORD *)PortObject + 104) >> 1) & 3) == 2 )
{
LOBYTE(v12) = v11 == 16;
if( v8 )
goto LABEL_44;
v15 = (INT64 *)*((_QWORD *)PortObject + 2);
ExAcquirePushLockSharedEx((UINT64)(v15 - 2), 0i64);
if( (*((_DWORD *)Message + 10) & 0x200) == 0 )
{
if( v11 == 16 )
{
v9 = *v15;
v10 = v15[1];
}
else
{
v9 = (INT64)PortObject;
v10 = (unsigned __int64)PortObject;
}
if( v9 )
v9 &= -(__int64)(ObReferenceObjectSafe((PVOID)v9) != 0);
if( v10 )
v10 &= -(__int64)(ObReferenceObjectSafe((PVOID)v10) != 0);
}
if( _InterlockedCompareExchange64(v15 - 2, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v15 - 2);
v14 = v15 - 2;
}
else
{
LOBYTE(v12) = v11 == 8;
if( v8 )
goto LABEL_44;
v13 = (INT64 *)*((_QWORD *)PortObject + 2);
ExAcquirePushLockSharedEx((UINT64)(v13 - 2), 0i64);
if( (*((_DWORD *)Message + 10) & 0x200) == 0 )
{
if( v11 == 8 )
{
v9 = v13[2];
v10 = v9;
}
else
{
v9 = *v13;
v10 = v13[1];
}
if( v9 )
v9 &= -(__int64)(ObReferenceObjectSafe((PVOID)v9) != 0);
if( v10 )
v10 &= -(__int64)(ObReferenceObjectSafe((PVOID)v10) != 0);
}
if( _InterlockedCompareExchange64(v13 - 2, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v13 - 2);
v14 = v13 - 2;
}
KeAbPostRelease(v14);
goto LABEL_42;
}
v16 = v3 & 0x78;
v12 = v16 == 8;
if( !v8 && v5 )
{
v17 = (INT64 *)*((_QWORD *)Message + 23);
if( !v17 )
{
LABEL_43:
v5 = v31;
goto LABEL_44;
}
ExAcquirePushLockSharedEx((UINT64)(v17 - 2), 0i64);
if( (*((_DWORD *)Message + 10) & 0x200) == 0 )
{
if( v16 == 8 )
{
v9 = v17[2];
v10 = v9;
}
else
{
v9 = *v17;
v10 = v17[1];
}
if( v9 )
v9 &= -(__int64)(ObReferenceObjectSafe((PVOID)v9) != 0);
if( v10 )
v10 &= -(__int64)(ObReferenceObjectSafe((PVOID)v10) != 0);
}
if( _InterlockedCompareExchange64(v17 - 2, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v17 - 2);
KeAbPostRelease(v17 - 2);
v12 = v16 == 8;
LABEL_42:
LOBYTE(Flags) = v32;
v7 = v30;
goto LABEL_43;
}
LABEL_44:
if( !v12 )
{
if( v5 && (v7 != 3 || (*((_DWORD *)Message + 10) & 0x2000) != 0) )
{
v18 = 0;
v19 = 0;
}
else
{
v19 = 1073741870;
v18 = 1;
}
if( (Flags & 1) != 0 && v18 )
goto LABEL_90;
LABEL_59:
*((_DWORD *)Message + 10) |= 0x80u;
*((_BYTE *)Message + 244) = 0;
*((_WORD *)Message + 122) |= 0xCu;
*((_DWORD *)Message + 60) = 2621440;
AlpcpReleaseMessageAttributesOnCancel((__int64)Message, v18);
*((_DWORD *)Message + 10) |= 0x8200u;
*((_WORD *)Message + 122) &= ~0x2000u;
_InterlockedOr(v28, 0);
AlpcpClearOwnerPortMessage((__int64)Message);
AlpcpTransferQuotaMessage((__int64)Message);
v21 = (void *)*((_QWORD *)Message + 26);
if( v21 )
{
PsReleaseProcessWakeCounter(v21, *((unsigned int *)Message + 66));
*((_QWORD *)Message + 26) = 0i64;
}
v22 = (void *)*((_QWORD *)Message + 27);
if( v22 )
{
PsReleaseProcessWakeCounter(v22, *((unsigned int *)Message + 66));
*((_QWORD *)Message + 27) = 0i64;
}
v23 = *((_QWORD *)Message + 4);
if( v23 )
{
if( (_KALPC_MESSAGE *)_InterlockedExchange64((volatile __int64 *)(v23 + 1320), 0i64) == Message )
{
*((_WORD *)Message - 15) -= 2;
*((_QWORD *)Message + 4) = 0i64;
v29 = 2;
KeReleaseSemaphoreEx((KSEMAPHORE *)(v23 + 1160), 1i64, 1i64, v20);
}
}
else if( v9 && v10 )
{
if( !v12 && (v32 & 2) == 0 )
{
LABEL_87:
v26 = *((_DWORD *)Message + 10);
if( (v26 & 0x2000) != 0 && (v26 & 7) == 3 )
AlpcpRemoveMessageFromPendingQueue(Message);
goto LABEL_90;
}
ExAcquirePushLockSharedEx(v9 + 352, 0i64);
if( (*(_DWORD *)(v9 + 416) & 0x40) != 0 )
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v9 + 352), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v9 + 352));
KeAbPostRelease((PVOID)(v9 + 352));
}
else
{
++*((_WORD *)Message - 15);
*((_QWORD *)Message + 8) = v9;
*((_QWORD *)Message + 7) = v10;
*((_DWORD *)Message + 18) = _InterlockedIncrement((volatile signed __int32 *)(v10 + 400));
*((_QWORD *)Message + 16) = *(_QWORD *)(v10 + 56);
AlpcpInsertMessageCanceledQueue(v9, (INT64)Message);
AlpcpSignalPortAndUnlock(v9);
}
v5 = v31;
}
if( v12 && (v32 & 0x10000) != 0 && v5 )
{
v24 = *((_DWORD *)Message + 10) & 7;
if( v24 == 3 )
{
AlpcpRemoveMessageFromPendingQueue(Message);
}
else
{
if( v24 == 4 )
{
v25 = (volatile INT64 *)(v5 + 200);
ExAcquirePushLockExclusiveEx(v5 + 200, 0i64);
--*(_DWORD *)(v5 + 460);
*((_DWORD *)Message + 10) &= 0xFFFFFFF8;
*((_QWORD *)Message + 2) = 0i64;
**((_QWORD **)Message + 1) = *(_QWORD *)Message;
*(_QWORD *)(*(_QWORD *)Message + 8i64) = *((_QWORD *)Message + 1);
}
else
{
v25 = (volatile INT64 *)(v5 + 136);
ExAcquirePushLockExclusiveEx(v5 + 136, 0i64);
AlpcpRemoveMessagePort(v5, (INT64)Message);
}
if( (_InterlockedExchangeAdd64(v25, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v25);
KeAbPostRelease((PVOID)v25);
--*((_WORD *)Message - 15);
}
}
goto LABEL_87;
}
if( !v5 || v7 != 3 || (v18 = 1, (*((_DWORD *)Message + 10) & 0x2000) != 0) )
v18 = 0;
v19 = 259;
if( (Flags & 1) == 0 || v18 )
goto LABEL_59;
LABEL_90:
*((_DWORD *)Message + 10) &= ~0x8000u;
AlpcpUnlockMessage((ULONG_PTR)Message);
if( v9 )
HalPutDmaAdapter((PADAPTER_OBJECT)v9);
if( v10 )
HalPutDmaAdapter((PADAPTER_OBJECT)v10);
return v19;
}Referenced by:
AlpcpAcceptConnectPort
AlpcpDispatchReplyToPort
AlpcpFlushMessagesByRequestor
AlpcpFlushQueue
AlpcpProcessSynchronousRequest
AlpcpReceiveLegacyMessage
AlpcpReceiveMessage
AlpcpReceiveSynchronousReply
AlpcpReplyLegacySynchronousRequest
AlpcpSendMessage
NtAlpcCancelMessage