1 /* $Id: reply.c,v 1.2 2000/10/22 16:36:51 ekohl Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/lpc/reply.c
6 * PURPOSE: Communication mechanism
7 * PROGRAMMER: David Welch (welch@cwcom.net)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/ob.h>
16 #include <internal/port.h>
17 #include <internal/dbg.h>
20 #include <internal/debug.h>
24 /**********************************************************************
38 EiReplyOrRequestPort (
40 IN PLPC_MESSAGE LpcReply
,
46 PQUEUEDMESSAGE MessageReply
;
48 MessageReply
= ExAllocatePool(NonPagedPool
, sizeof(QUEUEDMESSAGE
));
49 MessageReply
->Sender
= Sender
;
53 memcpy(&MessageReply
->Message
, LpcReply
, LpcReply
->MessageSize
);
56 MessageReply
->Message
.Cid
.UniqueProcess
= PsGetCurrentProcessId();
57 MessageReply
->Message
.Cid
.UniqueThread
= PsGetCurrentThreadId();
58 MessageReply
->Message
.MessageType
= MessageType
;
59 MessageReply
->Message
.MessageId
= InterlockedIncrement(&EiNextLpcMessageId
);
61 KeAcquireSpinLock(&Port
->Lock
, &oldIrql
);
62 EiEnqueueMessagePort(Port
, MessageReply
);
63 KeReleaseSpinLock(&Port
->Lock
, oldIrql
);
65 return(STATUS_SUCCESS
);
69 /**********************************************************************
85 IN PLPC_MESSAGE LpcReply
91 DPRINT("NtReplyPort(PortHandle %x, LpcReply %x)\n", PortHandle
, LpcReply
);
93 Status
= ObReferenceObjectByHandle(PortHandle
,
94 PORT_ALL_ACCESS
, /* AccessRequired */
99 if (!NT_SUCCESS(Status
))
101 DPRINT("NtReplyPort() = %x\n", Status
);
105 Status
= EiReplyOrRequestPort(Port
->OtherPort
,
109 KeSetEvent(&Port
->OtherPort
->Event
, IO_NO_INCREMENT
, FALSE
);
111 ObDereferenceObject(Port
);
117 /**********************************************************************
131 NtReplyWaitReceivePort (
134 PLPC_MESSAGE LpcReply
,
135 PLPC_MESSAGE LpcMessage
141 PQUEUEDMESSAGE Request
;
143 DPRINT("NtReplyWaitReceivePort(PortHandle %x, LpcReply %x, "
144 "LpcMessage %x)\n", PortHandle
, LpcReply
, LpcMessage
);
146 Status
= ObReferenceObjectByHandle(PortHandle
,
152 if (!NT_SUCCESS(Status
))
154 DPRINT("NtReplyWaitReceivePort() = %x\n", Status
);
161 if (LpcReply
!= NULL
)
163 Status
= EiReplyOrRequestPort(Port
->OtherPort
,
167 KeSetEvent(&Port
->OtherPort
->Event
, IO_NO_INCREMENT
, FALSE
);
169 if (!NT_SUCCESS(Status
))
171 ObDereferenceObject(Port
);
177 * Want for a message to be received
179 DPRINT("Entering wait for message\n");
180 KeWaitForSingleObject(&Port
->Event
,
185 DPRINT("Woke from wait for message\n");
188 * Dequeue the message
190 KeAcquireSpinLock(&Port
->Lock
, &oldIrql
);
191 Request
= EiDequeueMessagePort(Port
);
192 memcpy(LpcMessage
, &Request
->Message
, Request
->Message
.MessageSize
);
193 if (Request
->Message
.MessageType
== LPC_CONNECTION_REQUEST
)
195 EiEnqueueConnectMessagePort(Port
, Request
);
196 KeReleaseSpinLock(&Port
->Lock
, oldIrql
);
200 KeReleaseSpinLock(&Port
->Lock
, oldIrql
);
207 ObDereferenceObject(Port
);
208 return(STATUS_SUCCESS
);
212 /**********************************************************************
226 NtReplyWaitReplyPort (
228 PLPC_MESSAGE ReplyMessage