Cleanup isn't necessary after calling the driver in NtQueryDirectoryFile.
[reactos.git] / reactos / ntoskrnl / lpc / create.c
index 3cb242e..55c8645 100644 (file)
-/* $Id: create.c,v 1.5 2001/08/26 17:28:00 ekohl Exp $
- * 
+/* $Id$
+ *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/lpc/create.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 <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
 
-static
-NTSTATUS STDCALL VerifyCreateParameters (
-       IN      PHANDLE                 PortHandle,
-       IN      POBJECT_ATTRIBUTES      ObjectAttributes,
-       IN      ULONG                   MaxConnectInfoLength,
-       IN      ULONG                   MaxDataLength,
-       IN      ULONG                   Reserved
-       )
-{
-       if (NULL == PortHandle)
-       {
-               return (STATUS_INVALID_PARAMETER_1);
-       }
-       if (NULL == ObjectAttributes)
-       {
-               return (STATUS_INVALID_PARAMETER_2);
-       }
-       if (    (ObjectAttributes->Attributes    & OBJ_OPENLINK)
-               || (ObjectAttributes->Attributes & OBJ_OPENIF)
-               || (ObjectAttributes->Attributes & OBJ_EXCLUSIVE)
-               || (ObjectAttributes->Attributes & OBJ_PERMANENT)
-               || (ObjectAttributes->Attributes & OBJ_INHERIT)
-//             || (ObjectAttributes->Attributes & OBJ_KERNEL_HANDLE)
-               )
-       {
-               return (STATUS_INVALID_PORT_ATTRIBUTES);
-       }
-       if (MaxConnectInfoLength > 0x104) /* FIXME: use a macro! */
-       {
-               return (STATUS_INVALID_PARAMETER_3);
-       }
-       if (MaxDataLength > 0x148) /* FIXME: use a macro! */
-       {
-               return (STATUS_INVALID_PARAMETER_4);
-       }
-       /* FIXME: some checking is done also on Reserved */
-       return (STATUS_SUCCESS);
-}
-
-
-NTSTATUS STDCALL
-NiCreatePort (
-       PVOID                   ObjectBody,
-       PVOID                   Parent,
-       PWSTR                   RemainingPath,
-       POBJECT_ATTRIBUTES      ObjectAttributes
-       )
+/**********************************************************************
+ * NAME
+ *     LpcpVerifyCreateParameters/5
+ *
+ * DESCRIPTION
+ *     Verify user parameters in NtCreatePort and in
+ *     NtCreateWaitablePort.
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ */
+STATIC NTSTATUS STDCALL
+LpcpVerifyCreateParameters (IN PHANDLE                 PortHandle,
+                           IN  POBJECT_ATTRIBUTES      ObjectAttributes,
+                           IN  ULONG                   MaxConnectInfoLength,
+                           IN  ULONG                   MaxDataLength,
+                           IN  ULONG                   MaxPoolUsage)
 {
-       NTSTATUS        Status;
-   
-       if (RemainingPath == NULL)
-       {
-               return (STATUS_SUCCESS);
-       }
-
-       if (wcschr(RemainingPath+1, '\\') != NULL)
-       {
-               return (STATUS_UNSUCCESSFUL);
-       }
-   
-       Status = ObReferenceObjectByPointer (
-                       Parent,
-                       STANDARD_RIGHTS_REQUIRED,
-                       ObDirectoryType,
-                       UserMode
-                       );
-       if (!NT_SUCCESS(Status))
-       {
-               return (Status);
-       }
-   
-       ObAddEntryDirectory (
-               Parent,
-               ObjectBody,
-               (RemainingPath + 1)
-               );
-       ObDereferenceObject (Parent);
-   
-       return (STATUS_SUCCESS);
+  if (NULL == PortHandle)
+    {
+      return (STATUS_INVALID_PARAMETER_1);
+    }
+  if (NULL == ObjectAttributes)
+    {
+      return (STATUS_INVALID_PARAMETER_2);
+    }
+  if ((ObjectAttributes->Attributes    & OBJ_OPENLINK)
+      || (ObjectAttributes->Attributes & OBJ_OPENIF)
+      || (ObjectAttributes->Attributes & OBJ_EXCLUSIVE)
+      || (ObjectAttributes->Attributes & OBJ_PERMANENT)
+      || (ObjectAttributes->Attributes & OBJ_INHERIT))
+  {
+    return (STATUS_INVALID_PORT_ATTRIBUTES);
+  }
+  if (MaxConnectInfoLength > LPC_MAX_DATA_LENGTH)
+    {
+      return (STATUS_INVALID_PARAMETER_3);
+    }
+  if (MaxDataLength > LPC_MAX_MESSAGE_LENGTH)
+    {
+      return (STATUS_INVALID_PARAMETER_4);
+    }
+  /* TODO: some checking is done also on MaxPoolUsage
+   * to avoid choking the executive */
+  return (STATUS_SUCCESS);
 }
 
-
 /**********************************************************************
  * NAME                                                        EXPORTED
- *     NtCreatePort@20
- *     
+ *     NtCreatePort/5
+ *
  * DESCRIPTION
  *
  * ARGUMENTS
@@ -112,65 +73,74 @@ NiCreatePort (
  *     ObjectAttributes,
  *     MaxConnectInfoLength,
  *     MaxDataLength,
- *     Reserved
- * 
+ *     MaxPoolUsage: size of NP zone the NP part of msgs is kept in
+ *
  * RETURN VALUE
- * 
  */
