mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 17:03:12 -05:00
sys: IRP_MJ_DIRECTORY_CONTROL: testing
This commit is contained in:
parent
5f68ac105e
commit
953dd4ec5e
@ -49,8 +49,8 @@ FSP_DRIVER_DISPATCH FspDirectoryControl;
|
|||||||
#pragma alloc_text(PAGE, FspDirectoryControl)
|
#pragma alloc_text(PAGE, FspDirectoryControl)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FILE_INDEX_FROM_OFFSET(v) ((ULONG)((v) >> 32))
|
#define FILE_INDEX_FROM_OFFSET(v) ((ULONG)(v))
|
||||||
#define OFFSET_FROM_FILE_INDEX(v) ((UINT64)(v) << 32)
|
#define OFFSET_FROM_FILE_INDEX(v) ((UINT64)(v))
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
@ -140,7 +140,10 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
|
|||||||
{
|
{
|
||||||
if ((PUINT8)DirInfo + sizeof(DirInfo->Size) > DirInfoEnd)
|
if ((PUINT8)DirInfo + sizeof(DirInfo->Size) > DirInfoEnd)
|
||||||
break;
|
break;
|
||||||
if (sizeof(FSP_FSCTL_DIR_INFO) > DirInfo->Size)
|
|
||||||
|
DirInfoSize = DirInfo->Size;
|
||||||
|
|
||||||
|
if (sizeof(FSP_FSCTL_DIR_INFO) > DirInfoSize)
|
||||||
return 0 != *PDestLen ? STATUS_SUCCESS :
|
return 0 != *PDestLen ? STATUS_SUCCESS :
|
||||||
(0 == DirectoryOffset ? STATUS_NO_SUCH_FILE : STATUS_NO_MORE_FILES);
|
(0 == DirectoryOffset ? STATUS_NO_SUCH_FILE : STATUS_NO_MORE_FILES);
|
||||||
|
|
||||||
@ -151,7 +154,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
|
|||||||
}
|
}
|
||||||
|
|
||||||
FileName.Length =
|
FileName.Length =
|
||||||
FileName.MaximumLength = (USHORT)(DirInfo->Size - sizeof(FSP_FSCTL_DIR_INFO));
|
FileName.MaximumLength = (USHORT)(DirInfoSize - sizeof(FSP_FSCTL_DIR_INFO));
|
||||||
FileName.Buffer = DirInfo->FileNameBuf;
|
FileName.Buffer = DirInfo->FileNameBuf;
|
||||||
|
|
||||||
if (MatchAll || FsRtlIsNameInExpression(DirectoryPattern, &FileName, CaseInsensitive, 0))
|
if (MatchAll || FsRtlIsNameInExpression(DirectoryPattern, &FileName, CaseInsensitive, 0))
|
||||||
@ -168,6 +171,13 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (0 != PrevDestBuf)
|
||||||
|
*(PULONG)PrevDestBuf = (ULONG)((PUINT8)DestBuf - DestBufBgn);
|
||||||
|
PrevDestBuf = DestBuf;
|
||||||
|
|
||||||
|
*PDirectoryOffset = DirInfo->NextOffset;
|
||||||
|
*PDestLen = (ULONG)((PUINT8)DestBuf + BaseInfoLen + FileName.Length - DestBufBgn);
|
||||||
|
|
||||||
switch (FileInformationClass)
|
switch (FileInformationClass)
|
||||||
{
|
{
|
||||||
case FileDirectoryInformation:
|
case FileDirectoryInformation:
|
||||||
@ -207,13 +217,6 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
|
|||||||
return STATUS_INVALID_INFO_CLASS;
|
return STATUS_INVALID_INFO_CLASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != PrevDestBuf)
|
|
||||||
*(PULONG)PrevDestBuf = (ULONG)((PUINT8)DestBuf - DestBufBgn);
|
|
||||||
PrevDestBuf = DestBuf;
|
|
||||||
|
|
||||||
*PDirectoryOffset = DirInfo->NextOffset;
|
|
||||||
*PDestLen = (ULONG)((PUINT8)DestBuf + BaseInfoLen + FileName.Length - DestBufBgn);
|
|
||||||
|
|
||||||
if (ReturnSingleEntry)
|
if (ReturnSingleEntry)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -222,7 +225,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
|
|||||||
}
|
}
|
||||||
|
|
||||||
NextDirInfo:
|
NextDirInfo:
|
||||||
DirInfo = (PVOID)((PUINT8)DirInfo + FSP_FSCTL_DEFAULT_ALIGN_UP(DirInfo->Size));
|
DirInfo = (PVOID)((PUINT8)DirInfo + FSP_FSCTL_DEFAULT_ALIGN_UP(DirInfoSize));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
except (EXCEPTION_EXECUTE_HANDLER)
|
except (EXCEPTION_EXECUTE_HANDLER)
|
||||||
@ -399,8 +402,8 @@ static NTSTATUS FspFsvolQueryDirectoryRetry(
|
|||||||
FsvolDeviceExtension->VolumeParams.MaxComponentLength * sizeof(WCHAR))
|
FsvolDeviceExtension->VolumeParams.MaxComponentLength * sizeof(WCHAR))
|
||||||
SystemBufferLength = sizeof(FSP_FSCTL_DIR_INFO) +
|
SystemBufferLength = sizeof(FSP_FSCTL_DIR_INFO) +
|
||||||
FsvolDeviceExtension->VolumeParams.MaxComponentLength * sizeof(WCHAR);
|
FsvolDeviceExtension->VolumeParams.MaxComponentLength * sizeof(WCHAR);
|
||||||
SystemBufferLength = FSP_FSCTL_ALIGN_UP(SystemBufferLength, PAGE_SIZE);
|
Result = FspBufferUserBuffer(Irp,
|
||||||
Result = FspBufferUserBuffer(Irp, Length, IoWriteAccess);
|
FSP_FSCTL_ALIGN_UP(SystemBufferLength, PAGE_SIZE), IoWriteAccess);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
{
|
{
|
||||||
FspFileNodeRelease(FileNode, Full);
|
FspFileNodeRelease(FileNode, Full);
|
||||||
@ -594,7 +597,7 @@ NTSTATUS FspFsvolDirectoryControlComplete(
|
|||||||
if (0 == FileDesc->DirectoryOffset &&
|
if (0 == FileDesc->DirectoryOffset &&
|
||||||
FspFileNodeTrySetDirInfo(FileNode,
|
FspFileNodeTrySetDirInfo(FileNode,
|
||||||
Irp->AssociatedIrp.SystemBuffer,
|
Irp->AssociatedIrp.SystemBuffer,
|
||||||
(ULONG)Irp->IoStatus.Information,
|
(ULONG)Response->IoStatus.Information,
|
||||||
DirInfoChangeNumber) &&
|
DirInfoChangeNumber) &&
|
||||||
FspFileNodeReferenceDirInfo(FileNode, &DirInfoBuffer, &DirInfoSize))
|
FspFileNodeReferenceDirInfo(FileNode, &DirInfoBuffer, &DirInfoSize))
|
||||||
{
|
{
|
||||||
@ -608,7 +611,7 @@ NTSTATUS FspFsvolDirectoryControlComplete(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
DirInfoBuffer = Irp->AssociatedIrp.SystemBuffer;
|
DirInfoBuffer = Irp->AssociatedIrp.SystemBuffer;
|
||||||
DirInfoSize = (ULONG)Irp->IoStatus.Information;
|
DirInfoSize = (ULONG)Response->IoStatus.Information;
|
||||||
Result = FspFsvolQueryDirectoryCopyInPlace(FileDesc,
|
Result = FspFsvolQueryDirectoryCopyInPlace(FileDesc,
|
||||||
FileInformationClass, ReturnSingleEntry,
|
FileInformationClass, ReturnSingleEntry,
|
||||||
DirInfoBuffer, DirInfoSize, Buffer, &Length);
|
DirInfoBuffer, DirInfoSize, Buffer, &Length);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user