From f9d300c7381f1579d8f77fba77ab96ed0259a00a Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 27 Nov 2015 10:29:29 -0800 Subject: [PATCH] sys: WIP --- build/VStudio/winfsp_sys.vcxproj | 1 + build/VStudio/winfsp_sys.vcxproj.filters | 3 +++ inc/winfsp/fsctl.h | 32 ++++++++++++------------ src/dll/fsctl.c | 4 +-- src/sys/driver.h | 4 +++ src/sys/fsctl.c | 6 ++--- src/sys/iocompl.c | 29 +++++++++++++++++++++ src/sys/misc.c | 12 --------- 8 files changed, 58 insertions(+), 33 deletions(-) create mode 100644 src/sys/iocompl.c diff --git a/build/VStudio/winfsp_sys.vcxproj b/build/VStudio/winfsp_sys.vcxproj index 62a8b5ee..d0773675 100644 --- a/build/VStudio/winfsp_sys.vcxproj +++ b/build/VStudio/winfsp_sys.vcxproj @@ -146,6 +146,7 @@ + diff --git a/build/VStudio/winfsp_sys.vcxproj.filters b/build/VStudio/winfsp_sys.vcxproj.filters index bc67994f..cafac024 100644 --- a/build/VStudio/winfsp_sys.vcxproj.filters +++ b/build/VStudio/winfsp_sys.vcxproj.filters @@ -77,6 +77,9 @@ Source + + Source + diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 6b332666..4b41969c 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -36,9 +36,9 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid = #define FSP_FSCTL_CREATE_BUFFER_SIZE 128 #define FSP_FSCTL_TRANSACT_BUFFER_SIZE (16 * 1024) #define FSP_FSCTL_TRANSACT_REQ_SIZEMAX \ - FSP_FSCTL_ALIGN_UP(sizeof(FSP_TRANSACT_REQ) + 1024 * sizeof(WCHAR), FSP_FSCTL_DEFAULT_ALIGNMENT) + FSP_FSCTL_ALIGN_UP(sizeof(FSP_FSCTL_TRANSACT_REQ) + 1024 * sizeof(WCHAR), FSP_FSCTL_DEFAULT_ALIGNMENT) #define FSP_FSCTL_TRANSACT_RSP_SIZEMAX \ - FSP_FSCTL_ALIGN_UP(sizeof(FSP_TRANSACT_RSP) + 1024 * sizeof(WCHAR), FSP_FSCTL_DEFAULT_ALIGNMENT) + FSP_FSCTL_ALIGN_UP(sizeof(FSP_FSCTL_TRANSACT_RSP) + 1024 * sizeof(WCHAR), FSP_FSCTL_DEFAULT_ALIGNMENT) /* marshalling */ #pragma warning(push) @@ -52,7 +52,7 @@ typedef struct { UINT8 Placeholder; // !!!: REMOVE } Req; -} FSP_TRANSACT_REQ; +} FSP_FSCTL_TRANSACT_REQ; typedef struct { UINT64 Hint; @@ -67,34 +67,34 @@ typedef struct { UINT8 Placeholder; // !!!: REMOVE } Req; -} FSP_TRANSACT_RSP; +} FSP_FSCTL_TRANSACT_RSP; #pragma warning(pop) -static inline FSP_TRANSACT_REQ *FspFsctlTransactProduceRequest( - FSP_TRANSACT_REQ *Request, SIZE_T RequestSize, PVOID RequestBufEnd) +static inline FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactProduceRequest( + FSP_FSCTL_TRANSACT_REQ *Request, SIZE_T RequestSize, PVOID RequestBufEnd) { PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_ALIGN_UP(RequestSize, FSP_FSCTL_DEFAULT_ALIGNMENT); return NextRequest <= RequestBufEnd ? NextRequest : 0; } -static inline const FSP_TRANSACT_REQ *FspFsctlTransactConsumeRequest( - const FSP_TRANSACT_REQ *Request, PVOID RequestBufEnd) +static inline const FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactConsumeRequest( + const FSP_FSCTL_TRANSACT_REQ *Request, PVOID RequestBufEnd) { if ((PUINT8)Request + sizeof(Request->Size) > (PUINT8)RequestBufEnd || - sizeof(FSP_TRANSACT_REQ) > Request->Size) + sizeof(FSP_FSCTL_TRANSACT_REQ) > Request->Size) return 0; PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_ALIGN_UP(Request->Size, FSP_FSCTL_DEFAULT_ALIGNMENT); return NextRequest <= RequestBufEnd ? NextRequest : 0; } -static inline FSP_TRANSACT_RSP *FspFsctlTransactProduceResponse( - FSP_TRANSACT_RSP *Response, SIZE_T ResponseSize, PVOID ResponseBufEnd) +static inline FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactProduceResponse( + FSP_FSCTL_TRANSACT_RSP *Response, SIZE_T ResponseSize, PVOID ResponseBufEnd) { PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_ALIGN_UP(ResponseSize, FSP_FSCTL_DEFAULT_ALIGNMENT); return NextResponse <= ResponseBufEnd ? NextResponse : 0; } -static inline const FSP_TRANSACT_RSP *FspFsctlTransactConsumeResponse( - const FSP_TRANSACT_RSP *Response, PVOID ResponseBufEnd) +static inline const FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactConsumeResponse( + const FSP_FSCTL_TRANSACT_RSP *Response, PVOID ResponseBufEnd) { if ((PUINT8)Response + sizeof(Response->Size) > (PUINT8)ResponseBufEnd || - sizeof(FSP_TRANSACT_RSP) > Response->Size) + sizeof(FSP_FSCTL_TRANSACT_RSP) > Response->Size) return 0; PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_ALIGN_UP(Response->Size, FSP_FSCTL_DEFAULT_ALIGNMENT); return NextResponse <= ResponseBufEnd ? NextResponse : 0; @@ -107,8 +107,8 @@ FSP_API NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath, PHANDLE *PVolumeHandle); FSP_API NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle); FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle, - FSP_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize, - FSP_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize); + FSP_FSCTL_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize, + FSP_FSCTL_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize); #endif #endif diff --git a/src/dll/fsctl.c b/src/dll/fsctl.c index 38297231..cab35fff 100644 --- a/src/dll/fsctl.c +++ b/src/dll/fsctl.c @@ -113,8 +113,8 @@ exit: } FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle, - FSP_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize, - FSP_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize) + FSP_FSCTL_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize, + FSP_FSCTL_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize) { NTSTATUS Result = STATUS_SUCCESS; DWORD Bytes; diff --git a/src/sys/driver.h b/src/sys/driver.h index 91d50c66..6f86e7e4 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -220,6 +220,10 @@ FSP_FSVOL_DEVICE_EXTENSION *FspFsvolDeviceExtension(PDEVICE_OBJECT DeviceObject) return DeviceObject->DeviceExtension; } +/* I/O completion */ +VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result); +VOID FspDispatchProcessedIrp(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response); + /* misc */ VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result); NTSTATUS FspCreateGuid(GUID *Guid); diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index 785908c0..4ad7ed02 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -113,7 +113,7 @@ static NTSTATUS FspFsvrtTransact( ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength; ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength; PVOID SystemBuffer = Irp->AssociatedIrp.SystemBuffer; - if (sizeof(FSP_TRANSACT_RSP) > InputBufferLength || 0 == SystemBuffer) + if (sizeof(FSP_FSCTL_TRANSACT_RSP) > InputBufferLength || 0 == SystemBuffer) return STATUS_INVALID_PARAMETER; if (FSP_FSCTL_TRANSACT_BUFFER_SIZE > OutputBufferLength) return STATUS_BUFFER_TOO_SMALL; @@ -121,8 +121,8 @@ static NTSTATUS FspFsvrtTransact( NTSTATUS Result; FSP_FSVRT_DEVICE_EXTENSION *FsvrtDeviceExtension = FspFsvrtDeviceExtension(DeviceObject); PUINT8 SystemBufferEnd; - const FSP_TRANSACT_RSP *Response, *NextResponse; - FSP_TRANSACT_REQ *Request, *NextRequest, *PendingIrpRequest; + const FSP_FSCTL_TRANSACT_RSP *Response, *NextResponse; + FSP_FSCTL_TRANSACT_REQ *Request, *NextRequest, *PendingIrpRequest; PIRP ProcessIrp, PendingIrp; /* access check */ diff --git a/src/sys/iocompl.c b/src/sys/iocompl.c new file mode 100644 index 00000000..5b707491 --- /dev/null +++ b/src/sys/iocompl.c @@ -0,0 +1,29 @@ +/** + * @file sys/iocompl.c + * + * @copyright 2015 Bill Zissimopoulos + */ + +#include + +#ifdef ALLOC_PRAGMA +#endif + +VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result) +{ + // !PAGED_CODE(); + + ASSERT(STATUS_PENDING != Result); + + if (0 != Irp->Tail.Overlay.DriverContext[0]) + ExFreePoolWithTag(Irp->Tail.Overlay.DriverContext[0], FSP_TAG); + + if (!NT_SUCCESS(Result)) + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Result; + IoCompleteRequest(Irp, FSP_IO_INCREMENT); +} + +VOID FspDispatchProcessedIrp(PIRP Irp, FSP_FSCTL_TRANSACT_RSP *Response) +{ +} diff --git a/src/sys/misc.c b/src/sys/misc.c index efd86fc9..6749a5d5 100644 --- a/src/sys/misc.c +++ b/src/sys/misc.c @@ -15,18 +15,6 @@ NTSTATUS FspSecuritySubjectContextAccessCheck( #pragma alloc_text(PAGE, FspSecuritySubjectContextAccessCheck) #endif -VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result) -{ - // !PAGED_CODE(); - - ASSERT(STATUS_PENDING != Result); - - if (!NT_SUCCESS(Result)) - Irp->IoStatus.Information = 0; - Irp->IoStatus.Status = Result; - IoCompleteRequest(Irp, FSP_IO_INCREMENT); -} - NTSTATUS FspCreateGuid(GUID *Guid) { PAGED_CODE();