mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-08 04:52:10 -05:00
sys: IRP_MJ_FLUSH_BUFFERS
This commit is contained in:
parent
b187d47bca
commit
e6ab31a0e0
@ -246,6 +246,11 @@ typedef struct
|
|||||||
} Info;
|
} Info;
|
||||||
} SetInformation;
|
} SetInformation;
|
||||||
struct
|
struct
|
||||||
|
{
|
||||||
|
UINT64 UserContext;
|
||||||
|
UINT64 UserContext2;
|
||||||
|
} FlushBuffers;
|
||||||
|
struct
|
||||||
{
|
{
|
||||||
UINT32 FsInformationClass;
|
UINT32 FsInformationClass;
|
||||||
union
|
union
|
||||||
|
@ -72,6 +72,9 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE
|
|||||||
FSP_FSCTL_TRANSACT_REQ *Request,
|
FSP_FSCTL_TRANSACT_REQ *Request,
|
||||||
PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length, BOOLEAN WriteToEndOfFile,
|
PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length, BOOLEAN WriteToEndOfFile,
|
||||||
PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo);
|
PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo);
|
||||||
|
NTSTATUS (*Flush)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request,
|
||||||
|
PVOID FileNode);
|
||||||
NTSTATUS (*GetFileInfo)(FSP_FILE_SYSTEM *FileSystem,
|
NTSTATUS (*GetFileInfo)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request,
|
FSP_FSCTL_TRANSACT_REQ *Request,
|
||||||
PVOID FileNode,
|
PVOID FileNode,
|
||||||
@ -196,6 +199,8 @@ FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
|
FSP_API NTSTATUS FspFileSystemOpFlushBuffers(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
FSP_API NTSTATUS FspFileSystemOpQueryVolumeInformation(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpQueryVolumeInformation(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
FSP_API NTSTATUS FspFileSystemOpSetVolumeInformation(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpSetVolumeInformation(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
@ -46,14 +46,15 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath,
|
|||||||
FileSystem->Operations[FspFsctlTransactCloseKind] = FspFileSystemOpClose;
|
FileSystem->Operations[FspFsctlTransactCloseKind] = FspFileSystemOpClose;
|
||||||
FileSystem->Operations[FspFsctlTransactReadKind] = FspFileSystemOpRead;
|
FileSystem->Operations[FspFsctlTransactReadKind] = FspFileSystemOpRead;
|
||||||
FileSystem->Operations[FspFsctlTransactWriteKind] = FspFileSystemOpWrite;
|
FileSystem->Operations[FspFsctlTransactWriteKind] = FspFileSystemOpWrite;
|
||||||
// !!!: ...
|
|
||||||
FileSystem->Operations[FspFsctlTransactQueryInformationKind] = FspFileSystemOpQueryInformation;
|
FileSystem->Operations[FspFsctlTransactQueryInformationKind] = FspFileSystemOpQueryInformation;
|
||||||
FileSystem->Operations[FspFsctlTransactSetInformationKind] = FspFileSystemOpSetInformation;
|
FileSystem->Operations[FspFsctlTransactSetInformationKind] = FspFileSystemOpSetInformation;
|
||||||
|
FileSystem->Operations[FspFsctlTransactFlushBuffersKind] = FspFileSystemOpFlushBuffers;
|
||||||
FileSystem->Operations[FspFsctlTransactQueryVolumeInformationKind] = FspFileSystemOpQueryVolumeInformation;
|
FileSystem->Operations[FspFsctlTransactQueryVolumeInformationKind] = FspFileSystemOpQueryVolumeInformation;
|
||||||
FileSystem->Operations[FspFsctlTransactSetVolumeInformationKind] = FspFileSystemOpSetVolumeInformation;
|
FileSystem->Operations[FspFsctlTransactSetVolumeInformationKind] = FspFileSystemOpSetVolumeInformation;
|
||||||
FileSystem->Operations[FspFsctlTransactQueryDirectoryKind] = FspFileSystemOpQueryDirectory;
|
FileSystem->Operations[FspFsctlTransactQueryDirectoryKind] = FspFileSystemOpQueryDirectory;
|
||||||
FileSystem->Operations[FspFsctlTransactQuerySecurityKind] = FspFileSystemOpQuerySecurity;
|
FileSystem->Operations[FspFsctlTransactQuerySecurityKind] = FspFileSystemOpQuerySecurity;
|
||||||
FileSystem->Operations[FspFsctlTransactSetSecurityKind] = FspFileSystemOpSetSecurity;
|
FileSystem->Operations[FspFsctlTransactSetSecurityKind] = FspFileSystemOpSetSecurity;
|
||||||
|
// !!!: ...
|
||||||
FileSystem->Interface = Interface;
|
FileSystem->Interface = Interface;
|
||||||
|
|
||||||
*PFileSystem = FileSystem;
|
*PFileSystem = FileSystem;
|
||||||
|
@ -463,6 +463,16 @@ FSP_API NTSTATUS FspFileSystemOpWrite(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspFileSystemOpFlushBuffers(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
|
{
|
||||||
|
if (0 == FileSystem->Interface->Flush)
|
||||||
|
return STATUS_SUCCESS; /* liar! */
|
||||||
|
|
||||||
|
return FileSystem->Interface->Flush(FileSystem, Request,
|
||||||
|
(PVOID)Request->Req.FlushBuffers.UserContext);
|
||||||
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
{
|
{
|
||||||
|
@ -408,6 +408,8 @@ NTSTATUS FspCcMdlReadComplete(PFILE_OBJECT FileObject, PMDL MdlChain);
|
|||||||
NTSTATUS FspCcPrepareMdlWrite(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length,
|
NTSTATUS FspCcPrepareMdlWrite(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length,
|
||||||
PMDL *PMdlChain, PIO_STATUS_BLOCK IoStatus);
|
PMDL *PMdlChain, PIO_STATUS_BLOCK IoStatus);
|
||||||
NTSTATUS FspCcMdlWriteComplete(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, PMDL MdlChain);
|
NTSTATUS FspCcMdlWriteComplete(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, PMDL MdlChain);
|
||||||
|
NTSTATUS FspCcFlushCache(PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
||||||
|
PLARGE_INTEGER FileOffset, ULONG Length, PIO_STATUS_BLOCK IoStatus);
|
||||||
NTSTATUS FspQuerySecurityDescriptorInfo(SECURITY_INFORMATION SecurityInformation,
|
NTSTATUS FspQuerySecurityDescriptorInfo(SECURITY_INFORMATION SecurityInformation,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, PULONG PLength,
|
PSECURITY_DESCRIPTOR SecurityDescriptor, PULONG PLength,
|
||||||
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptor);
|
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptor);
|
||||||
|
@ -9,20 +9,74 @@
|
|||||||
static NTSTATUS FspFsvolFlushBuffers(
|
static NTSTATUS FspFsvolFlushBuffers(
|
||||||
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
||||||
FSP_IOCMPL_DISPATCH FspFsvolFlushBuffersComplete;
|
FSP_IOCMPL_DISPATCH FspFsvolFlushBuffersComplete;
|
||||||
|
static FSP_IOP_REQUEST_FINI FspFsvolFlushBuffersRequestFini;
|
||||||
FSP_DRIVER_DISPATCH FspFlushBuffers;
|
FSP_DRIVER_DISPATCH FspFlushBuffers;
|
||||||
|
|
||||||
#ifdef ALLOC_PRAGMA
|
#ifdef ALLOC_PRAGMA
|
||||||
#pragma alloc_text(PAGE, FspFsvolFlushBuffers)
|
#pragma alloc_text(PAGE, FspFsvolFlushBuffers)
|
||||||
#pragma alloc_text(PAGE, FspFsvolFlushBuffersComplete)
|
#pragma alloc_text(PAGE, FspFsvolFlushBuffersComplete)
|
||||||
|
#pragma alloc_text(PAGE, FspFsvolFlushBuffersRequestFini)
|
||||||
#pragma alloc_text(PAGE, FspFlushBuffers)
|
#pragma alloc_text(PAGE, FspFlushBuffers)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
/* FlushBuffers */
|
||||||
|
RequestFileNode = 0,
|
||||||
|
};
|
||||||
|
|
||||||
static NTSTATUS FspFsvolFlushBuffers(
|
static NTSTATUS FspFsvolFlushBuffers(
|
||||||
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
NTSTATUS Result;
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request;
|
||||||
|
|
||||||
|
/* is this a valid FileObject? */
|
||||||
|
if (!FspFileNodeIsValid(IrpSp->FileObject->FsContext))
|
||||||
|
{
|
||||||
|
/* indicate that we are flushing the whole volume! */
|
||||||
|
Result = FspIopCreateRequest(Irp, 0, 0, &Request);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
return Result;
|
||||||
|
|
||||||
|
Request->Kind = FspFsctlTransactFlushBuffersKind;
|
||||||
|
|
||||||
|
return FSP_STATUS_IOQ_POST;
|
||||||
|
}
|
||||||
|
|
||||||
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
|
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||||
|
FSP_FILE_DESC *FileDesc = FileObject->FsContext2;
|
||||||
|
IO_STATUS_BLOCK IoStatus;
|
||||||
|
|
||||||
|
ASSERT(FileNode == FileDesc->FileNode);
|
||||||
|
|
||||||
|
FspFileNodeAcquireExclusive(FileNode, Full);
|
||||||
|
|
||||||
|
Result = FspCcFlushCache(FileObject->SectionObjectPointer, 0, 0, &IoStatus);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspFileNodeRelease(FileNode, Full);
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolFlushBuffersRequestFini, &Request);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspFileNodeRelease(FileNode, Full);
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Request->Kind = FspFsctlTransactFlushBuffersKind;
|
||||||
|
Request->Req.FlushBuffers.UserContext = FileNode->UserContext;
|
||||||
|
Request->Req.FlushBuffers.UserContext2 = FileDesc->UserContext2;
|
||||||
|
|
||||||
|
FspFileNodeSetOwner(FileNode, Full, Request);
|
||||||
|
FspIopRequestContext(Request, RequestFileNode) = FileNode;
|
||||||
|
|
||||||
|
return FSP_STATUS_IOQ_POST;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS FspFsvolFlushBuffersComplete(
|
NTSTATUS FspFsvolFlushBuffersComplete(
|
||||||
@ -30,7 +84,18 @@ NTSTATUS FspFsvolFlushBuffersComplete(
|
|||||||
{
|
{
|
||||||
FSP_ENTER_IOC(PAGED_CODE());
|
FSP_ENTER_IOC(PAGED_CODE());
|
||||||
|
|
||||||
FSP_LEAVE_IOC("%s", "");
|
FSP_LEAVE_IOC("FileObject=%p",
|
||||||
|
IrpSp->FileObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID FspFsvolFlushBuffersRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[4])
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
FSP_FILE_NODE *FileNode = Context[RequestFileNode];
|
||||||
|
|
||||||
|
if (0 != FileNode)
|
||||||
|
FspFileNodeReleaseOwner(FileNode, Full, Request);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS FspFlushBuffers(
|
NTSTATUS FspFlushBuffers(
|
||||||
@ -46,5 +111,6 @@ NTSTATUS FspFlushBuffers(
|
|||||||
FSP_RETURN(Result = STATUS_INVALID_DEVICE_REQUEST);
|
FSP_RETURN(Result = STATUS_INVALID_DEVICE_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
FSP_LEAVE_MJ("%s", "");
|
FSP_LEAVE_MJ("FileObject=%p",
|
||||||
|
IrpSp->FileObject);
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,8 @@ NTSTATUS FspCcMdlReadComplete(PFILE_OBJECT FileObject, PMDL MdlChain);
|
|||||||
NTSTATUS FspCcPrepareMdlWrite(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length,
|
NTSTATUS FspCcPrepareMdlWrite(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length,
|
||||||
PMDL *PMdlChain, PIO_STATUS_BLOCK IoStatus);
|
PMDL *PMdlChain, PIO_STATUS_BLOCK IoStatus);
|
||||||
NTSTATUS FspCcMdlWriteComplete(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, PMDL MdlChain);
|
NTSTATUS FspCcMdlWriteComplete(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, PMDL MdlChain);
|
||||||
|
NTSTATUS FspCcFlushCache(PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
||||||
|
PLARGE_INTEGER FileOffset, ULONG Length, PIO_STATUS_BLOCK IoStatus);
|
||||||
NTSTATUS FspQuerySecurityDescriptorInfo(SECURITY_INFORMATION SecurityInformation,
|
NTSTATUS FspQuerySecurityDescriptorInfo(SECURITY_INFORMATION SecurityInformation,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, PULONG PLength,
|
PSECURITY_DESCRIPTOR SecurityDescriptor, PULONG PLength,
|
||||||
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptor);
|
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptor);
|
||||||
@ -83,6 +85,7 @@ VOID FspSafeMdlDelete(FSP_SAFE_MDL *SafeMdl);
|
|||||||
#pragma alloc_text(PAGE, FspCcMdlReadComplete)
|
#pragma alloc_text(PAGE, FspCcMdlReadComplete)
|
||||||
#pragma alloc_text(PAGE, FspCcPrepareMdlWrite)
|
#pragma alloc_text(PAGE, FspCcPrepareMdlWrite)
|
||||||
#pragma alloc_text(PAGE, FspCcMdlWriteComplete)
|
#pragma alloc_text(PAGE, FspCcMdlWriteComplete)
|
||||||
|
#pragma alloc_text(PAGE, FspCcFlushCache)
|
||||||
#pragma alloc_text(PAGE, FspQuerySecurityDescriptorInfo)
|
#pragma alloc_text(PAGE, FspQuerySecurityDescriptorInfo)
|
||||||
#pragma alloc_text(PAGE, FspNotifyInitializeSync)
|
#pragma alloc_text(PAGE, FspNotifyInitializeSync)
|
||||||
#pragma alloc_text(PAGE, FspNotifyFullChangeDirectory)
|
#pragma alloc_text(PAGE, FspNotifyFullChangeDirectory)
|
||||||
@ -528,6 +531,29 @@ NTSTATUS FspCcMdlWriteComplete(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffse
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS FspCcFlushCache(PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
||||||
|
PLARGE_INTEGER FileOffset, ULONG Length, PIO_STATUS_BLOCK IoStatus)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CcFlushCache(SectionObjectPointer, FileOffset, Length, IoStatus);
|
||||||
|
Result = IoStatus->Status;
|
||||||
|
}
|
||||||
|
except (EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Result = GetExceptionCode();
|
||||||
|
|
||||||
|
IoStatus->Information = 0;
|
||||||
|
IoStatus->Status = Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS FspQuerySecurityDescriptorInfo(SECURITY_INFORMATION SecurityInformation,
|
NTSTATUS FspQuerySecurityDescriptorInfo(SECURITY_INFORMATION SecurityInformation,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, PULONG PLength,
|
PSECURITY_DESCRIPTOR SecurityDescriptor, PULONG PLength,
|
||||||
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptor)
|
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptor)
|
||||||
|
@ -501,6 +501,14 @@ static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS Flush(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request,
|
||||||
|
PVOID FileNode)
|
||||||
|
{
|
||||||
|
/* nothing to do, since we do not cache anything */
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request,
|
FSP_FSCTL_TRANSACT_REQ *Request,
|
||||||
PVOID FileNode0,
|
PVOID FileNode0,
|
||||||
@ -802,6 +810,7 @@ static FSP_FILE_SYSTEM_INTERFACE MemfsInterface =
|
|||||||
Close,
|
Close,
|
||||||
Read,
|
Read,
|
||||||
Write,
|
Write,
|
||||||
|
Flush,
|
||||||
GetFileInfo,
|
GetFileInfo,
|
||||||
SetBasicInfo,
|
SetBasicInfo,
|
||||||
SetAllocationSize,
|
SetAllocationSize,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user