From 5eaa6b03ae2aebeaa560ba49ce1286340ec12aaa Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 4 Jan 2016 17:42:25 -0800 Subject: [PATCH] dll: create --- inc/winfsp/winfsp.h | 2 -- src/dll/access.c | 2 +- src/dll/create.c | 20 ++++++++++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index dc564c27..37427431 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -60,8 +60,6 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode); NTSTATUS (*Open)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode); - NTSTATUS (*OpenParentDirectory)(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode, PBOOLEAN PFileExists); NTSTATUS (*Overwrite)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN ReplaceFileAttributes, FSP_FILE_NODE *FileNode); NTSTATUS (*Cleanup)(FSP_FILE_SYSTEM *FileSystem, diff --git a/src/dll/access.c b/src/dll/access.c index fed7a3e5..dbd6474a 100644 --- a/src/dll/access.c +++ b/src/dll/access.c @@ -87,7 +87,7 @@ FSP_API NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, } Prefix = L'\0' == Prefix[0] ? L"\\" : (PWSTR)Request->Buffer; - Result = FspGetSecurity(FileSystem, Prefix, &FileAttributes, + Result = FspGetSecurity(FileSystem, Prefix, 0, &SecurityDescriptor, &SecurityDescriptorSize); FspPathCombine((PWSTR)Request->Buffer, Path); diff --git a/src/dll/create.c b/src/dll/create.c index e3713360..a039b7d7 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -271,17 +271,19 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F return STATUS_ACCESS_DENIED; NTSTATUS Result; + PWSTR Parent, Suffix; DWORD GrantedAccess; FSP_FILE_NODE *FileNode; - BOOLEAN FileExists; + UINT_PTR Information; Result = FspAccessCheck(FileSystem, Request, TRUE, TRUE, Request->Req.Create.DesiredAccess, &GrantedAccess); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FileSystem->Interface->OpenParentDirectory(FileSystem, Request, - &FileNode, &FileExists); + FspPathSuffix((PWSTR)Request->Buffer, &Parent, &Suffix); + Result = FileSystem->Interface->Open(FileSystem, Request, &FileNode); + FspPathCombine((PWSTR)Request->Buffer, Suffix); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); @@ -293,8 +295,15 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); } + Information = FILE_OPENED; + if (0 == FileSystem->Interface->GetSecurity) + { + Result = FileSystem->Interface->GetSecurity(FileSystem, (PWSTR)Request->Buffer, 0, 0, 0); + Information = NT_SUCCESS(Result) ? FILE_EXISTS : FILE_DOES_NOT_EXIST; + } + return FspFileSystemSendCreateResponse(FileSystem, Request, - FileExists ? FILE_EXISTS : FILE_DOES_NOT_EXIST, FileNode, GrantedAccess); + Information, FileNode, GrantedAccess); } FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, @@ -302,8 +311,7 @@ FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, { if (0 == FileSystem->Interface->Create || 0 == FileSystem->Interface->Open || - 0 == FileSystem->Interface->Overwrite || - 0 == FileSystem->Interface->OpenParentDirectory) + 0 == FileSystem->Interface->Overwrite) return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST); if (Request->Req.Create.OpenTargetDirectory)