mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 19:48:38 -05:00 
			
		
		
		
	tst: memfs, memfs-dotnet: EaSize support
This commit is contained in:
		| @@ -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; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user