sys: create: overwrite EA support

This commit is contained in:
Bill Zissimopoulos 2019-03-19 13:22:35 -07:00
parent 02a650f8d0
commit a830de9d04
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3
3 changed files with 24 additions and 4 deletions

View File

@ -1171,8 +1171,16 @@ NTSTATUS FspFsvolCreateComplete(
if (0 == FileNode->MainFileNode)
FspFileNodeOverwriteStreams(FileNode);
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo, TRUE);
if (0 == FileNode->MainFileNode && FsvolDeviceExtension->VolumeParams.ExtendedAttributes)
{
/* invalidate any existing EA and increment the EA change count */
FspFileNodeSetEa(FileNode, 0, 0);
FileNode->EaChangeCount++;
}
FspFileNodeNotifyChange(FileNode,
FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE,
FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE |
(0 == FileNode->MainFileNode && FsvolDeviceExtension->VolumeParams.ExtendedAttributes ?
FILE_NOTIFY_CHANGE_EA : 0),
FILE_ACTION_MODIFIED,
FALSE);

View File

@ -460,6 +460,9 @@ namespace memfs
FileNodeMap.Remove(StreamNode);
}
SortedDictionary<String, EaValueData> EaMap = FileNode.GetEaMap(false);
if (null != EaMap)
EaMap.Clear();
if (IntPtr.Zero != Ea)
{
Result = SetEa(FileNode, null, Ea, EaLength);

View File

@ -346,10 +346,10 @@ NTSTATUS MemfsFileNodeCreate(PWSTR FileName, MEMFS_FILE_NODE **PFileNode)
return STATUS_SUCCESS;
}
static inline
VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode)
{
#if defined(MEMFS_EA)
static inline
VOID MemfsFileNodeDeleteAllEa(MEMFS_FILE_NODE *FileNode)
{
if (0 != FileNode->EaMap)
{
for (MEMFS_FILE_NODE_EA_MAP::iterator p = FileNode->EaMap->begin(), q = FileNode->EaMap->end();
@ -357,6 +357,14 @@ VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode)
free(p->second);
delete FileNode->EaMap;
}
}
#endif
static inline
VOID MemfsFileNodeDelete(MEMFS_FILE_NODE *FileNode)
{
#if defined(MEMFS_EA)
MemfsFileNodeDeleteAllEa(FileNode);
#endif
#if defined(MEMFS_REPARSE_POINTS)
free(FileNode->ReparseData);
@ -1244,6 +1252,7 @@ static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem,
#endif
#if defined(MEMFS_EA)
MemfsFileNodeDeleteAllEa(FileNode);
if (0 != Ea)
{
Result = FspFileSystemEnumerateEa(FileSystem, MemfsFileNodeSetEa, FileNode, Ea, EaLength);