sys: IRP_MJ_SET_INFORMATION: FileEndOfFileInformation: ignore calls with the AdvanceOnly parameter

This commit is contained in:
Bill Zissimopoulos 2016-03-03 11:35:32 -08:00
parent 6f3f57366a
commit bc9f983285
5 changed files with 11 additions and 15 deletions

View File

@ -226,7 +226,6 @@ typedef struct
struct struct
{ {
UINT64 FileSize; UINT64 FileSize;
UINT32 AdvanceOnly:1;
} EndOfFile; } EndOfFile;
struct struct
{ {

View File

@ -79,7 +79,7 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE
FSP_FSCTL_FILE_INFO *FileInfo); FSP_FSCTL_FILE_INFO *FileInfo);
NTSTATUS (*SetFileSize)(FSP_FILE_SYSTEM *FileSystem, NTSTATUS (*SetFileSize)(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_REQ *Request,
PVOID FileNode, UINT64 FileSize, BOOLEAN AdvanceOnly, PVOID FileNode, UINT64 FileSize,
FSP_FSCTL_FILE_INFO *FileInfo); FSP_FSCTL_FILE_INFO *FileInfo);
NTSTATUS (*CanDelete)(FSP_FILE_SYSTEM *FileSystem, NTSTATUS (*CanDelete)(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_REQ *Request,

View File

@ -459,7 +459,6 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
Result = FileSystem->Interface->SetFileSize(FileSystem, Request, Result = FileSystem->Interface->SetFileSize(FileSystem, Request,
(PVOID)Request->Req.SetInformation.UserContext, (PVOID)Request->Req.SetInformation.UserContext,
Request->Req.SetInformation.Info.Allocation.AllocationSize, Request->Req.SetInformation.Info.Allocation.AllocationSize,
FALSE,
&FileInfo); &FileInfo);
} }
} }
@ -469,7 +468,6 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
Result = FileSystem->Interface->SetFileSize(FileSystem, Request, Result = FileSystem->Interface->SetFileSize(FileSystem, Request,
(PVOID)Request->Req.SetInformation.UserContext, (PVOID)Request->Req.SetInformation.UserContext,
Request->Req.SetInformation.Info.EndOfFile.FileSize, Request->Req.SetInformation.Info.EndOfFile.FileSize,
Request->Req.SetInformation.Info.EndOfFile.AdvanceOnly,
&FileInfo); &FileInfo);
break; break;
case 13/*FileDispositionInformation*/: case 13/*FileDispositionInformation*/:

View File

@ -38,7 +38,7 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject,
PVOID Buffer, ULONG Length, PVOID Buffer, ULONG Length,
FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response); FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response);
static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject, static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject,
PVOID Buffer, ULONG Length, BOOLEAN AdvanceOnly, PVOID Buffer, ULONG Length,
FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response); FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response);
static NTSTATUS FspFsvolSetPositionInformation(PFILE_OBJECT FileObject, static NTSTATUS FspFsvolSetPositionInformation(PFILE_OBJECT FileObject,
PVOID Buffer, ULONG Length); PVOID Buffer, ULONG Length);
@ -640,7 +640,7 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject,
} }
static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject, static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject,
PVOID Buffer, ULONG Length, BOOLEAN AdvanceOnly, PVOID Buffer, ULONG Length,
FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response) FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
PAGED_CODE(); PAGED_CODE();
@ -656,9 +656,7 @@ static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject,
BOOLEAN Success; BOOLEAN Success;
Request->Req.SetInformation.Info.EndOfFile.FileSize = Info->EndOfFile.QuadPart; Request->Req.SetInformation.Info.EndOfFile.FileSize = Info->EndOfFile.QuadPart;
Request->Req.SetInformation.Info.EndOfFile.AdvanceOnly = AdvanceOnly;
// !!!: REVISIT after better understanding relationship between AllocationSize and FileSize
Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->EndOfFile); Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->EndOfFile);
if (!Success) if (!Success)
return STATUS_USER_MAPPED_FILE; return STATUS_USER_MAPPED_FILE;
@ -964,8 +962,11 @@ static NTSTATUS FspFsvolSetInformation(
Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, 0, 0); Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, 0, 0);
break; break;
case FileEndOfFileInformation: case FileEndOfFileInformation:
Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, if (IrpSp->Parameters.SetFile.AdvanceOnly)
IrpSp->Parameters.SetFile.AdvanceOnly, 0, 0); /* we do not support ValidDataLength currently! */
Result = STATUS_INVALID_PARAMETER;
else
Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, 0, 0);
break; break;
case FileLinkInformation: case FileLinkInformation:
Result = STATUS_INVALID_PARAMETER; /* no hard link support */ Result = STATUS_INVALID_PARAMETER; /* no hard link support */
@ -1012,8 +1013,7 @@ static NTSTATUS FspFsvolSetInformation(
Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, Request, 0); Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, Request, 0);
break; break;
case FileEndOfFileInformation: case FileEndOfFileInformation:
Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, Request, 0);
IrpSp->Parameters.SetFile.AdvanceOnly, Request, 0);
break; break;
default: default:
ASSERT(0); ASSERT(0);
@ -1062,8 +1062,7 @@ NTSTATUS FspFsvolSetInformationComplete(
Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, Request, Response); Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, Request, Response);
break; break;
case FileEndOfFileInformation: case FileEndOfFileInformation:
Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, Request, Response);
IrpSp->Parameters.SetFile.AdvanceOnly, Request, Response);
break; break;
default: default:
ASSERT(0); ASSERT(0);

View File

@ -470,7 +470,7 @@ NTSTATUS SetAllocationSize(FSP_FILE_SYSTEM *FileSystem,
NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem, NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_REQ *Request,
PVOID FileNode0, UINT64 FileSize, BOOLEAN AdvanceOnly, PVOID FileNode0, UINT64 FileSize,
FSP_FSCTL_FILE_INFO *FileInfo) FSP_FSCTL_FILE_INFO *FileInfo)
{ {
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;