mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 00:43:00 -05:00
sys: implement FastIo operations
FspFastIoQueryOpen
This commit is contained in:
parent
0d849ffcc8
commit
3a286324ff
@ -122,7 +122,7 @@ NTSTATUS DriverEntry(
|
|||||||
//FspFastIoDispatch.FastIoWriteCompressed = 0;
|
//FspFastIoDispatch.FastIoWriteCompressed = 0;
|
||||||
//FspFastIoDispatch.MdlReadCompleteCompressed = 0;
|
//FspFastIoDispatch.MdlReadCompleteCompressed = 0;
|
||||||
//FspFastIoDispatch.MdlWriteCompleteCompressed = 0;
|
//FspFastIoDispatch.MdlWriteCompleteCompressed = 0;
|
||||||
//FspFastIoDispatch.FastIoQueryOpen = 0;
|
FspFastIoDispatch.FastIoQueryOpen = FspFastIoQueryOpen;
|
||||||
FspFastIoDispatch.ReleaseForModWrite = FspReleaseForModWrite;
|
FspFastIoDispatch.ReleaseForModWrite = FspReleaseForModWrite;
|
||||||
FspFastIoDispatch.AcquireForCcFlush = FspAcquireForCcFlush;
|
FspFastIoDispatch.AcquireForCcFlush = FspAcquireForCcFlush;
|
||||||
FspFastIoDispatch.ReleaseForCcFlush = FspReleaseForCcFlush;
|
FspFastIoDispatch.ReleaseForCcFlush = FspReleaseForCcFlush;
|
||||||
|
@ -341,6 +341,7 @@ FSP_IOCMPL_DISPATCH FspFsvolWriteComplete;
|
|||||||
FAST_IO_QUERY_BASIC_INFO FspFastIoQueryBasicInfo;
|
FAST_IO_QUERY_BASIC_INFO FspFastIoQueryBasicInfo;
|
||||||
FAST_IO_QUERY_STANDARD_INFO FspFastIoQueryStandardInfo;
|
FAST_IO_QUERY_STANDARD_INFO FspFastIoQueryStandardInfo;
|
||||||
FAST_IO_QUERY_NETWORK_OPEN_INFO FspFastIoQueryNetworkOpenInfo;
|
FAST_IO_QUERY_NETWORK_OPEN_INFO FspFastIoQueryNetworkOpenInfo;
|
||||||
|
FAST_IO_QUERY_OPEN FspFastIoQueryOpen;
|
||||||
FAST_IO_CHECK_IF_POSSIBLE FspFastIoCheckIfPossible;
|
FAST_IO_CHECK_IF_POSSIBLE FspFastIoCheckIfPossible;
|
||||||
FAST_IO_ACQUIRE_FILE FspAcquireFileForNtCreateSection;
|
FAST_IO_ACQUIRE_FILE FspAcquireFileForNtCreateSection;
|
||||||
FAST_IO_RELEASE_FILE FspReleaseFileForNtCreateSection;
|
FAST_IO_RELEASE_FILE FspReleaseFileForNtCreateSection;
|
||||||
@ -1385,6 +1386,8 @@ NTSTATUS FspFileNodeRenameCheck(PDEVICE_OBJECT FsvolDeviceObject, PIRP OplockIrp
|
|||||||
VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName);
|
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);
|
||||||
|
BOOLEAN FspFileNodeTryGetFileInfoByName(PDEVICE_OBJECT FsvolDeviceObject,
|
||||||
|
PUNICODE_STRING FileName, 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, BOOLEAN TruncateOnClose);
|
const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose);
|
||||||
BOOLEAN FspFileNodeTrySetFileInfoOnOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
BOOLEAN FspFileNodeTrySetFileInfoOnOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||||
|
@ -61,6 +61,8 @@ NTSTATUS FspFileNodeRenameCheck(PDEVICE_OBJECT FsvolDeviceObject, PIRP OplockIrp
|
|||||||
VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName);
|
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);
|
||||||
|
BOOLEAN FspFileNodeTryGetFileInfoByName(PDEVICE_OBJECT FsvolDeviceObject,
|
||||||
|
PUNICODE_STRING FileName, 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, BOOLEAN TruncateOnClose);
|
const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose);
|
||||||
BOOLEAN FspFileNodeTrySetFileInfoOnOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
BOOLEAN FspFileNodeTrySetFileInfoOnOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||||
@ -136,6 +138,7 @@ VOID FspFileNodeOplockComplete(PVOID Context, PIRP Irp);
|
|||||||
#pragma alloc_text(PAGE, FspFileNodeRename)
|
#pragma alloc_text(PAGE, FspFileNodeRename)
|
||||||
#pragma alloc_text(PAGE, FspFileNodeGetFileInfo)
|
#pragma alloc_text(PAGE, FspFileNodeGetFileInfo)
|
||||||
#pragma alloc_text(PAGE, FspFileNodeTryGetFileInfo)
|
#pragma alloc_text(PAGE, FspFileNodeTryGetFileInfo)
|
||||||
|
#pragma alloc_text(PAGE, FspFileNodeTryGetFileInfoByName)
|
||||||
#pragma alloc_text(PAGE, FspFileNodeSetFileInfo)
|
#pragma alloc_text(PAGE, FspFileNodeSetFileInfo)
|
||||||
#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfoOnOpen)
|
#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfoOnOpen)
|
||||||
#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfo)
|
#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfo)
|
||||||
@ -1640,6 +1643,32 @@ BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOLEAN FspFileNodeTryGetFileInfoByName(PDEVICE_OBJECT FsvolDeviceObject,
|
||||||
|
PUNICODE_STRING FileName, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
FSP_FILE_NODE *FileNode;
|
||||||
|
BOOLEAN Result;
|
||||||
|
|
||||||
|
FspFsvolDeviceLockContextTable(FsvolDeviceObject);
|
||||||
|
FileNode = FspFsvolDeviceLookupContextByName(FsvolDeviceObject, FileName);
|
||||||
|
if (0 != FileNode)
|
||||||
|
FspFileNodeReference(FileNode);
|
||||||
|
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
|
||||||
|
|
||||||
|
Result = FALSE;
|
||||||
|
if (0 != FileNode)
|
||||||
|
{
|
||||||
|
FspFileNodeAcquireShared(FileNode, Main);
|
||||||
|
Result = FspFileNodeTryGetFileInfo(FileNode, FileInfo);
|
||||||
|
FspFileNodeRelease(FileNode, Main);
|
||||||
|
FspFileNodeDereference(FileNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||||
const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose)
|
const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose)
|
||||||
{
|
{
|
||||||
|
@ -84,6 +84,7 @@ FSP_DRIVER_DISPATCH FspSetInformation;
|
|||||||
FAST_IO_QUERY_BASIC_INFO FspFastIoQueryBasicInfo;
|
FAST_IO_QUERY_BASIC_INFO FspFastIoQueryBasicInfo;
|
||||||
FAST_IO_QUERY_STANDARD_INFO FspFastIoQueryStandardInfo;
|
FAST_IO_QUERY_STANDARD_INFO FspFastIoQueryStandardInfo;
|
||||||
FAST_IO_QUERY_NETWORK_OPEN_INFO FspFastIoQueryNetworkOpenInfo;
|
FAST_IO_QUERY_NETWORK_OPEN_INFO FspFastIoQueryNetworkOpenInfo;
|
||||||
|
FAST_IO_QUERY_OPEN FspFastIoQueryOpen;
|
||||||
|
|
||||||
#ifdef ALLOC_PRAGMA
|
#ifdef ALLOC_PRAGMA
|
||||||
#pragma alloc_text(PAGE, FspFsvolQueryAllInformation)
|
#pragma alloc_text(PAGE, FspFsvolQueryAllInformation)
|
||||||
@ -118,6 +119,7 @@ FAST_IO_QUERY_NETWORK_OPEN_INFO FspFastIoQueryNetworkOpenInfo;
|
|||||||
#pragma alloc_text(PAGE, FspFastIoQueryBasicInfo)
|
#pragma alloc_text(PAGE, FspFastIoQueryBasicInfo)
|
||||||
#pragma alloc_text(PAGE, FspFastIoQueryStandardInfo)
|
#pragma alloc_text(PAGE, FspFastIoQueryStandardInfo)
|
||||||
#pragma alloc_text(PAGE, FspFastIoQueryNetworkOpenInfo)
|
#pragma alloc_text(PAGE, FspFastIoQueryNetworkOpenInfo)
|
||||||
|
#pragma alloc_text(PAGE, FspFastIoQueryOpen)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@ -1768,7 +1770,7 @@ NTSTATUS FspSetInformation(
|
|||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN FspFastIoQueryBasicInfo(
|
BOOLEAN FspFastIoQueryBasicInfo(
|
||||||
PFILE_OBJECT FileObject, BOOLEAN Wait, PFILE_BASIC_INFORMATION Info,
|
PFILE_OBJECT FileObject, BOOLEAN CanWait, PFILE_BASIC_INFORMATION Info,
|
||||||
PIO_STATUS_BLOCK PIoStatus, PDEVICE_OBJECT DeviceObject)
|
PIO_STATUS_BLOCK PIoStatus, PDEVICE_OBJECT DeviceObject)
|
||||||
{
|
{
|
||||||
FSP_ENTER_BOOL(PAGED_CODE());
|
FSP_ENTER_BOOL(PAGED_CODE());
|
||||||
@ -1779,12 +1781,13 @@ BOOLEAN FspFastIoQueryBasicInfo(
|
|||||||
if (!FspFileNodeIsValid(FileNode))
|
if (!FspFileNodeIsValid(FileNode))
|
||||||
FSP_RETURN(Result = FALSE);
|
FSP_RETURN(Result = FALSE);
|
||||||
|
|
||||||
FspFileNodeAcquireShared(FileNode, Main);
|
Result = FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait);
|
||||||
|
if (Result)
|
||||||
|
{
|
||||||
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
|
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
|
||||||
FspFileNodeRelease(FileNode, Main);
|
FspFileNodeRelease(FileNode, Main);
|
||||||
if (Result)
|
if (Result)
|
||||||
{
|
{
|
||||||
|
|
||||||
PVOID Buffer = Info;
|
PVOID Buffer = Info;
|
||||||
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
|
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
|
||||||
NTSTATUS Result0 = FspFsvolQueryBasicInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
|
NTSTATUS Result0 = FspFsvolQueryBasicInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
|
||||||
@ -1794,12 +1797,13 @@ BOOLEAN FspFastIoQueryBasicInfo(
|
|||||||
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
|
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
|
||||||
PIoStatus->Status = Result0;
|
PIoStatus->Status = Result0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FSP_LEAVE_BOOL("FileObject=%p", FileObject);
|
FSP_LEAVE_BOOL("FileObject=%p", FileObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN FspFastIoQueryStandardInfo(
|
BOOLEAN FspFastIoQueryStandardInfo(
|
||||||
PFILE_OBJECT FileObject, BOOLEAN Wait, PFILE_STANDARD_INFORMATION Info,
|
PFILE_OBJECT FileObject, BOOLEAN CanWait, PFILE_STANDARD_INFORMATION Info,
|
||||||
PIO_STATUS_BLOCK PIoStatus, PDEVICE_OBJECT DeviceObject)
|
PIO_STATUS_BLOCK PIoStatus, PDEVICE_OBJECT DeviceObject)
|
||||||
{
|
{
|
||||||
FSP_ENTER_BOOL(PAGED_CODE());
|
FSP_ENTER_BOOL(PAGED_CODE());
|
||||||
@ -1810,12 +1814,13 @@ BOOLEAN FspFastIoQueryStandardInfo(
|
|||||||
if (!FspFileNodeIsValid(FileNode))
|
if (!FspFileNodeIsValid(FileNode))
|
||||||
FSP_RETURN(Result = FALSE);
|
FSP_RETURN(Result = FALSE);
|
||||||
|
|
||||||
FspFileNodeAcquireShared(FileNode, Main);
|
Result = FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait);
|
||||||
|
if (Result)
|
||||||
|
{
|
||||||
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
|
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
|
||||||
FspFileNodeRelease(FileNode, Main);
|
FspFileNodeRelease(FileNode, Main);
|
||||||
if (Result)
|
if (Result)
|
||||||
{
|
{
|
||||||
|
|
||||||
PVOID Buffer = Info;
|
PVOID Buffer = Info;
|
||||||
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
|
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
|
||||||
NTSTATUS Result0 = FspFsvolQueryStandardInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
|
NTSTATUS Result0 = FspFsvolQueryStandardInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
|
||||||
@ -1825,12 +1830,13 @@ BOOLEAN FspFastIoQueryStandardInfo(
|
|||||||
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
|
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
|
||||||
PIoStatus->Status = Result0;
|
PIoStatus->Status = Result0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FSP_LEAVE_BOOL("FileObject=%p", FileObject);
|
FSP_LEAVE_BOOL("FileObject=%p", FileObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN FspFastIoQueryNetworkOpenInfo(
|
BOOLEAN FspFastIoQueryNetworkOpenInfo(
|
||||||
PFILE_OBJECT FileObject, BOOLEAN Wait, PFILE_NETWORK_OPEN_INFORMATION Info,
|
PFILE_OBJECT FileObject, BOOLEAN CanWait, PFILE_NETWORK_OPEN_INFORMATION Info,
|
||||||
PIO_STATUS_BLOCK PIoStatus, PDEVICE_OBJECT DeviceObject)
|
PIO_STATUS_BLOCK PIoStatus, PDEVICE_OBJECT DeviceObject)
|
||||||
{
|
{
|
||||||
FSP_ENTER_BOOL(PAGED_CODE());
|
FSP_ENTER_BOOL(PAGED_CODE());
|
||||||
@ -1841,12 +1847,13 @@ BOOLEAN FspFastIoQueryNetworkOpenInfo(
|
|||||||
if (!FspFileNodeIsValid(FileNode))
|
if (!FspFileNodeIsValid(FileNode))
|
||||||
FSP_RETURN(Result = FALSE);
|
FSP_RETURN(Result = FALSE);
|
||||||
|
|
||||||
FspFileNodeAcquireShared(FileNode, Main);
|
Result = FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait);
|
||||||
|
if (Result)
|
||||||
|
{
|
||||||
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
|
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
|
||||||
FspFileNodeRelease(FileNode, Main);
|
FspFileNodeRelease(FileNode, Main);
|
||||||
if (Result)
|
if (Result)
|
||||||
{
|
{
|
||||||
|
|
||||||
PVOID Buffer = Info;
|
PVOID Buffer = Info;
|
||||||
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
|
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
|
||||||
NTSTATUS Result0 = FspFsvolQueryNetworkOpenInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
|
NTSTATUS Result0 = FspFsvolQueryNetworkOpenInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
|
||||||
@ -1856,6 +1863,35 @@ BOOLEAN FspFastIoQueryNetworkOpenInfo(
|
|||||||
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
|
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
|
||||||
PIoStatus->Status = Result0;
|
PIoStatus->Status = Result0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FSP_LEAVE_BOOL("FileObject=%p", FileObject);
|
FSP_LEAVE_BOOL("FileObject=%p", FileObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOLEAN FspFastIoQueryOpen(
|
||||||
|
PIRP Irp, PFILE_NETWORK_OPEN_INFORMATION Info, PDEVICE_OBJECT DeviceObject)
|
||||||
|
{
|
||||||
|
FSP_ENTER_BOOL(PAGED_CODE());
|
||||||
|
|
||||||
|
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||||
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
|
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
||||||
|
|
||||||
|
Result = FspFileNodeTryGetFileInfoByName(IrpSp->DeviceObject, &FileObject->FileName, &FileInfoBuf);
|
||||||
|
if (Result)
|
||||||
|
{
|
||||||
|
PVOID Buffer = Info;
|
||||||
|
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
|
||||||
|
NTSTATUS Result0 = FspFsvolQueryNetworkOpenInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
|
||||||
|
if (!NT_SUCCESS(Result0))
|
||||||
|
FSP_RETURN(Result = FALSE);
|
||||||
|
|
||||||
|
Irp->IoStatus.Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
|
||||||
|
Irp->IoStatus.Status = Result0;
|
||||||
|
}
|
||||||
|
|
||||||
|
FSP_LEAVE_BOOL("FileObject=%p[%p:\"%wZ\"]",
|
||||||
|
IoGetCurrentIrpStackLocation(Irp)->FileObject,
|
||||||
|
IoGetCurrentIrpStackLocation(Irp)->FileObject->RelatedFileObject,
|
||||||
|
IoGetCurrentIrpStackLocation(Irp)->FileObject->FileName);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user