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);
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);
}