From 9d73f15b0f3586a73698518112286031bf144b3d Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 3 Jan 2016 17:15:59 -0800 Subject: [PATCH] dll: WIP --- src/dll/access.c | 4 ++++ src/dll/create.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/dll/access.c b/src/dll/access.c index 2f0dec57..85ad0cf7 100644 --- a/src/dll/access.c +++ b/src/dll/access.c @@ -88,7 +88,11 @@ FSP_API NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, FspPathCombine((PWSTR)Request->Buffer, Path); if (!NT_SUCCESS(Result)) + { + if (STATUS_OBJECT_NAME_NOT_FOUND == Result) + Result = STATUS_OBJECT_PATH_NOT_FOUND; goto exit; + } if (AccessCheck(SecurityDescriptor, (HANDLE)Request->Req.Create.AccessToken, FILE_TRAVERSE, &FspFileGenericMapping, 0, &PrivilegeSetLength, &TraverseAccess, &AccessStatus)) diff --git a/src/dll/create.c b/src/dll/create.c index 791c09cf..5f9814d2 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -84,7 +84,58 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { - return STATUS_NOT_IMPLEMENTED; + if (0 == FileSystem->Interface->FileOpen || 0 == FileSystem->Interface->FileCreate) + return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_NOT_IMPLEMENTED); + + NTSTATUS Result; + DWORD GrantedAccess; + FSP_FILE_NODE *FileNode; + FSP_FSCTL_TRANSACT_RSP Response; + BOOLEAN Create = FALSE; + + Result = FspAccessCheck(FileSystem, Request, TRUE, + Request->Req.Create.DesiredAccess, &GrantedAccess); + if (!NT_SUCCESS(Result)) + { + if (STATUS_OBJECT_NAME_NOT_FOUND != Result) + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); + + Create = TRUE; + Result = FspAccessCheck(FileSystem, Request, FALSE, + (Request->Req.Create.CreateOptions & FILE_DIRECTORY_FILE) ? + FILE_ADD_SUBDIRECTORY : FILE_ADD_FILE, + &GrantedAccess); + if (!NT_SUCCESS(Result)) + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); + } + + if (Create) + { + Result = FileSystem->Interface->FileCreate(FileSystem, Request, &FileNode); + memset(&FileNode->ShareAccess, 0, sizeof FileNode->ShareAccess); + } + else + Result = FileSystem->Interface->FileOpen(FileSystem, Request, &FileNode); + 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 = Create ? FILE_CREATED : FILE_OPENED; + Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; + Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; + return FspFileSystemSendResponse(FileSystem, &Response); } static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem,