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