-EXPORTED
-NTSTATUS
-STDCALL
-NtCreatePort (
-       PHANDLE                 PortHandle,
-       POBJECT_ATTRIBUTES      ObjectAttributes,
-       ULONG                   MaxConnectInfoLength,
-       ULONG                   MaxDataLength,
-       ULONG                   Reserved
-       )
+/*EXPORTED*/ NTSTATUS STDCALL
+NtCreatePort (PHANDLE                PortHandle,
+             POBJECT_ATTRIBUTES    ObjectAttributes,
+             ULONG            MaxConnectInfoLength,
+             ULONG                     MaxDataLength,
+             ULONG                     MaxPoolUsage)
 {
-       PEPORT          Port;
-       NTSTATUS        Status;
-   
-       DPRINT("NtCreatePort() Name %x\n", ObjectAttributes->ObjectName->Buffer);
+  PEPORT               Port;
+  NTSTATUS     Status;
+
+  DPRINT("NtCreatePort() Name %x\n", ObjectAttributes->ObjectName->Buffer);
+
+  /* Verify parameters */
+  Status = LpcpVerifyCreateParameters (PortHandle,
+                                      ObjectAttributes,
+                                      MaxConnectInfoLength,
+                                      MaxDataLength,
+                                      MaxPoolUsage);
+  if (STATUS_SUCCESS != Status)
+    {
+      return (Status);
+    }
 
-       /* Verify parameters */
-       Status = VerifyCreateParameters (
-                       PortHandle,
-                       ObjectAttributes,
-                       MaxConnectInfoLength,
-                       MaxDataLength,
-                       Reserved
-                       );
-       if (!NT_SUCCESS(Status))
-       {
-               return (Status);
-       }
-       /* Ask Ob to create the object */
-       Status = ObCreateObject (
-                       PortHandle,
-                       PORT_ALL_ACCESS,
-                       ObjectAttributes,
-                       ExPortType,
-                       (PVOID*)&Port
-                       );
-       if (!NT_SUCCESS(Status))
-       {
-               return (Status);
-       }
-   
-       Status = NiInitializePort (Port);
-       Port->MaxConnectInfoLength = 260; /* FIXME: use a macro! */
-       Port->MaxDataLength = 328; /* FIXME: use a macro! */
-   
-       ObDereferenceObject (Port);
-   
-       return (Status);
+  /* Ask Ob to create the object */
+  Status = ObCreateObject (ExGetPreviousMode(),
+                          LpcPortObjectType,
+                          ObjectAttributes,
+                          ExGetPreviousMode(),
+                          NULL,
+                          sizeof(EPORT),
+                          0,
+                          0,
+                          (PVOID*)&Port);
+  if (!NT_SUCCESS(Status))
+    {
+      return (Status);
+    }
+
+  Status = ObInsertObject ((PVOID)Port,
+                          NULL,
+                          PORT_ALL_ACCESS,
+                          0,
+                          NULL,
+                          PortHandle);
+  if (!NT_SUCCESS(Status))
+    {
+      ObDereferenceObject (Port);
+      return (Status);
+    }
+
+  Status = LpcpInitializePort (Port, EPORT_TYPE_SERVER_RQST_PORT, NULL);
+  Port->MaxConnectInfoLength = LPC_MAX_DATA_LENGTH;
+  Port->MaxDataLength = LPC_MAX_MESSAGE_LENGTH;
+  Port->MaxPoolUsage = MaxPoolUsage;
+
+  ObDereferenceObject (Port);
+
+  return (Status);
 }
 
 /**********************************************************************
  * NAME                                                        EXPORTED
- *     NtCreateWaitablePort@20
- *     
+ *     NtCreateWaitablePort/5
+ *
  * DESCRIPTION
  *     Waitable ports can be connected to with NtSecureConnectPort.
  *     No port interface can be used with waitable ports but
@@ -182,38 +152,31 @@ NtCreatePort (
  *     ObjectAttributes,
  *     MaxConnectInfoLength,
  *     MaxDataLength,
- *     Reserved
- * 
+ *     MaxPoolUsage
+ *
  * RETURN VALUE
- * 
  */
-EXPORTED
-NTSTATUS
-STDCALL
-NtCreateWaitablePort (
-       OUT     PHANDLE                 PortHandle,
-       IN      POBJECT_ATTRIBUTES      ObjectAttributes,
-       IN      ULONG                   MaxConnectInfoLength,
-       IN      ULONG                   MaxDataLength,
-       IN      ULONG                   Reserved
-       )
+/*EXPORTED*/ NTSTATUS STDCALL
+NtCreateWaitablePort (OUT      PHANDLE                 PortHandle,
+                     IN        POBJECT_ATTRIBUTES      ObjectAttributes,
+                     IN        ULONG                   MaxConnectInfoLength,
+                     IN        ULONG                   MaxDataLength,
+                     IN        ULONG                   MaxPoolUsage)
 {
-       NTSTATUS Status;
+  NTSTATUS Status;
 
-       /* Verify parameters */
-       Status = VerifyCreateParameters (
-                       PortHandle,
-                       ObjectAttributes,
-                       MaxConnectInfoLength,
-                       MaxDataLength,
-                       Reserved
-                       );
-       if (STATUS_SUCCESS != Status)
-       {
-               return (Status);
-       }
-       /* TODO */
-       return (STATUS_NOT_IMPLEMENTED);
+  /* Verify parameters */
+  Status = LpcpVerifyCreateParameters (PortHandle,
+                                      ObjectAttributes,
+                                      MaxConnectInfoLength,
+                                      MaxDataLength,
+                                      MaxPoolUsage);
+  if (STATUS_SUCCESS != Status)
+    {
+      return (Status);
+    }
+  /* TODO */
+  return (STATUS_NOT_IMPLEMENTED);
 }
 
 /* EOF */