MCPcopy Create free account
hub / github.com/bobranten/Ext4Fsd / Ext2DismountVolume

Function Ext2DismountVolume

Ext4Fsd/fsctl.c:2522–2591  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2520
2521
2522NTSTATUS
2523Ext2DismountVolume (IN PEXT2_IRP_CONTEXT IrpContext)
2524{
2525 PDEVICE_OBJECT DeviceObject;
2526 NTSTATUS Status = STATUS_UNSUCCESSFUL;
2527 PEXT2_VCB Vcb = NULL;
2528 BOOLEAN VcbResourceAcquired = FALSE;
2529
2530 __try {
2531
2532 ASSERT(IrpContext != NULL);
2533
2534 ASSERT((IrpContext->Identifier.Type == EXT2ICX) &&
2535 (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT)));
2536
2537 DeviceObject = IrpContext->DeviceObject;
2538
2539 //
2540 // This request is not allowed on the main device object
2541 //
2542 if (IsExt2FsDevice(DeviceObject)) {
2543 Status = STATUS_INVALID_DEVICE_REQUEST;
2544 __leave;
2545 }
2546
2547 Vcb = (PEXT2_VCB) DeviceObject->DeviceExtension;
2548
2549 ASSERT(Vcb != NULL);
2550
2551 ASSERT((Vcb->Identifier.Type == EXT2VCB) &&
2552 (Vcb->Identifier.Size == sizeof(EXT2_VCB)));
2553
2554 ASSERT(IsMounted(Vcb));
2555
2556 ExAcquireResourceExclusiveLite(
2557 &Vcb->MainResource,
2558 TRUE );
2559
2560 VcbResourceAcquired = TRUE;
2561
2562 if ( IsFlagOn(Vcb->Flags, VCB_DISMOUNT_PENDING)) {
2563 Status = STATUS_VOLUME_DISMOUNTED;
2564 __leave;
2565 }
2566
2567 Ext2FlushFiles(IrpContext, Vcb, FALSE);
2568 Ext2FlushVolume(IrpContext, Vcb, FALSE);
2569
2570 ExReleaseResourceLite(&Vcb->MainResource);
2571 VcbResourceAcquired = FALSE;
2572
2573 Ext2PurgeVolume(Vcb, TRUE);
2574 Ext2CheckDismount(IrpContext, Vcb, TRUE);
2575
2576 DEBUG(DL_INF, ( "Ext2Dismount: Volume dismount pending.\n"));
2577 Status = STATUS_SUCCESS;
2578
2579 } __finally {

Callers 1

Ext2UserFsRequestFunction · 0.70

Calls 5

Ext2FlushFilesFunction · 0.85
Ext2PurgeVolumeFunction · 0.85
Ext2CheckDismountFunction · 0.85
Ext2CompleteIrpContextFunction · 0.85
Ext2FlushVolumeFunction · 0.70

Tested by

no test coverage detected