diff --git a/build/VStudio/winfsp_dll.vcxproj b/build/VStudio/winfsp_dll.vcxproj
index 3ca1fa0a..3ee98e59 100644
--- a/build/VStudio/winfsp_dll.vcxproj
+++ b/build/VStudio/winfsp_dll.vcxproj
@@ -25,6 +25,8 @@
+
+
diff --git a/build/VStudio/winfsp_dll.vcxproj.filters b/build/VStudio/winfsp_dll.vcxproj.filters
index 878ca2ac..61513d10 100644
--- a/build/VStudio/winfsp_dll.vcxproj.filters
+++ b/build/VStudio/winfsp_dll.vcxproj.filters
@@ -49,6 +49,12 @@
Source
+
+ Source
+
+
+ Source
+
diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h
index 908434e5..7aeb3197 100644
--- a/inc/winfsp/winfsp.h
+++ b/inc/winfsp/winfsp.h
@@ -64,6 +64,8 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN Supersede, FSP_FILE_NODE **PFileNode);
NTSTATUS (*FileOpenParentDirectory)(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode, PBOOLEAN PFileExists);
+ NTSTATUS (*FileCleanup)(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode);
NTSTATUS (*FileClose)(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode);
} FSP_FILE_SYSTEM_INTERFACE;
@@ -151,9 +153,17 @@ FSP_API NTSTATUS FspFileSystemSendResponseWithStatus(FSP_FILE_SYSTEM *FileSystem
*/
FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request);
+FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request);
+FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request);
FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, UINT_PTR Information,
FSP_FILE_NODE *FileNode, DWORD GrantedAccess);
+FSP_API NTSTATUS FspFileSystemSendCloseResponse(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request);
+FSP_API NTSTATUS FspFileSystemSendCleanupResponse(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request);
/*
* Access Checks
diff --git a/src/dll/cleanup.c b/src/dll/cleanup.c
new file mode 100644
index 00000000..0356f6a3
--- /dev/null
+++ b/src/dll/cleanup.c
@@ -0,0 +1,34 @@
+/**
+ * @file dll/cleanup.c
+ *
+ * @copyright 2015 Bill Zissimopoulos
+ */
+
+#include
+
+FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request)
+{
+ if (0 == FileSystem->Interface->FileCleanup)
+ return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST);
+
+ FSP_FILE_NODE *FileNode = (PVOID)Request->Req.Close.UserContext;
+
+ FileSystem->Interface->FileCleanup(FileSystem, Request, FileNode);
+
+ return FspFileSystemSendCleanupResponse(FileSystem, Request);
+}
+
+FSP_API NTSTATUS FspFileSystemSendCleanupResponse(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request)
+{
+ FSP_FSCTL_TRANSACT_RSP Response;
+
+ memset(&Response, 0, sizeof Response);
+ Response.Size = sizeof Response;
+ Response.Kind = Request->Kind;
+ Response.Hint = Request->Hint;
+ Response.IoStatus.Status = STATUS_SUCCESS;
+ Response.IoStatus.Information = 0;
+ return FspFileSystemSendResponse(FileSystem, &Response);
+}
diff --git a/src/dll/close.c b/src/dll/close.c
new file mode 100644
index 00000000..c9df818f
--- /dev/null
+++ b/src/dll/close.c
@@ -0,0 +1,34 @@
+/**
+ * @file dll/close.c
+ *
+ * @copyright 2015 Bill Zissimopoulos
+ */
+
+#include
+
+FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request)
+{
+ if (0 == FileSystem->Interface->FileClose)
+ return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST);
+
+ FSP_FILE_NODE *FileNode = (PVOID)Request->Req.Close.UserContext;
+
+ FileSystem->Interface->FileClose(FileSystem, Request, FileNode);
+
+ return FspFileSystemSendCloseResponse(FileSystem, Request);
+}
+
+FSP_API NTSTATUS FspFileSystemSendCloseResponse(FSP_FILE_SYSTEM *FileSystem,
+ FSP_FSCTL_TRANSACT_REQ *Request)
+{
+ FSP_FSCTL_TRANSACT_RSP Response;
+
+ memset(&Response, 0, sizeof Response);
+ Response.Size = sizeof Response;
+ Response.Kind = Request->Kind;
+ Response.Hint = Request->Hint;
+ Response.IoStatus.Status = STATUS_SUCCESS;
+ Response.IoStatus.Information = 0;
+ return FspFileSystemSendResponse(FileSystem, &Response);
+}
diff --git a/src/dll/loop.c b/src/dll/loop.c
index 63deed6b..719d29a2 100644
--- a/src/dll/loop.c
+++ b/src/dll/loop.c
@@ -43,6 +43,8 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath,
FileSystem->Dispatcher = FspFileSystemDirectDispatcher;
FileSystem->Operations[FspFsctlTransactCreateKind] = FspFileSystemOpCreate;
+ FileSystem->Operations[FspFsctlTransactCleanupKind] = FspFileSystemOpCleanup;
+ FileSystem->Operations[FspFsctlTransactCloseKind] = FspFileSystemOpClose;
// !!!: ...
FileSystem->Interface = Interface;