From 7e1883044b47ff4957055c43d09e2d8773c9044d Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 12 Jan 2016 16:43:24 -0800 Subject: [PATCH] dll: overwrite refactoring --- inc/winfsp/fsctl.h | 1 + inc/winfsp/winfsp.h | 40 +++++++-- src/dll/cleanup.c | 34 +------- src/dll/close.c | 17 +--- src/dll/create.c | 207 +++++++++++++++----------------------------- 5 files changed, 113 insertions(+), 186 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 32583295..98ef9871 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -162,6 +162,7 @@ typedef struct { UINT64 UserContext; /* open file user context (unique file id) */ UINT64 UserContext2; /* kernel file object user context (stores as many bits as a pointer) */ + UINT32 FileAttributes; /* FILE_ATTRIBUTE_{NORMAL,DIRECTORY,etc.} */ UINT64 AllocationSize; /* file allocation size */ UINT64 FileSize; /* file size */ UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */ diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 143e1eca..5d6ff476 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -27,23 +27,39 @@ typedef struct _FSP_FILE_SYSTEM FSP_FILE_SYSTEM; typedef VOID FSP_FILE_SYSTEM_DISPATCHER(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *); typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *); +typedef struct _FSP_FILE_NODE_INFO +{ + PVOID FileNode; + DWORD FileAttributes; + UINT64 AllocationSize; + UINT64 FileSize; +} FSP_FILE_NODE_INFO; +typedef struct _FSP_FILE_SIZE_INFO +{ + UINT64 AllocationSize; + UINT64 FileSize; +} FSP_FILE_SIZE_INFO; typedef struct _FSP_FILE_SYSTEM_INTERFACE { NTSTATUS (*GetSecurity)(FSP_FILE_SYSTEM *FileSystem, PWSTR FileName, PDWORD PFileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize); -#if 0 NTSTATUS (*Create)(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode); + FSP_FSCTL_TRANSACT_REQ *Request, + FSP_FILE_NODE_INFO *Info); NTSTATUS (*Open)(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode); + FSP_FSCTL_TRANSACT_REQ *Request, + FSP_FILE_NODE_INFO *Info); NTSTATUS (*Overwrite)(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN ReplaceFileAttributes, FSP_FILE_NODE *FileNode); + FSP_FSCTL_TRANSACT_REQ *Request, + PVOID FileNode, DWORD FileAttributes, BOOLEAN ReplaceFileAttributes, + FSP_FILE_SIZE_INFO *Info); VOID (*Cleanup)(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode, BOOLEAN Delete); + FSP_FSCTL_TRANSACT_REQ *Request, + PVOID FileNode, BOOLEAN Delete); VOID (*Close)(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE *FileNode); -#endif + FSP_FSCTL_TRANSACT_REQ *Request, + PVOID FileNode); } FSP_FILE_SYSTEM_INTERFACE; typedef struct _FSP_FILE_SYSTEM { @@ -139,6 +155,16 @@ FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request); FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request); +FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, UINT_PTR Information, + const FSP_FILE_NODE_INFO *NodeInfo, DWORD GrantedAccess); +FSP_API NTSTATUS FspFileSystemSendOverwriteResponse(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, + const FSP_FILE_SIZE_INFO *SizeInfo); +FSP_API NTSTATUS FspFileSystemSendCleanupResponse(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request); +FSP_API NTSTATUS FspFileSystemSendCloseResponse(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request); /* * Path Handling diff --git a/src/dll/cleanup.c b/src/dll/cleanup.c index b18893a4..96068e19 100644 --- a/src/dll/cleanup.c +++ b/src/dll/cleanup.c @@ -9,35 +9,10 @@ FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { - return STATUS_INVALID_DEVICE_REQUEST; -} - -#if 0 -FSP_API NTSTATUS FspFileSystemOpCleanup(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request) -{ - if (0 == FileSystem->Interface->Cleanup) - return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST); - - FSP_FILE_NODE *FileNode = (PVOID)Request->Req.Close.UserContext; - BOOLEAN DeletePending; - LONG OpenCount; - - FspFileNodeLock(FileNode); - - FspShareAccessRemove(FileSystem, Request, FileNode); - - /* propagate the DeleteOnClose flag to DeletePending */ - if (FileNode->Flags.DeleteOnClose) - FileNode->Flags.DeletePending = TRUE; - DeletePending = FileNode->Flags.DeletePending; - - /* all handles on the kernel FILE_OBJECT gone; decrement the FileNode's OpenCount */ - OpenCount = FspFileNodeClose(FileNode); - - FspFileNodeUnlock(FileNode); - - FileSystem->Interface->Cleanup(FileSystem, Request, FileNode, 0 == OpenCount && DeletePending); + if (0 != FileSystem->Interface->Cleanup) + FileSystem->Interface->Cleanup(FileSystem, Request, + (PVOID)Request->Req.Cleanup.UserContext, + 0 != Request->Req.Cleanup.Delete); return FspFileSystemSendCleanupResponse(FileSystem, Request); } @@ -55,4 +30,3 @@ FSP_API NTSTATUS FspFileSystemSendCleanupResponse(FSP_FILE_SYSTEM *FileSystem, Response.IoStatus.Information = 0; return FspFileSystemSendResponse(FileSystem, &Response); } -#endif diff --git a/src/dll/close.c b/src/dll/close.c index d85c9b18..83326aa1 100644 --- a/src/dll/close.c +++ b/src/dll/close.c @@ -9,19 +9,9 @@ FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { - return STATUS_INVALID_DEVICE_REQUEST; -} - -#if 0 -FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request) -{ - if (0 == FileSystem->Interface->Close) - return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST); - - FSP_FILE_NODE *FileNode = (PVOID)Request->Req.Close.UserContext; - - FileSystem->Interface->Close(FileSystem, Request, FileNode); + if (0 != FileSystem->Interface->Close) + FileSystem->Interface->Close(FileSystem, Request, + (PVOID)Request->Req.Close.UserContext); return FspFileSystemSendCloseResponse(FileSystem, Request); } @@ -39,4 +29,3 @@ FSP_API NTSTATUS FspFileSystemSendCloseResponse(FSP_FILE_SYSTEM *FileSystem, Response.IoStatus.Information = 0; return FspFileSystemSendResponse(FileSystem, &Response); } -#endif diff --git a/src/dll/create.c b/src/dll/create.c index 13d2a9ea..9773180c 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -184,7 +184,7 @@ NTSTATUS FspFileSystemCreateCheck(FSP_FILE_SYSTEM *FileSystem, } static inline -NTSTATUS FspFileSystemPreOpenCheck(FSP_FILE_SYSTEM *FileSystem, +NTSTATUS FspFileSystemOpenCheck(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllowTraverseCheck, PDWORD PGrantedAccess) { return FspAccessCheck(FileSystem, Request, FALSE, AllowTraverseCheck, @@ -212,49 +212,23 @@ NTSTATUS FspFileSystemOverwriteCheck(FSP_FILE_SYSTEM *FileSystem, return Result; } -FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request) -{ - return STATUS_INVALID_DEVICE_REQUEST; -} - -FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem, - FSP_FSCTL_TRANSACT_REQ *Request) -{ - return STATUS_INVALID_DEVICE_REQUEST; -} - -#if 0 -static BOOLEAN FspIsRootDirectory(PWSTR FileName) -{ - for (PWSTR Pointer = FileName; *Pointer; Pointer++) - if (L'\\' != *Pointer) - return FALSE; - return TRUE; -} - static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { NTSTATUS Result; DWORD GrantedAccess; - FSP_FILE_NODE *FileNode; + FSP_FILE_NODE_INFO NodeInfo; - if (FspIsRootDirectory((PWSTR)Request->Buffer)) - return STATUS_ACCESS_DENIED; - - Result = FspFileSystemPreCreateCheck(FileSystem, Request, TRUE, &GrantedAccess); + Result = FspFileSystemCreateCheck(FileSystem, Request, TRUE, &GrantedAccess); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FileSystem->Interface->Create(FileSystem, Request, &FileNode); + Result = FileSystem->Interface->Create(FileSystem, Request, &NodeInfo); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - FspFileSystemPostCreateCheck(FileSystem, Request, GrantedAccess, FileNode); - return FspFileSystemSendCreateResponse(FileSystem, Request, - FILE_CREATED, FileNode, GrantedAccess); + FILE_CREATED, &NodeInfo, GrantedAccess); } static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, @@ -262,26 +236,18 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, { NTSTATUS Result; DWORD GrantedAccess; - FSP_FILE_NODE *FileNode; + FSP_FILE_NODE_INFO NodeInfo; - Result = FspFileSystemPreOpenCheck(FileSystem, Request, TRUE, &GrantedAccess); + Result = FspFileSystemOpenCheck(FileSystem, Request, TRUE, &GrantedAccess); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FileSystem->Interface->Open(FileSystem, Request, &FileNode); + Result = FileSystem->Interface->Open(FileSystem, Request, &NodeInfo); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FspFileSystemPostOpenCheck(FileSystem, Request, GrantedAccess, FileNode); - if (!NT_SUCCESS(Result)) - { - if (0 != FileSystem->Interface->Close) - FileSystem->Interface->Close(FileSystem, Request, FileNode); - return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - } - return FspFileSystemSendCreateResponse(FileSystem, Request, - FILE_OPENED, FileNode, GrantedAccess); + FILE_OPENED, &NodeInfo, GrantedAccess); } static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, @@ -289,10 +255,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, { NTSTATUS Result; DWORD GrantedAccess; - FSP_FILE_NODE *FileNode; + FSP_FILE_NODE_INFO NodeInfo; BOOLEAN Create = FALSE; - Result = FspFileSystemPreOpenCheck(FileSystem, Request, TRUE, &GrantedAccess); + Result = FspFileSystemOpenCheck(FileSystem, Request, TRUE, &GrantedAccess); if (!NT_SUCCESS(Result)) { if (STATUS_OBJECT_NAME_NOT_FOUND != Result) @@ -302,43 +268,28 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, if (!Create) { - Result = FileSystem->Interface->Open(FileSystem, Request, &FileNode); + Result = FileSystem->Interface->Open(FileSystem, Request, &NodeInfo); if (!NT_SUCCESS(Result)) { if (STATUS_OBJECT_NAME_NOT_FOUND != Result) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); Create = TRUE; } - else - { - Result = FspFileSystemPostOpenCheck(FileSystem, Request, GrantedAccess, FileNode); - if (!NT_SUCCESS(Result)) - { - if (0 != FileSystem->Interface->Close) - FileSystem->Interface->Close(FileSystem, Request, FileNode); - return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - } - } } if (Create) { - if (FspIsRootDirectory((PWSTR)Request->Buffer)) - return STATUS_ACCESS_DENIED; - - Result = FspFileSystemPreCreateCheck(FileSystem, Request, FALSE, &GrantedAccess); + Result = FspFileSystemCreateCheck(FileSystem, Request, FALSE, &GrantedAccess); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FileSystem->Interface->Create(FileSystem, Request, &FileNode); + Result = FileSystem->Interface->Create(FileSystem, Request, &NodeInfo); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - - FspFileSystemPostCreateCheck(FileSystem, Request, GrantedAccess, FileNode); } return FspFileSystemSendCreateResponse(FileSystem, Request, - Create ? FILE_CREATED : FILE_OPENED, FileNode, GrantedAccess); + Create ? FILE_CREATED : FILE_OPENED, &NodeInfo, GrantedAccess); } static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, @@ -346,38 +297,19 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, { NTSTATUS Result; DWORD GrantedAccess; - FSP_FILE_NODE *FileNode; + FSP_FILE_NODE_INFO NodeInfo; BOOLEAN Supersede = FILE_SUPERSEDE == ((Request->Req.Create.CreateOptions >> 24) & 0xff); - if (FspIsRootDirectory((PWSTR)Request->Buffer)) - return STATUS_ACCESS_DENIED; - - Result = FspFileSystemPreOverwriteCheck(FileSystem, Request, TRUE, &GrantedAccess); + Result = FspFileSystemOverwriteCheck(FileSystem, Request, TRUE, &GrantedAccess); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FileSystem->Interface->Open(FileSystem, Request, &FileNode); + Result = FileSystem->Interface->Open(FileSystem, Request, &NodeInfo); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FspFileSystemPostOverwriteCheck(FileSystem, Request, GrantedAccess, FileNode); - if (!NT_SUCCESS(Result)) - { - if (0 != FileSystem->Interface->Close) - FileSystem->Interface->Close(FileSystem, Request, FileNode); - return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - } - - Result = FileSystem->Interface->Overwrite(FileSystem, Request, Supersede, FileNode); - if (!NT_SUCCESS(Result)) - { - if (0 != FileSystem->Interface->Close) - FileSystem->Interface->Close(FileSystem, Request, FileNode); - return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - } - return FspFileSystemSendCreateResponse(FileSystem, Request, - Supersede ? FILE_SUPERSEDED : FILE_OVERWRITTEN, FileNode, GrantedAccess); + Supersede ? FILE_SUPERSEDED : FILE_OVERWRITTEN, &NodeInfo, GrantedAccess); } static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem, @@ -385,13 +317,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste { NTSTATUS Result; DWORD GrantedAccess; - FSP_FILE_NODE *FileNode; + FSP_FILE_NODE_INFO NodeInfo; BOOLEAN Create = FALSE; - if (FspIsRootDirectory((PWSTR)Request->Buffer)) - return STATUS_ACCESS_DENIED; - - Result = FspFileSystemPreOverwriteCheck(FileSystem, Request, TRUE, &GrantedAccess); + Result = FspFileSystemOverwriteCheck(FileSystem, Request, TRUE, &GrantedAccess); if (!NT_SUCCESS(Result)) { if (STATUS_OBJECT_NAME_NOT_FOUND != Result) @@ -401,48 +330,28 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste if (!Create) { - Result = FileSystem->Interface->Open(FileSystem, Request, &FileNode); + Result = FileSystem->Interface->Open(FileSystem, Request, &NodeInfo); if (!NT_SUCCESS(Result)) { if (STATUS_OBJECT_NAME_NOT_FOUND != Result) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); Create = TRUE; } - else - { - Result = FspFileSystemPostOverwriteCheck(FileSystem, Request, GrantedAccess, FileNode); - if (!NT_SUCCESS(Result)) - { - if (0 != FileSystem->Interface->Close) - FileSystem->Interface->Close(FileSystem, Request, FileNode); - return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - } - - Result = FileSystem->Interface->Overwrite(FileSystem, Request, FALSE, FileNode); - if (!NT_SUCCESS(Result)) - { - if (0 != FileSystem->Interface->Close) - FileSystem->Interface->Close(FileSystem, Request, FileNode); - return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - } - } } if (Create) { - Result = FspFileSystemPreCreateCheck(FileSystem, Request, FALSE, &GrantedAccess); + Result = FspFileSystemCreateCheck(FileSystem, Request, FALSE, &GrantedAccess); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FileSystem->Interface->Create(FileSystem, Request, &FileNode); + Result = FileSystem->Interface->Create(FileSystem, Request, &NodeInfo); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - - FspFileSystemPostCreateCheck(FileSystem, Request, GrantedAccess, FileNode); } return FspFileSystemSendCreateResponse(FileSystem, Request, - Create ? FILE_CREATED : FILE_OVERWRITTEN, FileNode, GrantedAccess); + Create ? FILE_CREATED : FILE_OVERWRITTEN, &NodeInfo, GrantedAccess); } static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *FileSystem, @@ -451,31 +360,20 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F NTSTATUS Result; PWSTR Parent, Suffix; DWORD GrantedAccess; - FSP_FILE_NODE *FileNode; + FSP_FILE_NODE_INFO NodeInfo; UINT_PTR Information; - if (FspIsRootDirectory((PWSTR)Request->Buffer)) - return STATUS_ACCESS_DENIED; - Result = FspAccessCheck(FileSystem, Request, TRUE, TRUE, Request->Req.Create.DesiredAccess, &GrantedAccess); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); FspPathSuffix((PWSTR)Request->Buffer, &Parent, &Suffix); - Result = FileSystem->Interface->Open(FileSystem, Request, &FileNode); + Result = FileSystem->Interface->Open(FileSystem, Request, &NodeInfo); FspPathCombine((PWSTR)Request->Buffer, Suffix); if (!NT_SUCCESS(Result)) return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FspFileSystemPostOpenCheck(FileSystem, Request, GrantedAccess, FileNode); - if (!NT_SUCCESS(Result)) - { - if (0 != FileSystem->Interface->Close) - FileSystem->Interface->Close(FileSystem, Request, FileNode); - return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - } - Information = FILE_OPENED; if (0 != FileSystem->Interface->GetSecurity) { @@ -484,7 +382,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F } return FspFileSystemSendCreateResponse(FileSystem, Request, - Information, FileNode, GrantedAccess); + Information, &NodeInfo, GrantedAccess); } FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, @@ -517,9 +415,31 @@ FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, } } +FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request) +{ + NTSTATUS Result; + FSP_FILE_SIZE_INFO SizeInfo; + + Result = FileSystem->Interface->Overwrite(FileSystem, Request, + (PVOID)Request->Req.Overwrite.UserContext, + Request->Req.Overwrite.FileAttributes, + Request->Req.Overwrite.Supersede, + &SizeInfo); + if (!NT_SUCCESS(Result)) + { + if (0 != FileSystem->Interface->Close) + FileSystem->Interface->Close(FileSystem, Request, + (PVOID)Request->Req.Overwrite.UserContext); + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); + } + + return FspFileSystemSendOverwriteResponse(FileSystem, Request, &SizeInfo); +} + FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, UINT_PTR Information, - FSP_FILE_NODE *FileNode, DWORD GrantedAccess) + const FSP_FILE_NODE_INFO *NodeInfo, DWORD GrantedAccess) { FSP_FSCTL_TRANSACT_RSP Response; @@ -529,10 +449,27 @@ FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, 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.AllocationSize = FileNode->AllocationSize; - Response.Rsp.Create.Opened.FileSize = FileNode->FileSize; + Response.Rsp.Create.Opened.UserContext = (UINT_PTR)NodeInfo->FileNode; + Response.Rsp.Create.Opened.FileAttributes = NodeInfo->FileAttributes; + Response.Rsp.Create.Opened.AllocationSize = NodeInfo->AllocationSize; + Response.Rsp.Create.Opened.FileSize = NodeInfo->FileSize; Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; return FspFileSystemSendResponse(FileSystem, &Response); } -#endif + +FSP_API NTSTATUS FspFileSystemSendOverwriteResponse(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request, + const FSP_FILE_SIZE_INFO *SizeInfo) +{ + 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 = 0; + Response.Rsp.Overwrite.AllocationSize = SizeInfo->AllocationSize; + Response.Rsp.Overwrite.FileSize = SizeInfo->FileSize; + return FspFileSystemSendResponse(FileSystem, &Response); +}