diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index b224a3e38a2..34ddaacf65b 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -333,6 +333,16 @@ typedef struct _SHUTDOWN_ENTRY PDEVICE_OBJECT DeviceObject; } SHUTDOWN_ENTRY, *PSHUTDOWN_ENTRY; +// +// F/S Notification entry for registered File Systems +// +typedef struct _FS_CHANGE_NOTIFY_ENTRY +{ + LIST_ENTRY FsChangeNotifyList; + PDRIVER_OBJECT DriverObject; + PDRIVER_FS_NOTIFICATION FSDNotificationProc; +} FS_CHANGE_NOTIFY_ENTRY, *PFS_CHANGE_NOTIFY_ENTRY; + // // Called on every visit of a node during a preorder-traversal of the device // node tree. @@ -559,7 +569,10 @@ NTSTATUS NTAPI IopMountVolume( IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN AllowRawMount + IN BOOLEAN AllowRawMount, + IN BOOLEAN DeviceIsLocked, + IN BOOLEAN Alertable, + OUT PVPB *Vpb ); PVOID @@ -575,7 +588,7 @@ IoOpenFileOnDevice( NTSTATUS NTAPI -IopAttachVpb( +IopCreateVpb( IN PDEVICE_OBJECT DeviceObject ); diff --git a/reactos/ntoskrnl/io/iomgr/device.c b/reactos/ntoskrnl/io/iomgr/device.c index 3a8d4562ea7..c141afbf541 100644 --- a/reactos/ntoskrnl/io/iomgr/device.c +++ b/reactos/ntoskrnl/io/iomgr/device.c @@ -798,7 +798,7 @@ IoCreateDevice(IN PDRIVER_OBJECT DriverObject, CreatedDeviceObject->DeviceType == FILE_DEVICE_TAPE) { /* Create Vpb */ - IopAttachVpb(CreatedDeviceObject); + IopCreateVpb(CreatedDeviceObject); /* Initialize Lock Event */ KeInitializeEvent(&CreatedDeviceObject->DeviceLock, diff --git a/reactos/ntoskrnl/io/iomgr/file.c b/reactos/ntoskrnl/io/iomgr/file.c index cea681e026c..189e213cbb1 100644 --- a/reactos/ntoskrnl/io/iomgr/file.c +++ b/reactos/ntoskrnl/io/iomgr/file.c @@ -43,6 +43,7 @@ IopParseDevice(IN PVOID ParseObject, PDEVICE_OBJECT DeviceObject; NTSTATUS Status; PFILE_OBJECT FileObject; + PVPB Vpb; DPRINT("IopParseDevice:\n" "DeviceObject : %p\n" "RelatedFileObject : %p\n" @@ -100,7 +101,7 @@ IopParseDevice(IN PVOID ParseObject, /* Check if it's not already mounted */ if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED)) { - Status = IopMountVolume(DeviceObject, FALSE); + Status = IopMountVolume(DeviceObject, FALSE, FALSE, FALSE, &Vpb); if (!NT_SUCCESS(Status)) { /* Couldn't mount, fail the lookup */ diff --git a/reactos/ntoskrnl/io/iomgr/volume.c b/reactos/ntoskrnl/io/iomgr/volume.c index f5632573b26..4d19a2533f8 100644 --- a/reactos/ntoskrnl/io/iomgr/volume.c +++ b/reactos/ntoskrnl/io/iomgr/volume.c @@ -26,13 +26,6 @@ typedef struct _FILE_SYSTEM_OBJECT LIST_ENTRY Entry; } FILE_SYSTEM_OBJECT, *PFILE_SYSTEM_OBJECT; -typedef struct _FS_CHANGE_NOTIFY_ENTRY -{ - LIST_ENTRY FsChangeNotifyList; - PDRIVER_OBJECT DriverObject; - PDRIVER_FS_NOTIFICATION FSDNotificationProc; -} FS_CHANGE_NOTIFY_ENTRY, *PFS_CHANGE_NOTIFY_ENTRY; - #if defined (ALLOC_PRAGMA) #pragma alloc_text(INIT, IoInitVpbImplementation) #endif @@ -68,8 +61,8 @@ IoInitFileSystemImplementation(VOID) } NTSTATUS -STDCALL -IopAttachVpb(IN PDEVICE_OBJECT DeviceObject) +NTAPI +IopCreateVpb(IN PDEVICE_OBJECT DeviceObject) { PVPB Vpb; @@ -77,7 +70,7 @@ IopAttachVpb(IN PDEVICE_OBJECT DeviceObject) Vpb = ExAllocatePoolWithTag(NonPagedPool, sizeof(VPB), TAG_VPB); - if (!Vpb) return(STATUS_UNSUCCESSFUL); + if (!Vpb) return STATUS_UNSUCCESSFUL; /* Clear it so we don't waste time manually */ RtlZeroMemory(Vpb, sizeof(VPB)); @@ -87,9 +80,9 @@ IopAttachVpb(IN PDEVICE_OBJECT DeviceObject) Vpb->Size = sizeof(VPB); Vpb->RealDevice = DeviceObject; - /* link it to the Device Object */ + /* Link it to the Device Object */ DeviceObject->Vpb = Vpb; - return(STATUS_SUCCESS); + return STATUS_SUCCESS; } VOID @@ -237,7 +230,10 @@ IopLoadFileSystem(IN PDEVICE_OBJECT DeviceObject) NTSTATUS NTAPI IopMountVolume(IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN AllowRawMount) + IN BOOLEAN AllowRawMount, + IN BOOLEAN DeviceIsLocked, + IN BOOLEAN Alertable, + OUT PVPB *Vpb) { PFILE_SYSTEM_OBJECT current; NTSTATUS Status; @@ -341,6 +337,7 @@ IoVerifyVolume(IN PDEVICE_OBJECT DeviceObject, PIRP Irp; NTSTATUS Status = STATUS_SUCCESS; PDEVICE_OBJECT DevObject; + PVPB NewVpb; KeWaitForSingleObject(&DeviceObject->DeviceLock, Executive, @@ -401,7 +398,7 @@ IoVerifyVolume(IN PDEVICE_OBJECT DeviceObject, } /* Start mount sequence */ - Status = IopMountVolume(DeviceObject, AllowRawMount); + Status = IopMountVolume(DeviceObject, AllowRawMount, TRUE, FALSE, &NewVpb); KeSetEvent(&DeviceObject->DeviceLock, IO_NO_INCREMENT, FALSE); return(Status);