From 8497855d80e5ed9a46844971c12ea786ff5ae08a Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 7 Feb 2020 13:22:09 -0800 Subject: [PATCH] sys: FSP_DEVICE_REJECT_EARLY_IRP macro --- src/sys/create.c | 2 ++ src/sys/driver.h | 5 +++++ src/sys/volinfo.c | 4 ++++ src/sys/volume.c | 4 ++++ 4 files changed, 15 insertions(+) diff --git a/src/sys/create.c b/src/sys/create.c index f5d73dfd..4b34372d 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -284,8 +284,10 @@ static NTSTATUS FspFsvolCreateNoLock( return STATUS_SUCCESS; } +#if defined(FSP_DEVICE_REJECT_EARLY_IRP) if (!FspFsvolDeviceReadyToAcceptIrp(FsvolDeviceObject)) return STATUS_CANCELLED; +#endif PACCESS_STATE AccessState = IrpSp->Parameters.Create.SecurityContext->AccessState; ULONG CreateDisposition = (IrpSp->Parameters.Create.Options >> 24) & 0xff; diff --git a/src/sys/driver.h b/src/sys/driver.h index 155b2cc5..b6da6824 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1028,6 +1028,7 @@ NTSTATUS FspStatisticsCopy(FSP_STATISTICS *Statistics, PVOID Buffer, PULONG PLen #define FspStatisticsAdd(S,F,V) ((S)->F += (V)) /* device management */ +#define FSP_DEVICE_REJECT_EARLY_IRP enum { FspFsvolDeviceSecurityCacheCapacity = 100, @@ -1082,7 +1083,9 @@ typedef struct FSP_FSEXT_PROVIDER *Provider; UNICODE_STRING VolumePrefix; UNICODE_PREFIX_TABLE_ENTRY VolumePrefixEntry; +#if defined(FSP_DEVICE_REJECT_EARLY_IRP) LONG ReadyToAcceptIrp; +#endif FSP_IOQ *Ioq; FSP_META_CACHE *SecurityCache; FSP_META_CACHE *DirInfoCache; @@ -1182,6 +1185,7 @@ VOID FspFsvolDeviceGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_I BOOLEAN FspFsvolDeviceTryGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); VOID FspFsvolDeviceSetVolumeInfo(PDEVICE_OBJECT DeviceObject, const FSP_FSCTL_VOLUME_INFO *VolumeInfo); VOID FspFsvolDeviceInvalidateVolumeInfo(PDEVICE_OBJECT DeviceObject); +#if defined(FSP_DEVICE_REJECT_EARLY_IRP) static inline BOOLEAN FspFsvolDeviceReadyToAcceptIrp(PDEVICE_OBJECT DeviceObject) { @@ -1198,6 +1202,7 @@ VOID FspFsvolDeviceSetReadyToAcceptIrp(PDEVICE_OBJECT DeviceObject) return; InterlockedExchange(&FsvolDeviceExtension->ReadyToAcceptIrp, 1); } +#endif static inline BOOLEAN FspFsvolDeviceVolumePrefixInString(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING String) { diff --git a/src/sys/volinfo.c b/src/sys/volinfo.c index 3dccaf77..4ffda23e 100644 --- a/src/sys/volinfo.c +++ b/src/sys/volinfo.c @@ -286,8 +286,10 @@ static NTSTATUS FspFsvolQueryVolumeInformation( { PAGED_CODE(); +#if defined(FSP_DEVICE_REJECT_EARLY_IRP) if (!FspFsvolDeviceReadyToAcceptIrp(FsvolDeviceObject)) return STATUS_CANCELLED; +#endif NTSTATUS Result; PUINT8 Buffer = Irp->AssociatedIrp.SystemBuffer; @@ -417,8 +419,10 @@ static NTSTATUS FspFsvolSetVolumeInformation( { PAGED_CODE(); +#if defined(FSP_DEVICE_REJECT_EARLY_IRP) if (!FspFsvolDeviceReadyToAcceptIrp(FsvolDeviceObject)) return STATUS_CANCELLED; +#endif NTSTATUS Result; FS_INFORMATION_CLASS FsInformationClass = IrpSp->Parameters.SetVolume.FsInformationClass; diff --git a/src/sys/volume.c b/src/sys/volume.c index ff007745..992552df 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -277,8 +277,10 @@ static NTSTATUS FspVolumeCreateNoLock( RtlInitEmptyUnicodeString(&FsvolDeviceExtension->VolumeName, FsvolDeviceExtension->VolumeNameBuf, sizeof FsvolDeviceExtension->VolumeNameBuf); RtlCopyUnicodeString(&FsvolDeviceExtension->VolumeName, &VolumeName); +#if defined(FSP_DEVICE_REJECT_EARLY_IRP) if (!FsvolDeviceExtension->VolumeParams.RejectIrpPriorToTransact0) FsvolDeviceExtension->ReadyToAcceptIrp = 1; +#endif Result = FspDeviceInitialize(FsvolDeviceObject); if (NT_SUCCESS(Result)) { @@ -769,8 +771,10 @@ NTSTATUS FspVolumeTransact( if (!FspDeviceReference(FsvolDeviceObject)) return STATUS_CANCELLED; +#if defined(FSP_DEVICE_REJECT_EARLY_IRP) if (0 == InputBufferLength && 0 == OutputBufferLength) FspFsvolDeviceSetReadyToAcceptIrp(FsvolDeviceObject); +#endif NTSTATUS Result; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);