From 976c054d060a2f4423f30e3da95950d5e2073679 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 26 Jan 2016 11:05:36 -0800 Subject: [PATCH] sys: IRP_MJ_SET_INFORMATION --- inc/winfsp/fsctl.h | 17 +++ src/sys/create.c | 3 +- src/sys/driver.h | 25 +++-- src/sys/file.c | 38 +++---- src/sys/fileinfo.c | 252 ++++++++++++++++++++++++++++++++++++++++++++- src/sys/util.c | 13 +++ 6 files changed, 313 insertions(+), 35 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 8f9e737f..81df38da 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -184,6 +184,19 @@ typedef struct UINT64 UserContext; UINT64 UserContext2; } QueryInformation; + struct + { + UINT64 UserContext; + UINT64 UserContext2; + UINT32 FileInformationClass; + union + { + struct + { + UINT64 AllocationSize; + } Allocation; + } Info; + } SetInformation; } Req; FSP_FSCTL_TRANSACT_BUF FileName; FSP_FSCTL_DECLSPEC_ALIGN UINT8 Buffer[]; @@ -226,6 +239,10 @@ typedef struct FSP_FSCTL_FILE_INFO FileInfo; } QueryInformation; struct + { + FSP_FSCTL_FILE_INFO FileInfo; + } SetInformation; + struct { FSP_FSCTL_VOLUME_INFO VolumeInfo; } QueryVolumeInformation; diff --git a/src/sys/create.c b/src/sys/create.c index c2303553..ab6fee34 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -692,7 +692,8 @@ VOID FspFsvolCreateComplete( /* file was successfully overwritten/superseded */ FileNode->Header.AllocationSize.QuadPart = Response->Rsp.Overwrite.FileInfo.AllocationSize; FileNode->Header.FileSize.QuadPart = Response->Rsp.Overwrite.FileInfo.FileSize; - CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize); + FileNode->CcStatus = FspCcSetFileSizes( + FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize); FspFileNodeRelease(FileNode, Both); diff --git a/src/sys/driver.h b/src/sys/driver.h index 44505db8..96b1fd76 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -321,8 +321,9 @@ ULONG FspHashMixPointer(PVOID Pointer) #endif } -/* utility: GUIDs */ +/* utility */ NTSTATUS FspCreateGuid(GUID *Guid); +NTSTATUS FspCcSetFileSizes(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes); /* utility: synchronous work queue */ typedef struct @@ -565,6 +566,8 @@ typedef struct UINT32 DeleteOnClose:1; UINT32 DeletePending:1; } Flags; + /* locked under same rules as Header.AllocationSize/FileSize */ + NTSTATUS CcStatus; /* read-only after creation (and insertion in the ContextTable) */ PDEVICE_OBJECT FsvolDeviceObject; UINT64 UserContext; @@ -598,11 +601,11 @@ VOID FspFileNodeDereference(FSP_FILE_NODE *FileNode) if (0 == RefCount) FspFileNodeDelete(FileNode); } -VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags); -BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags); -VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); -BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); -VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); +BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); +BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags); FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, @@ -612,11 +615,11 @@ BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO * VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, const FSP_FSCTL_FILE_INFO *FileInfo); NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc); VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc); -#define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireShared(N, FspFileNodeAcquire ## F) -#define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireShared(N, FspFileNodeAcquire ## F) -#define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusive(N, FspFileNodeAcquire ## F) -#define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusive(N, FspFileNodeAcquire ## F) -#define FspFileNodeRelease(N,F) FspFileNodeRelease(N, FspFileNodeAcquire ## F) +#define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireSharedF(N, FspFileNodeAcquire ## F) +#define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireSharedF(N, FspFileNodeAcquire ## F) +#define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusiveF(N, FspFileNodeAcquire ## F) +#define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusiveF(N, FspFileNodeAcquire ## F) +#define FspFileNodeRelease(N,F) FspFileNodeReleaseF(N, FspFileNodeAcquire ## F) /* debug */ #if DBG diff --git a/src/sys/file.c b/src/sys/file.c index 83b5d2af..e0c7ca5d 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -6,20 +6,14 @@ #include -#undef FspFileNodeAcquireShared -#undef FspFileNodeTryAcquireShared -#undef FspFileNodeAcquireExclusive -#undef FspFileNodeTryAcquireExclusive -#undef FspFileNodeRelease - NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject, ULONG ExtraSize, FSP_FILE_NODE **PFileNode); VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode); -VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags); -BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags); -VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); -BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); -VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); +BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); +BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags); FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, @@ -33,11 +27,11 @@ VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc); #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFileNodeCreate) #pragma alloc_text(PAGE, FspFileNodeDelete) -#pragma alloc_text(PAGE, FspFileNodeAcquireShared) -#pragma alloc_text(PAGE, FspFileNodeTryAcquireShared) -#pragma alloc_text(PAGE, FspFileNodeAcquireExclusive) -#pragma alloc_text(PAGE, FspFileNodeTryAcquireExclusive) -#pragma alloc_text(PAGE, FspFileNodeRelease) +#pragma alloc_text(PAGE, FspFileNodeAcquireSharedF) +#pragma alloc_text(PAGE, FspFileNodeTryAcquireSharedF) +#pragma alloc_text(PAGE, FspFileNodeAcquireExclusiveF) +#pragma alloc_text(PAGE, FspFileNodeTryAcquireExclusiveF) +#pragma alloc_text(PAGE, FspFileNodeReleaseF) #pragma alloc_text(PAGE, FspFileNodeOpen) #pragma alloc_text(PAGE, FspFileNodeClose) #pragma alloc_text(PAGE, FspFileNodeGetFileInfo) @@ -77,7 +71,7 @@ NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject, FileNode->Header.IsFastIoPossible = FastIoIsQuestionable; FileNode->Header.Resource = &NonPaged->Resource; FileNode->Header.PagingIoResource = &NonPaged->PagingIoResource; - FileNode->Header.ValidDataLength.QuadPart = 0x7fffffffffffffffLL; + FileNode->Header.ValidDataLength.QuadPart = MAXLONGLONG; /* disable ValidDataLength functionality */ FsRtlSetupAdvancedHeader(&FileNode->Header, &NonPaged->HeaderFastMutex); FileNode->NonPaged = NonPaged; @@ -106,7 +100,7 @@ VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode) FspFree(FileNode); } -VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags) +VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags) { PAGED_CODE(); @@ -117,7 +111,7 @@ VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags) ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, TRUE); } -BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags) +BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags) { PAGED_CODE(); @@ -144,7 +138,7 @@ BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags) return Result; } -VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags) +VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags) { PAGED_CODE(); @@ -155,7 +149,7 @@ VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags) ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, TRUE); } -BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags) +BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags) { PAGED_CODE(); @@ -182,7 +176,7 @@ BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags) return Result; } -VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags) +VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags) { PAGED_CODE(); diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index c6d20c5f..9b4594a8 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -25,9 +25,28 @@ static NTSTATUS FspFsvolQueryStandardInformation(PFILE_OBJECT FileObject, static NTSTATUS FspFsvolQueryInformation( PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); FSP_IOCMPL_DISPATCH FspFsvolQueryInformationComplete; +static NTSTATUS FspFsvolSetAllocationInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response); +static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response); +static NTSTATUS FspFsvolSetDispositionInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response); +static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, BOOLEAN AdvanceOnly, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response); +static NTSTATUS FspFsvolSetPositionInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response); +static NTSTATUS FspFsvolSetRenameInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response); static NTSTATUS FspFsvolSetInformation( PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); FSP_IOCMPL_DISPATCH FspFsvolSetInformationComplete; +static FSP_IOP_REQUEST_FINI FspFsvolSetInformationRequestFini; FSP_DRIVER_DISPATCH FspQueryInformation; FSP_DRIVER_DISPATCH FspSetInformation; @@ -42,8 +61,15 @@ FSP_DRIVER_DISPATCH FspSetInformation; #pragma alloc_text(PAGE, FspFsvolQueryStandardInformation) #pragma alloc_text(PAGE, FspFsvolQueryInformation) #pragma alloc_text(PAGE, FspFsvolQueryInformationComplete) +#pragma alloc_text(PAGE, FspFsvolSetAllocationInformation) +#pragma alloc_text(PAGE, FspFsvolSetBasicInformation) +#pragma alloc_text(PAGE, FspFsvolSetDispositionInformation) +#pragma alloc_text(PAGE, FspFsvolSetEndOfFileInformation) +#pragma alloc_text(PAGE, FspFsvolSetPositionInformation) +#pragma alloc_text(PAGE, FspFsvolSetRenameInformation) #pragma alloc_text(PAGE, FspFsvolSetInformation) #pragma alloc_text(PAGE, FspFsvolSetInformationComplete) +#pragma alloc_text(PAGE, FspFsvolSetInformationRequestFini) #pragma alloc_text(PAGE, FspQueryInformation) #pragma alloc_text(PAGE, FspSetInformation) #endif @@ -418,12 +444,171 @@ VOID FspFsvolQueryInformationComplete( IrpSp->FileObject); } +enum +{ + RequestFileNode = 0, + RequestAcquireFlags = 1, +}; + +static NTSTATUS FspFsvolSetAllocationInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + if (0 != Request) + { + if (sizeof(FILE_ALLOCATION_INFORMATION) > Length) + return STATUS_INVALID_PARAMETER; + + PFILE_ALLOCATION_INFORMATION Info = (PFILE_ALLOCATION_INFORMATION)Buffer; + FSP_FILE_NODE *FileNode = FileObject->FsContext; + BOOLEAN Success; + + Request->Req.SetInformation.Info.Allocation.AllocationSize = Info->AllocationSize.QuadPart; + + FspFileNodeAcquireExclusive(FileNode, Both); + + Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->AllocationSize); + if (!Success) + { + FspFileNodeRelease(FileNode, Both); + + return STATUS_USER_MAPPED_FILE; + } + + FspIopRequestContext(Request, RequestFileNode) = FileNode; + FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireBoth; + + return FSP_STATUS_IOQ_POST; + } + else + { + FspIopRequestContext(Request, RequestFileNode) = 0; + FspIopRequestContext(Request, RequestAcquireFlags) = 0; + + FSP_FILE_NODE *FileNode = FileObject->FsContext; + + FileNode->Header.AllocationSize.QuadPart = Response->Rsp.SetInformation.FileInfo.AllocationSize; + FileNode->Header.FileSize.QuadPart = Response->Rsp.SetInformation.FileInfo.FileSize; + FileNode->CcStatus = FspCcSetFileSizes( + FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize); + + FspFileNodeRelease(FileNode, Both); + + return STATUS_SUCCESS; + } +} + +static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + return STATUS_INVALID_DEVICE_REQUEST; +} + +static NTSTATUS FspFsvolSetDispositionInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + return STATUS_INVALID_DEVICE_REQUEST; +} + +static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, BOOLEAN AdvanceOnly, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + return STATUS_INVALID_DEVICE_REQUEST; +} + +static NTSTATUS FspFsvolSetPositionInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + return STATUS_INVALID_DEVICE_REQUEST; +} + +static NTSTATUS FspFsvolSetRenameInformation(PFILE_OBJECT FileObject, + PVOID Buffer, ULONG Length, + FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_TRANSACT_RSP *Response) +{ + PAGED_CODE(); + + return STATUS_INVALID_DEVICE_REQUEST; +} + static NTSTATUS FspFsvolSetInformation( PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) { PAGED_CODE(); - return STATUS_INVALID_DEVICE_REQUEST; + /* is this a valid FileObject? */ + if (!FspFileNodeIsValid(IrpSp->FileObject->FsContext)) + return STATUS_INVALID_DEVICE_REQUEST; + + NTSTATUS Result; + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); + BOOLEAN FileNameRequired = 0 != FsvolDeviceExtension->VolumeParams.FileNameRequired; + PFILE_OBJECT FileObject = IrpSp->FileObject; + FSP_FILE_NODE *FileNode = FileObject->FsContext; + FSP_FILE_DESC *FileDesc = FileObject->FsContext2; + FILE_INFORMATION_CLASS FileInformationClass = IrpSp->Parameters.SetFile.FileInformationClass; + PVOID Buffer = Irp->AssociatedIrp.SystemBuffer; + ULONG Length = IrpSp->Parameters.QueryFile.Length; + FSP_FSCTL_TRANSACT_REQ *Request; + + ASSERT(FileNode == FileDesc->FileNode); + + Result = FspIopCreateRequest(Irp, FileNameRequired ? &FileNode->FileName : 0, 0, &Request); + if (!NT_SUCCESS(Result)) + return Result; + + Request->Kind = FspFsctlTransactSetInformationKind; + Request->Req.SetInformation.UserContext = FileNode->UserContext; + Request->Req.SetInformation.UserContext2 = FileDesc->UserContext2; + Request->Req.SetInformation.FileInformationClass = FileInformationClass; + + switch (FileInformationClass) + { + case FileAllocationInformation: + Result = FspFsvolSetAllocationInformation(FileObject, Buffer, Length, Request, 0); + break; + case FileBasicInformation: + Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, Request, 0); + break; + case FileDispositionInformation: + Result = FspFsvolSetDispositionInformation(FileObject, Buffer, Length, Request, 0); + break; + case FileEndOfFileInformation: + Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, + IrpSp->Parameters.SetFile.AdvanceOnly, Request, 0); + break; + case FileLinkInformation: + Result = STATUS_INVALID_PARAMETER; /* no hard link support */ + break; + case FilePositionInformation: + Result = FspFsvolSetPositionInformation(FileObject, Buffer, Length, Request, 0); + break; + case FileRenameInformation: + Result = FspFsvolSetRenameInformation(FileObject, Buffer, Length, Request, 0); + break; + case FileValidDataLengthInformation: + Result = STATUS_INVALID_PARAMETER; /* no ValidDataLength support */ + break; + default: + Result = STATUS_INVALID_PARAMETER; + break; + } + + return Result; } VOID FspFsvolSetInformationComplete( @@ -431,11 +616,76 @@ VOID FspFsvolSetInformationComplete( { FSP_ENTER_IOC(PAGED_CODE()); + if (!NT_SUCCESS(Response->IoStatus.Status)) + { + Irp->IoStatus.Information = Response->IoStatus.Information; + Result = Response->IoStatus.Status; + FSP_RETURN(); + } + + PFILE_OBJECT FileObject = IrpSp->FileObject; + FSP_FILE_NODE *FileNode = FileObject->FsContext; + FILE_INFORMATION_CLASS FileInformationClass = IrpSp->Parameters.SetFile.FileInformationClass; + PVOID Buffer = Irp->AssociatedIrp.SystemBuffer; + ULONG Length = IrpSp->Parameters.QueryFile.Length; + + FspFileNodeSetFileInfo(FileNode, &Response->Rsp.SetInformation.FileInfo); + + switch (FileInformationClass) + { + case FileAllocationInformation: + Result = FspFsvolSetAllocationInformation(FileObject, Buffer, Length, 0, Response); + break; + case FileBasicInformation: + Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, 0, Response); + break; + case FileDispositionInformation: + Result = FspFsvolSetDispositionInformation(FileObject, Buffer, Length, 0, Response); + break; + case FileEndOfFileInformation: + Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, + IrpSp->Parameters.SetFile.AdvanceOnly, 0, Response); + break; + case FileLinkInformation: + Result = STATUS_INVALID_PARAMETER; /* no hard link support */ + break; + case FilePositionInformation: + Result = FspFsvolSetPositionInformation(FileObject, Buffer, Length, 0, Response); + break; + case FileRenameInformation: + Result = FspFsvolSetRenameInformation(FileObject, Buffer, Length, 0, Response); + break; + case FileValidDataLengthInformation: + Result = STATUS_INVALID_PARAMETER; /* no ValidDataLength support */ + break; + default: + ASSERT(0); + Result = STATUS_INVALID_PARAMETER; + break; + } + + ASSERT(FSP_STATUS_IOQ_POST != Result); + + Irp->IoStatus.Information = 0; + FSP_LEAVE_IOC("%s, FileObject=%p", FileInformationClassSym(IrpSp->Parameters.SetFile.FileInformationClass), IrpSp->FileObject); } +static VOID FspFsvolSetInformationRequestFini(PVOID Context[3]) +{ + PAGED_CODE(); + + FSP_FILE_NODE *FileNode = Context[RequestFileNode]; + ULONG AcquireFlags = (ULONG)(UINT_PTR)Context[RequestAcquireFlags]; + + if (0 != FileNode) + FspFileNodeReleaseF(FileNode, AcquireFlags); + + Context[RequestFileNode] = Context[RequestAcquireFlags] = 0; +} + NTSTATUS FspQueryInformation( PDEVICE_OBJECT DeviceObject, PIRP Irp) { diff --git a/src/sys/util.c b/src/sys/util.c index 5054c244..d227ae70 100644 --- a/src/sys/util.c +++ b/src/sys/util.c @@ -40,6 +40,19 @@ NTSTATUS FspCreateGuid(GUID *Guid) return Result; } +NTSTATUS FspCcSetFileSizes(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes) +{ + try + { + CcSetFileSizes(FileObject, FileSizes); + return STATUS_SUCCESS; + } + except(EXCEPTION_EXECUTE_HANDLER) + { + return GetExceptionCode(); + } +} + VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem, PWORKER_THREAD_ROUTINE Routine, PVOID Context) {