* RETURN VALUE
*
* REVISIONS
- *
*/
NTSTATUS STDCALL
LpcSendTerminationPort (IN PEPORT Port,
* RETURN VALUE
*
* REVISIONS
- *
*/
NTSTATUS STDCALL
LpcSendDebugMessagePort (IN PEPORT Port,
*
* REVISIONS
*
+ * @implemented
*/
NTSTATUS STDCALL LpcRequestPort (IN PEPORT Port,
IN PLPC_MESSAGE LpcMessage)
*
* REVISIONS
*
+ * @implemented
*/
NTSTATUS STDCALL NtRequestPort (IN HANDLE PortHandle,
IN PLPC_MESSAGE LpcMessage)
*
* REVISIONS
*
+ * @implemented
*/
NTSTATUS STDCALL
NtRequestWaitReplyPort (IN HANDLE PortHandle,
/*
* Wait for a reply
*/
- KeWaitForSingleObject(&Port->Semaphore,
- UserRequest,
- UserMode,
- FALSE,
- NULL);
-
- /*
- * Dequeue the reply
- */
- KeAcquireSpinLock(&Port->Lock, &oldIrql);
- Message = EiDequeueMessagePort(Port);
- KeReleaseSpinLock(&Port->Lock, oldIrql);
- DPRINT("Message->Message.MessageSize %d\n",
- Message->Message.MessageSize);
- Status = MmCopyToCaller(UnsafeLpcReply, &Message->Message,
- Message->Message.MessageSize);
- ExFreePool(Message);
+ Status = KeWaitForSingleObject(&Port->Semaphore,
+ UserRequest,
+ UserMode,
+ FALSE,
+ NULL);
+ if (Status == STATUS_SUCCESS)
+ {
+ /*
+ * Dequeue the reply
+ */
+ KeAcquireSpinLock(&Port->Lock, &oldIrql);
+ Message = EiDequeueMessagePort(Port);
+ KeReleaseSpinLock(&Port->Lock, oldIrql);
+ if (Message)
+ {
+ DPRINT("Message->Message.MessageSize %d\n",
+ Message->Message.MessageSize);
+ Status = MmCopyToCaller(UnsafeLpcReply, &Message->Message,
+ Message->Message.MessageSize);
+ ExFreePool(Message);
+ }
+ else
+ Status = STATUS_UNSUCCESSFUL;
+ }
+ else
+ {
+ if (NT_SUCCESS(Status))
+ {
+ Status = STATUS_UNSUCCESSFUL;
+ }
+ }
ObDereferenceObject(Port);
return(Status);
* RETURN VALUE
*
* REVISIONS
- *
*/
NTSTATUS STDCALL NtWriteRequestData (HANDLE PortHandle,
PLPC_MESSAGE Message,