29 #pragma alloc_text(PAGE, RfsdIsHandleCountZero) 30 #pragma alloc_text(PAGE, RfsdLockVcb) 31 #pragma alloc_text(PAGE, RfsdLockVolume) 32 #pragma alloc_text(PAGE, RfsdUnlockVcb) 33 #pragma alloc_text(PAGE, RfsdUnlockVolume) 34 #pragma alloc_text(PAGE, RfsdAllowExtendedDasdIo) 35 #pragma alloc_text(PAGE, RfsdUserFsRequest) 36 #pragma alloc_text(PAGE, RfsdIsMediaWriteProtected) 37 #pragma alloc_text(PAGE, RfsdMountVolume) 38 #pragma alloc_text(PAGE, RfsdCheckDismount) 39 #pragma alloc_text(PAGE, RfsdPurgeVolume) 40 #pragma alloc_text(PAGE, RfsdPurgeFile) 41 #pragma alloc_text(PAGE, RfsdDismountVolume) 42 #pragma alloc_text(PAGE, RfsdIsVolumeMounted) 43 #pragma alloc_text(PAGE, RfsdVerifyVolume) 44 #pragma alloc_text(PAGE, RfsdFileSystemControl) 92 RfsdPrint((
DBG_INFO,
"RfsdIsHandleCountZero: Key:%x,%xh File:%S OpenHandleCount=%xh\n",
196 #if (_WIN32_WINNT >= 0x0500) 203 VcbResourceAcquired =
TRUE;
209 if (VcbResourceAcquired) {
216 if (!IrpContext->ExceptionInProgress) {
312 VcbResourceAcquired =
TRUE;
318 if (VcbResourceAcquired) {
325 if (!IrpContext->ExceptionInProgress) {
353 Irp = IrpContext->Irp;
366 Parameters.FileSystemControl.InputBufferLength
397 GlobalResourceAcquired =
TRUE;
407 ListEntry = ListEntry->
Flink;
432 if (GlobalResourceAcquired) {
492 Irp = IrpContext->Irp;
498 IoStackLocation->
Parameters.FileSystemControl.FsControlCode;
501 IoStackLocation)->Parameters.FileSystemControl.FsControlCode;
526 #if (_WIN32_WINNT >= 0x0500) 530 #endif //(_WIN32_WINNT >= 0x0500) 636 GlobalDataResourceAcquired =
TRUE;
643 Irp = IrpContext->Irp;
648 IoStackLocation->
Parameters.MountVolume.DeviceObject;
670 &VolumeDeviceObject );
696 Vcb->DiskGeometry = DiskGeometry;
718 VolumeDeviceObject, IoStackLocation->
Parameters.MountVolume.Vpb);
736 if (GlobalDataResourceAcquired) {
748 if (VolumeDeviceObject) {
753 if (!IrpContext->ExceptionInProgress) {
802 GlobalResourceAcquired =
TRUE;
815 VcbResourceAcquired =
TRUE;
827 dwReturn =
sizeof(
ULONG);
829 Vcb->TargetDeviceObject,
836 if (ChangeCount !=
Vcb->ChangeCount) {
841 Irp = IrpContext->Irp;
849 if ((rfsd_sb !=
NULL)
880 if (VcbResourceAcquired) {
887 if (GlobalResourceAcquired) {
893 if (!IrpContext->ExceptionInProgress) {
956 VcbResourceAcquired =
TRUE;
983 VcbResourceAcquired =
FALSE;
993 if (VcbResourceAcquired) {
1000 if (!IrpContext->ExceptionInProgress) {
1018 ULONG UnCleanCount = 0;
1029 (IrpContext->RealDevice ==
Vcb->RealDevice)) {
1037 if ((
Vpb->ReferenceCount == UnCleanCount) || bForce) {
1039 if ((
Vpb->ReferenceCount != UnCleanCount) && bForce) {
1040 KdPrint((
"RfsdCheckDismount: force dismount ...\n"));
1047 #pragma prefast( suppress: 28175, "allowed in file system drivers" ) 1049 if ((
Vcb->RealDevice !=
Vpb->RealDevice) &&
1050 (
Vcb->RealDevice->Vpb ==
Vpb)) {
1076 KdPrint((
"RfsdCheckDismount: now free the vcb ...\n"));
1104 FlushBeforePurge =
FALSE;
1110 for (ListEntry =
Vcb->FcbList.Flink;
1111 ListEntry != &
Vcb->FcbList;
1112 ListEntry = ListEntry->
Flink ) {
1116 Fcb->ReferenceCount++;
1159 if (FlushBeforePurge) {
1166 if (
Vcb->SectionObject.ImageSectionObject) {
1170 if (
Vcb->SectionObject.DataSectionObject) {
1202 Fcb->AnsiFileName.Buffer));
1212 if (
Fcb->SectionObject.ImageSectionObject) {
1215 Fcb->AnsiFileName.Buffer));
1220 if (
Fcb->SectionObject.DataSectionObject) {
1223 Fcb->AnsiFileName.Buffer));
1244 switch (IrpContext->MinorFunction) {
#define DO_DEVICE_INITIALIZING
NTSTATUS RfsdDiskIoControl(IN PDEVICE_OBJECT DeviceOjbect, IN ULONG IoctlCode, IN PVOID InputBuffer, IN ULONG InputBufferSize, IN OUT PVOID OutputBuffer, IN OUT PULONG OutputBufferSize)
#define ExGetCurrentResourceThread()
BOOLEAN NTAPI CcPurgeCacheSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps)
#define STATUS_PRIVILEGE_NOT_HELD
#define FSCTL_UNLOCK_VOLUME
NTSTATUS RfsdCompleteIrpContext(IN PRFSD_IRP_CONTEXT IrpContext, IN NTSTATUS Status)
#define IRP_CONTEXT_FLAG_WAIT
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
__drv_mustHoldCriticalRegion NTSTATUS RfsdIsVolumeMounted(IN PRFSD_IRP_CONTEXT IrpContext)
#define __drv_mustHoldCriticalRegion
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
_Must_inspect_result_ __drv_aliasesMem PDEVICE_OBJECT _In_ PDEVICE_OBJECT TargetDevice
NTSTATUS RfsdAllowExtendedDasdIo(IN PRFSD_IRP_CONTEXT IrpContext)
#define STATUS_INVALID_PARAMETER
struct _LIST_ENTRY * Blink
NTSTATUS RfsdLockVcb(IN PRFSD_VCB Vcb, IN PFILE_OBJECT FileObject)
VOID RfsdFreeFcb(IN PRFSD_FCB Fcb)
#define IOCTL_DISK_CHECK_VERIFY
__drv_mustHoldCriticalRegion NTSTATUS RfsdUserFsRequest(IN PRFSD_IRP_CONTEXT IrpContext)
#define STATUS_INVALID_DEVICE_REQUEST
VOID NTAPI IoAcquireVpbSpinLock(OUT PKIRQL Irql)
#define IOCTL_DISK_IS_WRITABLE
__drv_mustHoldCriticalRegion NTSTATUS RfsdPurgeFile(IN PRFSD_FCB Fcb, IN BOOLEAN FlushBeforePurge)
NTSTATUS RfsdFlushVolume(IN PRFSD_VCB Vcb, BOOLEAN bShutDown)
BOOLEAN NTAPI SeSinglePrivilegeCheck(IN LUID PrivilegeValue, IN KPROCESSOR_MODE PreviousMode)
NTSTATUS RfsdFlushFiles(IN PRFSD_VCB Vcb, BOOLEAN bShutDown)
__drv_mustHoldCriticalRegion NTSTATUS RfsdFileSystemControl(IN PRFSD_IRP_CONTEXT IrpContext)
#define STATUS_WRONG_VOLUME
#define InsertTailList(ListHead, Entry)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
BOOLEAN SuperblockContainsMagicKey(PRFSD_SUPER_BLOCK sb)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
PDEVICE_OBJECT DeviceObject
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
_In_ PDEVICE_OBJECT DeviceObject
BOOLEAN RfsdIsMediaWriteProtected(IN PRFSD_IRP_CONTEXT IrpContext, IN PDEVICE_OBJECT TargetDevice)
NTFSIDENTIFIER Identifier
#define IRP_MN_VERIFY_VOLUME
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
#define CCB_ALLOW_EXTENDED_DASD_IO
#define FSCTL_INVALIDATE_VOLUMES
#define STATUS_UNRECOGNIZED_VOLUME
NTSTATUS RfsdInitializeVcb(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, PRFSD_SUPER_BLOCK RfsdSb, PDEVICE_OBJECT TargetDevice, PDEVICE_OBJECT VolumeDevice, PVPB Vpb)
_In_ PVOID _In_ ULONG Event
VOID RfsdFreeVcb(IN PRFSD_VCB Vcb)
VOID RfsdSetVpbFlag(IN PVPB Vpb, IN USHORT Flag)
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
#define SL_OVERRIDE_VERIFY_VOLUME
#define STATUS_MEDIA_WRITE_PROTECTED
struct _RFSD_VCB RFSD_VCB
VOID RfsdRemoveVcb(PRFSD_VCB Vcb)
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 FILE_DEVICE_DISK_FILE_SYSTEM
#define FSCTL_DISMOUNT_VOLUME
struct _RFSD_VCB * PRFSD_VCB
#define IRP_MN_MOUNT_VOLUME
NTSTATUS NTAPI CcWaitForCurrentLazyWriterActivity(VOID)
struct _LIST_ENTRY * Flink
#define IRP_MN_USER_FS_REQUEST
_Must_inspect_result_ _In_ ULONG Flags
#define NT_SUCCESS(StatCode)
BOOLEAN NTAPI MmFlushImageSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN MMFLUSH_TYPE FlushType)
PRFSD_SUPER_BLOCK RfsdLoadSuper(IN PRFSD_VCB Vcb, IN BOOLEAN bVerify)
__drv_mustHoldCriticalRegion BOOLEAN RfsdCheckDismount(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN BOOLEAN bForce)
#define ObDereferenceObject
#define STATUS_ACCESS_DENIED
__drv_mustHoldCriticalRegion NTSTATUS RfsdInvalidateVolumes(IN PRFSD_IRP_CONTEXT IrpContext)
BOOL Privilege(LPTSTR pszPrivilege, BOOL bEnable)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
#define FSCTL_ALLOW_EXTENDED_DASD_IO
__drv_mustHoldCriticalRegion NTSTATUS RfsdMountVolume(IN PRFSD_IRP_CONTEXT IrpContext)
#define STATUS_UNSUCCESSFUL
#define VCB_WRITE_PROTECTED
#define ExAllocatePoolWithTag(hernya, size, tag)
#define VCB_DISMOUNT_PENDING
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
_Must_inspect_result_ _In_ WDFCMRESLIST List
#define FCB_FILE_MODIFIED
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
__drv_mustHoldCriticalRegion NTSTATUS RfsdPurgeVolume(IN PRFSD_VCB Vcb, IN BOOLEAN FlushBeforePurge)
POBJECT_TYPE IoFileObjectType
ULONG AlignmentRequirement
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
__drv_mustHoldCriticalRegion NTSTATUS RfsdVerifyVolume(IN PRFSD_IRP_CONTEXT IrpContext)
BOOLEAN NTAPI ExAcquireSharedStarveExclusive(IN PERESOURCE Resource, IN BOOLEAN Wait)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
struct _DISK_GEOMETRY DISK_GEOMETRY
#define KeInitializeEvent(pEvt, foo, foo2)
__drv_mustHoldCriticalRegion NTSTATUS RfsdDismountVolume(IN PRFSD_IRP_CONTEXT IrpContext)
#define InitializeListHead(ListHead)
_In_ PIO_STACK_LOCATION IrpSp
static PDEVICE_OBJECT MainDeviceObject
__drv_mustHoldCriticalRegion NTSTATUS RfsdUnlockVolume(IN PRFSD_IRP_CONTEXT IrpContext)
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define FSCTL_IS_VOLUME_MOUNTED
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG FsControlCode
#define VCB_VOLUME_LOCKED
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
#define STATUS_VOLUME_DISMOUNTED
#define STATUS_NOT_LOCKED
#define FSCTL_LOCK_VOLUME
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
ERESOURCE PagingIoResource
#define RtlZeroMemory(Destination, Length)
BOOLEAN RfsdIsHandleCountZero(IN PRFSD_VCB Vcb)
VOID NTAPI ExReleaseResourceForThreadLite(IN PERESOURCE Resource, IN ERESOURCE_THREAD Thread)
#define RFSD_UNLOAD_PENDING
VOID RfsdClearVpbFlag(IN PVPB Vpb, IN USHORT Flag)
IO_STACK_LOCATION * PEXTENDED_IO_STACK_LOCATION
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
IN OUT PVCB IN PDEVICE_OBJECT TargetDeviceObject
VOID RfsdInsertVcb(PRFSD_VCB Vcb)
VOID NTAPI IoReleaseVpbSpinLock(IN KIRQL Irql)
IN OUT PVCB IN PDEVICE_OBJECT IN PVPB Vpb
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
__drv_mustHoldCriticalRegion NTSTATUS RfsdLockVolume(IN PRFSD_IRP_CONTEXT IrpContext)
NTSTATUS RfsdUnlockVcb(IN PRFSD_VCB Vcb, IN PFILE_OBJECT FileObject)