From b2eee21330a67de2f1c70d195b4707b4c95e7123 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sat, 11 Nov 2017 06:03:48 +0900 Subject: [PATCH] CdfsDismountVolume --- drivers/filesystems/cdfs/fsctl.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/drivers/filesystems/cdfs/fsctl.c b/drivers/filesystems/cdfs/fsctl.c index 925819fb8e..80546db46b 100644 --- a/drivers/filesystems/cdfs/fsctl.c +++ b/drivers/filesystems/cdfs/fsctl.c @@ -607,6 +607,39 @@ CdfsLockOrUnlockVolume( return STATUS_SUCCESS; } +static +NTSTATUS +CdfsDismountVolume( + IN PCDFS_IRP_CONTEXT IrpContext) +{ + PFCB Fcb; + PFILE_OBJECT FileObject; + PDEVICE_EXTENSION DeviceExt; + PDEVICE_OBJECT DeviceObject = NULL; + + FileObject = IrpContext->FileObject; + Fcb = FileObject->FsContext; + if (!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME_STREAM)) + return STATUS_ACCESS_DENIED; + + DeviceExt = IrpContext->DeviceObject->DeviceExtension; + if (DeviceExt) + { + DeviceObject = DeviceExt->VolumeDevice; + DeviceExt->VolumeDevice = NULL; + } + if (DeviceExt && DeviceExt->StreamFileObject) + { + ObDereferenceObject(DeviceExt->StreamFileObject); + DeviceExt->StreamFileObject = NULL; + } + if (Fcb) + ExFreePoolWithTag(Fcb, CDFS_NONPAGED_FCB_TAG); + if (DeviceObject) + IoDeleteDevice(DeviceObject); + + return STATUS_SUCCESS; +} NTSTATUS NTAPI @@ -673,6 +706,11 @@ CdfsFileSystemControl( Status = CdfsLockOrUnlockVolume(IrpContext, FALSE); break; + case FSCTL_DISMOUNT_VOLUME: + DPRINT("CDFS: IRP_MN_USER_FS_REQUEST / FSCTL_DISMOUNT_VOLUME\n"); + Status = CdfsDismountVolume(IrpContext); + break; + default: DPRINT1("CDFS: IRP_MN_USER_FS_REQUEST / Unknown IoControlCode 0x%x\n", Stack->Parameters.DeviceIoControl.IoControlCode); -- 2.14.2