| 136 | #if EXT2_UNLOAD |
| 137 | |
| 138 | NTSTATUS |
| 139 | Ext2PrepareToUnload (IN PEXT2_IRP_CONTEXT IrpContext) |
| 140 | { |
| 141 | PDEVICE_OBJECT DeviceObject; |
| 142 | NTSTATUS Status = STATUS_UNSUCCESSFUL; |
| 143 | BOOLEAN GlobalDataResourceAcquired = FALSE; |
| 144 | |
| 145 | __try { |
| 146 | |
| 147 | ASSERT(IrpContext != NULL); |
| 148 | |
| 149 | ASSERT((IrpContext->Identifier.Type == EXT2ICX) && |
| 150 | (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT))); |
| 151 | |
| 152 | DeviceObject = IrpContext->DeviceObject; |
| 153 | |
| 154 | if (IsExt2FsDevice(DeviceObject)) { |
| 155 | Status = STATUS_INVALID_DEVICE_REQUEST; |
| 156 | __leave; |
| 157 | } |
| 158 | |
| 159 | ExAcquireResourceExclusiveLite( |
| 160 | &Ext2Global->Resource, |
| 161 | TRUE ); |
| 162 | |
| 163 | GlobalDataResourceAcquired = TRUE; |
| 164 | |
| 165 | if (FlagOn(Ext2Global->Flags, EXT2_UNLOAD_PENDING)) { |
| 166 | DEBUG(DL_ERR, ( "Ext2PrepareUnload: Already ready to unload.\n")); |
| 167 | |
| 168 | Status = STATUS_ACCESS_DENIED; |
| 169 | |
| 170 | __leave; |
| 171 | } |
| 172 | |
| 173 | { |
| 174 | PEXT2_VCB Vcb; |
| 175 | PLIST_ENTRY ListEntry; |
| 176 | |
| 177 | ListEntry = Ext2Global->VcbList.Flink; |
| 178 | |
| 179 | while (ListEntry != &(Ext2Global->VcbList)) { |
| 180 | |
| 181 | Vcb = CONTAINING_RECORD(ListEntry, EXT2_VCB, Next); |
| 182 | ListEntry = ListEntry->Flink; |
| 183 | |
| 184 | if (Vcb && (!Vcb->ReferenceCount) && |
| 185 | IsFlagOn(Vcb->Flags, VCB_DISMOUNT_PENDING)) { |
| 186 | Ext2RemoveVcb(Vcb); |
| 187 | Ext2ClearVpbFlag(Vcb->Vpb, VPB_MOUNTED); |
| 188 | |
| 189 | Ext2DestroyVcb(Vcb); |
| 190 | } |
| 191 | } |
| 192 | } |
| 193 | |
| 194 | if (!IsListEmpty(&(Ext2Global->VcbList))) { |
| 195 |
no test coverage detected