Author: ion
Date: Sun Jul 2 09:44:27 2006
New Revision: 22762
URL:
http://svn.reactos.org/svn/reactos?rev=22762&view=rev
Log:
- If the device to be mounted is an attachee, find the base device object
- Reference the device object being mounted.
- If the file system being mounted is an atachee, find its base device object too, and
increase the IRP Stack for each attached FSD.
- Fix IRP parameters with this new information.
Modified:
trunk/reactos/ntoskrnl/io/iomgr/volume.c
Modified: trunk/reactos/ntoskrnl/io/iomgr/volume.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/volume.c…
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/volume.c (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/volume.c Sun Jul 2 09:44:27 2006
@@ -284,8 +284,10 @@
PIO_STACK_LOCATION StackPtr;
PLIST_ENTRY FsList, ListEntry;
PDEVICE_OBJECT DevObject;
+ PDEVICE_OBJECT AttachedDeviceObject = DeviceObject;
PDEVICE_OBJECT FileSystemDeviceObject;
LIST_ENTRY LocalList;
+ ULONG FsStackOverhead;
PAGED_CODE();
/* Check if the device isn't already locked */
@@ -332,6 +334,16 @@
/* Initialize the event to wait on */
KeInitializeEvent(&Event, NotificationEvent, FALSE);
+ /* Get the actual device to mount */
+ while (AttachedDeviceObject->AttachedDevice)
+ {
+ /* Get the next one */
+ AttachedDeviceObject = AttachedDeviceObject->AttachedDevice;
+ }
+
+ /* Reference it */
+ ObReferenceObject(AttachedDeviceObject);
+
/* Now loop the fs list until one of the file systems accepts us */
Status = STATUS_UNSUCCESSFUL;
ListEntry = FsList->Flink;
@@ -341,6 +353,20 @@
FileSystemDeviceObject = CONTAINING_RECORD(ListEntry,
DEVICE_OBJECT,
Queue.ListEntry);
+
+ /*
+ * If this file system device is attached to some other device,
+ * then we must make sure to increase the stack size for the IRP.
+ * The default is +1, for the FS device itself.
+ */
+ FsStackOverhead = 1;
+ while (FileSystemDeviceObject->AttachedDevice)
+ {
+ /* Get the next attached device and increase overhead */
+ FileSystemDeviceObject = FileSystemDeviceObject->
+ AttachedDevice;
+ FsStackOverhead++;
+ }
/* If we are not allowed to mount this volume as a raw filesystem volume
then don't try this */
@@ -354,8 +380,8 @@
KeClearEvent(&Event);
/* Allocate the IRP */
- Irp = IoAllocateIrp(FileSystemDeviceObject->StackSize +
- 1,
+ Irp = IoAllocateIrp(AttachedDeviceObject->StackSize +
+ FsStackOverhead,
TRUE);
if (!Irp)
{
@@ -378,7 +404,7 @@
StackPtr->Flags = AllowRawMount;
StackPtr->Parameters.MountVolume.Vpb = DeviceObject->Vpb;
StackPtr->Parameters.MountVolume.DeviceObject =
- DeviceObject;
+ AttachedDeviceObject;
/* Call the driver */
Status = IoCallDriver(FileSystemDeviceObject, Irp);