Fixed a typo.
[reactos.git] / reactos / ntoskrnl / io / create.c
index ee8f1db..af9fdd1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: create.c,v 1.47 2001/08/26 17:27:00 ekohl Exp $
+/* $Id: create.c,v 1.54 2002/04/01 22:18:01 hbirr Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -85,7 +85,7 @@ IopCreateFile(PVOID                   ObjectBody,
      }
    if (IoDeviceObjectType != BODY_TO_HEADER(Parent)->ObjectType)
      {
-       CPRINT("Parent is a %S which not a device type\n",
+       CPRINT("Parent is a %S which is not a device type\n",
               BODY_TO_HEADER(Parent)->ObjectType->TypeName.Buffer);
        return (STATUS_UNSUCCESSFUL);
      }
@@ -125,7 +125,6 @@ IopCreateFile(PVOID                 ObjectBody,
            && (DeviceObject->DeviceType != FILE_DEVICE_MAILSLOT))
          {
             CPRINT ("Device was wrong type\n");
-            assert(FALSE);
             return (STATUS_UNSUCCESSFUL);
          }
 
@@ -140,7 +139,7 @@ IopCreateFile(PVOID                 ObjectBody,
                  DPRINT("Status %x\n", Status);
                  if (!NT_SUCCESS(Status))
                    {
-                      CPRINT("Failed to mount storage device (statux %x)\n",
+                      CPRINT("Failed to mount storage device (status %x)\n",
                              Status);
                       return (Status);
                    }
@@ -295,27 +294,28 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject,
  * 
  */
 NTSTATUS STDCALL
-IoCreateFile(
-       OUT     PHANDLE                 FileHandle,
-       IN      ACCESS_MASK             DesiredAccess,
-       IN      POBJECT_ATTRIBUTES      ObjectAttributes,
-       OUT     PIO_STATUS_BLOCK        IoStatusBlock,
-       IN      PLARGE_INTEGER          AllocationSize          OPTIONAL,
-       IN      ULONG                   FileAttributes,
-       IN      ULONG                   ShareAccess,
-       IN      ULONG                   CreateDisposition,
-       IN      ULONG                   CreateOptions,
-       IN      PVOID                   EaBuffer                OPTIONAL,
-       IN      ULONG                   EaLength,
-       IN      CREATE_FILE_TYPE        CreateFileType,
-       IN      PVOID                   ExtraCreateParameters   OPTIONAL,
-       IN      ULONG                   Options)
+IoCreateFile(OUT       PHANDLE                 FileHandle,
+            IN ACCESS_MASK             DesiredAccess,
+            IN POBJECT_ATTRIBUTES      ObjectAttributes,
+            OUT        PIO_STATUS_BLOCK        IoStatusBlock,
+            IN PLARGE_INTEGER          AllocationSize          OPTIONAL,
+            IN ULONG                   FileAttributes,
+            IN ULONG                   ShareAccess,
+            IN ULONG                   CreateDisposition,
+            IN ULONG                   CreateOptions,
+            IN PVOID                   EaBuffer                OPTIONAL,
+            IN ULONG                   EaLength,
+            IN CREATE_FILE_TYPE        CreateFileType,
+            IN PVOID                   ExtraCreateParameters   OPTIONAL,
+            IN ULONG                   Options)
 {
    PFILE_OBJECT                FileObject;
    NTSTATUS            Status;
    PIRP                        Irp;
-   KEVENT                      Event;
+   KEVENT              Event;
    PIO_STACK_LOCATION  StackLoc;
+   IO_STATUS_BLOCK      IoSB;
+   IO_SECURITY_CONTEXT  SecurityContext;
    
    DPRINT("IoCreateFile(FileHandle %x, DesiredAccess %x, "
          "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n",
@@ -344,6 +344,15 @@ IoCreateFile(
      {
        FileObject->Flags |= FO_SYNCHRONOUS_IO;
      }
+
+   if( CreateOptions & FILE_NO_INTERMEDIATE_BUFFERING )
+     FileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
+
+   SecurityContext.SecurityQos = NULL; /* ?? */
+   SecurityContext.AccessState = NULL; /* ?? */
+   SecurityContext.DesiredAccess = DesiredAccess;
+   SecurityContext.FullCreateOptions = 0; /* ?? */
+   
    KeInitializeEvent(&FileObject->Lock, NotificationEvent, TRUE);
    KeInitializeEvent(&Event, NotificationEvent, FALSE);
    
@@ -361,9 +370,11 @@ IoCreateFile(
        return (STATUS_UNSUCCESSFUL);
      }
      
-   Irp->UserIosb = IoStatusBlock;   //return iostatus
+   Irp->UserIosb = &IoSB;   //return iostatus
    Irp->AssociatedIrp.SystemBuffer = EaBuffer;
    Irp->Tail.Overlay.AuxiliaryBuffer = (PCHAR)ExtraCreateParameters;
+   Irp->Tail.Overlay.Thread = PsGetCurrentThread();
+   Irp->UserEvent = &Event;
    
    /*
     * Get the stack location for the new
@@ -386,12 +397,16 @@ IoCreateFile(
          break;
      }
    StackLoc->MinorFunction = 0;
-   StackLoc->Flags = 0;
+   StackLoc->Flags = Options;
    StackLoc->Control = 0;
    StackLoc->DeviceObject = FileObject->DeviceObject;
    StackLoc->FileObject = FileObject;
+   StackLoc->Parameters.Create.SecurityContext = &SecurityContext;
    StackLoc->Parameters.Create.Options = (CreateOptions & FILE_VALID_OPTION_FLAGS);
    StackLoc->Parameters.Create.Options |= (CreateDisposition << 24);
+   StackLoc->Parameters.Create.FileAttributes = FileAttributes;
+   StackLoc->Parameters.Create.ShareAccess = ShareAccess;
+   StackLoc->Parameters.Create.EaLength = EaLength;
    
    /*
     * Now call the driver and 
@@ -408,14 +423,17 @@ IoCreateFile(
                              KernelMode,
                              FALSE,
                              NULL);
-       Status = IoStatusBlock->Status;
+       Status = IoSB.Status;
      }
    if (!NT_SUCCESS(Status))
      {
        DPRINT("Failing create request with status %x\n", Status);
        ZwClose(*FileHandle);
      }
-   
+   if (IoStatusBlock)
+     {
+       *IoStatusBlock = IoSB;
+     }
    assert_irql(PASSIVE_LEVEL);
 
    DPRINT("Finished IoCreateFile() (*FileHandle) %x\n", (*FileHandle));