diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index facd8b46..7a957a5c 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -30,7 +30,9 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid = CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'T', METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSP_FSCTL_CREATE_BUFFER_SIZE 128 -#define FSP_FSCTL_TRANSACT_BUFFER_SIZE 4096 +#define FSP_FSCTL_TRANSACT_BUFFER_SIZE (16 * 1024) +#define FSP_FSCTL_TRANSACT_REQ_SIZEMAX (sizeof(FSP_TRANSACT_REQ) + 1024 * sizeof(WCHAR)) +#define FSP_FSCTL_TRANSACT_RSP_SIZEMAX (sizeof(FSP_TRANSACT_RSP) + 1024 * sizeof(WCHAR)) /* marshalling */ #pragma warning(push) diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index 6f67d892..a6d96d0f 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -186,6 +186,10 @@ static NTSTATUS FspFsvrtTransact( return STATUS_CANCELLED; } + /* check that we have enough space before pulling the next pending IRP off the queue */ + if ((PUINT8)Request + FSP_FSCTL_TRANSACT_REQ_SIZEMAX > SystemBufferEnd) + break; + PendingIrp = FspIoqNextPendingIrp(&FsvrtDeviceExtension->Ioq, 0); if (0 == PendingIrp) break;