inc: winfsp.hpp: FileSystem: ReadDirectoryEntry and friends

This commit is contained in:
Bill Zissimopoulos
2017-04-14 00:01:08 -07:00
parent 4c102ab57c
commit 8787f2c528
2 changed files with 148 additions and 81 deletions

View File

@ -236,44 +236,95 @@ public:
return _FileSystem;
}
/* helpers: directories/streams */
static BOOLEAN AcquireDirectoryBuffer(PVOID *PDirBuffer,
BOOLEAN Reset, PNTSTATUS PResult)
{
return FspFileSystemAcquireDirectoryBuffer(PDirBuffer, Reset, PResult);
}
static BOOLEAN FillDirectoryBuffer(PVOID *PDirBuffer,
DirInfo *DirInfo, PNTSTATUS PResult)
{
return FspFileSystemFillDirectoryBuffer(PDirBuffer, DirInfo, PResult);
}
static VOID ReleaseDirectoryBuffer(PVOID *PDirBuffer)
{
FspFileSystemReleaseDirectoryBuffer(PDirBuffer);
}
static VOID ReadDirectoryBuffer(PVOID *PDirBuffer,
/* helpers */
NTSTATUS SeekableReadDirectory(
PVOID FileNode,
PVOID FileDesc,
PWSTR Pattern,
PWSTR Marker,
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
PVOID Buffer,
ULONG Length,
PULONG PBytesTransferred)
{
FspFileSystemReadDirectoryBuffer(PDirBuffer,
Marker, Buffer, Length, PBytesTransferred);
PVOID Context = 0;
union
{
UINT8 B[FIELD_OFFSET(FileSystem::DirInfo, FileNameBuf) + MAX_PATH * sizeof(WCHAR)];
FileSystem::DirInfo D;
} DirInfoBuf;
FileSystem::DirInfo *DirInfo = &DirInfoBuf.D;
NTSTATUS Result = STATUS_SUCCESS;
*PBytesTransferred = 0;
for (;;)
{
Result = ReadDirectoryEntry(FileNode, FileDesc, Pattern, Marker, &Context, DirInfo);
if (STATUS_NO_MORE_FILES == Result)
{
Result = STATUS_SUCCESS;
break;
}
if (!NT_SUCCESS(Result))
break;
if (!FspFileSystemAddDirInfo(DirInfo, Buffer, Length, PBytesTransferred))
break;
}
if (!NT_SUCCESS(Result))
return Result;
return STATUS_SUCCESS;
}
NTSTATUS BufferedReadDirectory(
PVOID *PDirBuffer,
PVOID FileNode,
PVOID FileDesc,
PWSTR Pattern,
PWSTR Marker,
PVOID Buffer,
ULONG Length,
PULONG PBytesTransferred)
{
PVOID Context = 0;
union
{
UINT8 B[FIELD_OFFSET(FileSystem::DirInfo, FileNameBuf) + MAX_PATH * sizeof(WCHAR)];
FileSystem::DirInfo D;
} DirInfoBuf;
FileSystem::DirInfo *DirInfo = &DirInfoBuf.D;
NTSTATUS Result = STATUS_SUCCESS;
*PBytesTransferred = 0;
if (FspFileSystemAcquireDirectoryBuffer(PDirBuffer, 0 == Marker, &Result))
{
try
{
for (;;)
{
Result = ReadDirectoryEntry(FileNode, FileDesc, Pattern, Marker, &Context, DirInfo);
if (STATUS_NO_MORE_FILES == Result)
{
Result = STATUS_SUCCESS;
break;
}
if (!NT_SUCCESS(Result))
break;
if (!FspFileSystemFillDirectoryBuffer(PDirBuffer, DirInfo, &Result))
break;
}
}
catch (...)
{
FspFileSystemReleaseDirectoryBuffer(PDirBuffer);
throw;
}
FspFileSystemReleaseDirectoryBuffer(PDirBuffer);
}
if (!NT_SUCCESS(Result))
return Result;
FspFileSystemReadDirectoryBuffer(PDirBuffer, Marker, Buffer, Length, PBytesTransferred);
return STATUS_SUCCESS;
}
static VOID DeleteDirectoryBuffer(PVOID *PDirBuffer)
{
FspFileSystemDeleteDirectoryBuffer(PDirBuffer);
}
static BOOLEAN AddDirInfo(DirInfo *DirInfo,
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
{
return FspFileSystemAddDirInfo(DirInfo, Buffer, Length, PBytesTransferred);
}
static BOOLEAN AddStreamInfo(StreamInfo *StreamInfo,
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
{
return FspFileSystemAddStreamInfo(StreamInfo, Buffer, Length, PBytesTransferred);
}
/* helpers: reparse points */
BOOLEAN FindReparsePoint(
PWSTR FileName, PUINT32 PReparsePointIndex)
{
@ -288,6 +339,11 @@ public:
CurrentReparseData, CurrentReparseDataSize,
ReplaceReparseData, ReplaceReparseDataSize);
}
static BOOLEAN AddStreamInfo(StreamInfo *StreamInfo,
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
{
return FspFileSystemAddStreamInfo(StreamInfo, Buffer, Length, PBytesTransferred);
}
protected:
/* operations */
@ -460,6 +516,16 @@ protected:
{
return STATUS_INVALID_DEVICE_REQUEST;
}
virtual NTSTATUS ReadDirectoryEntry(
PVOID FileNode,
PVOID FileDesc,
PWSTR Pattern,
PWSTR Marker,
PVOID *PContext,
DirInfo *DirInfo)
{
return STATUS_INVALID_DEVICE_REQUEST;
}
virtual NTSTATUS ResolveReparsePoints(
PWSTR FileName,
UINT32 ReparsePointIndex,