sys: IRP_MJ_DIRECTORY_CONTROL: testing

This commit is contained in:
Bill Zissimopoulos 2016-03-28 17:46:09 -07:00
parent 5f68ac105e
commit 953dd4ec5e

View File

@ -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);