IopCreateFile(): Fix semantics of volume mounting (Vpb vs. Device etc.)
[reactos.git] / ntoskrnl / io / create.c
index e2a0400..cf0553d 100644 (file)
@@ -26,6 +26,8 @@
 
 /* FUNCTIONS *************************************************************/
 
+#ifndef LIBCAPTIVE
+
 /**********************************************************************
  * NAME                                                        EXPORTED
  *     NtDeleteFile@4
@@ -47,6 +49,7 @@ NtDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes)
   UNIMPLEMENTED;
 }
 
+#endif /* LIBCAPTIVE */
 
 /**********************************************************************
  * NAME                                                        INTERNAL
@@ -101,6 +104,8 @@ IopCreateFile(PVOID                 ObjectBody,
       return(Status);
     }
 
+  FileObject->Flags = 0;
+
   DeviceObject = IoGetAttachedDevice(DeviceObject);
   DPRINT("DeviceObject %x\n", DeviceObject);
 
@@ -109,6 +114,7 @@ IopCreateFile(PVOID                 ObjectBody,
       FileObject->Flags = FileObject->Flags | FO_DIRECT_DEVICE_OPEN;
       FileObject->FileName.Buffer = 0;
       FileObject->FileName.Length = FileObject->FileName.MaximumLength = 0;
+      FileObject->Vpb = DeviceObject->Vpb;
     }
   else
     {
@@ -121,6 +127,7 @@ IopCreateFile(PVOID                 ObjectBody,
          && (DeviceObject->DeviceType != FILE_DEVICE_MAILSLOT))
        {
          CPRINT("Device was wrong type\n");
+         KeBugCheck(0);
          return(STATUS_UNSUCCESSFUL);
        }
 
@@ -139,12 +146,20 @@ IopCreateFile(PVOID                       ObjectBody,
                         Status);
                  return(Status);
                }
+             if (!DeviceObject->Vpb)
+               KeBugCheck(0);
+             if (DeviceObject->Vpb->DeviceObject->Vpb)
+               KeBugCheck(0);
+             DeviceObject->Vpb->DeviceObject->Vpb=DeviceObject->Vpb;
+             DeviceObject->Vpb->Flags |= VPB_MOUNTED;
            }
+
          DeviceObject = DeviceObject->Vpb->DeviceObject;
          DPRINT("FsDeviceObject %lx\n", DeviceObject);
        }
       RtlCreateUnicodeString(&(FileObject->FileName),
                             RemainingPath);
+      FileObject->Vpb = NULL;
     }
 
   DPRINT("FileObject->FileName %wZ\n",
@@ -153,8 +168,8 @@ IopCreateFile(PVOID                 ObjectBody,
   DPRINT("FileObject %x DeviceObject %x\n",
         FileObject,
         DeviceObject);
-  FileObject->Vpb = DeviceObject->Vpb;
   FileObject->Type = InternalFileType;
+  FileObject->RelatedFileObject = NULL;
 
   return(STATUS_SUCCESS);
 }
@@ -184,7 +199,6 @@ PFILE_OBJECT STDCALL
 IoCreateStreamFileObject(PFILE_OBJECT FileObject,
                         PDEVICE_OBJECT DeviceObject)
 {
-  HANDLE               FileHandle;
   PFILE_OBJECT CreatedFileObject;
   NTSTATUS Status;
 
@@ -193,7 +207,10 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject,
 
   assert_irql(PASSIVE_LEVEL);
 
-  Status = ObCreateObject(&FileHandle,
+  /* We don't need any 'Handle' therefore pass 1st parameter as NULL and it
+   * will not be created by ObCreateObject() at all.
+   */
+  Status = ObCreateObject(NULL,
                          STANDARD_RIGHTS_REQUIRED,
                          NULL,
                          IoFileObjectType,
@@ -215,13 +232,23 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject,
   CreatedFileObject->DeviceObject = DeviceObject->Vpb->DeviceObject;
   CreatedFileObject->Vpb = DeviceObject->Vpb;
   CreatedFileObject->Type = InternalFileType;
-  CreatedFileObject->Flags |= FO_DIRECT_DEVICE_OPEN;
+  /* Why was FO_DIRECT_DEVICE_OPEN used here before?
+   * FO_STREAM_FILE is according to W32 documentation.
+   */
+  CreatedFileObject->Flags |= FO_STREAM_FILE;
+#ifdef LIBCAPTIVE
+  /* We are fully single-threaded/single-processed;
+   * prevent at least IopDeleteFile()->...->IoIsOperationSynchronous() to return FALSE
+   */
+  CreatedFileObject->Flags |= FO_SYNCHRONOUS_IO;
+#endif /* LIBCAPTIVE */
+  CreatedFileObject->FileName.Length=0;
+  CreatedFileObject->FileName.MaximumLength=0;
+  CreatedFileObject->FileName.Buffer=NULL;
 
   // shouldn't we initialize the lock event, and several other things here too?
   KeInitializeEvent(&CreatedFileObject->Event, NotificationEvent, FALSE);
 
-  ZwClose(FileHandle);
-
   return(CreatedFileObject);
 }
 
@@ -316,6 +343,7 @@ IoCreateFile(OUT    PHANDLE                 FileHandle,
    PIO_STACK_LOCATION  StackLoc;
    IO_STATUS_BLOCK      IoSB;
    IO_SECURITY_CONTEXT  SecurityContext;
+   ACCESS_STATE                AccessState;
    
    DPRINT("IoCreateFile(FileHandle %x, DesiredAccess %x, "
          "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n",
@@ -348,8 +376,19 @@ IoCreateFile(OUT   PHANDLE                 FileHandle,
    if( CreateOptions & FILE_NO_INTERMEDIATE_BUFFERING )
      FileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
 
+   FileObject->FsContext=NULL;
+   FileObject->FsContext2=NULL;
+
+   RtlZeroMemory(&AccessState, sizeof(AccessState));
+   AccessState.RemainingDesiredAccess=0;       /* FIXME: Meaning? */
+   AccessState.PreviouslyGrantedAccess=DesiredAccess;  /* FIXME: Meaning? */
+   /* 'OriginalDesiredAccess' is required during file create by ntfs.sys of NT-5.1sp1
+    * W32 undocumented.
+    */
+   AccessState.OriginalDesiredAccess=DesiredAccess;    /* FIXME: Meaning? */
+
    SecurityContext.SecurityQos = NULL; /* ?? */
-   SecurityContext.AccessState = NULL; /* ?? */
+   SecurityContext.AccessState = &AccessState;
    SecurityContext.DesiredAccess = DesiredAccess;
    SecurityContext.FullCreateOptions = 0; /* ?? */
    
@@ -432,6 +471,9 @@ IoCreateFile(OUT    PHANDLE                 FileHandle,
    if (!NT_SUCCESS(Status))
      {
        DPRINT("Failing create request with status %x\n", Status);
+        FileObject->DeviceObject = NULL;
+        FileObject->Vpb = NULL;
+
        ZwClose(*FileHandle);
      }
    if (IoStatusBlock)
@@ -445,6 +487,7 @@ IoCreateFile(OUT    PHANDLE                 FileHandle,
    return (Status);
 }
 
+#ifndef LIBCAPTIVE
 
 /**********************************************************************
  * NAME                                                        EXPORTED
@@ -551,4 +594,6 @@ NtOpenFile(PHANDLE FileHandle,
                       0);
 }
 
+#endif /* LIBCAPTIVE */
+
 /* EOF */