| 2591 | } |
| 2592 | |
| 2593 | BOOLEAN |
| 2594 | Ext2CheckDismount ( |
| 2595 | IN PEXT2_IRP_CONTEXT IrpContext, |
| 2596 | IN PEXT2_VCB Vcb, |
| 2597 | IN BOOLEAN bForce ) |
| 2598 | { |
| 2599 | KIRQL Irql; |
| 2600 | PVPB Vpb = Vcb->Vpb, NewVpb = NULL; |
| 2601 | BOOLEAN bDeleted = FALSE, bTearDown = FALSE; |
| 2602 | ULONG UnCleanCount = 0; |
| 2603 | |
| 2604 | NewVpb = Ext2AllocatePool(NonPagedPool, VPB_SIZE, TAG_VPB); |
| 2605 | if (NewVpb == NULL) { |
| 2606 | DEBUG(DL_ERR, ( "Ex2CheckDismount: failed to allocate NewVpb.\n")); |
| 2607 | return FALSE; |
| 2608 | } |
| 2609 | DEBUG(DL_DBG, ("Ext2CheckDismount: NewVpb allocated: %p\n", NewVpb)); |
| 2610 | INC_MEM_COUNT(PS_VPB, NewVpb, sizeof(VPB)); |
| 2611 | memset(NewVpb, '_', VPB_SIZE); |
| 2612 | RtlZeroMemory(NewVpb, sizeof(VPB)); |
| 2613 | |
| 2614 | ExAcquireResourceExclusiveLite( |
| 2615 | &Ext2Global->Resource, TRUE ); |
| 2616 | |
| 2617 | ExAcquireResourceExclusiveLite( |
| 2618 | &Vcb->MainResource, TRUE ); |
| 2619 | |
| 2620 | if (IrpContext && |
| 2621 | IrpContext->MajorFunction == IRP_MJ_CREATE && |
| 2622 | IrpContext->RealDevice == Vcb->RealDevice) { |
| 2623 | UnCleanCount = 2; |
| 2624 | } else { |
| 2625 | UnCleanCount = 1; |
| 2626 | } |
| 2627 | |
| 2628 | IoAcquireVpbSpinLock (&Irql); |
| 2629 | |
| 2630 | DEBUG(DL_DBG, ("Ext2CheckDismount: Vpb %p ioctl=%d Device %p\n", |
| 2631 | Vpb, Vpb->ReferenceCount, Vpb->RealDevice)); |
| 2632 | |
| 2633 | if (Vpb->ReferenceCount <= UnCleanCount) { |
| 2634 | |
| 2635 | if (!IsFlagOn(Vcb->Flags, VCB_DISMOUNT_PENDING)) { |
| 2636 | |
| 2637 | ClearFlag(Vpb->Flags, VPB_MOUNTED); |
| 2638 | ClearFlag(Vpb->Flags, VPB_LOCKED); |
| 2639 | |
| 2640 | if ((Vcb->RealDevice != Vpb->RealDevice) && |
| 2641 | (Vcb->RealDevice->Vpb == Vpb)) { |
| 2642 | SetFlag(Vcb->RealDevice->Flags, DO_DEVICE_INITIALIZING); |
| 2643 | SetFlag(Vpb->Flags, VPB_PERSISTENT ); |
| 2644 | } |
| 2645 | |
| 2646 | Ext2RemoveVcb(Vcb); |
| 2647 | SetLongFlag(Vcb->Flags, VCB_DISMOUNT_PENDING); |
| 2648 | } |
| 2649 | |
| 2650 | if (Vpb->ReferenceCount) { |
no test coverage detected