From dc9f95e8a67364225c0b3998d7d8e38ee00cbbf5 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 4 Jan 2016 17:14:49 -0800 Subject: [PATCH] dll: cleanup, close --- build/VStudio/winfsp_dll.vcxproj | 2 ++ build/VStudio/winfsp_dll.vcxproj.filters | 6 +++++ inc/winfsp/winfsp.h | 10 +++++++ src/dll/cleanup.c | 34 ++++++++++++++++++++++++ src/dll/close.c | 34 ++++++++++++++++++++++++ src/dll/loop.c | 2 ++ 6 files changed, 88 insertions(+) create mode 100644 src/dll/cleanup.c create mode 100644 src/dll/close.c 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;