#pragma alloc_text(PAGE, CdVerifyVcb)
#endif
-
+_Requires_lock_held_(_Global_critical_region_)
NTSTATUS
CdPerformVerify (
- IN PIRP_CONTEXT IrpContext,
- IN PIRP Irp,
- IN PDEVICE_OBJECT DeviceToVerify
+ _Inout_ PIRP_CONTEXT IrpContext,
+ _Inout_ PIRP Irp,
+ _In_ PDEVICE_OBJECT DeviceToVerify
)
/*++
Vcb = &CONTAINING_RECORD( IrpSp->DeviceObject,
VOLUME_DEVICE_OBJECT,
DeviceObject )->Vcb;
- try {
+ _SEH2_TRY {
//
// Send down the verify FSCTL. Note that this is sent to the
Status = CdFsdPostRequest( IrpContext, Irp );
}
- } except(CdExceptionFilter( IrpContext, GetExceptionInformation() )) {
+ } _SEH2_EXCEPT(CdExceptionFilter( IrpContext, _SEH2_GetExceptionInformation() )) {
//
// We had some trouble trying to perform the verify or raised
// an error ourselves. So we'll abort the I/O request with
- // the error status that we get back from the exception code.
+ // the error status that we get back from the execption code.
//
- Status = CdProcessException( IrpContext, Irp, GetExceptionCode() );
- }
+ Status = CdProcessException( IrpContext, Irp, _SEH2_GetExceptionCode() );
+ } _SEH2_END;
return Status;
}
\f
+
+_Requires_lock_held_(_Global_critical_region_)
BOOLEAN
CdCheckForDismount (
- IN PIRP_CONTEXT IrpContext,
- IN PVCB Vcb,
- IN BOOLEAN Force
+ _In_ PIRP_CONTEXT IrpContext,
+ _Inout_ PVCB Vcb,
+ _In_ BOOLEAN Force
)
/*++
CdReleaseVcb( IrpContext, Vcb );
}
+ else {
+ _Analysis_assume_lock_not_held_(Vcb->VcbResource);
+ }
return VcbPresent;
}
BOOLEAN
-CdMarkDevForVerifyIfVcbMounted(
- IN PVCB Vcb
+CdMarkDevForVerifyIfVcbMounted (
+ _Inout_ PVCB Vcb
)
/*++
KIRQL SavedIrql;
IoAcquireVpbSpinLock( &SavedIrql );
-
+
+#ifdef _MSC_VER
+#pragma prefast(suppress: 28175, "this is a filesystem driver, touching the vpb is allowed")
+#endif
if (Vcb->Vpb->RealDevice->Vpb == Vcb->Vpb) {
CdMarkRealDevForVerify( Vcb->Vpb->RealDevice);
VOID
CdVerifyVcb (
- IN PIRP_CONTEXT IrpContext,
- IN PVCB Vcb
+ _In_ PIRP_CONTEXT IrpContext,
+ _Inout_ PVCB Vcb
)
/*++
ULONG MediaChangeCount = 0;
BOOLEAN ForceVerify = FALSE;
BOOLEAN DevMarkedForVerify;
- //KIRQL SavedIrql; /* ReactOS Change: GCC Unused variable */
PAGED_CODE();
((Vcb->VcbCondition == VcbDismountInProgress) &&
(IrpContext->MajorFunction != IRP_MJ_CREATE))) {
- CdRaiseStatus( IrpContext, STATUS_FILE_INVALID );
+ if (FlagOn( Vcb->VcbState, VCB_STATE_DISMOUNTED )) {
+
+ CdRaiseStatus( IrpContext, STATUS_VOLUME_DISMOUNTED );
+
+ } else {
+
+ CdRaiseStatus( IrpContext, STATUS_FILE_INVALID );
+ }
}
- if (FlagOn( Vcb->VcbState, VCB_STATE_REMOVABLE_MEDIA )) {
-
- //
- // Capture the real device verify state.
- //
+ //
+ // Capture the real device verify state.
+ //
+
+ DevMarkedForVerify = CdRealDevNeedsVerify( Vcb->Vpb->RealDevice);
+
+ if (FlagOn( Vcb->VcbState, VCB_STATE_REMOVABLE_MEDIA ) && !DevMarkedForVerify) {
- DevMarkedForVerify = CdRealDevNeedsVerify( Vcb->Vpb->RealDevice);
-
//
// If the media is removable and the verify volume flag in the
// device object is not set then we want to ping the device
// since they were directed at the 'drive', not our volume.
//
- if (NT_SUCCESS( Status) && !ForceVerify &&
+ if (NT_SUCCESS( Status) && !ForceVerify && !DevMarkedForVerify &&
(IrpContext->MajorFunction == IRP_MJ_CREATE)) {
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( IrpContext->Irp);
// it would have been caught and set by the first set of checks.
//
}
+ }
- //
- // Raise the verify / error if necessary.
- //
-
- if (ForceVerify || !NT_SUCCESS( Status)) {
-
- IoSetHardErrorOrVerifyDevice( IrpContext->Irp,
- Vcb->Vpb->RealDevice );
-
- CdRaiseStatus( IrpContext, ForceVerify ? STATUS_VERIFY_REQUIRED : Status);
- }
+ //
+ // Raise the verify / error if neccessary.
+ //
+
+ if (ForceVerify || DevMarkedForVerify || !NT_SUCCESS( Status)) {
+
+ IoSetHardErrorOrVerifyDevice( IrpContext->Irp,
+ Vcb->Vpb->RealDevice );
+
+ CdRaiseStatus( IrpContext, (ForceVerify || DevMarkedForVerify)
+ ? STATUS_VERIFY_REQUIRED
+ : Status);
}
//
break;
case VcbInvalid:
- case VcbDismountInProgress :
+ case VcbDismountInProgress:
+
+ if (FlagOn( Vcb->VcbState, VCB_STATE_DISMOUNTED )) {
+
+ CdRaiseStatus( IrpContext, STATUS_VOLUME_DISMOUNTED );
- CdRaiseStatus( IrpContext, STATUS_FILE_INVALID );
+ } else {
+
+ CdRaiseStatus( IrpContext, STATUS_FILE_INVALID );
+ }
break;
/* ReactOS Change: GCC "enumeration value not handled in switch" */
BOOLEAN
CdVerifyFcbOperation (
- IN PIRP_CONTEXT IrpContext OPTIONAL,
- IN PFCB Fcb
+ _In_opt_ PIRP_CONTEXT IrpContext,
+ _In_ PFCB Fcb
)
/*++
--*/
{
- //NTSTATUS Status = STATUS_SUCCESS; /* ReactOS Change: GCC Unused variable */
PVCB Vcb = Fcb->Vcb;
PDEVICE_OBJECT RealDevice = Vcb->Vpb->RealDevice;
PIRP Irp;
if (ARGUMENT_PRESENT( IrpContext )) {
- CdRaiseStatus( IrpContext, STATUS_FILE_INVALID );
+ if (FlagOn( Vcb->VcbState, VCB_STATE_DISMOUNTED )) {
+
+ CdRaiseStatus( IrpContext, STATUS_VOLUME_DISMOUNTED );
+
+ } else {
+
+ CdRaiseStatus( IrpContext, STATUS_FILE_INVALID );
+ }
}
return FALSE;
} else if (Vcb->VcbCondition == VcbNotMounted) {
- if (ARGUMENT_PRESENT( IrpContext )) {
-
- IoSetHardErrorOrVerifyDevice( IrpContext->Irp, RealDevice );
- CdRaiseStatus( IrpContext, STATUS_WRONG_VOLUME );
- }
+ IoSetHardErrorOrVerifyDevice( IrpContext->Irp, RealDevice );
+ CdRaiseStatus( IrpContext, STATUS_WRONG_VOLUME );
- return FALSE;
+// return FALSE; // unreachable code
}
return TRUE;
}
\f
+
+_Requires_lock_held_(_Global_critical_region_)
BOOLEAN
CdDismountVcb (
- IN PIRP_CONTEXT IrpContext,
- IN PVCB Vcb
+ _In_ PIRP_CONTEXT IrpContext,
+ _Inout_ PVCB Vcb
)
/*++
// We should only take this path once.
//
- ASSERT( Vcb->VcbCondition != VcbDismountInProgress );
+ NT_ASSERT( Vcb->VcbCondition != VcbDismountInProgress );
//
// Mark the Vcb as DismountInProgress.
// mount request.
//
+#ifdef _MSC_VER
+#pragma prefast(suppress: 28175, "this is a filesystem driver, touching the vpb is allowed")
+#endif
if (OldVpb->RealDevice->Vpb == OldVpb) {
//
if (!FinalReference) {
- ASSERT( Vcb->SwapVpb != NULL );
+ NT_ASSERT( Vcb->SwapVpb != NULL );
Vcb->SwapVpb->Type = IO_TYPE_VPB;
Vcb->SwapVpb->Size = sizeof( VPB );
- Vcb->SwapVpb->RealDevice = OldVpb->RealDevice;
+#ifdef _MSC_VER
+#pragma prefast(push)
+#pragma prefast(disable: 28175, "this is a filesystem driver, touching the vpb is allowed")
+#endif
+ Vcb->SwapVpb->RealDevice = OldVpb->RealDevice;
Vcb->SwapVpb->RealDevice->Vpb = Vcb->SwapVpb;
+#ifdef _MSC_VER
+#pragma prefast(pop)
+#endif
Vcb->SwapVpb->Flags = FlagOn( OldVpb->Flags, VPB_REMOVE_PENDING );