From b3854368c520298823ced0e82a1aabc60f30ce83 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 4 Jan 2016 00:00:00 -0800 Subject: [PATCH] dll: WIP --- inc/winfsp/winfsp.h | 3 ++ src/dll/create.c | 89 +++++++++++++++------------------------------ 2 files changed, 32 insertions(+), 60 deletions(-) diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 8585860a..5ce0ce97 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -145,6 +145,9 @@ FSP_API NTSTATUS FspFileSystemSendResponseWithStatus(FSP_FILE_SYSTEM *FileSystem */ FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request); +FSP_API NTSTATUS FspFileSystemOpCreateSendSuccessResponse(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, UINT_PTR Information, + FSP_FILE_NODE *FileNode, DWORD GrantedAccess); /* * Access Checks diff --git a/src/dll/create.c b/src/dll/create.c index 90511d84..997c5b3e 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -46,7 +46,6 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, NTSTATUS Result; DWORD GrantedAccess; FSP_FILE_NODE *FileNode; - FSP_FSCTL_TRANSACT_RSP Response; Result = FspCreateCheck(FileSystem, Request, TRUE, &GrantedAccess); if (!NT_SUCCESS(Result)) @@ -61,15 +60,8 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, FspShareCheck(FileSystem, GrantedAccess, Request->Req.Create.ShareAccess, FileNode); - 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 = FILE_CREATED; - Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; - Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; - return FspFileSystemSendResponse(FileSystem, &Response); + return FspFileSystemOpCreateSendSuccessResponse(FileSystem, Request, + FILE_CREATED, FileNode, GrantedAccess); } static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, @@ -78,7 +70,6 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, NTSTATUS Result; DWORD GrantedAccess; FSP_FILE_NODE *FileNode; - FSP_FSCTL_TRANSACT_RSP Response; Result = FspAccessCheck(FileSystem, Request, TRUE, Request->Req.Create.DesiredAccess, &GrantedAccess); @@ -97,15 +88,8 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, 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 = FILE_OPENED; - Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; - Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; - return FspFileSystemSendResponse(FileSystem, &Response); + return FspFileSystemOpCreateSendSuccessResponse(FileSystem, Request, + FILE_OPENED, FileNode, GrantedAccess); } static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, @@ -114,7 +98,6 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, NTSTATUS Result; DWORD GrantedAccess; FSP_FILE_NODE *FileNode; - FSP_FSCTL_TRANSACT_RSP Response; BOOLEAN Create = FALSE; Result = FspAccessCheck(FileSystem, Request, TRUE, @@ -162,15 +145,8 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, 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); + return FspFileSystemOpCreateSendSuccessResponse(FileSystem, Request, + Create ? FILE_CREATED : FILE_OPENED, FileNode, GrantedAccess); } static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, @@ -182,7 +158,6 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, NTSTATUS Result; DWORD GrantedAccess; FSP_FILE_NODE *FileNode; - FSP_FSCTL_TRANSACT_RSP Response; Result = FspAccessCheck(FileSystem, Request, TRUE, Request->Req.Create.DesiredAccess | (Supersede ? DELETE : FILE_WRITE_DATA), @@ -207,15 +182,8 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, 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 = Supersede ? FILE_SUPERSEDED : FILE_OVERWRITTEN; - Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; - Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; - return FspFileSystemSendResponse(FileSystem, &Response); + return FspFileSystemOpCreateSendSuccessResponse(FileSystem, Request, + Supersede ? FILE_SUPERSEDED : FILE_OVERWRITTEN, FileNode, GrantedAccess); } static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem, @@ -227,7 +195,6 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste NTSTATUS Result; DWORD GrantedAccess; FSP_FILE_NODE *FileNode; - FSP_FSCTL_TRANSACT_RSP Response; BOOLEAN Create = FALSE; Result = FspAccessCheck(FileSystem, Request, TRUE, @@ -278,15 +245,8 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste 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_OVERWRITTEN; - Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; - Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; - return FspFileSystemSendResponse(FileSystem, &Response); + return FspFileSystemOpCreateSendSuccessResponse(FileSystem, Request, + Create ? FILE_CREATED : FILE_OVERWRITTEN, FileNode, GrantedAccess); } static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *FileSystem, @@ -299,7 +259,6 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F DWORD GrantedAccess; FSP_FILE_NODE *FileNode; BOOLEAN FileExists; - FSP_FSCTL_TRANSACT_RSP Response; PWSTR Path, Suffix; FspPathSuffix((PWSTR)Request->Buffer, &Path, &Suffix); @@ -323,15 +282,8 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F 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); + return FspFileSystemOpCreateSendSuccessResponse(FileSystem, Request, + FileExists ? FILE_EXISTS : FILE_DOES_NOT_EXIST, FileNode, GrantedAccess); } FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, @@ -364,3 +316,20 @@ FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_PARAMETER); } } + +FSP_API NTSTATUS FspFileSystemOpCreateSendSuccessResponse(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, UINT_PTR Information, + FSP_FILE_NODE *FileNode, DWORD GrantedAccess) +{ + FSP_FSCTL_TRANSACT_RSP Response; + + 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 = Information; + Response.Rsp.Create.Opened.UserContext = (UINT_PTR)FileNode; + Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; + return FspFileSystemSendResponse(FileSystem, &Response); +}