From df1343cd9de68f5884964167d28e9814dbe63bb5 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 4 Mar 2016 22:45:14 -0800 Subject: [PATCH] dll: FspFileSystemOpRead, FspFileSystemOpWrite --- inc/winfsp/fsctl.h | 3 +-- inc/winfsp/winfsp.h | 14 +++++++++++ src/dll/dispatch.c | 17 ++++++++++++- src/dll/fsop.c | 59 +++++++++++++++++++++++++++++++++++++++++++++ src/sys/write.c | 3 +-- 5 files changed, 91 insertions(+), 5 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index f159a3c0..836293b8 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -197,8 +197,7 @@ typedef struct UINT64 Offset; UINT32 Length; UINT32 Key; - UINT32 Append:1; /* append to end of file */ - UINT32 PagingIo:1; /* write's beyond EOF are NOP's (file size remains same) */ + UINT32 Constrained:1; /* write's beyond EOF are NOP's (file size remains same) */ } Write; struct { diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index d249fa7f..82cbc465 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -64,6 +64,14 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE VOID (*Close)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, PVOID FileNode); + NTSTATUS (*Read)(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, + PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length, + PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo); + NTSTATUS (*Write)(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, + PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length, BOOLEAN Constrained, + PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo); NTSTATUS (*GetFileInfo)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, PVOID FileNode, @@ -117,6 +125,8 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, FSP_API VOID FspFileSystemDelete(FSP_FILE_SYSTEM *FileSystem); FSP_API NTSTATUS FspFileSystemStartDispatcher(FSP_FILE_SYSTEM *FileSystem, ULONG ThreadCount); FSP_API VOID FspFileSystemStopDispatcher(FSP_FILE_SYSTEM *FileSystem); +FSP_API VOID FspFileSystemSendResponse(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_RSP *Response); static inline VOID FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) @@ -174,6 +184,10 @@ FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpRead(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); +FSP_API NTSTATUS FspFileSystemOpWrite(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response); FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem, diff --git a/src/dll/dispatch.c b/src/dll/dispatch.c index 36d4bd44..b782b93f 100644 --- a/src/dll/dispatch.c +++ b/src/dll/dispatch.c @@ -44,11 +44,13 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, FileSystem->Operations[FspFsctlTransactOverwriteKind] = FspFileSystemOpOverwrite; FileSystem->Operations[FspFsctlTransactCleanupKind] = FspFileSystemOpCleanup; FileSystem->Operations[FspFsctlTransactCloseKind] = FspFileSystemOpClose; + FileSystem->Operations[FspFsctlTransactReadKind] = FspFileSystemOpRead; + FileSystem->Operations[FspFsctlTransactWriteKind] = FspFileSystemOpWrite; + // !!!: ... FileSystem->Operations[FspFsctlTransactQueryInformationKind] = FspFileSystemOpQueryInformation; FileSystem->Operations[FspFsctlTransactSetInformationKind] = FspFileSystemOpSetInformation; FileSystem->Operations[FspFsctlTransactQueryVolumeInformationKind] = FspFileSystemOpQueryVolumeInformation; FileSystem->Operations[FspFsctlTransactSetVolumeInformationKind] = FspFileSystemOpSetVolumeInformation; - // !!!: ... FileSystem->Operations[FspFsctlTransactQuerySecurityKind] = FspFileSystemOpQuerySecurity; FileSystem->Operations[FspFsctlTransactSetSecurityKind] = FspFileSystemOpSetSecurity; FileSystem->Interface = Interface; @@ -132,6 +134,8 @@ static DWORD WINAPI FspFileSystemDispatcherThread(PVOID FileSystem0) Response->Hint = Request->Hint; Response->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; } + else if (STATUS_PENDING == Response->IoStatus.Status) + memset(Response, 0, sizeof *Response); else { memset((PUINT8)Response + Response->Size, 0, ResponseSize - Response->Size); @@ -194,3 +198,14 @@ FSP_API VOID FspFileSystemStopDispatcher(FSP_FILE_SYSTEM *FileSystem) WaitForSingleObject(FileSystem->DispatcherThread, INFINITE); CloseHandle(FileSystem->DispatcherThread); } + +FSP_API VOID FspFileSystemSendResponse(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_RSP *Response) +{ + NTSTATUS Result; + + Result = FspFsctlTransact(FileSystem->VolumeHandle, + Response, Response->Size, 0, 0, FALSE); + if (!NT_SUCCESS(Result)) + FspFsctlStop(FileSystem->VolumeHandle); +} diff --git a/src/dll/fsop.c b/src/dll/fsop.c index c42651c0..f84b0bd4 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -402,6 +402,65 @@ FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem, return STATUS_SUCCESS; } +FSP_API NTSTATUS FspFileSystemOpRead(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) +{ + NTSTATUS Result; + ULONG BytesTransferred; + FSP_FSCTL_FILE_INFO FileInfo; + + if (0 == FileSystem->Interface->Read) + return STATUS_INVALID_DEVICE_REQUEST; + + Result = FileSystem->Interface->Read(FileSystem, Request, + (PVOID)Request->Req.Read.UserContext, + (PVOID)Request->Req.Read.Address, + Request->Req.Read.Offset, + Request->Req.Read.Length, + &BytesTransferred, + &FileInfo); + if (!NT_SUCCESS(Result)) + return Result; + + if (STATUS_PENDING != Result) + { + Response->IoStatus.Information = BytesTransferred; + memcpy(&Response->Rsp.Read.FileInfo, &FileInfo, sizeof FileInfo); + } + + return Result; +} + +FSP_API NTSTATUS FspFileSystemOpWrite(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) +{ + NTSTATUS Result; + ULONG BytesTransferred; + FSP_FSCTL_FILE_INFO FileInfo; + + if (0 == FileSystem->Interface->Write) + return STATUS_INVALID_DEVICE_REQUEST; + + Result = FileSystem->Interface->Write(FileSystem, Request, + (PVOID)Request->Req.Write.UserContext, + (PVOID)Request->Req.Write.Address, + Request->Req.Write.Offset, + Request->Req.Write.Length, + Request->Req.Write.Constrained, + &BytesTransferred, + &FileInfo); + if (!NT_SUCCESS(Result)) + return Result; + + if (STATUS_PENDING != Result) + { + Response->IoStatus.Information = BytesTransferred; + memcpy(&Response->Rsp.Read.FileInfo, &FileInfo, sizeof FileInfo); + } + + return Result; +} + FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) { diff --git a/src/sys/write.c b/src/sys/write.c index 599374db..7380b927 100644 --- a/src/sys/write.c +++ b/src/sys/write.c @@ -271,8 +271,7 @@ static NTSTATUS FspFsvolWriteNonCached( Request->Req.Write.Offset = WriteOffset.QuadPart; Request->Req.Write.Length = WriteLength; Request->Req.Write.Key = WriteKey; - Request->Req.Write.Append = WriteToEndOfFile; - Request->Req.Write.PagingIo = PagingIo; + Request->Req.Write.Constrained = PagingIo; return FSP_STATUS_IOQ_POST; }