dll,sys: FSP_CFG_REJECT_EARLY_IRP

Includes Avast fix for FUSE.
This commit is contained in:
Bill Zissimopoulos 2020-02-07 15:11:24 -08:00
parent 91c36b8f09
commit 71995a1fcd
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3
7 changed files with 17 additions and 9 deletions

View File

@ -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 (;;)

View File

@ -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));

View File

@ -28,6 +28,8 @@
#include <shared/minimal.h>
#include <strsafe.h>
#define FSP_CFG_REJECT_EARLY_IRP
#define LIBRARY_NAME "WinFsp"
/* DEBUGLOG */

View File

@ -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

View File

@ -33,6 +33,8 @@
#include <winfsp/fsctl.h>
#include <winfsp/fsext.h>
#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)
{

View File

@ -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

View File

@ -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