Cleanup isn't necessary after calling the driver in NtQueryDirectoryFile.
[reactos.git] / reactos / ntoskrnl / lpc / connect.c
index ce0e97a..c2e5a50 100644 (file)
@@ -1,33 +1,31 @@
-/* $Id: connect.c,v 1.9 2001/12/31 01:53:45 dwelch Exp $
- * 
+/* $Id$
+ *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/lpc/connect.c
  * PURPOSE:         Communication mechanism
- * PROGRAMMER:      David Welch (welch@cwcom.net)
- * UPDATE HISTORY:
- *                  Created 22/05/98
+ *
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
  */
 
 /* INCLUDES *****************************************************************/
 
-#include <ddk/ntddk.h>
-#include <internal/ob.h>
-#include <internal/port.h>
-#include <internal/dbg.h>
-#include <internal/pool.h>
-#include <internal/safe.h>
-#include <internal/mm.h>
-
+#include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
 
-/* GLOBALS *******************************************************************/
-
-#define TAG_LPC_CONNECT_MESSAGE   TAG('L', 'P', 'C', 'C')
-
 /* FUNCTIONS *****************************************************************/
 
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     EiConnectPort/12
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ */
 NTSTATUS STDCALL
 EiConnectPort(IN PEPORT* ConnectedPort,
              IN PEPORT NamedPort,
@@ -62,22 +60,26 @@ EiConnectPort(IN PEPORT* ConnectedPort,
   /*
    * Create a port to represent our side of the connection
    */
-  Status = ObCreateObject (NULL,
-                          PORT_ALL_ACCESS,
+  Status = ObCreateObject (KernelMode,
+                          LpcPortObjectType,
                           NULL,
-                          ExPortType,
+                          KernelMode,
+                          NULL,
+                          sizeof(EPORT),
+                          0,
+                          0,
                           (PVOID*)&OurPort);
   if (!NT_SUCCESS(Status))
     {
       return (Status);
     }
-  NiInitializePort(OurPort);
+  LpcpInitializePort(OurPort, EPORT_TYPE_CLIENT_COMM_PORT, NamedPort);
 
   /*
    * Allocate a request message.
    */
-  RequestMessage = ExAllocatePool(NonPagedPool, 
-                                 sizeof(EPORT_CONNECT_REQUEST_MESSAGE) + 
+  RequestMessage = ExAllocatePool(NonPagedPool,
+                                 sizeof(EPORT_CONNECT_REQUEST_MESSAGE) +
                                  RequestConnectDataLength);
   if (RequestMessage == NULL)
     {
@@ -88,14 +90,14 @@ EiConnectPort(IN PEPORT* ConnectedPort,
   /*
    * Initialize the request message.
    */
-  RequestMessage->MessageHeader.DataSize = 
+  RequestMessage->MessageHeader.u1.s1.DataLength =
     sizeof(EPORT_CONNECT_REQUEST_MESSAGE) + RequestConnectDataLength -
-    sizeof(LPC_MESSAGE_HEADER);
-  RequestMessage->MessageHeader.MessageSize = 
+    sizeof(PORT_MESSAGE);
+  RequestMessage->MessageHeader.u1.s1.TotalLength =
     sizeof(EPORT_CONNECT_REQUEST_MESSAGE) + RequestConnectDataLength;
   DPRINT("RequestMessageSize %d\n",
-        RequestMessage->MessageHeader.MessageSize);
-  RequestMessage->MessageHeader.SharedSectionSize = 0;
+        RequestMessage->MessageHeader.u1.s1.TotalLength);
+  RequestMessage->MessageHeader.ClientViewSize = 0;
   RequestMessage->ConnectingProcess = PsGetCurrentProcess();
   ObReferenceObjectByPointer(RequestMessage->ConnectingProcess,
                             PROCESS_VM_OPERATION,
@@ -110,7 +112,7 @@ EiConnectPort(IN PEPORT* ConnectedPort,
       memcpy(RequestMessage->ConnectData, ConnectData,
             RequestConnectDataLength);
     }
-  
+
   /*
    * Queue the message to the named port
    */
@@ -120,7 +122,7 @@ EiConnectPort(IN PEPORT* ConnectedPort,
                       OurPort);
   KeReleaseSemaphore(&NamedPort->Semaphore, IO_NO_INCREMENT, 1, FALSE);
   ExFreePool(RequestMessage);
-  
+
   /*
    * Wait for them to accept our connection
    */
@@ -130,7 +132,7 @@ EiConnectPort(IN PEPORT* ConnectedPort,
                        FALSE,
                        NULL);
 
-  /* 
+  /*
    * Dequeue the response
    */
   KeAcquireSpinLock (&OurPort->Lock, &oldIrql);
@@ -146,7 +148,7 @@ EiConnectPort(IN PEPORT* ConnectedPort,
   /*
    * Check for connection refusal.
    */
-  if (CReply->MessageHeader.MessageType == LPC_CONNECTION_REFUSED)
+  if (CReply->MessageHeader.u2.s2.Type == LPC_CONNECTION_REFUSED)
     {
       ObDereferenceObject(OurPort);
       ExFreePool(Reply);
@@ -214,11 +216,11 @@ EiConnectPort(IN PEPORT* ConnectedPort,
 
 /**********************************************************************
  * NAME                                                        EXPORTED
- *     NtConnectPort@32
- *     
+ *     NtConnectPort/8
+ *
  * DESCRIPTION
- *     Connect to a named port and wait for the other side to 
- *     accept the connection.
+ *     Connect to a named port and wait for the other side to
+ *     accept or reject the connection request.
  *
  * ARGUMENTS
  *     ConnectedPort
@@ -229,44 +231,93 @@ EiConnectPort(IN PEPORT* ConnectedPort,
  *     MaxMessageSize
  *     ConnectInfo
  *     UserConnectInfoLength
- * 
+ *
  * RETURN VALUE
- * 
+ *
+ * @unimplemented
  */
 NTSTATUS STDCALL
 NtConnectPort (PHANDLE                         UnsafeConnectedPortHandle,
               PUNICODE_STRING                  PortName,
               PSECURITY_QUALITY_OF_SERVICE     Qos,
-              PLPC_SECTION_WRITE               UnsafeWriteMap,
-              PLPC_SECTION_READ                UnsafeReadMap,
+              PPORT_VIEW               UnsafeWriteMap,
+              PREMOTE_PORT_VIEW                UnsafeReadMap,
               PULONG                           UnsafeMaximumMessageSize,
               PVOID                            UnsafeConnectData,
               PULONG                           UnsafeConnectDataLength)
 {
   HANDLE ConnectedPortHandle;
-  LPC_SECTION_WRITE WriteMap;
-  LPC_SECTION_READ ReadMap;
+  PORT_VIEW WriteMap;
+  REMOTE_PORT_VIEW ReadMap;
   ULONG MaximumMessageSize;
-  PVOID ConnectData;
-  ULONG ConnectDataLength;
+  PVOID ConnectData = NULL;
+  ULONG ConnectDataLength = 0;
   PSECTION_OBJECT SectionObject;
   LARGE_INTEGER SectionOffset;
   PEPORT ConnectedPort;
-  NTSTATUS Status;
+  KPROCESSOR_MODE PreviousMode;
+  NTSTATUS Status = STATUS_SUCCESS;
   PEPORT NamedPort;
   
+  PreviousMode = ExGetPreviousMode();
+  
+  if (PreviousMode != KernelMode)
+    {
+      _SEH_TRY
+        {
+          ProbeForWriteHandle(UnsafeConnectedPortHandle);
+          if (UnsafeMaximumMessageSize != NULL)
+            {
+              ProbeForWriteUlong(UnsafeMaximumMessageSize);
+            }
+        }
+      _SEH_HANDLE
+        {
+          Status = _SEH_GetExceptionCode();
+        }
+      _SEH_END;
+      
+      if (!NT_SUCCESS(Status))
+        {
+          return Status;
+        }
+    }
+
   /*
    * Copy in write map and partially validate.
    */
   if (UnsafeWriteMap != NULL)
     {
-      Status = MmCopyFromCaller(&WriteMap, UnsafeWriteMap, 
-                               sizeof(LPC_SECTION_WRITE));
-      if (!NT_SUCCESS(Status))
-       {
-         return(Status);
-       }
-      if (WriteMap.Length != sizeof(LPC_SECTION_WRITE))
+      if (PreviousMode != KernelMode)
+        {
+          _SEH_TRY
+            {
+              ProbeForWrite(UnsafeWriteMap,
+                            sizeof(PORT_VIEW),
+                            1);
+              RtlCopyMemory(&WriteMap,
+                            UnsafeWriteMap,
+                            sizeof(PORT_VIEW));
+            }
+          _SEH_HANDLE
+            {
+              Status = _SEH_GetExceptionCode();
+            }
+          _SEH_END;
+
+          if (!NT_SUCCESS(Status))
+            {
+              return Status;
+            }
+        }
+      else
+        {
+          RtlCopyMemory(&WriteMap,
+                        UnsafeWriteMap,
+                        sizeof(PORT_VIEW));
+        }
+
+      if (WriteMap.Length != sizeof(PORT_VIEW))
        {
          return(STATUS_INVALID_PARAMETER_4);
        }
@@ -280,41 +331,66 @@ NtConnectPort (PHANDLE                            UnsafeConnectedPortHandle,
   /*
    * Handle connection data.
    */
-  if (UnsafeConnectData == NULL)
-    {
-      ConnectDataLength = 0;
-      ConnectData = NULL;
-    }
-  else
-    {
-      if (ExGetPreviousMode() == KernelMode)
-       {
-         ConnectDataLength = *UnsafeConnectDataLength;
-         ConnectData = UnsafeConnectData;
-       }
+  if (UnsafeConnectData)
+    {
+      if (PreviousMode != KernelMode)
+        {
+          _SEH_TRY
+            {
+              ConnectDataLength = ProbeForReadUlong(UnsafeConnectDataLength);
+            }
+          _SEH_HANDLE
+            {
+              Status = _SEH_GetExceptionCode();
+            }
+          _SEH_END;
+
+          if (!NT_SUCCESS(Status))
+            {
+              return Status;
+            }
+        }
       else
-       {
-         Status = MmCopyFromCaller(&ConnectDataLength,
-                                   UnsafeConnectDataLength,
-                                   sizeof(ULONG));
-         if (!NT_SUCCESS(Status))
-           {
-             return(Status);
-           }
-         ConnectData = ExAllocatePool(NonPagedPool, ConnectDataLength);
-         if (ConnectData == NULL && ConnectDataLength != 0)
-           {
-             return(STATUS_NO_MEMORY);
-           }
-         Status = MmCopyFromCaller(ConnectData,
-                                   UnsafeConnectData,
-                                   ConnectDataLength); 
-         if (!NT_SUCCESS(Status))
-           {
-             ExFreePool(ConnectData);
-             return(Status);
-           }
-       }
+        {
+          ConnectDataLength = *UnsafeConnectDataLength;
+        }
+
+      if (ConnectDataLength != 0)
+        {
+          ConnectData = ExAllocatePool(NonPagedPool, ConnectDataLength);
+          if (ConnectData == NULL)
+            {
+              return(STATUS_NO_MEMORY);
+            }
+
+          if (PreviousMode != KernelMode)
+            {
+              _SEH_TRY
+                {
+                  ProbeForWriteUlong(UnsafeConnectData);
+                  RtlCopyMemory(ConnectData,
+                                UnsafeConnectData,
+                                ConnectDataLength);
+                }
+              _SEH_HANDLE
+                {
+                  Status = _SEH_GetExceptionCode();
+                }
+              _SEH_END;
+
+              if (!NT_SUCCESS(Status))
+                {
+                  ExFreePool(ConnectData);
+                  return Status;
+                }
+            }
+          else
+            {
+              RtlCopyMemory(ConnectData,
+                            UnsafeConnectData,
+                            ConnectDataLength);
+            }
+        }
     }
 
   /*
@@ -324,8 +400,8 @@ NtConnectPort (PHANDLE                              UnsafeConnectedPortHandle,
                                     0,
                                     NULL,
                                     PORT_ALL_ACCESS,  /* DesiredAccess */
-                                    ExPortType,
-                                    UserMode,
+                                    LpcPortObjectType,
+                                    PreviousMode,
                                     NULL,
                                     (PVOID*)&NamedPort);
   if (!NT_SUCCESS(Status))
@@ -345,7 +421,7 @@ NtConnectPort (PHANDLE                              UnsafeConnectedPortHandle,
       Status = ObReferenceObjectByHandle(WriteMap.SectionHandle,
                                         SECTION_MAP_READ | SECTION_MAP_WRITE,
                                         MmSectionObjectType,
-                                        UserMode,
+                                        PreviousMode,
                                         (PVOID*)&SectionObject,
                                         NULL);
       if (!NT_SUCCESS(Status))
@@ -372,7 +448,7 @@ NtConnectPort (PHANDLE                              UnsafeConnectedPortHandle,
                         SectionOffset,
                         WriteMap.ViewSize,
                         &WriteMap.ViewBase,
-                        &WriteMap.TargetViewBase,
+                        &WriteMap.ViewRemoteBase,
                         &ReadMap.ViewSize,
                         &ReadMap.ViewBase,
                         &MaximumMessageSize,
@@ -383,14 +459,30 @@ NtConnectPort (PHANDLE                            UnsafeConnectedPortHandle,
       /* FIXME: Again, check what NT does here. */
       if (UnsafeConnectDataLength != NULL)
        {
-         if (ExGetPreviousMode() != KernelMode)
+         if (PreviousMode != KernelMode)
            {
-             MmCopyToCaller(UnsafeConnectData, ConnectData,
-                            ConnectDataLength);
-             ExFreePool(ConnectData);
+              _SEH_TRY
+                {
+                  RtlCopyMemory(UnsafeConnectData,
+                                ConnectData,
+                                ConnectDataLength);
+                  *UnsafeConnectDataLength = ConnectDataLength;
+                }
+              _SEH_HANDLE
+                {
+                  Status = _SEH_GetExceptionCode();
+                }
+              _SEH_END;
            }
-         MmCopyToCaller(UnsafeConnectDataLength, &ConnectDataLength,
-                        sizeof(ULONG));
+         else
+           {
+               RtlCopyMemory(UnsafeConnectData,
+                             ConnectData,
+                             ConnectDataLength);
+               *UnsafeConnectDataLength = ConnectDataLength;
+           }
+
+          ExFreePool(ConnectData);
        }
       return(Status);
     }
@@ -405,31 +497,57 @@ NtConnectPort (PHANDLE                            UnsafeConnectedPortHandle,
     }
   ObDereferenceObject(NamedPort);
   NamedPort = NULL;
-  
+
   /*
    * Copy the data back to the caller.
    */
-  if (ExGetPreviousMode() != KernelMode)
+
+  if (UnsafeConnectDataLength != NULL)
     {
-      if (UnsafeConnectDataLength != NULL)
+      if (PreviousMode != KernelMode)
        {
-         if (ExGetPreviousMode() != KernelMode)
-           {
-             Status = MmCopyToCaller(UnsafeConnectData, ConnectData,
-                                     ConnectDataLength);
-             ExFreePool(ConnectData);
-             if (!NT_SUCCESS(Status))
-               {
-                 return(Status);
-               }
-           }
-         Status = MmCopyToCaller(UnsafeConnectDataLength, &ConnectDataLength,
-                                 sizeof(ULONG));
+          _SEH_TRY
+            {
+              *UnsafeConnectDataLength = ConnectDataLength;
+              
+              if (ConnectData != NULL)
+                {
+                  RtlCopyMemory(UnsafeConnectData,
+                                ConnectData,
+                                ConnectDataLength);
+                }
+            }
+          _SEH_HANDLE
+            {
+              Status = _SEH_GetExceptionCode();
+            }
+          _SEH_END;
+
          if (!NT_SUCCESS(Status))
            {
-             return(Status);
+              if (ConnectData != NULL)
+                {
+                  ExFreePool(ConnectData);
+                }
+              return(Status);
            }
        }
+      else
+        {
+          *UnsafeConnectDataLength = ConnectDataLength;
+          
+          if (ConnectData != NULL)
+            {
+              RtlCopyMemory(UnsafeConnectData,
+                            ConnectData,
+                            ConnectDataLength);
+            }
+        }
+
+      if (ConnectData != NULL)
+       {
+         ExFreePool(ConnectData);
+       }
     }
   Status = ObInsertObject(ConnectedPort,
                          NULL,
@@ -441,45 +559,70 @@ NtConnectPort (PHANDLE                            UnsafeConnectedPortHandle,
     {
       return(Status);
     }
-  Status = MmCopyToCaller(UnsafeConnectedPortHandle, &ConnectedPortHandle,
-                         sizeof(HANDLE));
-  if (!NT_SUCCESS(Status))
-    {
-      return(Status);
-    }
-  if (UnsafeWriteMap != NULL)
-    {
-      Status = MmCopyToCaller(UnsafeWriteMap, &WriteMap, 
-                             sizeof(LPC_SECTION_WRITE));
-      if (!NT_SUCCESS(Status))
-       {
-         return(Status);
-       }
-    }
-  if (UnsafeReadMap != NULL)
-    {
-      Status = MmCopyToCaller(UnsafeReadMap, &ReadMap,
-                             sizeof(LPC_SECTION_READ));
+
+  if (PreviousMode != KernelMode)
+    {
+      _SEH_TRY
+        {
+          *UnsafeConnectedPortHandle = ConnectedPortHandle;
+          
+          if (UnsafeWriteMap != NULL)
+            {
+              RtlCopyMemory(UnsafeWriteMap,
+                            &WriteMap,
+                            sizeof(PORT_VIEW));
+            }
+
+          if (UnsafeReadMap != NULL)
+            {
+              RtlCopyMemory(UnsafeReadMap,
+                            &ReadMap,
+                            sizeof(REMOTE_PORT_VIEW));
+            }
+
+          if (UnsafeMaximumMessageSize != NULL)
+            {
+              *UnsafeMaximumMessageSize = MaximumMessageSize;
+            }
+        }
+      _SEH_HANDLE
+        {
+          Status = _SEH_GetExceptionCode();
+        }
+      _SEH_END;
+      
       if (!NT_SUCCESS(Status))
-       {
-         return(Status);
-       }
+        {
+          return Status;
+        }
     }
-  if (UnsafeMaximumMessageSize != NULL)
+  else
     {
-      Status = MmCopyToCaller(UnsafeMaximumMessageSize, 
-                             &MaximumMessageSize,
-                             sizeof(LPC_SECTION_WRITE));
-      if (!NT_SUCCESS(Status))
-       {
-         return(Status);
-       }
+      *UnsafeConnectedPortHandle = ConnectedPortHandle;
+      
+      if (UnsafeWriteMap != NULL)
+        {
+          RtlCopyMemory(UnsafeWriteMap,
+                        &WriteMap,
+                        sizeof(PORT_VIEW));
+        }
+
+      if (UnsafeReadMap != NULL)
+        {
+          RtlCopyMemory(UnsafeReadMap,
+                        &ReadMap,
+                        sizeof(REMOTE_PORT_VIEW));
+        }
+
+      if (UnsafeMaximumMessageSize != NULL)
+        {
+          *UnsafeMaximumMessageSize = MaximumMessageSize;
+        }
     }
 
   /*
    * All done.
    */
-  ObDereferenceObject(ConnectedPort);
 
   return(STATUS_SUCCESS);
 }
@@ -487,7 +630,7 @@ NtConnectPort (PHANDLE                              UnsafeConnectedPortHandle,
 
 /**********************************************************************
  * NAME                                                        EXPORTED
- *     NtAcceptConnectPort@24
+ *     NtAcceptConnectPort/6
  *
  * DESCRIPTION
  *
@@ -500,15 +643,14 @@ NtConnectPort (PHANDLE                            UnsafeConnectedPortHandle,
  *     ReadMap
  *
  * RETURN VALUE
- *
  */
-EXPORTED NTSTATUS STDCALL
+/*EXPORTED*/ NTSTATUS STDCALL
 NtAcceptConnectPort (PHANDLE                   ServerPortHandle,
                     HANDLE                     NamedPortHandle,
-                    PLPC_MESSAGE               LpcMessage,
+                    PPORT_MESSAGE              LpcMessage,
                     BOOLEAN                    AcceptIt,
-                    PLPC_SECTION_WRITE WriteMap,
-                    PLPC_SECTION_READ  ReadMap)
+                    PPORT_VIEW WriteMap,
+                    PREMOTE_PORT_VIEW  ReadMap)
 {
   NTSTATUS     Status;
   PEPORT               NamedPort;
@@ -517,18 +659,25 @@ NtAcceptConnectPort (PHANDLE                      ServerPortHandle,
   KIRQL                oldIrql;
   PEPORT_CONNECT_REQUEST_MESSAGE CRequest;
   PEPORT_CONNECT_REPLY_MESSAGE CReply;
+  ULONG Size;
+  KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
 
-  CReply = ExAllocatePool(NonPagedPool, 
-                sizeof(EPORT_CONNECT_REPLY_MESSAGE) + LpcMessage->DataSize);
+  Size = sizeof(EPORT_CONNECT_REPLY_MESSAGE);
+  if (LpcMessage)
+  {
+     Size += LpcMessage->u1.s1.DataLength;
+  }
+
+  CReply = ExAllocatePool(NonPagedPool, Size);
   if (CReply == NULL)
     {
       return(STATUS_NO_MEMORY);
     }
-  
+
   Status = ObReferenceObjectByHandle(NamedPortHandle,
                                     PORT_ALL_ACCESS,
-                                    ExPortType,
-                                    UserMode,
+                                    LpcPortObjectType,
+                                    PreviousMode,
                                     (PVOID*)&NamedPort,
                                     NULL);
   if (!NT_SUCCESS(Status))
@@ -540,21 +689,41 @@ NtAcceptConnectPort (PHANDLE                      ServerPortHandle,
   /*
    * Create a port object for our side of the connection
    */
-  if (AcceptIt == 1)
+  if (AcceptIt)
     {
-      Status = ObCreateObject(ServerPortHandle,
-                             PORT_ALL_ACCESS,
+      Status = ObCreateObject(PreviousMode,
+                             LpcPortObjectType,
+                             NULL,
+                             PreviousMode,
                              NULL,
-                             ExPortType,
+                             sizeof(EPORT),
+                             0,
+                             0,
                              (PVOID*)&OurPort);
       if (!NT_SUCCESS(Status))
        {
+         ExFreePool(CReply);
          ObDereferenceObject(NamedPort);
          return(Status);
        }
-      NiInitializePort(OurPort);
+
+      Status = ObInsertObject ((PVOID)OurPort,
+                              NULL,
+                              PORT_ALL_ACCESS,
+                              0,
+                              NULL,
+                              ServerPortHandle);
+      if (!NT_SUCCESS(Status))
+       {
+         ObDereferenceObject(OurPort);
+         ExFreePool(CReply);
+         ObDereferenceObject(NamedPort);
+         return(Status);
+       }
+
+      LpcpInitializePort(OurPort, EPORT_TYPE_SERVER_COMM_PORT, NamedPort);
     }
-  
+
   /*
    * Dequeue the connection request
    */
@@ -562,31 +731,30 @@ NtAcceptConnectPort (PHANDLE                      ServerPortHandle,
   ConnectionRequest = EiDequeueConnectMessagePort (NamedPort);
   KeReleaseSpinLock(&NamedPort->Lock, oldIrql);
   CRequest = (PEPORT_CONNECT_REQUEST_MESSAGE)(&ConnectionRequest->Message);
-  
+
   /*
    * Prepare the reply.
    */
   if (LpcMessage != NULL)
     {
-      memcpy(&CReply->MessageHeader, LpcMessage, sizeof(LPC_MESSAGE_HEADER));
-      memcpy(&CReply->ConnectData, (PVOID)(LpcMessage + 1), 
-            LpcMessage->DataSize);
-      CReply->MessageHeader.MessageSize =
-       sizeof(EPORT_CONNECT_REPLY_MESSAGE) + LpcMessage->DataSize;
-      CReply->MessageHeader.DataSize = CReply->MessageHeader.MessageSize -
-       sizeof(LPC_MESSAGE_HEADER);
-      CReply->ConnectDataLength = LpcMessage->DataSize;
+      memcpy(&CReply->MessageHeader, LpcMessage, sizeof(PORT_MESSAGE));
+      memcpy(&CReply->ConnectData, (PVOID)(LpcMessage + 1),
+            LpcMessage->u1.s1.DataLength);
+      CReply->MessageHeader.u1.s1.TotalLength =
+       sizeof(EPORT_CONNECT_REPLY_MESSAGE) + LpcMessage->u1.s1.DataLength;
+      CReply->MessageHeader.u1.s1.DataLength = CReply->MessageHeader.u1.s1.TotalLength -
+       sizeof(PORT_MESSAGE);
+      CReply->ConnectDataLength = LpcMessage->u1.s1.DataLength;
     }
   else
     {
-      CReply->MessageHeader.MessageSize = sizeof(EPORT_CONNECT_REPLY_MESSAGE);
-      CReply->MessageHeader.DataSize = sizeof(EPORT_CONNECT_REPLY_MESSAGE) -
-       sizeof(LPC_MESSAGE_HEADER);
+      CReply->MessageHeader.u1.s1.TotalLength = sizeof(EPORT_CONNECT_REPLY_MESSAGE);
+      CReply->MessageHeader.u1.s1.DataLength = sizeof(EPORT_CONNECT_REPLY_MESSAGE) -
+       sizeof(PORT_MESSAGE);
       CReply->ConnectDataLength = 0;
     }
-
-  if (AcceptIt != 1)
-    {  
+  if (!AcceptIt)
+    {
       EiReplyOrRequestPort(ConnectionRequest->Sender,
                           &CReply->MessageHeader,
                           LPC_CONNECTION_REFUSED,
@@ -596,12 +764,12 @@ NtAcceptConnectPort (PHANDLE                      ServerPortHandle,
                         1,
                         FALSE);
       ObDereferenceObject(ConnectionRequest->Sender);
-      ExFreePool(ConnectionRequest);   
+      ExFreePool(ConnectionRequest);
       ExFreePool(CReply);
       ObDereferenceObject(NamedPort);
       return (STATUS_SUCCESS);
     }
-  
+
   /*
    * Prepare the connection.
    */
@@ -613,7 +781,7 @@ NtAcceptConnectPort (PHANDLE                        ServerPortHandle,
       Status = ObReferenceObjectByHandle(WriteMap->SectionHandle,
                                         SECTION_MAP_READ | SECTION_MAP_WRITE,
                                         MmSectionObjectType,
-                                        UserMode,
+                                        PreviousMode,
                                         (PVOID*)&SectionObject,
                                         NULL);
       if (!NT_SUCCESS(Status))
@@ -622,11 +790,11 @@ NtAcceptConnectPort (PHANDLE                      ServerPortHandle,
        }
 
       SectionOffset.QuadPart = WriteMap->SectionOffset;
-      WriteMap->TargetViewBase = 0;
+      WriteMap->ViewRemoteBase = 0;
       CReply->ReceiveClientViewSize = WriteMap->ViewSize;
       Status = MmMapViewOfSection(SectionObject,
                                  CRequest->ConnectingProcess,
-                                 &WriteMap->TargetViewBase,
+                                 &WriteMap->ViewRemoteBase,
                                  0,
                                  CReply->ReceiveClientViewSize,
                                  &SectionOffset,
@@ -637,7 +805,7 @@ NtAcceptConnectPort (PHANDLE                        ServerPortHandle,
       if (!NT_SUCCESS(Status))
        {
          return(Status);
-       }      
+       }
 
       WriteMap->ViewBase = 0;
       Status = MmMapViewOfSection(SectionObject,
@@ -653,8 +821,8 @@ NtAcceptConnectPort (PHANDLE                        ServerPortHandle,
       if (!NT_SUCCESS(Status))
        {
          return(Status);
-       }      
-      
+       }
+
       ObDereferenceObject(SectionObject);
     }
   if (ReadMap != NULL && CRequest->SendSectionObject != NULL)
@@ -693,9 +861,10 @@ NtAcceptConnectPort (PHANDLE                       ServerPortHandle,
     }
   if (WriteMap != NULL)
     {
-      CReply->ReceiveClientViewBase = WriteMap->TargetViewBase;
+      CReply->ReceiveClientViewBase = WriteMap->ViewRemoteBase;
     }
-  CReply->MaximumMessageSize = 0x148;
+  CReply->MaximumMessageSize = LPC_MAX_MESSAGE_LENGTH;
+
 
   /*
    * Connect the two ports
@@ -703,30 +872,31 @@ NtAcceptConnectPort (PHANDLE                      ServerPortHandle,
   OurPort->OtherPort = ConnectionRequest->Sender;
   OurPort->OtherPort->OtherPort = OurPort;
   EiReplyOrRequestPort(ConnectionRequest->Sender,
-                      LpcMessage,
+                      (PPORT_MESSAGE)CReply,
                       LPC_REPLY,
                       OurPort);
   ExFreePool(ConnectionRequest);
-   
+  ExFreePool(CReply);
+
   ObDereferenceObject(OurPort);
   ObDereferenceObject(NamedPort);
-  
+
   return (STATUS_SUCCESS);
 }
 
 /**********************************************************************
  * NAME                                                        EXPORTED
- *     NtSecureConnectPort@36
- *     
+ *     NtSecureConnectPort/9
+ *
  * DESCRIPTION
- *     Connect to a named port and wait for the other side to 
+ *     Connect to a named port and wait for the other side to
  *     accept the connection. Possibly verify that the server
  *     matches the ServerSid (trusted server).
  *     Present in w2k+.
  *
  * ARGUMENTS
  *     ConnectedPort
- *     PortName
+ *     PortName: fully qualified name in the Ob name space;
  *     Qos
  *     WriteMap
  *     ServerSid
@@ -734,22 +904,30 @@ NtAcceptConnectPort (PHANDLE                      ServerPortHandle,
  *     MaxMessageSize
  *     ConnectInfo
  *     UserConnectInfoLength
- * 
+ *
  * RETURN VALUE
- * 
  */
 NTSTATUS STDCALL
 NtSecureConnectPort (OUT    PHANDLE                            ConnectedPort,
                     IN     PUNICODE_STRING                     PortName,
                     IN     PSECURITY_QUALITY_OF_SERVICE        Qos,
-                    IN OUT PLPC_SECTION_WRITE                  WriteMap                OPTIONAL,
+                    IN OUT PPORT_VIEW                  WriteMap                OPTIONAL,
                     IN     PSID                                ServerSid               OPTIONAL,
-                    IN OUT PLPC_SECTION_READ                   ReadMap                 OPTIONAL,
+                    IN OUT PREMOTE_PORT_VIEW                   ReadMap                 OPTIONAL,
                     OUT    PULONG                              MaxMessageSize          OPTIONAL,
                     IN OUT PVOID                               ConnectInfo             OPTIONAL,
                     IN OUT PULONG                              UserConnectInfoLength   OPTIONAL)
 {
-       return (STATUS_NOT_IMPLEMENTED);
+  /* TODO: implement a new object type: WaitablePort */
+  /* TODO: verify the process' SID that hosts the rendez-vous port equals ServerSid */
+  return NtConnectPort (ConnectedPort,
+                       PortName,
+                       Qos,
+                       WriteMap,
+                       ReadMap,
+                       MaxMessageSize,
+                       ConnectInfo,
+                       UserConnectInfoLength);
 }
 
 /* EOF */