sys: implement FastIo operations

FspFastIoQueryOpen
This commit is contained in:
Bill Zissimopoulos 2018-09-07 16:01:40 -07:00
parent 0d849ffcc8
commit 3a286324ff
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3
4 changed files with 101 additions and 33 deletions

View File

@ -122,7 +122,7 @@ NTSTATUS DriverEntry(
//FspFastIoDispatch.FastIoWriteCompressed = 0;
//FspFastIoDispatch.MdlReadCompleteCompressed = 0;
//FspFastIoDispatch.MdlWriteCompleteCompressed = 0;
//FspFastIoDispatch.FastIoQueryOpen = 0;
FspFastIoDispatch.FastIoQueryOpen = FspFastIoQueryOpen;
FspFastIoDispatch.ReleaseForModWrite = FspReleaseForModWrite;
FspFastIoDispatch.AcquireForCcFlush = FspAcquireForCcFlush;
FspFastIoDispatch.ReleaseForCcFlush = FspReleaseForCcFlush;

View File

@ -341,6 +341,7 @@ FSP_IOCMPL_DISPATCH FspFsvolWriteComplete;
FAST_IO_QUERY_BASIC_INFO FspFastIoQueryBasicInfo;
FAST_IO_QUERY_STANDARD_INFO FspFastIoQueryStandardInfo;
FAST_IO_QUERY_NETWORK_OPEN_INFO FspFastIoQueryNetworkOpenInfo;
FAST_IO_QUERY_OPEN FspFastIoQueryOpen;
FAST_IO_CHECK_IF_POSSIBLE FspFastIoCheckIfPossible;
FAST_IO_ACQUIRE_FILE FspAcquireFileForNtCreateSection;
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 FspFileNodeGetFileInfo(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,
const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose);
BOOLEAN FspFileNodeTrySetFileInfoOnOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,

View File

@ -61,6 +61,8 @@ NTSTATUS FspFileNodeRenameCheck(PDEVICE_OBJECT FsvolDeviceObject, PIRP OplockIrp
VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName);
VOID FspFileNodeGetFileInfo(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,
const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose);
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, FspFileNodeGetFileInfo)
#pragma alloc_text(PAGE, FspFileNodeTryGetFileInfo)
#pragma alloc_text(PAGE, FspFileNodeTryGetFileInfoByName)
#pragma alloc_text(PAGE, FspFileNodeSetFileInfo)
#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfoOnOpen)
#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfo)
@ -1640,6 +1643,32 @@ BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *
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,
const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose)
{

View File

@ -84,6 +84,7 @@ FSP_DRIVER_DISPATCH FspSetInformation;
FAST_IO_QUERY_BASIC_INFO FspFastIoQueryBasicInfo;
FAST_IO_QUERY_STANDARD_INFO FspFastIoQueryStandardInfo;
FAST_IO_QUERY_NETWORK_OPEN_INFO FspFastIoQueryNetworkOpenInfo;
FAST_IO_QUERY_OPEN FspFastIoQueryOpen;
#ifdef ALLOC_PRAGMA
#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, FspFastIoQueryStandardInfo)
#pragma alloc_text(PAGE, FspFastIoQueryNetworkOpenInfo)
#pragma alloc_text(PAGE, FspFastIoQueryOpen)
#endif
enum
@ -1768,7 +1770,7 @@ NTSTATUS FspSetInformation(
}
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)
{
FSP_ENTER_BOOL(PAGED_CODE());
@ -1779,27 +1781,29 @@ BOOLEAN FspFastIoQueryBasicInfo(
if (!FspFileNodeIsValid(FileNode))
FSP_RETURN(Result = FALSE);
FspFileNodeAcquireShared(FileNode, Main);
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
FspFileNodeRelease(FileNode, Main);
Result = FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait);
if (Result)
{
PVOID Buffer = Info;
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
NTSTATUS Result0 = FspFsvolQueryBasicInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
if (!NT_SUCCESS(Result0))
FSP_RETURN(Result = FALSE);
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
FspFileNodeRelease(FileNode, Main);
if (Result)
{
PVOID Buffer = Info;
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
NTSTATUS Result0 = FspFsvolQueryBasicInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
if (!NT_SUCCESS(Result0))
FSP_RETURN(Result = FALSE);
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
PIoStatus->Status = Result0;
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
PIoStatus->Status = Result0;
}
}
FSP_LEAVE_BOOL("FileObject=%p", FileObject);
}
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)
{
FSP_ENTER_BOOL(PAGED_CODE());
@ -1810,27 +1814,29 @@ BOOLEAN FspFastIoQueryStandardInfo(
if (!FspFileNodeIsValid(FileNode))
FSP_RETURN(Result = FALSE);
FspFileNodeAcquireShared(FileNode, Main);
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
FspFileNodeRelease(FileNode, Main);
Result = FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait);
if (Result)
{
PVOID Buffer = Info;
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
NTSTATUS Result0 = FspFsvolQueryStandardInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
if (!NT_SUCCESS(Result0))
FSP_RETURN(Result = FALSE);
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
FspFileNodeRelease(FileNode, Main);
if (Result)
{
PVOID Buffer = Info;
PVOID BufferEnd = (PUINT8)Info + sizeof Info;
NTSTATUS Result0 = FspFsvolQueryStandardInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
if (!NT_SUCCESS(Result0))
FSP_RETURN(Result = FALSE);
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
PIoStatus->Status = Result0;
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
PIoStatus->Status = Result0;
}
}
FSP_LEAVE_BOOL("FileObject=%p", FileObject);
}
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)
{
FSP_ENTER_BOOL(PAGED_CODE());
@ -1841,21 +1847,51 @@ BOOLEAN FspFastIoQueryNetworkOpenInfo(
if (!FspFileNodeIsValid(FileNode))
FSP_RETURN(Result = FALSE);
FspFileNodeAcquireShared(FileNode, Main);
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
FspFileNodeRelease(FileNode, Main);
Result = FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait);
if (Result)
{
Result = FspFileNodeTryGetFileInfo(FileNode, &FileInfoBuf);
FspFileNodeRelease(FileNode, Main);
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);
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
PIoStatus->Status = Result0;
}
}
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);
PIoStatus->Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
PIoStatus->Status = Result0;
Irp->IoStatus.Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Info);
Irp->IoStatus.Status = Result0;
}
FSP_LEAVE_BOOL("FileObject=%p", FileObject);
FSP_LEAVE_BOOL("FileObject=%p[%p:\"%wZ\"]",
IoGetCurrentIrpStackLocation(Irp)->FileObject,
IoGetCurrentIrpStackLocation(Irp)->FileObject->RelatedFileObject,
IoGetCurrentIrpStackLocation(Irp)->FileObject->FileName);
}