mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
tst: memfs: support named streams
This commit is contained in:
parent
6a126da51d
commit
dfd6cbbde1
@ -68,6 +68,8 @@ typedef struct _MEMFS_FILE_NODE
|
|||||||
SIZE_T ReparseDataSize;
|
SIZE_T ReparseDataSize;
|
||||||
PVOID ReparseData;
|
PVOID ReparseData;
|
||||||
ULONG RefCount;
|
ULONG RefCount;
|
||||||
|
/* stream support */
|
||||||
|
struct _MEMFS_FILE_NODE *MainFileNode;
|
||||||
} MEMFS_FILE_NODE;
|
} MEMFS_FILE_NODE;
|
||||||
|
|
||||||
struct MEMFS_FILE_NODE_LESS
|
struct MEMFS_FILE_NODE_LESS
|
||||||
@ -126,6 +128,21 @@ VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode)
|
|||||||
free(FileNode);
|
free(FileNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
VOID MemfsFileNodeGetFileInfo(MEMFS_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
|
{
|
||||||
|
if (0 == FileNode->MainFileNode)
|
||||||
|
*FileInfo = FileNode->FileInfo;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*FileInfo = FileNode->MainFileNode->FileInfo;
|
||||||
|
FileInfo->FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY;
|
||||||
|
/* named streams cannot be directories */
|
||||||
|
FileInfo->AllocationSize = FileNode->FileInfo.AllocationSize;
|
||||||
|
FileInfo->FileSize = FileNode->FileInfo.FileSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
VOID MemfsFileNodeMapDump(MEMFS_FILE_NODE_MAP *FileNodeMap)
|
VOID MemfsFileNodeMapDump(MEMFS_FILE_NODE_MAP *FileNodeMap)
|
||||||
{
|
{
|
||||||
@ -176,6 +193,21 @@ MEMFS_FILE_NODE *MemfsFileNodeMapGet(MEMFS_FILE_NODE_MAP *FileNodeMap, PWSTR Fil
|
|||||||
return iter->second;
|
return iter->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
MEMFS_FILE_NODE *MemfsFileNodeMapGetMain(MEMFS_FILE_NODE_MAP *FileNodeMap, PWSTR FileName0)
|
||||||
|
{
|
||||||
|
WCHAR FileName[MAX_PATH];
|
||||||
|
wcscpy_s(FileName, sizeof FileName / sizeof(WCHAR), FileName0);
|
||||||
|
PWSTR StreamName = wcschr(FileName, L':');
|
||||||
|
if (0 == StreamName)
|
||||||
|
return 0;
|
||||||
|
StreamName[0] = L'\0';
|
||||||
|
MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->find(FileName);
|
||||||
|
if (iter == FileNodeMap->end())
|
||||||
|
return 0;
|
||||||
|
return iter->second;
|
||||||
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
MEMFS_FILE_NODE *MemfsFileNodeMapGetParent(MEMFS_FILE_NODE_MAP *FileNodeMap, PWSTR FileName0,
|
MEMFS_FILE_NODE *MemfsFileNodeMapGetParent(MEMFS_FILE_NODE_MAP *FileNodeMap, PWSTR FileName0,
|
||||||
PNTSTATUS PResult)
|
PNTSTATUS PResult)
|
||||||
@ -366,6 +398,9 @@ static NTSTATUS GetSecurityByName(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (0 != FileNode->MainFileNode)
|
||||||
|
FileNode = FileNode->MainFileNode;
|
||||||
|
|
||||||
if (0 != PFileAttributes)
|
if (0 != PFileAttributes)
|
||||||
*PFileAttributes = FileNode->FileInfo.FileAttributes;
|
*PFileAttributes = FileNode->FileInfo.FileAttributes;
|
||||||
|
|
||||||
@ -416,6 +451,8 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
|
FileNode->MainFileNode = MemfsFileNodeMapGetMain(Memfs->FileNodeMap, FileName);
|
||||||
|
|
||||||
FileNode->FileInfo.FileAttributes = (FileAttributes & FILE_ATTRIBUTE_DIRECTORY) ?
|
FileNode->FileInfo.FileAttributes = (FileAttributes & FILE_ATTRIBUTE_DIRECTORY) ?
|
||||||
FileAttributes : FileAttributes | FILE_ATTRIBUTE_ARCHIVE;
|
FileAttributes : FileAttributes | FILE_ATTRIBUTE_ARCHIVE;
|
||||||
|
|
||||||
@ -453,7 +490,7 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
|
|
||||||
FileNode->RefCount++;
|
FileNode->RefCount++;
|
||||||
*PFileNode = FileNode;
|
*PFileNode = FileNode;
|
||||||
*FileInfo = FileNode->FileInfo;
|
MemfsFileNodeGetFileInfo(FileNode, FileInfo);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -491,7 +528,7 @@ static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
|
|
||||||
FileNode->RefCount++;
|
FileNode->RefCount++;
|
||||||
*PFileNode = FileNode;
|
*PFileNode = FileNode;
|
||||||
*FileInfo = FileNode->FileInfo;
|
MemfsFileNodeGetFileInfo(FileNode, FileInfo);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -513,7 +550,7 @@ NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
FileNode->FileInfo.LastWriteTime =
|
FileNode->FileInfo.LastWriteTime =
|
||||||
FileNode->FileInfo.LastAccessTime = MemfsGetSystemTime();
|
FileNode->FileInfo.LastAccessTime = MemfsGetSystemTime();
|
||||||
|
|
||||||
*FileInfo = FileNode->FileInfo;
|
MemfsFileNodeGetFileInfo(FileNode, FileInfo);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -639,7 +676,7 @@ static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
memcpy((PUINT8)FileNode->FileData + Offset, Buffer, (size_t)(EndOffset - Offset));
|
memcpy((PUINT8)FileNode->FileData + Offset, Buffer, (size_t)(EndOffset - Offset));
|
||||||
|
|
||||||
*PBytesTransferred = (ULONG)(EndOffset - Offset);
|
*PBytesTransferred = (ULONG)(EndOffset - Offset);
|
||||||
*FileInfo = FileNode->FileInfo;
|
MemfsFileNodeGetFileInfo(FileNode, FileInfo);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -659,7 +696,7 @@ static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
{
|
{
|
||||||
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
|
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
|
||||||
|
|
||||||
*FileInfo = FileNode->FileInfo;
|
MemfsFileNodeGetFileInfo(FileNode, FileInfo);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -672,6 +709,9 @@ static NTSTATUS SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
{
|
{
|
||||||
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
|
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
|
||||||
|
|
||||||
|
if (0 != FileNode->MainFileNode)
|
||||||
|
FileNode = FileNode->MainFileNode;
|
||||||
|
|
||||||
if (INVALID_FILE_ATTRIBUTES != FileAttributes)
|
if (INVALID_FILE_ATTRIBUTES != FileAttributes)
|
||||||
FileNode->FileInfo.FileAttributes = FileAttributes;
|
FileNode->FileInfo.FileAttributes = FileAttributes;
|
||||||
if (0 != CreationTime)
|
if (0 != CreationTime)
|
||||||
@ -681,7 +721,7 @@ static NTSTATUS SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
if (0 != LastWriteTime)
|
if (0 != LastWriteTime)
|
||||||
FileNode->FileInfo.LastWriteTime = LastWriteTime;
|
FileNode->FileInfo.LastWriteTime = LastWriteTime;
|
||||||
|
|
||||||
*FileInfo = FileNode->FileInfo;
|
MemfsFileNodeGetFileInfo(FileNode, FileInfo);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -734,7 +774,7 @@ static NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*FileInfo = FileNode->FileInfo;
|
MemfsFileNodeGetFileInfo(FileNode, FileInfo);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -868,6 +908,9 @@ static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
{
|
{
|
||||||
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
|
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
|
||||||
|
|
||||||
|
if (0 != FileNode->MainFileNode)
|
||||||
|
FileNode = FileNode->MainFileNode;
|
||||||
|
|
||||||
if (FileNode->FileSecuritySize > *PSecurityDescriptorSize)
|
if (FileNode->FileSecuritySize > *PSecurityDescriptorSize)
|
||||||
{
|
{
|
||||||
*PSecurityDescriptorSize = FileNode->FileSecuritySize;
|
*PSecurityDescriptorSize = FileNode->FileSecuritySize;
|
||||||
@ -891,6 +934,9 @@ static NTSTATUS SetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
SIZE_T FileSecuritySize;
|
SIZE_T FileSecuritySize;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
if (0 != FileNode->MainFileNode)
|
||||||
|
FileNode = FileNode->MainFileNode;
|
||||||
|
|
||||||
Result = FspSetSecurityDescriptor(FileSystem, Request, FileNode->FileSecurity,
|
Result = FspSetSecurityDescriptor(FileSystem, Request, FileNode->FileSecurity,
|
||||||
&NewSecurityDescriptor);
|
&NewSecurityDescriptor);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user