mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
sys: IRP_MJ_DIRECTORY_CONTROL: IRP_MN_QUERY_DIRECTORY: testing
This commit is contained in:
parent
c898100dac
commit
5f68ac105e
@ -664,25 +664,27 @@ FSP_API BOOLEAN FspFileSystemAddDirInfo(FSP_FSCTL_DIR_INFO *DirInfo,
|
|||||||
static UINT8 Zero[sizeof DirInfo->Size] = { 0 };
|
static UINT8 Zero[sizeof DirInfo->Size] = { 0 };
|
||||||
PVOID BufferEnd = (PUINT8)Buffer + Length;
|
PVOID BufferEnd = (PUINT8)Buffer + Length;
|
||||||
PVOID SrcBuffer;
|
PVOID SrcBuffer;
|
||||||
ULONG SrcLength;
|
ULONG SrcLength, DstLength;
|
||||||
|
|
||||||
if (0 != DirInfo)
|
if (0 != DirInfo)
|
||||||
{
|
{
|
||||||
SrcBuffer = DirInfo;
|
SrcBuffer = DirInfo;
|
||||||
SrcLength = sizeof DirInfo->Size;
|
SrcLength = DirInfo->Size;
|
||||||
|
DstLength = FSP_FSCTL_DEFAULT_ALIGN_UP(SrcLength);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SrcBuffer = &Zero;
|
SrcBuffer = &Zero;
|
||||||
SrcLength = sizeof Zero;
|
SrcLength = sizeof Zero;
|
||||||
|
DstLength = SrcLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer = (PVOID)((PUINT8)Buffer + *PBytesTransferred);
|
Buffer = (PVOID)((PUINT8)Buffer + *PBytesTransferred);
|
||||||
if ((PUINT8)Buffer + SrcLength > (PUINT8)BufferEnd)
|
if ((PUINT8)Buffer + DstLength > (PUINT8)BufferEnd)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
memcpy(Buffer, SrcBuffer, SrcLength);
|
memcpy(Buffer, SrcBuffer, SrcLength);
|
||||||
*PBytesTransferred += SrcLength;
|
*PBytesTransferred += DstLength;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -206,12 +206,15 @@ BOOLEAN MemfsFileNodeEnumerateChildren(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_F
|
|||||||
WCHAR Root[2] = L"\\";
|
WCHAR Root[2] = L"\\";
|
||||||
PWSTR Remain, Suffix;
|
PWSTR Remain, Suffix;
|
||||||
MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->upper_bound(FileNode->FileName);
|
MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->upper_bound(FileNode->FileName);
|
||||||
|
BOOLEAN Equal;
|
||||||
for (; FileNodeMap->end() != iter; ++iter)
|
for (; FileNodeMap->end() != iter; ++iter)
|
||||||
{
|
{
|
||||||
if (!MemfsFileNameHasPrefix(iter->second->FileName, FileNode->FileName))
|
if (!MemfsFileNameHasPrefix(iter->second->FileName, FileNode->FileName))
|
||||||
break;
|
break;
|
||||||
FspPathSuffix(iter->second->FileName, &Remain, &Suffix, Root);
|
FspPathSuffix(iter->second->FileName, &Remain, &Suffix, Root);
|
||||||
if (0 == MemfsFileNameCompare(Remain, FileNode->FileName))
|
Equal = 0 == MemfsFileNameCompare(Remain, FileNode->FileName);
|
||||||
|
FspPathCombine(iter->second->FileName, Suffix);
|
||||||
|
if (Equal)
|
||||||
{
|
{
|
||||||
if (!EnumFn(iter->second, Context))
|
if (!EnumFn(iter->second, Context))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -697,22 +700,39 @@ typedef struct _MEMFS_READ_DIRECTORY_CONTEXT
|
|||||||
PULONG PBytesTransferred;
|
PULONG PBytesTransferred;
|
||||||
} MEMFS_READ_DIRECTORY_CONTEXT;
|
} MEMFS_READ_DIRECTORY_CONTEXT;
|
||||||
|
|
||||||
|
static BOOLEAN AddDirInfo(MEMFS_FILE_NODE *FileNode, PWSTR FileName,
|
||||||
|
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
|
||||||
|
{
|
||||||
|
UINT8 DirInfoBuf[sizeof(FSP_FSCTL_DIR_INFO) + sizeof FileNode->FileName];
|
||||||
|
FSP_FSCTL_DIR_INFO *DirInfo = (FSP_FSCTL_DIR_INFO *)DirInfoBuf;
|
||||||
|
WCHAR Root[2] = L"\\";
|
||||||
|
PWSTR Remain, Suffix;
|
||||||
|
|
||||||
|
if (0 == FileName)
|
||||||
|
{
|
||||||
|
FspPathSuffix(FileNode->FileName, &Remain, &Suffix, Root);
|
||||||
|
FileName = Suffix;
|
||||||
|
FspPathCombine(FileNode->FileName, Suffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(DirInfo->Padding, 0, sizeof DirInfo->Padding);
|
||||||
|
DirInfo->Size = (UINT16)(sizeof(FSP_FSCTL_DIR_INFO) + wcslen(FileName) * sizeof(WCHAR));
|
||||||
|
DirInfo->FileInfo = FileNode->FileInfo;
|
||||||
|
DirInfo->NextOffset = FileNode->FileInfo.IndexNumber;
|
||||||
|
memcpy(DirInfo->FileNameBuf, FileName, DirInfo->Size - sizeof(FSP_FSCTL_DIR_INFO));
|
||||||
|
|
||||||
|
return FspFileSystemAddDirInfo(DirInfo, Buffer, Length, PBytesTransferred);
|
||||||
|
}
|
||||||
|
|
||||||
static BOOLEAN ReadDirectoryEnumFn(MEMFS_FILE_NODE *FileNode, PVOID Context0)
|
static BOOLEAN ReadDirectoryEnumFn(MEMFS_FILE_NODE *FileNode, PVOID Context0)
|
||||||
{
|
{
|
||||||
MEMFS_READ_DIRECTORY_CONTEXT *Context = (MEMFS_READ_DIRECTORY_CONTEXT *)Context0;
|
MEMFS_READ_DIRECTORY_CONTEXT *Context = (MEMFS_READ_DIRECTORY_CONTEXT *)Context0;
|
||||||
UINT8 DirInfoBuf[sizeof(FSP_FSCTL_DIR_INFO) + sizeof FileNode->FileName];
|
|
||||||
FSP_FSCTL_DIR_INFO *DirInfo = (FSP_FSCTL_DIR_INFO *)DirInfoBuf;
|
|
||||||
|
|
||||||
if (0 == *Context->PBytesTransferred && Context->Offset != FileNode->FileInfo.IndexNumber)
|
if (0 == *Context->PBytesTransferred &&
|
||||||
|
0 != Context->Offset && Context->Offset != FileNode->FileInfo.IndexNumber)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
memset(DirInfo->Padding, 0, sizeof DirInfo->Padding);
|
return AddDirInfo(FileNode, 0,
|
||||||
DirInfo->Size = (UINT16)(sizeof(FSP_FSCTL_DIR_INFO) + wcslen(FileNode->FileName) * sizeof(WCHAR));
|
|
||||||
DirInfo->FileInfo = FileNode->FileInfo;
|
|
||||||
DirInfo->NextOffset = FileNode->FileInfo.IndexNumber;
|
|
||||||
memcpy(DirInfo->FileNameBuf, FileNode->FileName, DirInfo->Size - sizeof(FSP_FSCTL_DIR_INFO));
|
|
||||||
|
|
||||||
return FspFileSystemAddDirInfo(DirInfo,
|
|
||||||
Context->Buffer, Context->Length, Context->PBytesTransferred);
|
Context->Buffer, Context->Length, Context->PBytesTransferred);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -731,20 +751,18 @@ static NTSTATUS ReadDirectory(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
if (0 == ParentNode)
|
if (0 == ParentNode)
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
|
if (0 == Offset)
|
||||||
|
if (!AddDirInfo(FileNode, L".", Buffer, Length, PBytesTransferred))
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
if (0 == Offset || FileNode->FileInfo.IndexNumber == Offset)
|
||||||
|
if (!AddDirInfo(ParentNode, L"..", Buffer, Length, PBytesTransferred))
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
Context.Buffer = Buffer;
|
Context.Buffer = Buffer;
|
||||||
Context.Offset = Offset;
|
Context.Offset = Offset;
|
||||||
Context.Length = Length;
|
Context.Length = Length;
|
||||||
Context.PBytesTransferred = PBytesTransferred;
|
Context.PBytesTransferred = PBytesTransferred;
|
||||||
|
|
||||||
if (0 == Offset)
|
|
||||||
/* "." */
|
|
||||||
if (!ReadDirectoryEnumFn(FileNode, &Context))
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
if (0 == Offset || FileNode->FileInfo.IndexNumber == Offset)
|
|
||||||
/* ".." */
|
|
||||||
if (!ReadDirectoryEnumFn(ParentNode, &Context))
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
|
|
||||||
if (MemfsFileNodeEnumerateChildren(Memfs->FileNodeMap, FileNode, ReadDirectoryEnumFn, &Context))
|
if (MemfsFileNodeEnumerateChildren(Memfs->FileNodeMap, FileNode, ReadDirectoryEnumFn, &Context))
|
||||||
FspFileSystemAddDirInfo(0, Buffer, Length, PBytesTransferred);
|
FspFileSystemAddDirInfo(0, Buffer, Length, PBytesTransferred);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user