| 2276 | } |
| 2277 | |
| 2278 | VOID |
| 2279 | Ext2VerifyVcb (IN PEXT2_IRP_CONTEXT IrpContext, |
| 2280 | IN PEXT2_VCB Vcb ) |
| 2281 | { |
| 2282 | NTSTATUS Status = STATUS_SUCCESS; |
| 2283 | |
| 2284 | BOOLEAN bVerify = FALSE; |
| 2285 | ULONG ChangeCount = 0; |
| 2286 | ULONG dwBytes; |
| 2287 | |
| 2288 | PIRP Irp; |
| 2289 | PEXTENDED_IO_STACK_LOCATION IrpSp; |
| 2290 | |
| 2291 | __try { |
| 2292 | |
| 2293 | ASSERT(IrpContext != NULL); |
| 2294 | |
| 2295 | ASSERT((IrpContext->Identifier.Type == EXT2ICX) && |
| 2296 | (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT))); |
| 2297 | |
| 2298 | Irp = IrpContext->Irp; |
| 2299 | IrpSp = (PEXTENDED_IO_STACK_LOCATION)IoGetCurrentIrpStackLocation(Irp); |
| 2300 | |
| 2301 | bVerify = IsFlagOn(Vcb->Vpb->RealDevice->Flags, DO_VERIFY_VOLUME); |
| 2302 | |
| 2303 | if ( (IsFlagOn(Vcb->Flags, VCB_REMOVABLE_MEDIA) || |
| 2304 | IsFlagOn(Vcb->Flags, VCB_FLOPPY_DISK)) && !bVerify ) { |
| 2305 | |
| 2306 | dwBytes = sizeof(ULONG); |
| 2307 | Status = Ext2DiskIoControl( |
| 2308 | Vcb->TargetDeviceObject, |
| 2309 | IOCTL_DISK_CHECK_VERIFY, |
| 2310 | NULL, |
| 2311 | 0, |
| 2312 | &ChangeCount, |
| 2313 | &dwBytes ); |
| 2314 | |
| 2315 | if ( STATUS_VERIFY_REQUIRED == Status || |
| 2316 | STATUS_DEVICE_NOT_READY == Status || |
| 2317 | STATUS_NO_MEDIA_IN_DEVICE == Status || |
| 2318 | (NT_SUCCESS(Status) && |
| 2319 | (ChangeCount != Vcb->ChangeCount))) { |
| 2320 | |
| 2321 | KIRQL Irql; |
| 2322 | |
| 2323 | IoAcquireVpbSpinLock(&Irql); |
| 2324 | if (Vcb->Vpb == Vcb->Vpb->RealDevice->Vpb) { |
| 2325 | SetFlag(Vcb->Vpb->RealDevice->Flags, DO_VERIFY_VOLUME); |
| 2326 | } |
| 2327 | IoReleaseVpbSpinLock(Irql); |
| 2328 | |
| 2329 | } else { |
| 2330 | |
| 2331 | if (!NT_SUCCESS(Status)) { |
| 2332 | Ext2NormalizeAndRaiseStatus(IrpContext, Status); |
| 2333 | } |
| 2334 | } |
| 2335 | } |
no test coverage detected