| 2520 | |
| 2521 | |
| 2522 | NTSTATUS |
| 2523 | Ext2DismountVolume (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 { |
no test coverage detected