From 3a286324ffa36ad98e52c53fc4e796f643e96ef4 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 7 Sep 2018 16:01:40 -0700 Subject: [PATCH] sys: implement FastIo operations FspFastIoQueryOpen --- src/sys/driver.c | 2 +- src/sys/driver.h | 3 ++ src/sys/file.c | 29 +++++++++++++ src/sys/fileinfo.c | 100 ++++++++++++++++++++++++++++++--------------- 4 files changed, 101 insertions(+), 33 deletions(-) diff --git a/src/sys/driver.c b/src/sys/driver.c index 7f51d102..928fcde7 100644 --- a/src/sys/driver.c +++ b/src/sys/driver.c @@ -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; diff --git a/src/sys/driver.h b/src/sys/driver.h index 34160de8..6335270d 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -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, diff --git a/src/sys/file.c b/src/sys/file.c index 8559f713..ffed3cff 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -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) { diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 181d95a1..fe096424 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -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); }