22 #define BugCheckFileId (CDFS_BUG_CHECK_VERFYSUP) 25 #pragma alloc_text(PAGE, CdVerifyFcbOperation) 26 #pragma alloc_text(PAGE, CdVerifyVcb) 80 return CdFsdPostRequest( IrpContext,
Irp );
157 CdCheckForDismount( IrpContext,
Vcb,
FALSE );
204 if (IrpContext !=
NULL) {
206 Status = CdFsdPostRequest( IrpContext,
Irp );
300 VcbPresent = CdDismountVcb( IrpContext,
Vcb );
309 }
else if (
Vcb->VcbReference == 0) {
319 if (
Vcb->Vpb->ReferenceCount == 1) {
388 #pragma prefast(suppress: 28175, "this is a filesystem driver, touching the vpb is allowed") 390 if (
Vcb->Vpb->RealDevice->Vpb ==
Vcb->Vpb) {
439 ULONG MediaChangeCount = 0;
482 Vcb->TargetDeviceObject,
495 MediaChangeCount = 0;
514 (
Vcb->MediaChangeCount != MediaChangeCount))) {
523 !DevMarkedForVerify) {
574 Vcb->Vpb->RealDevice );
576 CdRaiseStatus( IrpContext, (ForceVerify || DevMarkedForVerify)
586 switch (
Vcb->VcbCondition) {
656 Irp = IrpContext->Irp;
815 Vcb->XADiskOffset = 0;
823 if (
Vcb->RootIndexFcb !=
NULL) {
825 Vcb->RootIndexFcb->FcbReference -= 1;
826 Vcb->RootIndexFcb->FcbUserReference -= 1;
829 if (
Vcb->PathTableFcb !=
NULL) {
831 Vcb->PathTableFcb->FcbReference -= 1;
832 Vcb->PathTableFcb->FcbUserReference -= 1;
835 if (
Vcb->VolumeDasdFcb !=
NULL) {
837 Vcb->VolumeDasdFcb->FcbReference -= 1;
838 Vcb->VolumeDasdFcb->FcbUserReference -= 1;
847 CdPurgeVolume( IrpContext,
Vcb,
TRUE );
862 Vcb->VcbReference -= 1;
878 FinalReference = (
BOOLEAN) ((
Vcb->VcbReference == 0) &&
890 #pragma prefast(suppress: 28175, "this is a filesystem driver, touching the vpb is allowed") 900 if (!FinalReference) {
905 Vcb->SwapVpb->Size =
sizeof(
VPB );
908 #pragma prefast(push) 909 #pragma prefast(disable: 28175, "this is a filesystem driver, touching the vpb is allowed") 912 Vcb->SwapVpb->RealDevice->Vpb =
Vcb->SwapVpb;
964 }
else if (FinalReference) {
#define ASSERT_EXCLUSIVE_CDDATA
#define CdAcquireVcbShared(IC, V, I)
static INLINE BOOLEAN CdOperationIsDasdOpen(_In_ PIRP_CONTEXT IrpContext)
#define _Analysis_assume_lock_not_held_(lock)
#define CDFS_RESIDUAL_USER_REFERENCE
#define IOCTL_CDROM_CHECK_VERIFY
#define IoIsErrorUserInduced(Status)
NTSTATUS FASTCALL CdPerformDevIoCtrl(_In_ PIRP_CONTEXT IrpContext, _In_ ULONG IoControlCode, _In_ PDEVICE_OBJECT Device, _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, _In_ ULONG OutputBufferLength, _In_ BOOLEAN InternalDeviceIoControl, _In_ BOOLEAN OverrideVerify, _Out_opt_ PIO_STATUS_BLOCK Iosb)
VOID NTAPI IoAcquireVpbSpinLock(OUT PKIRQL Irql)
#define STATUS_FILE_INVALID
#define STATUS_WRONG_VOLUME
#define STATUS_VERIFY_REQUIRED
VOID CdFspClose(_In_opt_ PVCB Vcb)
_In_ PDEVICE_OBJECT DeviceObject
#define IRP_MN_VERIFY_VOLUME
#define CdIsRawDevice(IC, S)
#define ASSERT_IRP_CONTEXT(IC)
#define CdMarkRealDevForVerify(DO)
#define CdRealDevNeedsVerify(DO)
VOID CdCompleteRequest(_Inout_opt_ PIRP_CONTEXT IrpContext, _Inout_opt_ PIRP Irp, _In_ NTSTATUS Status)
#define _SEH2_GetExceptionInformation()
struct _DEVICE_OBJECT * DeviceObject
#define VPB_REMOVE_PENDING
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
#define CdAcquireVcbExclusive(IC, V, I)
#define IRP_MN_MOUNT_VOLUME
#define CdReleaseVcb(IC, V)
#define NT_SUCCESS(StatCode)
#define CdUnlockVcb(IC, V)
#define ARGUMENT_PRESENT(ArgumentPointer)
#define IRP_MJ_FILE_SYSTEM_CONTROL
struct _DEVICE_OBJECT * RealDevice
PDEVICE_OBJECT DeviceObject
#define CDFS_RESIDUAL_REFERENCE
BOOLEAN CdMarkDevForVerifyIfVcbMounted(_Inout_ PVCB Vcb)
BOOLEAN CdVerifyFcbOperation(_In_opt_ PIRP_CONTEXT IrpContext, _In_ PFCB Fcb)
#define CdAcquireCdData(IC)
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define VCB_STATE_REMOVABLE_MEDIA
#define CdRaiseStatus(IC, S)
#define FO_CLEANUP_COMPLETE
LONG CdExceptionFilter(_Inout_ PIRP_CONTEXT IrpContext, _In_ PEXCEPTION_POINTERS ExceptionPointer)
_In_ PIO_STACK_LOCATION IrpSp
#define CdReleaseCdData(IC)
#define ASSERT_EXCLUSIVE_VCB(V)
#define STATUS_VOLUME_DISMOUNTED
VOID CdDeleteVcb(_In_ PIRP_CONTEXT IrpContext, _Inout_ PVCB Vcb)
#define CdNormalizeAndRaiseStatus(IC, S)
VOID NTAPI IoSetHardErrorOrVerifyDevice(IN PIRP Irp, IN PDEVICE_OBJECT DeviceObject)
#define VCB_STATE_VPB_NOT_ON_DEVICE
#define IRP_MJ_QUERY_INFORMATION
#define _SEH2_EXCEPT(...)
_Requires_lock_held_(_Global_critical_region_)
#define _SEH2_GetExceptionCode()
NTSTATUS NTAPI IoVerifyVolume(IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN AllowRawMount)
VOID NTAPI IoReleaseVpbSpinLock(IN KIRQL Irql)
_Inout_ PIRP _In_ PDEVICE_OBJECT DeviceToVerify
#define VCB_STATE_DISMOUNTED
_Inout_ PVCB _In_ BOOLEAN Force
#define STATUS_FILE_CLOSED
VOID CdVerifyVcb(_In_ PIRP_CONTEXT IrpContext, _Inout_ PVCB Vcb)