dismount_volume(): Also FSCTL_LOCK_VOLUME before FSCTL_DISMOUNT_VOLUME
authorshort <>
Fri, 11 Jul 2003 06:53:43 +0000 (06:53 +0000)
committershort <>
Fri, 11 Jul 2003 06:53:43 +0000 (06:53 +0000)
 - no effect seen on ntfs.sys of NT-5.1sp1

src/libcaptive/client/init.c

index b30efa4..97876c1 100644 (file)
@@ -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);
 }