From 324306a78449f9028e9c477f96ba259fcc15bf05 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 24 Nov 2015 16:36:11 -0800 Subject: [PATCH] sys: WIP --- inc/winfsp/fsctl.h | 3 ++- src/sys/driver.h | 3 ++- src/sys/fsctl.c | 14 +++++++++++--- src/sys/transact.c | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 3a4ac340..c8c8c0c7 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -29,6 +29,7 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid = #define FSP_FSCTL_TRANSACT \ CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'T', METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSP_FSCTL_CREATE_BUFFER_SIZEMAX 64 +#define FSP_FSCTL_CREATE_BUFFER_SIZE 64 +#define FSP_FSCTL_TRANSACT_BUFFER_SIZE 4096 #endif diff --git a/src/sys/driver.h b/src/sys/driver.h index 8783c066..0d60f399 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -191,7 +191,8 @@ typedef struct typedef struct { FSP_DEVICE_EXTENSION Base; - FSP_IOQ Ioq; + FSP_IOQ TransactIoq, Ioq; + FSP_TRANSACT_THREAD TransactThread; UINT8 SecurityDescriptorBuf[]; } FSP_FSVRT_DEVICE_EXTENSION; typedef struct diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index 19e777aa..ea347e6e 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -41,7 +41,7 @@ static NTSTATUS FspFsctlCreateVolume( !RtlValidRelativeSecurityDescriptor(SystemBuffer, InputBufferLength, OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION)) return STATUS_INVALID_PARAMETER; - if (FSP_FSCTL_CREATE_BUFFER_SIZEMAX > OutputBufferLength) + if (FSP_FSCTL_CREATE_BUFFER_SIZE > OutputBufferLength) return STATUS_BUFFER_TOO_SMALL; NTSTATUS Result; @@ -63,7 +63,7 @@ static NTSTATUS FspFsctlCreateVolume( UNICODE_STRING DeviceSddl; UNICODE_STRING DeviceName; RtlInitUnicodeString(&DeviceSddl, L"" FSP_FSVRT_DEVICE_SDDL); - RtlInitEmptyUnicodeString(&DeviceName, SystemBuffer, FSP_FSCTL_CREATE_BUFFER_SIZEMAX); + RtlInitEmptyUnicodeString(&DeviceName, SystemBuffer, FSP_FSCTL_CREATE_BUFFER_SIZE); Result = RtlUnicodeStringPrintf(&DeviceName, L"\\Device\\Volume{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", Guid.Data1, Guid.Data2, Guid.Data3, @@ -77,10 +77,17 @@ static NTSTATUS FspFsctlCreateVolume( &FsvrtDeviceObject); if (NT_SUCCESS(Result)) { - FspDeviceExtension(FsvrtDeviceObject)->Kind = FspFsvrtDeviceExtensionKind; + FSP_FSVRT_DEVICE_EXTENSION *FsvrtDeviceExtension = FspFsvrtDeviceExtension(FsvrtDeviceObject); + FsvrtDeviceExtension->Base.Kind = FspFsvrtDeviceExtensionKind; + FspIoqInitialize(&FsvrtDeviceExtension->TransactIoq); + FspIoqInitialize(&FsvrtDeviceExtension->Ioq); + Result = FspTransactThreadStart(&FsvrtDeviceExtension->TransactThread, + &FsvrtDeviceExtension->TransactIoq, &FsvrtDeviceExtension->Ioq); RtlCopyMemory(FspFsvrtDeviceExtension(FsvrtDeviceObject)->SecurityDescriptorBuf, SecurityDescriptor, InputBufferLength); Irp->IoStatus.Information = DeviceName.Length + 1; + if (!NT_SUCCESS(Result)) + IoDeleteDevice(FsvrtDeviceObject); } /* free the temporary security descriptor */ @@ -108,6 +115,7 @@ static NTSTATUS FspFsvrtTransact( { NTSTATUS Result; + /* access check */ Result = FspSecuritySubjectContextAccessCheck( FspFsvrtDeviceExtension(DeviceObject)->SecurityDescriptorBuf, FILE_WRITE_DATA, Irp->RequestorMode); diff --git a/src/sys/transact.c b/src/sys/transact.c index e9dcff6f..48005e8d 100644 --- a/src/sys/transact.c +++ b/src/sys/transact.c @@ -36,7 +36,7 @@ static VOID FspTransactThread(PVOID StartContext) else if (STATUS_WAIT_1 != Result) continue; /* retry */ - Irp = FspIoqNextPendingIrp(&TransactThread->TransactIoq, 0); + Irp = FspIoqNextPendingIrp(TransactThread->TransactIoq, 0); if (0 == Irp) continue; /* retry */ }