From b35bf204db3a0ec926b846e4ef70833b29cbfa4b Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 11 Jul 2017 14:17:17 -0700 Subject: [PATCH] sys: FspFileNodeTrySetFileInfoOnOpen --- src/sys/create.c | 2 +- src/sys/driver.h | 2 ++ src/sys/file.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/sys/create.c b/src/sys/create.c index 93fc1e9e..f1d89e0a 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -1098,7 +1098,7 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re return Result; } - FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Create.Opened.FileInfo, + FspFileNodeTrySetFileInfoOnOpen(FileNode, FileObject, &Response->Rsp.Create.Opened.FileInfo, FILE_CREATED == Response->IoStatus.Information); if (FlushImage) diff --git a/src/sys/driver.h b/src/sys/driver.h index 1ed4a19f..8b37875d 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1350,6 +1350,8 @@ VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileIn BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose); +BOOLEAN FspFileNodeTrySetFileInfoOnOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, + const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose); BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber); VOID FspFileNodeInvalidateFileInfo(FSP_FILE_NODE *FileNode); diff --git a/src/sys/file.c b/src/sys/file.c index e9a1bef1..61983478 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -58,6 +58,8 @@ VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileIn BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose); +BOOLEAN FspFileNodeTrySetFileInfoOnOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, + const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose); BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber); VOID FspFileNodeInvalidateFileInfo(FSP_FILE_NODE *FileNode); @@ -129,6 +131,7 @@ VOID FspFileNodeOplockComplete(PVOID Context, PIRP Irp); #pragma alloc_text(PAGE, FspFileNodeGetFileInfo) #pragma alloc_text(PAGE, FspFileNodeTryGetFileInfo) #pragma alloc_text(PAGE, FspFileNodeSetFileInfo) +#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfoOnOpen) #pragma alloc_text(PAGE, FspFileNodeTrySetFileInfo) #pragma alloc_text(PAGE, FspFileNodeInvalidateFileInfo) #pragma alloc_text(PAGE, FspFileNodeReferenceSecurity) @@ -1660,6 +1663,42 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, } } +BOOLEAN FspFileNodeTrySetFileInfoOnOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, + const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose) +{ + PAGED_CODE(); + + BOOLEAN EarlyExit; + + FspFsvolDeviceLockContextTable(FileNode->FsvolDeviceObject); + EarlyExit = 1 < FileNode->OpenCount; + FspFsvolDeviceUnlockContextTable(FileNode->FsvolDeviceObject); + if (EarlyExit) + { + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = + FspFsvolDeviceExtension(FileNode->FsvolDeviceObject); + UINT64 AllocationSize = FileInfo->AllocationSize > FileInfo->FileSize ? + FileInfo->AllocationSize : FileInfo->FileSize; + UINT64 AllocationUnit; + + AllocationUnit = FsvolDeviceExtension->VolumeParams.SectorSize * + FsvolDeviceExtension->VolumeParams.SectorsPerAllocationUnit; + AllocationSize = (AllocationSize + AllocationUnit - 1) / AllocationUnit * AllocationUnit; + + if (TruncateOnClose) + { + if ((UINT64)FileNode->Header.AllocationSize.QuadPart != AllocationSize || + (UINT64)FileNode->Header.FileSize.QuadPart != FileInfo->FileSize) + FileNode->TruncateOnClose = TRUE; + } + + return FALSE; + } + + FspFileNodeSetFileInfo(FileNode, CcFileObject, FileInfo, TruncateOnClose); + return TRUE; +} + BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber) {