NtReplyWaitReceivePortEx
NTSTATUS __fastcall NtReplyWaitReceivePortEx(
_HANDLE Handle,
VOID **PortContext,
_PORT_MESSAGE *Message,
PORT_MESSAGE *ReceiveMessage,
_LARGE_INTEGER *Timeout){
VOID *v8;
_ETHREAD *CurrentThread;
char PreviousMode;
int v11;
_ADAPTER_OBJECT *v12;
NTSTATUS v14;
PVOID Object;
_ALPC_DISPATCH_CONTEXT DispatchContext;
v8 = *(VOID **)&Handle;
memset(&DispatchContext, 0i64, sizeof(DispatchContext));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
AlpcpProbeForWriteMessageHeader(ReceiveMessage);
Object = 0i64;
v11 = ObReferenceObjectByHandle(v8, 1ui64, AlpcPortObjectType, PreviousMode, &Object, 0i64);
if( v11 >= 0 )
{
v12 = (_ADAPTER_OBJECT *)Object;
DispatchContext.PortObject = (_ALPC_PORT *)Object;
DispatchContext.Flags = 0;
if( Message
&& ((*((_DWORD *)Object + 104) & 0x2000) == 0 ? (DispatchContext.Flags = 65541,
memset(&DispatchContext.TargetThread, 0, 24),
v14 = AlpcpSendMessage(
&DispatchContext,
Message,
0i64,
PreviousMode)) : (DispatchContext.Flags = 4,
memset(
&DispatchContext.TargetThread,
0,
24),
v14 = AlpcpReplyLegacySynchronousRequest(
&DispatchContext,
(PORT_MESSAGE *)&Message->u1.DataLength,
PreviousMode)),
v11 = v14,
v14 < 0) )
{
HalPutDmaAdapter(v12);
if( v11 == -1073740029 )
v11 = -1073741769;
}
else
{
v11 = AlpcpReceiveLegacyMessage(&DispatchContext, ReceiveMessage, Timeout, PortContext);
AlpcpCompleteDeferSignalRequest(&DispatchContext);
HalPutDmaAdapter(v12);
}
}
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v11;
}Referenced by:
NtListenPort
NtReplyWaitReceivePort