From 675559118d64a7473249ef31409464aa97961459 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 3 Jan 2016 16:47:33 -0800 Subject: [PATCH] dll: WIP --- inc/winfsp/winfsp.h | 6 +++++- src/dll/access.c | 10 ++++------ src/dll/create.c | 35 ++++++++++++++++++----------------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 7af75502..2d474ca7 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -50,6 +50,10 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE PWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, SIZE_T *); NTSTATUS (*FileCreate)(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *, FSP_FILE_NODE **FileNode); + NTSTATUS (*FileOpen)(FSP_FILE_SYSTEM *, + FSP_FSCTL_TRANSACT_REQ *, FSP_FILE_NODE **FileNode); + NTSTATUS (*FileClose)(FSP_FILE_SYSTEM *, + FSP_FSCTL_TRANSACT_REQ *, FSP_FILE_NODE *FileNode); } FSP_FILE_SYSTEM_INTERFACE; typedef struct _FSP_FILE_SYSTEM { @@ -144,7 +148,7 @@ 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); + DWORD GrantedAccess, DWORD ShareAccess, FSP_FILE_NODE *FileNode); /* * Path Handling diff --git a/src/dll/access.c b/src/dll/access.c index 276a331e..2f0dec57 100644 --- a/src/dll/access.c +++ b/src/dll/access.c @@ -119,17 +119,15 @@ exit: } FSP_API NTSTATUS FspShareCheck(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode) + DWORD GrantedAccess, DWORD ShareAccess, FSP_FILE_NODE *FileNode) { - DWORD DesiredAccess = Request->Req.Create.DesiredAccess; - DWORD ShareAccess = Request->Req.Create.ShareAccess; BOOLEAN ReadAccess, WriteAccess, DeleteAccess; BOOLEAN SharedRead, SharedWrite, SharedDelete; ULONG OpenCount; - ReadAccess = 0 != (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)); - WriteAccess = 0 != (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)); - DeleteAccess = 0 != (DesiredAccess & DELETE); + ReadAccess = 0 != (GrantedAccess & (FILE_READ_DATA | FILE_EXECUTE)); + WriteAccess = 0 != (GrantedAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)); + DeleteAccess = 0 != (GrantedAccess & DELETE); if (ReadAccess || WriteAccess || DeleteAccess) { diff --git a/src/dll/create.c b/src/dll/create.c index 5a500cc5..791c09cf 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -28,9 +28,8 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FspShareCheck(FileSystem, Request, FileNode); - if (!NT_SUCCESS(Result)) - return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); + memset(&FileNode->ShareAccess, 0, sizeof FileNode->ShareAccess); + FspShareCheck(FileSystem, GrantedAccess, Request->Req.Create.ShareAccess, FileNode); memset(&Response, 0, sizeof Response); Response.Size = sizeof Response; @@ -46,26 +45,29 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { - return STATUS_NOT_IMPLEMENTED; -#if 0 + if (0 == FileSystem->Interface->FileOpen) + return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_NOT_IMPLEMENTED); + NTSTATUS Result; DWORD GrantedAccess; - PVOID File; + FSP_FILE_NODE *FileNode; FSP_FSCTL_TRANSACT_RSP Response; - Result = FspAccessCheck(FileSystem, Request, FALSE, &GrantedAccess); + Result = FspAccessCheck(FileSystem, Request, TRUE, + Request->Req.Create.DesiredAccess, &GrantedAccess); if (!NT_SUCCESS(Result)) - return FspSendResponseWithStatus(FileSystem, Request, Result); + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FileSystem->FileOpen(FileSystem, Request, &File); + Result = FileSystem->Interface->FileOpen(FileSystem, Request, &FileNode); if (!NT_SUCCESS(Result)) - return FspSendResponseWithStatus(FileSystem, Request, Result); + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FspShareCheck(FileSystem, Request, GrantedAccess, File); + Result = FspShareCheck(FileSystem, GrantedAccess, Request->Req.Create.ShareAccess, FileNode); if (!NT_SUCCESS(Result)) { - FileSystem->FileCleanupClose(FileSystem, Request, File); - return FspSendResponseWithStatus(FileSystem, Request, Result); + if (0 != FileSystem->Interface->FileClose) + FileSystem->Interface->FileClose(FileSystem, Request, FileNode); + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); } memset(&Response, 0, sizeof Response); @@ -73,11 +75,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, Response.Kind = Request->Kind; Response.Hint = Request->Hint; Response.IoStatus.Status = STATUS_SUCCESS; - Response.IoStatus.Information = FILE_CREATED; - Response.Rsp.Create.Opened.UserContext = (UINT_PTR)File; + Response.IoStatus.Information = FILE_OPENED; + Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; - return FspSendResponse(FileSystem, &Response); -#endif + return FspFileSystemSendResponse(FileSystem, &Response); } static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,