Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / ntoskrnl / lpc / listen.c
diff --git a/ntoskrnl/lpc/listen.c b/ntoskrnl/lpc/listen.c
new file mode 100644 (file)
index 0000000..eddcc66
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/lpc/listen.c
+ * PURPOSE:         Local Procedure Call: Listening
+ * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+NtListenPort(IN HANDLE PortHandle,
+             OUT PPORT_MESSAGE ConnectMessage)
+{
+    NTSTATUS Status;
+
+    PAGED_CODE();
+    LPCTRACE(LPC_LISTEN_DEBUG, "Handle: %p\n", PortHandle);
+
+    /* Wait forever for a connection request */
+    for (;;)
+    {
+        /* Do the wait */
+        Status = NtReplyWaitReceivePort(PortHandle,
+                                        NULL,
+                                        NULL,
+                                        ConnectMessage);
+
+        _SEH2_TRY
+        {
+            /* Accept only LPC_CONNECTION_REQUEST requests */
+            if ((Status != STATUS_SUCCESS) ||
+                (LpcpGetMessageType(ConnectMessage) == LPC_CONNECTION_REQUEST))
+            {
+                /* Break out */
+                _SEH2_YIELD(break);
+            }
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            Status = _SEH2_GetExceptionCode();
+            _SEH2_YIELD(break);
+        }
+        _SEH2_END;
+    }
+
+    /* Return status */
+    return Status;
+}
+
+/* EOF */