1 /* $Id: send.c,v 1.4 2001/03/18 19:35:13 dwelch Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/lpc/send.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>
23 /**********************************************************************
36 LpcSendTerminationPort (IN PEPORT Port
,
40 LPC_TERMINATION_MESSAGE Msg
;
42 Msg
.CreationTime
= CreationTime
;
43 Status
= LpcRequestPort (Port
, &Msg
.Header
);
48 /**********************************************************************
61 LpcSendDebugMessagePort (IN PEPORT Port
,
62 IN PLPC_DBG_MESSAGE Message
,
63 OUT PLPC_DBG_MESSAGE Reply
)
67 PQUEUEDMESSAGE ReplyMessage
;
69 Status
= EiReplyOrRequestPort(Port
,
73 if (!NT_SUCCESS(Status
))
75 ObDereferenceObject(Port
);
78 KeSetEvent(&Port
->OtherPort
->Event
, IO_NO_INCREMENT
, FALSE
);
83 KeWaitForSingleObject(&Port
->Event
,
92 KeAcquireSpinLock(&Port
->Lock
, &oldIrql
);
93 ReplyMessage
= EiDequeueMessagePort(Port
);
94 KeReleaseSpinLock(&Port
->Lock
, oldIrql
);
95 memcpy(Reply
, &ReplyMessage
->Message
, ReplyMessage
->Message
.MessageSize
);
96 ExFreePool(ReplyMessage
);
98 return(STATUS_SUCCESS
);
102 /**********************************************************************
114 NTSTATUS STDCALL
LpcRequestPort (IN PEPORT Port
,
115 IN PLPC_MESSAGE LpcMessage
)
119 DPRINT("LpcRequestPort(PortHandle %x LpcMessage %x)\n", Port
, LpcMessage
);
121 Status
= EiReplyOrRequestPort(Port
,
125 KeSetEvent(&Port
->Event
, IO_NO_INCREMENT
, FALSE
);
131 /**********************************************************************
143 NTSTATUS STDCALL
NtRequestPort (IN HANDLE PortHandle
,
144 IN PLPC_MESSAGE LpcMessage
)
149 DPRINT("NtRequestPort(PortHandle %x LpcMessage %x)\n", PortHandle
,
152 Status
= ObReferenceObjectByHandle(PortHandle
,
158 if (!NT_SUCCESS(Status
))
160 DPRINT("NtRequestPort() = %x\n", Status
);
164 Status
= LpcRequestPort(Port
->OtherPort
,
167 ObDereferenceObject(Port
);
172 /**********************************************************************
185 NtRequestWaitReplyPort (IN HANDLE PortHandle
,
186 PLPC_MESSAGE LpcRequest
,
187 PLPC_MESSAGE LpcReply
)
191 PQUEUEDMESSAGE Message
;
194 DPRINT("NtRequestWaitReplyPort(PortHandle %x, LpcRequest %x, "
195 "LpcReply %x)\n", PortHandle
, LpcRequest
, LpcReply
);
197 Status
= ObReferenceObjectByHandle(PortHandle
,
203 if (!NT_SUCCESS(Status
))
209 Status
= EiReplyOrRequestPort(Port
->OtherPort
,
213 if (!NT_SUCCESS(Status
))
215 DbgPrint("Enqueue failed\n");
216 ObDereferenceObject(Port
);
219 KeSetEvent(&Port
->OtherPort
->Event
, IO_NO_INCREMENT
, FALSE
);
224 KeWaitForSingleObject(&Port
->Event
,
233 KeAcquireSpinLock(&Port
->Lock
, &oldIrql
);
234 Message
= EiDequeueMessagePort(Port
);
235 KeReleaseSpinLock(&Port
->Lock
, oldIrql
);
236 DPRINT("Message->Message.MessageSize %d\n",
237 Message
->Message
.MessageSize
);
238 memcpy(LpcReply
, &Message
->Message
, Message
->Message
.MessageSize
);
241 ObDereferenceObject(Port
);
243 return(STATUS_SUCCESS
);
247 /**********************************************************************
259 NTSTATUS STDCALL
NtWriteRequestData (HANDLE PortHandle
,
260 PLPC_MESSAGE Message
,