mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
sys: FspFileNodeSetFileInfo: TruncateOnClose
This commit is contained in:
parent
c897ddd864
commit
7b94f2bebf
@ -1024,11 +1024,7 @@ NTSTATUS FspFsvolCreateComplete(
|
|||||||
/* file was successfully overwritten/superseded */
|
/* file was successfully overwritten/superseded */
|
||||||
if (0 == FileNode->MainFileNode)
|
if (0 == FileNode->MainFileNode)
|
||||||
FspFileNodeOverwriteStreams(FileNode);
|
FspFileNodeOverwriteStreams(FileNode);
|
||||||
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo);
|
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo, TRUE);
|
||||||
|
|
||||||
if (0 != Response->Rsp.Overwrite.FileInfo.AllocationSize)
|
|
||||||
FileNode->TruncateOnClose = TRUE;
|
|
||||||
|
|
||||||
FspFileNodeNotifyChange(FileNode,
|
FspFileNodeNotifyChange(FileNode,
|
||||||
FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE,
|
FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE,
|
||||||
FILE_ACTION_MODIFIED);
|
FILE_ACTION_MODIFIED);
|
||||||
@ -1094,7 +1090,8 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Create.Opened.FileInfo);
|
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Create.Opened.FileInfo,
|
||||||
|
FILE_CREATED == Response->IoStatus.Information);
|
||||||
|
|
||||||
if (FlushImage)
|
if (FlushImage)
|
||||||
{
|
{
|
||||||
@ -1119,14 +1116,9 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (FILE_CREATED == Response->IoStatus.Information)
|
if (FILE_CREATED == Response->IoStatus.Information)
|
||||||
{
|
|
||||||
if (0 != Response->Rsp.Create.Opened.FileInfo.AllocationSize)
|
|
||||||
FileNode->TruncateOnClose = TRUE;
|
|
||||||
|
|
||||||
FspFileNodeNotifyChange(FileNode,
|
FspFileNodeNotifyChange(FileNode,
|
||||||
FileNode->IsDirectory ? FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME,
|
FileNode->IsDirectory ? FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME,
|
||||||
FILE_ACTION_ADDED);
|
FILE_ACTION_ADDED);
|
||||||
}
|
|
||||||
|
|
||||||
FspFileNodeRelease(FileNode, Main);
|
FspFileNodeRelease(FileNode, Main);
|
||||||
|
|
||||||
|
@ -1281,7 +1281,7 @@ VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName);
|
|||||||
VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo);
|
VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo);
|
||||||
BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo);
|
BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo);
|
||||||
VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||||
const FSP_FSCTL_FILE_INFO *FileInfo);
|
const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose);
|
||||||
BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||||
const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
|
const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
|
||||||
static inline
|
static inline
|
||||||
|
@ -55,7 +55,7 @@ VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName);
|
|||||||
VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo);
|
VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo);
|
||||||
BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo);
|
BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo);
|
||||||
VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||||
const FSP_FSCTL_FILE_INFO *FileInfo);
|
const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose);
|
||||||
BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||||
const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
|
const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
|
||||||
BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize);
|
BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize);
|
||||||
@ -1416,7 +1416,7 @@ BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *
|
|||||||
}
|
}
|
||||||
|
|
||||||
VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||||
const FSP_FSCTL_FILE_INFO *FileInfo)
|
const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
@ -1430,8 +1430,20 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
|||||||
FsvolDeviceExtension->VolumeParams.SectorsPerAllocationUnit;
|
FsvolDeviceExtension->VolumeParams.SectorsPerAllocationUnit;
|
||||||
AllocationSize = (AllocationSize + AllocationUnit - 1) / AllocationUnit * AllocationUnit;
|
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;
|
||||||
|
|
||||||
FileNode->Header.AllocationSize.QuadPart = AllocationSize;
|
FileNode->Header.AllocationSize.QuadPart = AllocationSize;
|
||||||
FileNode->Header.FileSize.QuadPart = FileInfo->FileSize;
|
FileNode->Header.FileSize.QuadPart = FileInfo->FileSize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FileNode->Header.AllocationSize.QuadPart = AllocationSize;
|
||||||
|
FileNode->Header.FileSize.QuadPart = FileInfo->FileSize;
|
||||||
|
}
|
||||||
|
|
||||||
FileNode->FileInfoExpirationTime = FileNode->BasicInfoExpirationTime =
|
FileNode->FileInfoExpirationTime = FileNode->BasicInfoExpirationTime =
|
||||||
FspExpirationTimeFromMillis(FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
|
FspExpirationTimeFromMillis(FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
|
||||||
@ -1521,7 +1533,7 @@ BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileOb
|
|||||||
if (FspFileNodeFileInfoChangeNumber(FileNode) != InfoChangeNumber)
|
if (FspFileNodeFileInfoChangeNumber(FileNode) != InfoChangeNumber)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
FspFileNodeSetFileInfo(FileNode, CcFileObject, FileInfo);
|
FspFileNodeSetFileInfo(FileNode, CcFileObject, FileInfo, FALSE);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -901,8 +901,7 @@ static NTSTATUS FspFsvolSetAllocationInformation(PFILE_OBJECT FileObject,
|
|||||||
{
|
{
|
||||||
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||||
|
|
||||||
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo);
|
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo, TRUE);
|
||||||
FileNode->TruncateOnClose = TRUE;
|
|
||||||
|
|
||||||
/* mark the file object as modified */
|
/* mark the file object as modified */
|
||||||
SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
|
SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
|
||||||
@ -971,7 +970,7 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject,
|
|||||||
ClearFlag(FileObject->Flags, FO_TEMPORARY_FILE);
|
ClearFlag(FileObject->Flags, FO_TEMPORARY_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo);
|
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo, FALSE);
|
||||||
|
|
||||||
if ((UINT32)-1 != Request->Req.SetInformation.Info.Basic.FileAttributes)
|
if ((UINT32)-1 != Request->Req.SetInformation.Info.Basic.FileAttributes)
|
||||||
NotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
|
NotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
|
||||||
@ -1032,8 +1031,7 @@ static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject,
|
|||||||
{
|
{
|
||||||
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||||
|
|
||||||
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo);
|
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo, TRUE);
|
||||||
FileNode->TruncateOnClose = TRUE;
|
|
||||||
|
|
||||||
/* mark the file object as modified -- FastFat does this only for Allocation though! */
|
/* mark the file object as modified -- FastFat does this only for Allocation though! */
|
||||||
SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
|
SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
|
||||||
|
@ -470,16 +470,13 @@ NTSTATUS FspFsvolWriteComplete(
|
|||||||
UINT64 OriginalFileSize = FileNode->Header.FileSize.QuadPart;
|
UINT64 OriginalFileSize = FileNode->Header.FileSize.QuadPart;
|
||||||
|
|
||||||
/* update file info */
|
/* update file info */
|
||||||
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Write.FileInfo);
|
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Write.FileInfo, TRUE);
|
||||||
|
|
||||||
if (!PagingIo && OriginalFileSize != Response->Rsp.Write.FileInfo.FileSize)
|
if (OriginalFileSize != Response->Rsp.Write.FileInfo.FileSize)
|
||||||
{
|
|
||||||
FileNode->TruncateOnClose = TRUE;
|
|
||||||
FspFileNodeNotifyChange(FileNode, FILE_NOTIFY_CHANGE_SIZE, FILE_ACTION_MODIFIED);
|
FspFileNodeNotifyChange(FileNode, FILE_NOTIFY_CHANGE_SIZE, FILE_ACTION_MODIFIED);
|
||||||
}
|
|
||||||
|
|
||||||
/* update the current file offset if synchronous I/O (and not paging I/O) */
|
/* update the current file offset if synchronous I/O (and not paging I/O) */
|
||||||
if (!PagingIo && SynchronousIo)
|
if (SynchronousIo && !PagingIo)
|
||||||
FileObject->CurrentByteOffset.QuadPart = WriteToEndOfFile ?
|
FileObject->CurrentByteOffset.QuadPart = WriteToEndOfFile ?
|
||||||
Response->Rsp.Write.FileInfo.FileSize :
|
Response->Rsp.Write.FileInfo.FileSize :
|
||||||
WriteOffset.QuadPart + Response->IoStatus.Information;
|
WriteOffset.QuadPart + Response->IoStatus.Information;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user