-/* $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
* 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
* 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 */