From 71995a1fcd1fc9d88bfb8ff1744b0f7a932a438c Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 7 Feb 2020 15:11:24 -0800 Subject: [PATCH] dll,sys: FSP_CFG_REJECT_EARLY_IRP Includes Avast fix for FUSE. --- src/dll/fs.c | 2 ++ src/dll/fuse/fuse.c | 3 +++ src/dll/library.h | 2 ++ src/sys/create.c | 2 +- src/sys/driver.h | 9 +++++---- src/sys/volinfo.c | 4 ++-- src/sys/volume.c | 4 ++-- 7 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/dll/fs.c b/src/dll/fs.c index e2c36804..d378694b 100644 --- a/src/dll/fs.c +++ b/src/dll/fs.c @@ -273,10 +273,12 @@ static DWORD WINAPI FspFileSystemDispatcherThread(PVOID FileSystem0) OperationContext.Response = Response; TlsSetValue(FspFileSystemTlsKey, &OperationContext); +#if defined(FSP_CFG_REJECT_EARLY_IRP) Result = FspFsctlTransact(FileSystem->VolumeHandle, 0, 0, 0, 0, FALSE); /* send a Transact0 to inform the FSD that the dispatcher is ready */ if (!NT_SUCCESS(Result)) goto exit; +#endif memset(Response, 0, sizeof *Response); for (;;) diff --git a/src/dll/fuse/fuse.c b/src/dll/fuse/fuse.c index 49ddd008..d18eaef0 100644 --- a/src/dll/fuse/fuse.c +++ b/src/dll/fuse/fuse.c @@ -510,6 +510,9 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env, opt_data.VolumeParams.PostCleanupWhenModifiedOnly = TRUE; opt_data.VolumeParams.PassQueryDirectoryFileName = TRUE; opt_data.VolumeParams.DeviceControl = TRUE; +#if defined(FSP_CFG_REJECT_EARLY_IRP) + opt_data.VolumeParams.RejectIrpPriorToTransact0 = TRUE; +#endif opt_data.VolumeParams.UmFileContextIsUserContext2 = TRUE; if (L'\0' == opt_data.VolumeParams.FileSystemName[0]) memcpy(opt_data.VolumeParams.FileSystemName, L"FUSE", 5 * sizeof(WCHAR)); diff --git a/src/dll/library.h b/src/dll/library.h index 2d254824..ea3e9865 100644 --- a/src/dll/library.h +++ b/src/dll/library.h @@ -28,6 +28,8 @@ #include #include +#define FSP_CFG_REJECT_EARLY_IRP + #define LIBRARY_NAME "WinFsp" /* DEBUGLOG */ diff --git a/src/sys/create.c b/src/sys/create.c index 4b34372d..0bc61e71 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -284,7 +284,7 @@ static NTSTATUS FspFsvolCreateNoLock( return STATUS_SUCCESS; } -#if defined(FSP_DEVICE_REJECT_EARLY_IRP) +#if defined(FSP_CFG_REJECT_EARLY_IRP) if (!FspFsvolDeviceReadyToAcceptIrp(FsvolDeviceObject)) return STATUS_CANCELLED; #endif diff --git a/src/sys/driver.h b/src/sys/driver.h index b6da6824..50ab13c1 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -33,7 +33,9 @@ #include #include -/* disable warnings */ +#define FSP_CFG_REJECT_EARLY_IRP + + /* disable warnings */ #pragma warning(disable:4100) /* unreferenced formal parameter */ #pragma warning(disable:4200) /* zero-sized array in struct/union */ @@ -1028,7 +1030,6 @@ 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, @@ -1083,7 +1084,7 @@ typedef struct FSP_FSEXT_PROVIDER *Provider; UNICODE_STRING VolumePrefix; UNICODE_PREFIX_TABLE_ENTRY VolumePrefixEntry; -#if defined(FSP_DEVICE_REJECT_EARLY_IRP) +#if defined(FSP_CFG_REJECT_EARLY_IRP) LONG ReadyToAcceptIrp; #endif FSP_IOQ *Ioq; @@ -1185,7 +1186,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) +#if defined(FSP_CFG_REJECT_EARLY_IRP) static inline BOOLEAN FspFsvolDeviceReadyToAcceptIrp(PDEVICE_OBJECT DeviceObject) { diff --git a/src/sys/volinfo.c b/src/sys/volinfo.c index 4ffda23e..aa231777 100644 --- a/src/sys/volinfo.c +++ b/src/sys/volinfo.c @@ -286,7 +286,7 @@ static NTSTATUS FspFsvolQueryVolumeInformation( { PAGED_CODE(); -#if defined(FSP_DEVICE_REJECT_EARLY_IRP) +#if defined(FSP_CFG_REJECT_EARLY_IRP) if (!FspFsvolDeviceReadyToAcceptIrp(FsvolDeviceObject)) return STATUS_CANCELLED; #endif @@ -419,7 +419,7 @@ static NTSTATUS FspFsvolSetVolumeInformation( { PAGED_CODE(); -#if defined(FSP_DEVICE_REJECT_EARLY_IRP) +#if defined(FSP_CFG_REJECT_EARLY_IRP) if (!FspFsvolDeviceReadyToAcceptIrp(FsvolDeviceObject)) return STATUS_CANCELLED; #endif diff --git a/src/sys/volume.c b/src/sys/volume.c index 992552df..06784a4b 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -277,7 +277,7 @@ static NTSTATUS FspVolumeCreateNoLock( RtlInitEmptyUnicodeString(&FsvolDeviceExtension->VolumeName, FsvolDeviceExtension->VolumeNameBuf, sizeof FsvolDeviceExtension->VolumeNameBuf); RtlCopyUnicodeString(&FsvolDeviceExtension->VolumeName, &VolumeName); -#if defined(FSP_DEVICE_REJECT_EARLY_IRP) +#if defined(FSP_CFG_REJECT_EARLY_IRP) if (!FsvolDeviceExtension->VolumeParams.RejectIrpPriorToTransact0) FsvolDeviceExtension->ReadyToAcceptIrp = 1; #endif @@ -771,7 +771,7 @@ NTSTATUS FspVolumeTransact( if (!FspDeviceReference(FsvolDeviceObject)) return STATUS_CANCELLED; -#if defined(FSP_DEVICE_REJECT_EARLY_IRP) +#if defined(FSP_CFG_REJECT_EARLY_IRP) if (0 == InputBufferLength && 0 == OutputBufferLength) FspFsvolDeviceSetReadyToAcceptIrp(FsvolDeviceObject); #endif