From: short <> Date: Fri, 11 Jul 2003 06:53:43 +0000 (+0000) Subject: dismount_volume(): Also FSCTL_LOCK_VOLUME before FSCTL_DISMOUNT_VOLUME X-Git-Tag: bp_captive~147 X-Git-Url: http://git.jankratochvil.net/?a=commitdiff_plain;h=5cb37fd8b251274737500aea655376ef776cc7de;p=captive.git dismount_volume(): Also FSCTL_LOCK_VOLUME before FSCTL_DISMOUNT_VOLUME - no effect seen on ntfs.sys of NT-5.1sp1 --- diff --git a/src/libcaptive/client/init.c b/src/libcaptive/client/init.c index b30efa4..97876c1 100644 --- a/src/libcaptive/client/init.c +++ b/src/libcaptive/client/init.c @@ -302,6 +302,8 @@ FILE_OBJECT *FileObject; GnomeVFSResult errvfsresult; NTSTATUS err; IO_STATUS_BLOCK dir_IoStatusBlock; +static const ULONG fsctls[2]={ FSCTL_LOCK_VOLUME,FSCTL_DISMOUNT_VOLUME }; +int fsctlsi; errvfsresult=captive_ObjectAttributes_init("/!Captive!del",&dir_ObjectAttributes); g_return_if_fail(errvfsresult==GNOME_VFS_OK); @@ -337,39 +339,41 @@ IO_STATUS_BLOCK dir_IoStatusBlock; Status=ObReferenceObjectByHandle(dir_Handle,FILE_LIST_DIRECTORY,IoFileObjectType,UserMode,(PVOID *)&FileObject,NULL); g_assert(NT_SUCCESS(Status)); - Irp=IoAllocateIrp(DeviceObject->StackSize,TRUE); - g_return_if_fail(Irp!=NULL); - - Irp->UserIosb=&IoStatusBlock; - Irp->UserEvent=&FileObject->Event; - Irp->Tail.Overlay.Thread=PsGetCurrentThread(); - - StackPtr=IoGetNextIrpStackLocation(Irp); - StackPtr->MajorFunction=IRP_MJ_FILE_SYSTEM_CONTROL; - StackPtr->MinorFunction=IRP_MN_USER_FS_REQUEST; - StackPtr->Flags=0; - StackPtr->Control=0; - StackPtr->DeviceObject=DeviceObject; /* FIXME: FileObject->Vpb->DeviceObject ? */ - StackPtr->FileObject=FileObject; - StackPtr->CompletionRoutine=NULL; - - StackPtr->Parameters.FileSystemControl.OutputBufferLength=0; - StackPtr->Parameters.FileSystemControl.InputBufferLength=0; - StackPtr->Parameters.FileSystemControl.FsControlCode=FSCTL_DISMOUNT_VOLUME; - StackPtr->Parameters.FileSystemControl.Type3InputBuffer=NULL; - - /* IoCallDriver() will do one ObDereferenceObject(FileObject) - * in its IoSecondStageCompletion(). - * Do not leave to dereference it itself as we need its 'FileObject->Event'. - */ - ObReferenceObject(FileObject); - - Status=IoCallDriver(DeviceObject,Irp); - if (Status==STATUS_PENDING) { - KeWaitForSingleObject(&FileObject->Event,Executive,KernelMode,FALSE,NULL); - Status=IoStatusBlock.Status; - } - g_assert(NT_SUCCESS(Status)); + for (fsctlsi=0;fsctlsi<2;fsctlsi++) { + Irp=IoAllocateIrp(DeviceObject->StackSize,TRUE); + g_return_if_fail(Irp!=NULL); + + Irp->UserIosb=&IoStatusBlock; + Irp->UserEvent=&FileObject->Event; + Irp->Tail.Overlay.Thread=PsGetCurrentThread(); + + StackPtr=IoGetNextIrpStackLocation(Irp); + StackPtr->MajorFunction=IRP_MJ_FILE_SYSTEM_CONTROL; + StackPtr->MinorFunction=IRP_MN_USER_FS_REQUEST; + StackPtr->Flags=0; + StackPtr->Control=0; + StackPtr->DeviceObject=DeviceObject; /* FIXME: FileObject->Vpb->DeviceObject ? */ + StackPtr->FileObject=FileObject; + StackPtr->CompletionRoutine=NULL; + + StackPtr->Parameters.FileSystemControl.OutputBufferLength=0; + StackPtr->Parameters.FileSystemControl.InputBufferLength=0; + StackPtr->Parameters.FileSystemControl.FsControlCode=fsctls[fsctlsi]; + StackPtr->Parameters.FileSystemControl.Type3InputBuffer=NULL; + + /* IoCallDriver() will do one ObDereferenceObject(FileObject) + * in its IoSecondStageCompletion(). + * Do not leave to dereference it itself as we need its 'FileObject->Event'. + */ + ObReferenceObject(FileObject); + + Status=IoCallDriver(DeviceObject,Irp); + if (Status==STATUS_PENDING) { + KeWaitForSingleObject(&FileObject->Event,Executive,KernelMode,FALSE,NULL); + Status=IoStatusBlock.Status; + } + g_assert(NT_SUCCESS(Status)); + } ObDereferenceObject(FileObject); }