mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
tst: memfs, memfs-dotnet: EaSize support
This commit is contained in:
parent
948254f083
commit
b619dbfe97
@ -463,7 +463,10 @@ namespace memfs
|
|||||||
|
|
||||||
SortedDictionary<String, EaValueData> EaMap = FileNode.GetEaMap(false);
|
SortedDictionary<String, EaValueData> EaMap = FileNode.GetEaMap(false);
|
||||||
if (null != EaMap)
|
if (null != EaMap)
|
||||||
|
{
|
||||||
EaMap.Clear();
|
EaMap.Clear();
|
||||||
|
FileNode.FileInfo.EaSize = 0;
|
||||||
|
}
|
||||||
if (IntPtr.Zero != Ea)
|
if (IntPtr.Zero != Ea)
|
||||||
{
|
{
|
||||||
Result = SetEa(FileNode, null, Ea, EaLength);
|
Result = SetEa(FileNode, null, Ea, EaLength);
|
||||||
@ -1116,15 +1119,21 @@ namespace memfs
|
|||||||
{
|
{
|
||||||
FileNode FileNode = (FileNode)FileNode0;
|
FileNode FileNode = (FileNode)FileNode0;
|
||||||
SortedDictionary<String, EaValueData> EaMap = FileNode.GetEaMap(true);
|
SortedDictionary<String, EaValueData> EaMap = FileNode.GetEaMap(true);
|
||||||
|
EaValueData Data;
|
||||||
|
UInt32 EaSizePlus = 0, EaSizeMinus = 0;
|
||||||
if (null != EaValue)
|
if (null != EaValue)
|
||||||
{
|
{
|
||||||
EaValueData Data;
|
|
||||||
Data.EaValue = EaValue;
|
Data.EaValue = EaValue;
|
||||||
Data.NeedEa = NeedEa;
|
Data.NeedEa = NeedEa;
|
||||||
EaMap[EaName] = Data;
|
EaMap[EaName] = Data;
|
||||||
|
EaSizePlus = GetEaEntrySize(EaName, EaValue, NeedEa);
|
||||||
}
|
}
|
||||||
else
|
else if (EaMap.TryGetValue(EaName, out Data))
|
||||||
|
{
|
||||||
|
EaSizeMinus = GetEaEntrySize(EaName, Data.EaValue, Data.NeedEa);
|
||||||
EaMap.Remove(EaName);
|
EaMap.Remove(EaName);
|
||||||
|
}
|
||||||
|
FileNode.FileInfo.EaSize = FileNode.FileInfo.EaSize + EaSizePlus - EaSizeMinus;
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,6 +357,7 @@ VOID MemfsFileNodeDeleteEaMap(MEMFS_FILE_NODE *FileNode)
|
|||||||
free(p->second);
|
free(p->second);
|
||||||
delete FileNode->EaMap;
|
delete FileNode->EaMap;
|
||||||
FileNode->EaMap = 0;
|
FileNode->EaMap = 0;
|
||||||
|
FileNode->FileInfo.EaSize = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -441,6 +442,7 @@ NTSTATUS MemfsFileNodeSetEa(
|
|||||||
MEMFS_FILE_NODE_EA_MAP *EaMap;
|
MEMFS_FILE_NODE_EA_MAP *EaMap;
|
||||||
FILE_FULL_EA_INFORMATION *FileNodeEa = 0;
|
FILE_FULL_EA_INFORMATION *FileNodeEa = 0;
|
||||||
MEMFS_FILE_NODE_EA_MAP::iterator p;
|
MEMFS_FILE_NODE_EA_MAP::iterator p;
|
||||||
|
ULONG EaSizePlus = 0, EaSizeMinus = 0;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
Result = MemfsFileNodeGetEaMap(FileNode, &EaMap);
|
Result = MemfsFileNodeGetEaMap(FileNode, &EaMap);
|
||||||
@ -449,18 +451,20 @@ NTSTATUS MemfsFileNodeSetEa(
|
|||||||
|
|
||||||
if (0 != Ea->EaValueLength)
|
if (0 != Ea->EaValueLength)
|
||||||
{
|
{
|
||||||
FileNodeEa = (FILE_FULL_EA_INFORMATION *)malloc(
|
EaSizePlus = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
||||||
FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + Ea->EaNameLength + 1 + Ea->EaValueLength);
|
Ea->EaNameLength + 1 + Ea->EaValueLength;
|
||||||
|
FileNodeEa = (FILE_FULL_EA_INFORMATION *)malloc(EaSizePlus);
|
||||||
if (0 == FileNodeEa)
|
if (0 == FileNodeEa)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
memcpy(FileNodeEa, Ea,
|
memcpy(FileNodeEa, Ea, EaSizePlus);
|
||||||
FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + Ea->EaNameLength + 1 + Ea->EaValueLength);
|
|
||||||
FileNodeEa->NextEntryOffset = 0;
|
FileNodeEa->NextEntryOffset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = EaMap->find(Ea->EaName);
|
p = EaMap->find(Ea->EaName);
|
||||||
if (p != EaMap->end())
|
if (p != EaMap->end())
|
||||||
{
|
{
|
||||||
|
EaSizeMinus = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
||||||
|
p->second->EaNameLength + 1 + p->second->EaValueLength;
|
||||||
free(p->second);
|
free(p->second);
|
||||||
EaMap->erase(p);
|
EaMap->erase(p);
|
||||||
}
|
}
|
||||||
@ -470,7 +474,6 @@ NTSTATUS MemfsFileNodeSetEa(
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
EaMap->insert(MEMFS_FILE_NODE_EA_MAP::value_type(FileNodeEa->EaName, FileNodeEa));
|
EaMap->insert(MEMFS_FILE_NODE_EA_MAP::value_type(FileNodeEa->EaName, FileNodeEa));
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
@ -479,6 +482,10 @@ NTSTATUS MemfsFileNodeSetEa(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FileNode->FileInfo.EaSize = FileNode->FileInfo.EaSize
|
||||||
|
+ FSP_FSCTL_ALIGN_UP(EaSizePlus, sizeof(ULONG))
|
||||||
|
- FSP_FSCTL_ALIGN_UP(EaSizeMinus, sizeof(ULONG));
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user