mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 17:03:12 -05:00
sys: IRP_MJ_READ, IRP_MJ_WRITE
This commit is contained in:
parent
319a0087f8
commit
3939c096e9
@ -89,10 +89,8 @@ static NTSTATUS FspFsvolReadCached(
|
|||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
|
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||||
FSP_FILE_DESC *FileDesc = FileObject->FsContext2;
|
|
||||||
LARGE_INTEGER ReadOffset = IrpSp->Parameters.Read.ByteOffset;
|
LARGE_INTEGER ReadOffset = IrpSp->Parameters.Read.ByteOffset;
|
||||||
ULONG ReadLength = IrpSp->Parameters.Read.Length;
|
ULONG ReadLength = IrpSp->Parameters.Read.Length;
|
||||||
#if 0
|
#if 0
|
||||||
@ -104,8 +102,6 @@ static NTSTATUS FspFsvolReadCached(
|
|||||||
CC_FILE_SIZES FileSizes;
|
CC_FILE_SIZES FileSizes;
|
||||||
BOOLEAN Success;
|
BOOLEAN Success;
|
||||||
|
|
||||||
ASSERT(FileNode == FileDesc->FileNode);
|
|
||||||
|
|
||||||
/* try to acquire the FileNode Main shared */
|
/* try to acquire the FileNode Main shared */
|
||||||
Success = DEBUGTEST(90, TRUE) &&
|
Success = DEBUGTEST(90, TRUE) &&
|
||||||
FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait);
|
FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait);
|
||||||
@ -113,7 +109,8 @@ static NTSTATUS FspFsvolReadCached(
|
|||||||
return FspWqRepostIrpWorkItem(Irp, FspFsvolReadCached, 0);
|
return FspWqRepostIrpWorkItem(Irp, FspFsvolReadCached, 0);
|
||||||
|
|
||||||
/* trim ReadLength; the cache manager does not tolerate reads beyond file size */
|
/* trim ReadLength; the cache manager does not tolerate reads beyond file size */
|
||||||
ASSERT(FspTimeoutInfinity32 == FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
|
ASSERT(FspTimeoutInfinity32 ==
|
||||||
|
FspFsvolDeviceExtension(FsvolDeviceObject)->VolumeParams.FileInfoTimeout);
|
||||||
FspFileNodeGetFileInfo(FileNode, &FileInfo);
|
FspFileNodeGetFileInfo(FileNode, &FileInfo);
|
||||||
if ((UINT64)ReadOffset.QuadPart >= FileInfo.FileSize)
|
if ((UINT64)ReadOffset.QuadPart >= FileInfo.FileSize)
|
||||||
{
|
{
|
||||||
|
@ -90,10 +90,8 @@ static NTSTATUS FspFsvolWriteCached(
|
|||||||
|
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
BOOLEAN Retrying = 0 != FspIrpRequest(Irp);
|
BOOLEAN Retrying = 0 != FspIrpRequest(Irp);
|
||||||
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
|
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||||
FSP_FILE_DESC *FileDesc = FileObject->FsContext2;
|
|
||||||
LARGE_INTEGER WriteOffset = IrpSp->Parameters.Write.ByteOffset;
|
LARGE_INTEGER WriteOffset = IrpSp->Parameters.Write.ByteOffset;
|
||||||
ULONG WriteLength = IrpSp->Parameters.Write.Length;
|
ULONG WriteLength = IrpSp->Parameters.Write.Length;
|
||||||
#if 0
|
#if 0
|
||||||
@ -108,8 +106,6 @@ static NTSTATUS FspFsvolWriteCached(
|
|||||||
UINT64 WriteEndOffset;
|
UINT64 WriteEndOffset;
|
||||||
BOOLEAN Success;
|
BOOLEAN Success;
|
||||||
|
|
||||||
ASSERT(FileNode == FileDesc->FileNode);
|
|
||||||
|
|
||||||
/* should we defer the write? */
|
/* should we defer the write? */
|
||||||
Success = DEBUGTEST(90, TRUE) && CcCanIWrite(FileObject, WriteLength, CanWait, Retrying);
|
Success = DEBUGTEST(90, TRUE) && CcCanIWrite(FileObject, WriteLength, CanWait, Retrying);
|
||||||
if (!Success)
|
if (!Success)
|
||||||
@ -133,7 +129,8 @@ static NTSTATUS FspFsvolWriteCached(
|
|||||||
return FspWqRepostIrpWorkItem(Irp, FspFsvolWriteCached, 0);
|
return FspWqRepostIrpWorkItem(Irp, FspFsvolWriteCached, 0);
|
||||||
|
|
||||||
/* compute new file size and allocation size */
|
/* compute new file size and allocation size */
|
||||||
ASSERT(FspTimeoutInfinity32 == FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
|
ASSERT(FspTimeoutInfinity32 ==
|
||||||
|
FspFsvolDeviceExtension(FsvolDeviceObject)->VolumeParams.FileInfoTimeout);
|
||||||
FspFileNodeGetFileInfo(FileNode, &FileInfo);
|
FspFileNodeGetFileInfo(FileNode, &FileInfo);
|
||||||
FileSizes.AllocationSize.QuadPart = FileInfo.AllocationSize;
|
FileSizes.AllocationSize.QuadPart = FileInfo.AllocationSize;
|
||||||
FileSizes.FileSize.QuadPart = FileInfo.FileSize;
|
FileSizes.FileSize.QuadPart = FileInfo.FileSize;
|
||||||
@ -146,6 +143,8 @@ static NTSTATUS FspFsvolWriteCached(
|
|||||||
FileSizes.FileSize.QuadPart = WriteEndOffset;
|
FileSizes.FileSize.QuadPart = WriteEndOffset;
|
||||||
if (FileSizes.FileSize.QuadPart > FileSizes.AllocationSize.QuadPart)
|
if (FileSizes.FileSize.QuadPart > FileSizes.AllocationSize.QuadPart)
|
||||||
{
|
{
|
||||||
|
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
|
||||||
|
FspFsvolDeviceExtension(FsvolDeviceObject);
|
||||||
UINT64 AllocationUnit = FsvolDeviceExtension->VolumeParams.SectorSize *
|
UINT64 AllocationUnit = FsvolDeviceExtension->VolumeParams.SectorSize *
|
||||||
FsvolDeviceExtension->VolumeParams.SectorsPerAllocationUnit;
|
FsvolDeviceExtension->VolumeParams.SectorsPerAllocationUnit;
|
||||||
FileSizes.AllocationSize.QuadPart = (FileSizes.FileSize.QuadPart + AllocationUnit - 1)
|
FileSizes.AllocationSize.QuadPart = (FileSizes.FileSize.QuadPart + AllocationUnit - 1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user