IopCreateFile(): Fix semantics of volume mounting (Vpb vs. Device etc.)
[reactos.git] / ntoskrnl / io / create.c
index 83e1941..cf0553d 100644 (file)
@@ -114,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
     {
@@ -126,6 +127,7 @@ IopCreateFile(PVOID                 ObjectBody,
          && (DeviceObject->DeviceType != FILE_DEVICE_MAILSLOT))
        {
          CPRINT("Device was wrong type\n");
+         KeBugCheck(0);
          return(STATUS_UNSUCCESSFUL);
        }
 
@@ -144,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",
@@ -158,7 +168,6 @@ IopCreateFile(PVOID                 ObjectBody,
   DPRINT("FileObject %x DeviceObject %x\n",
         FileObject,
         DeviceObject);
-  FileObject->Vpb = DeviceObject->Vpb;
   FileObject->Type = InternalFileType;
   FileObject->RelatedFileObject = NULL;