Corrected the handle generation algorithm in the kernel and csrss
[reactos.git] / reactos / drivers / fs / np / create.c
index def56ba..fd7fac1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: create.c,v 1.2 1999/12/04 20:58:42 ea Exp $
+/* $Id: create.c,v 1.3 2000/03/26 22:00:09 dwelch Exp $
  *
  * COPYRIGHT:  See COPYING in the top level directory
  * PROJECT:    ReactOS kernel
 
 /* FUNCTIONS *****************************************************************/
 
-NTSTATUS NpfsCreatePipe(PNPFS_DEVICE_EXTENSION DeviceExt,
-                       PFILE_OBJECT FileObject)
+NTSTATUS NpfsCreate(PDEVICE_OBJECT DeviceObject,
+                   PIRP Irp)               
 {
+   return(Status);
+}
+
+NTSTATUS NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+   PIO_STACK_LOCATION IoStack;
+   PFILE_OBJECT FileObject;
+   NTSTATUS Status;
+   PNPFS_DEVICE_EXTENSION DeviceExt;
    PWSTR PipeName;
    PNPFS_FSCONTEXT PipeDescr;
    NTSTATUS Status;
+   KIRQL oldIrql;
+   PLIST_ENTRY current_entry;
+   PNPFS_CONTEXT current;
    
-   PipeName = wcsrchr(FileObject->FileName.Buffer, L'\\');
-   if (PipeName == NULL)
-     {
-       PipeName = FileObject->FileName.Buffer;
-     }
+   DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+   IoStack = IoGetCurrentIrpStackLocation(Irp);
+   FileObject = IoStack->FileObject;
+   
+   PipeName = FileObject->FileName.Buffer;
    
    PipeDescr = ExAllocatePool(NonPagedPool, sizeof(NPFS_FSCONTEXT));
    if (PipeDescr == NULL)
      {
+       Irp->IoStatus.Status = STATUS_NO_MEMORY;
+       Irp->IoStatus.Information = 0;
+       
+       IoCompleteRequest(Irp, IO_NO_INCREMENT);
+       
        return(STATUS_NO_MEMORY);
      }
-   
-   Status = NpfsCreateEntry(PipeName, PipeDescr);
-   if (!NT_SUCCESS(Status))
+   PipeDescr->Name = ExAllocatePool(NonPagedPool,
+                                   (wcslen(PipeName) + 1) * sizeof(WCHAR));
+   if (PipeDescr->Name == NULL)
      {
        ExFreePool(PipeDescr);
-       return(Status);
+       
+       Irp->IoStatus.Status = STATUS_NO_MEMORY;
+       Irp->IoStatus.Information = 0;
+       
+       IoCompleteRequest(Irp, IO_NO_INCREMENT);
      }
    
-   FileObject->FsContext = PipeDescr;
+   wcscpy(PipeDescr->Name, PipeName);
+   PipeDescr->FileAttributes = 
+     IoStack->Parameters.CreateNamedPipe.FileAttributes;
+   PipeDescr->OpenMode = 
+     IoStack->Parameters.CreateNamedPipe.OpenMode;
+   PipeDescr->PipeType =
+     IoStack->Parameters.CreateNamedPipe.PipeType;
+   PipeDescr->PipeRead =
+     IoStack->Parameters.CreateNamedPipe.PipeRead;
+   PipeDescr->PipeWait =
+     IoStack->Parameters.CreateNamedPipe.PipeWait;
+   PipeDescr->MaxInstances =
+     IoStack->Parameters.CreateNamedPipe.MaxInstances;
+   PipeDescr->InBufferSize =
+     IoStack->Parameters.CreateNamedPipe.InBufferSize;
+   PipeDescr->OutBufferSize =
+     IoStack->Parameters.CreateNamedPipe.OutBufferSize;
+   PipeDescr->Timeout =
+     IoStack->Parameters.CreateNamedPipe.Timeout;
+   KeInitializeSpinLock(&PipeDescr->MsgListLock);
+   InitializeListHead(&PipeDescr->MsgListHead);
+   
+   /*
+    * Check for duplicate names
+    */
+   KeAcquireSpinLock(&PipeListLock, &oldIrql);
+   current_entry = PipeListHead.Flink;
+   while (current_entry != &PipeListHead)
+     {
+       current = CONTAINING_RECORD(current_entry,
+                                   NPFS_FSCONTEXT,
+                                   ListEntry);
+       
+       if (wcscmp(current->Name, PipeDescr->Name) == 0)
+         {
+            KeReleaseSpinLock(&PipeListLock, oldIrql);
+            ExFreePool(PipeDescr->Name);
+            ExFreePool(PipeDescr);
+            
+            Irp->IoStatus.Status = STATUS_OBJECT_NAME_COLLISION;
+            Irp->IoStatus.Information = 0;
+            
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+         }
+       
+       current_entry = current_entry->Flink;
+     }
+   InsertTailList(&PipeListHead,
+                 &PipeDescr->ListEntry);
+   KeReleaseSpinLock(&PipeListLock, oldIrql);
    
-   return(Status);
-}
-
-NTSTATUS NpfsCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
-   PIO_STACK_LOCATION IoStack;
-   PFILE_OBJECT FileObject;
-   NTSTATUS Status;
-   PNPFS_DEVICE_EXTENSION DeviceExt;
    
-   DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-   IoStack = IoGetCurrentIrpStackLocation(Irp);
-   FileObject = IoStack->FileObject;
    
-   Status = NpfsCreatePipe(DeviceExt, FileObject);
+   FileObject->FsContext = PipeDescr;
    
    Irp->IoStatus.Status = Status;
    Irp->IoStatus.Information = 0;