update for HEAD-2003091401
[reactos.git] / ntoskrnl / lpc / send.c
index 2b38132..e65021d 100644 (file)
@@ -31,7 +31,6 @@
  * RETURN VALUE
  *
  * REVISIONS
- *
  */
 NTSTATUS STDCALL 
 LpcSendTerminationPort (IN PEPORT Port,
@@ -56,7 +55,6 @@ LpcSendTerminationPort (IN PEPORT Port,
  * RETURN VALUE
  *
  * REVISIONS
- *
  */
 NTSTATUS STDCALL 
 LpcSendDebugMessagePort (IN PEPORT Port,
@@ -111,6 +109,7 @@ LpcSendDebugMessagePort (IN PEPORT Port,
  *
  * REVISIONS
  *
+ * @implemented
  */
 NTSTATUS STDCALL LpcRequestPort (IN    PEPORT          Port,
                                 IN     PLPC_MESSAGE    LpcMessage)
@@ -140,6 +139,7 @@ NTSTATUS STDCALL LpcRequestPort (IN PEPORT          Port,
  *
  * REVISIONS
  *
+ * @implemented
  */
 NTSTATUS STDCALL NtRequestPort (IN     HANDLE          PortHandle,
                                IN      PLPC_MESSAGE    LpcMessage)
@@ -181,6 +181,7 @@ NTSTATUS STDCALL NtRequestPort (IN  HANDLE          PortHandle,
  *
  * REVISIONS
  *
+ * @implemented
  */
 NTSTATUS STDCALL 
 NtRequestWaitReplyPort (IN HANDLE PortHandle,
@@ -267,24 +268,38 @@ 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);
@@ -301,7 +316,6 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle,
  * RETURN VALUE
  *
  * REVISIONS
- *
  */
 NTSTATUS STDCALL NtWriteRequestData (HANDLE            PortHandle,
                                     PLPC_MESSAGE       Message,