diff --git a/reactos/drivers/fs/vfat/shutdown.c b/reactos/drivers/fs/vfat/shutdown.c index 37e95be3da4..9feaeaa97fc 100644 --- a/reactos/drivers/fs/vfat/shutdown.c +++ b/reactos/drivers/fs/vfat/shutdown.c @@ -14,6 +14,34 @@ /* FUNCTIONS ****************************************************************/ +NTSTATUS +VfatDiskShutDown(PVCB Vcb) +{ + PIRP Irp; + KEVENT Event; + NTSTATUS Status; + IO_STATUS_BLOCK IoStatus; + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN, Vcb->StorageDevice, + NULL, 0, NULL, &Event, &IoStatus); + if (Irp) + { + Status = IoCallDriver(Vcb->StorageDevice, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatus.Status; + } + } + else + { + Status = IoStatus.Status; + } + + return Status; +} + NTSTATUS STDCALL VfatShutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp) { @@ -37,15 +65,24 @@ VfatShutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp) ExAcquireResourceExclusiveLite(&DeviceExt->DirResource, TRUE); Status = VfatFlushVolume(DeviceExt, DeviceExt->VolumeFcb); - ExReleaseResourceLite(&DeviceExt->DirResource); - if (!NT_SUCCESS(Status)) - { + if (NT_SUCCESS(Status)) + { + Status = VfatDiskShutDown(DeviceExt); + if (!NT_SUCCESS(Status)) + DPRINT1("VfatDiskShutDown failed, status = %x\n", Status); + } + else + { DPRINT1("VfatFlushVolume failed, status = %x\n", Status); - Irp->IoStatus.Status = Status; } + ExReleaseResourceLite(&DeviceExt->DirResource); + /* FIXME: Unmount the logical volume */ + + if (!NT_SUCCESS(Status)) + Irp->IoStatus.Status = Status; } - ExReleaseResourceLite(&VfatGlobalData->VolumeListLock); + ExReleaseResourceLite(&VfatGlobalData->VolumeListLock); /* FIXME: Free all global acquired resources */ @@ -53,13 +90,13 @@ VfatShutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp) } else { + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Status = STATUS_INVALID_DEVICE_REQUEST; } - Irp->IoStatus.Status = Status; Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + return(Status); }