sys: IRP_MJ_DIRECTORY_CONTROL: IRP_MN_QUERY_DIRECTORY: testing

This commit is contained in:
Bill Zissimopoulos 2016-03-28 15:18:43 -07:00
parent c898100dac
commit 5f68ac105e
2 changed files with 44 additions and 24 deletions

View File

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

View File

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