Fixed a typo.
[reactos.git] / reactos / ntoskrnl / io / create.c
index a7341e0..af9fdd1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: create.c,v 1.42 2001/05/13 13:35:37 chorns 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
@@ -42,7 +42,7 @@
  * 
  */
 NTSTATUS STDCALL
-NtDeleteFile (IN       POBJECT_ATTRIBUTES      ObjectAttributes)
+NtDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes)
 {
    UNIMPLEMENTED;
 }
@@ -61,11 +61,11 @@ NtDeleteFile (IN    POBJECT_ATTRIBUTES      ObjectAttributes)
  * REVISIONS
  * 
  */
-NTSTATUS
-IopCreateFile (PVOID                   ObjectBody,
-              PVOID                    Parent,
-              PWSTR                    RemainingPath,
-              POBJECT_ATTRIBUTES       ObjectAttributes)
+NTSTATUS STDCALL
+IopCreateFile(PVOID                    ObjectBody,
+             PVOID                     Parent,
+             PWSTR                     RemainingPath,
+             POBJECT_ATTRIBUTES        ObjectAttributes)
 {
    PDEVICE_OBJECT      DeviceObject = (PDEVICE_OBJECT) Parent;
    PFILE_OBJECT        FileObject = (PFILE_OBJECT) ObjectBody;
@@ -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);
      }
@@ -108,7 +108,7 @@ IopCreateFile (PVOID                        ObjectBody,
        FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN;
        FileObject->FileName.Buffer = 
          ExAllocatePoolWithTag(NonPagedPool,
-                               (ObjectAttributes->ObjectName->Length+1)*2,
+                               (ObjectAttributes->ObjectName->Length+1)*sizeof(WCHAR),
                                TAG_FILE_NAME);
        FileObject->FileName.Length = ObjectAttributes->ObjectName->Length;
        FileObject->FileName.MaximumLength = 
@@ -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);
                    }
@@ -189,17 +188,19 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject,
 {
   HANDLE               FileHandle;
   PFILE_OBJECT CreatedFileObject;
+  NTSTATUS Status;
 
   DPRINT("IoCreateStreamFileObject(FileObject %x, DeviceObject %x)\n",
           FileObject, DeviceObject);
    
   assert_irql (PASSIVE_LEVEL);
 
-  CreatedFileObject = ObCreateObject (&FileHandle,
-                                     STANDARD_RIGHTS_REQUIRED,
-                                     NULL,
-                                     IoFileObjectType);
-  if (NULL == CreatedFileObject)
+  Status = ObCreateObject (&FileHandle,
+                          STANDARD_RIGHTS_REQUIRED,
+                          NULL,
+                          IoFileObjectType,
+                          (PVOID*)&CreatedFileObject);
+  if (!NT_SUCCESS(Status))
     {
       DPRINT("Could not create FileObject\n");
       return (NULL);
@@ -293,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",
@@ -324,14 +326,15 @@ IoCreateFile(
    
    *FileHandle = 0;
 
-   FileObject = ObCreateObject(FileHandle,
-                              DesiredAccess,
-                              ObjectAttributes,
-                              IoFileObjectType);
-   if (FileObject == NULL)
+   Status = ObCreateObject(FileHandle,
+                          DesiredAccess,
+                          ObjectAttributes,
+                          IoFileObjectType,
+                          (PVOID*)&FileObject);
+   if (!NT_SUCCESS(Status))
      {
-       DPRINT1("ObCreateObject() failed!\n");
-       return (STATUS_UNSUCCESSFUL);
+       DPRINT("ObCreateObject() failed!\n");
+       return (Status);
      }
    if (CreateOptions & FILE_SYNCHRONOUS_IO_ALERT)
      {
@@ -341,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);
    
@@ -354,11 +366,15 @@ IoCreateFile(
    Irp = IoAllocateIrp(FileObject->DeviceObject->StackSize, FALSE);
    if (Irp == NULL)
      {
+       ZwClose(*FileHandle);
        return (STATUS_UNSUCCESSFUL);
      }
-   
+     
+   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
@@ -381,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 
@@ -395,6 +415,7 @@ IoCreateFile(
     * immediately.
     */
    Status = IofCallDriver(FileObject->DeviceObject, Irp );
+   
    if (Status == STATUS_PENDING)
      {
        KeWaitForSingleObject(&Event,
@@ -402,15 +423,17 @@ IoCreateFile(
                              KernelMode,
                              FALSE,
                              NULL);
-       Status = IoStatusBlock->Status;
+       Status = IoSB.Status;
      }
    if (!NT_SUCCESS(Status))
      {
-       DPRINT1("Failing create request with status %x\n", Status);
+       DPRINT("Failing create request with status %x\n", Status);
        ZwClose(*FileHandle);
-       (*FileHandle) = 0;
      }
-   
+   if (IoStatusBlock)
+     {
+       *IoStatusBlock = IoSB;
+     }
    assert_irql(PASSIVE_LEVEL);
 
    DPRINT("Finished IoCreateFile() (*FileHandle) %x\n", (*FileHandle));