- Silence TCPIP.
[reactos.git] / reactos / ntoskrnl / lpc / port.c
index 77af065..fec68bb 100644 (file)
-/* $Id: port.c,v 1.16 2003/12/14 17:44:02 hbirr Exp $
- * 
+/* $Id$
+ *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/lpc/port.c
  * PURPOSE:         Communication mechanism
- * PROGRAMMER:      David Welch (welch@cwcom.net)
- * UPDATE HISTORY:
- *                  Created 22/05/98
  *
- *     2000-06-04 (ea)
- *             ntoskrnl/nt/port.c moved in ntoskrnl/lpc/port.c
+ * PROGRAMMERS:     David Welch (welch@cwcom.net)
  */
 
 /* INCLUDES *****************************************************************/
 
-#include <limits.h>
-
-#include <ddk/ntddk.h>
-#include <internal/ob.h>
-#include <internal/port.h>
-#include <internal/dbg.h>
-#include <internal/pool.h>
-#include <rosrtl/string.h>
-
+#include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
 
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, LpcpInitSystem)
+#endif
 
 /* GLOBALS *******************************************************************/
 
-POBJECT_TYPE   ExPortType = NULL;
-ULONG          EiNextLpcMessageId = 0;
+POBJECT_TYPE   LpcPortObjectType = 0;
+ULONG          LpcpNextMessageId = 0; /* 0 is not a valid ID */
+FAST_MUTEX     LpcpLock; /* global internal sync in LPC facility */
 
-static GENERIC_MAPPING ExpPortMapping = {
-       STANDARD_RIGHTS_READ,
-       STANDARD_RIGHTS_WRITE,
-       0,
-       PORT_ALL_ACCESS};
+static GENERIC_MAPPING LpcpPortMapping = 
+{
+    STANDARD_RIGHTS_READ,
+    STANDARD_RIGHTS_WRITE,
+    0,
+    PORT_ALL_ACCESS
+};
 
 /* FUNCTIONS *****************************************************************/
 
 
-NTSTATUS INIT_FUNCTION
-NiInitPort (VOID)
+NTSTATUS
+INIT_FUNCTION
+NTAPI
+LpcpInitSystem (VOID)
 {
-   ExPortType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
-   
-   RtlRosInitUnicodeStringFromLiteral(&ExPortType->TypeName,L"Port");
-   
-   ExPortType->Tag = TAG('L', 'P', 'R', 'T');
-   ExPortType->MaxObjects = ULONG_MAX;
-   ExPortType->MaxHandles = ULONG_MAX;
-   ExPortType->TotalObjects = 0;
-   ExPortType->TotalHandles = 0;
-   ExPortType->PagedPoolCharge = 0;
-   ExPortType->NonpagedPoolCharge = sizeof(EPORT);
-   ExPortType->Mapping = &ExpPortMapping;
-   ExPortType->Dump = NULL;
-   ExPortType->Open = NULL;
-   ExPortType->Close = NiClosePort;
-   ExPortType->Delete = NiDeletePort;
-   ExPortType->Parse = NULL;
-   ExPortType->Security = NULL;
-   ExPortType->QueryName = NULL;
-   ExPortType->OkayToClose = NULL;
-   ExPortType->Create = NiCreatePort;
-   ExPortType->DuplicationNotify = NULL;
-   
-   EiNextLpcMessageId = 0;
-   
-   return(STATUS_SUCCESS);
+    OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
+    UNICODE_STRING Name;
+
+    DPRINT("Creating Port Object Type\n");
+  
+    /* Create the Port Object Type */
+    RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
+    RtlInitUnicodeString(&Name, L"Port");
+    ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
+    ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(EPORT);
+    ObjectTypeInitializer.GenericMapping = LpcpPortMapping;
+    ObjectTypeInitializer.PoolType = NonPagedPool;
+    ObjectTypeInitializer.UseDefaultObject = TRUE;
+    ObjectTypeInitializer.CloseProcedure = LpcpClosePort;
+    ObjectTypeInitializer.DeleteProcedure = LpcpDeletePort;
+    ObpCreateTypeObject(&ObjectTypeInitializer, &Name, &LpcPortObjectType);
+    
+    LpcpNextMessageId = 0;
+    ExInitializeFastMutex (& LpcpLock);
+
+    return(STATUS_SUCCESS);
 }
 
 
 /**********************************************************************
  * NAME                                                        INTERNAL
- *     NiInitializePort
- *     
+ *     NiInitializePort/3
+ *
  * DESCRIPTION
  *     Initialize the EPORT object attributes. The Port
  *     object enters the inactive state.
  *
  * ARGUMENTS
  *     Port    Pointer to an EPORT object to initialize.
+ *     Type    connect (RQST), or communication port (COMM)
+ *     Parent  OPTIONAL connect port a communication port
+ *             is created from
  *
  * RETURN VALUE
  *     STATUS_SUCCESS if initialization succedeed. An error code
  *     otherwise.
  */
 NTSTATUS STDCALL
-NiInitializePort (IN OUT       PEPORT  Port)
+LpcpInitializePort (IN OUT  PEPORT Port,
+                 IN      USHORT Type,
+                 IN      PEPORT Parent OPTIONAL)
 {
+  if ((Type != EPORT_TYPE_SERVER_RQST_PORT) &&
+      (Type != EPORT_TYPE_SERVER_COMM_PORT) &&
+      (Type != EPORT_TYPE_CLIENT_COMM_PORT))
+  {
+         return STATUS_INVALID_PARAMETER_2;
+  }
   memset (Port, 0, sizeof(EPORT));
   KeInitializeSpinLock (& Port->Lock);
-  KeInitializeSemaphore( &Port->Semaphore, 0, LONG_MAX );
+  KeInitializeSemaphore( &Port->Semaphore, 0, MAXLONG );
+  Port->RequestPort = Parent;
   Port->OtherPort = NULL;
   Port->QueueLength = 0;
   Port->ConnectQueueLength = 0;
+  Port->Type = Type;
   Port->State = EPORT_INACTIVE;
   InitializeListHead (& Port->QueueListHead);
   InitializeListHead (& Port->ConnectQueueListHead);
-   
+
   return (STATUS_SUCCESS);
 }
 
@@ -110,8 +115,8 @@ NiInitializePort (IN OUT    PEPORT  Port)
 
 /**********************************************************************
  * NAME                                                        SYSTEM
- *     NtImpersonateClientOfPort@8
- *     
+ *     NtImpersonateClientOfPort/2
+ *
  * DESCRIPTION
  *
  * ARGUMENTS
@@ -122,12 +127,10 @@ NiInitializePort (IN OUT  PEPORT  Port)
  */
 NTSTATUS STDCALL
 NtImpersonateClientOfPort (HANDLE              PortHandle,
-                          PLPC_MESSAGE ClientMessage)
+                          PPORT_MESSAGE        ClientMessage)
 {
   UNIMPLEMENTED;
   return(STATUS_NOT_IMPLEMENTED);
 }
 
-
-
 /* EOF */