mirror of
https://github.com/winfsp/winfsp.git
synced 2025-07-04 01:42:58 -05:00
sys: implement FastIo operations
FspFastIoQueryOpen
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user