From 6f5a290a81dac4bf72f573456151579cf175e34e Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 3 Jan 2016 15:31:06 -0800 Subject: [PATCH] dll: share access support --- inc/winfsp/winfsp.h | 19 ++++++++++++++++++- src/dll/access.c | 6 ++++++ src/dll/create.c | 10 ++++++---- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 73118e6c..7af75502 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -25,6 +25,21 @@ * File System */ typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM; +typedef struct _FSP_FILE_NODE +{ + PVOID UserContext; + DWORD Flags; + struct + { + ULONG OpenCount; + ULONG Readers; + ULONG Writers; + ULONG Deleters; + ULONG SharedRead; + ULONG SharedWrite; + ULONG SharedDelete; + } ShareAccess; +} FSP_FILE_NODE; typedef VOID FSP_FILE_SYSTEM_DISPATCHER(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *); typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *); typedef struct _FSP_FILE_SYSTEM_INTERFACE @@ -34,7 +49,7 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE NTSTATUS (*QuerySecurity)(FSP_FILE_SYSTEM *, PWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, SIZE_T *); NTSTATUS (*FileCreate)(FSP_FILE_SYSTEM *, - FSP_FSCTL_TRANSACT_REQ *, PVOID *File); + FSP_FSCTL_TRANSACT_REQ *, FSP_FILE_NODE **FileNode); } FSP_FILE_SYSTEM_INTERFACE; typedef struct _FSP_FILE_SYSTEM { @@ -128,6 +143,8 @@ FSP_API PGENERIC_MAPPING FspGetFileGenericMapping(VOID); FSP_API NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllowTraverseCheck, DWORD DesiredAccess, PDWORD PGrantedAccess); +FSP_API NTSTATUS FspShareCheck(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode); /* * Path Handling diff --git a/src/dll/access.c b/src/dll/access.c index 72de5981..c3205af7 100644 --- a/src/dll/access.c +++ b/src/dll/access.c @@ -117,3 +117,9 @@ exit: return Result; } + +FSP_API NTSTATUS FspShareCheck(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode) +{ + return STATUS_SUCCESS; +} diff --git a/src/dll/create.c b/src/dll/create.c index ce013e4b..5a500cc5 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -14,7 +14,7 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, NTSTATUS Result; DWORD GrantedAccess; - PVOID File; + FSP_FILE_NODE *FileNode; FSP_FSCTL_TRANSACT_RSP Response; Result = FspAccessCheck(FileSystem, Request, TRUE, @@ -24,11 +24,13 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FileSystem->Interface->FileCreate(FileSystem, Request, &File); + Result = FileSystem->Interface->FileCreate(FileSystem, Request, &FileNode); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - /* !!!: set share access */ + Result = FspShareCheck(FileSystem, Request, FileNode); + if (!NT_SUCCESS(Result)) + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); memset(&Response, 0, sizeof Response); Response.Size = sizeof Response; @@ -36,7 +38,7 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, Response.Hint = Request->Hint; Response.IoStatus.Status = STATUS_SUCCESS; Response.IoStatus.Information = FILE_CREATED; - Response.Rsp.Create.Opened.UserContext = (UINT_PTR)File; + Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; return FspFileSystemSendResponse(FileSystem, &Response); }