AlpcpReceiveLegacyMessage
INT64 __fastcall AlpcpReceiveLegacyMessage(
_ALPC_DISPATCH_CONTEXT *DispatchContext,
_PORT_MESSAGE *ReceiveMessage,
_LARGE_INTEGER *Timeout,
VOID **PortContext,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 a8){
_ETHREAD *CurrentThread;
unsigned __int8 v11;
_ALPC_PORT *v12;
__int64 v13;
__int64 v14;
__int64 v15;
struct _DMA_ADAPTER *v16;
unsigned int v17;
ULONG_PTR v18;
char *v19;
struct _DMA_ADAPTER **v21;
UINT64 ReceiveAttributes;
_ALPC_PORT *PortObject;
ULONG_PTR BugCheckParameter2;
LONGLONG v25;
struct _DMA_ADAPTER *v26;
_ALPC_PORT *v27;
_ETHREAD *v28;
_ALPC_DISPATCH_CONTEXT *DispatchContexta;
DispatchContexta = DispatchContext;
BugCheckParameter2 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v28 = CurrentThread;
v11 = *((_BYTE *)CurrentThread + 562);
v25 = 0i64;
v12 = DispatchContext->PortObject;
PortObject = DispatchContext->PortObject;
v27 = DispatchContext->PortObject;
if( v11 )
{
if( Timeout )
{
v15 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)Timeout < 0x7FFFFFFF0000i64 )
v15 = (__int64)Timeout;
v25 = *(_QWORD *)v15;
Timeout = (_LARGE_INTEGER *)&v25;
}
if( ReceiveMessage )
{
v13 = (__int64)ReceiveMessage;
if( ((unsigned __int8)ReceiveMessage & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)ReceiveMessage >= 0x7FFFFFFF0000i64 )
v13 = 0x7FFFFFFF0000i64;
*(_BYTE *)v13 = *(_BYTE *)v13;
*(_BYTE *)(v13 + 39) = *(_BYTE *)(v13 + 39);
}
if( PortContext )
{
v14 = (__int64)PortContext;
if( (unsigned __int64)PortContext >= 0x7FFFFFFF0000i64 )
v14 = 0x7FFFFFFF0000i64;
*(_QWORD *)v14 = *(_QWORD *)v14;
}
DispatchContext = DispatchContexta;
}
else
{
v11 = (*((_DWORD *)CurrentThread + 29) & 0x400) != 0;
}
v16 = 0i64;
v26 = 0i64;
if( (*((_BYTE *)v12 + 416) & 6) == 6 )
{
v21 = (struct _DMA_ADAPTER **)*((_QWORD *)v12 + 2);
ExAcquirePushLockSharedEx((UINT64)(v21 - 2), 0i64);
v16 = *v21;
v26 = v16;
if( v16 && ObReferenceObjectSafe(v16) )
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)v21 - 2, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)v21 - 2);
KeAbPostRelease(v21 - 2);
PortObject = (_ALPC_PORT *)v16;
v27 = (_ALPC_PORT *)v16;
DispatchContext = DispatchContexta;
DispatchContexta->PortObject = (_ALPC_PORT *)v16;
goto LABEL_18;
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)v21 - 2, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)v21 - 2);
KeAbPostRelease(v21 - 2);
return 3221225527i64;
}
else
{
LABEL_18:
while( 1 )
{
LODWORD(ReceiveAttributes) = 0;
v17 = AlpcpReceiveMessagePort(
DispatchContext,
v11,
Timeout,
(_KALPC_MESSAGE **)&BugCheckParameter2,
ReceiveAttributes);
if( v17 )
break;
v18 = BugCheckParameter2;
if( (*(_DWORD *)(BugCheckParameter2 + 40) & 0x80u) == 0 )
{
*(_QWORD *)(BugCheckParameter2 + 200) = v28;
if( ReceiveMessage )
{
*(_OWORD *)ReceiveMessage = *(_OWORD *)(v18 + 240);
*((_OWORD *)ReceiveMessage + 1) = *(_OWORD *)(v18 + 256);
*((_QWORD *)ReceiveMessage + 4) = *(_QWORD *)(v18 + 272);
if( (*((_DWORD *)PortObject + 64) & 0x1000) != 0 )
*((_WORD *)ReceiveMessage + 2) &= 0xC00Fu;
v19 = (char *)ReceiveMessage + 40;
if( *(_QWORD *)(v18 + 176) )
AlpcpGetDataFromUserVaSafe(v18, v19);
else
AlpcpReadMessageData(v18, v19);
}
if( PortContext )
*PortContext = *(VOID **)(v18 + 120);
if( ReceiveMessage )
{
AlpcpUnlockMessage(v18);
}
else
{
*(_QWORD *)(v18 + 200) = 0i64;
AlpcpCancelMessage(PortObject, (_KALPC_MESSAGE *)v18, 0x10000ui64);
}
break;
}
if( *(_ALPC_PORT **)(BugCheckParameter2 + 64) == PortObject )
{
*(_QWORD *)(BugCheckParameter2 + 64) = 0i64;
*(_QWORD *)(v18 + 56) = 0i64;
}
AlpcpCancelMessage(PortObject, (_KALPC_MESSAGE *)v18, 0x10000ui64);
BugCheckParameter2 = 0i64;
DispatchContext = DispatchContexta;
}
if( v16 )
HalPutDmaAdapter(v16);
return v17;
}
}Referenced by:
NtReplyWaitReceivePortEx