From 761e0a16518b0103967296f04076001398db691b Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 3 Jan 2016 23:01:10 -0800 Subject: [PATCH] dll: WIP --- inc/winfsp/winfsp.h | 2 ++ src/dll/create.c | 51 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 0abf877c..3db3a443 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -56,6 +56,8 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode); NTSTATUS (*FileOverwrite)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode); + NTSTATUS (*FileOpenTargetDirectory)(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode, PBOOLEAN PFileExists); NTSTATUS (*FileClose)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode); } FSP_FILE_SYSTEM_INTERFACE; diff --git a/src/dll/create.c b/src/dll/create.c index 29a99028..db092df3 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -289,14 +289,63 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste return FspFileSystemSendResponse(FileSystem, &Response); } +static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request) +{ + if (FspIsRootDirectory((PWSTR)Request->Buffer)) + return STATUS_ACCESS_DENIED; + + NTSTATUS Result; + DWORD GrantedAccess; + FSP_FILE_NODE *FileNode; + BOOLEAN FileExists; + FSP_FSCTL_TRANSACT_RSP Response; + PWSTR Path, Suffix; + + FspPathSuffix((PWSTR)Request->Buffer, &Path, &Suffix); + Result = FspAccessCheck(FileSystem, Request, TRUE, + Request->Req.Create.DesiredAccess, &GrantedAccess); + FspPathCombine((PWSTR)Request->Buffer, Suffix); + + if (!NT_SUCCESS(Result)) + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); + + Result = FileSystem->Interface->FileOpenTargetDirectory(FileSystem, Request, + &FileNode, &FileExists); + if (!NT_SUCCESS(Result)) + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); + + Result = FspShareCheck(FileSystem, GrantedAccess, Request->Req.Create.ShareAccess, FileNode); + if (!NT_SUCCESS(Result)) + { + if (0 != FileSystem->Interface->FileClose) + FileSystem->Interface->FileClose(FileSystem, Request, FileNode); + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); + } + + 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 = FileExists ? FILE_EXISTS : FILE_DOES_NOT_EXIST; + Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; + Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; + return FspFileSystemSendResponse(FileSystem, &Response); +} + FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { if (0 == FileSystem->Interface->FileCreate || 0 == FileSystem->Interface->FileOpen || - 0 == FileSystem->Interface->FileOverwrite) + 0 == FileSystem->Interface->FileOverwrite || + 0 == FileSystem->Interface->FileOpenTargetDirectory) return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST); + if (Request->Req.Create.OpenTargetDirectory) + return FspFileSystemOpCreate_FileOpenTargetDirectory(FileSystem, Request); + switch ((Request->Req.Create.CreateOptions >> 24) & 0xff) { case FILE_CREATE: