Fix stupid.

This commit is contained in:
Ottermandias 2025-01-20 20:33:28 +01:00
parent 9ca0145a7f
commit 39c73af238
3 changed files with 40 additions and 18 deletions

View file

@ -197,22 +197,24 @@ public unsafe class ImcFile : MetaBaseFile
if (length >= actualLength) if (length >= actualLength)
{ {
MemoryUtility.MemCpyUnchecked((byte*)data, Data, actualLength); MemoryUtility.MemCpyUnchecked((byte*)data, Data, actualLength);
MemoryUtility.MemSet((byte*)data + actualLength, 0, length - actualLength); if (length > actualLength)
MemoryUtility.MemSet((byte*)(data + actualLength), 0, length - actualLength);
return; return;
} }
var paddedLength = actualLength.PadToMultiple(128); var paddedLength = actualLength.PadToMultiple(128);
var newData = Manager.XivAllocator.Allocate(paddedLength, 8); var newData = Manager.XivFileAllocator.Allocate(paddedLength, 8);
if (newData == null) if (newData == null)
{ {
Penumbra.Log.Error($"Could not replace loaded IMC data at 0x{(ulong)resource:X}, allocation failed."); Penumbra.Log.Error($"Could not replace loaded IMC data at 0x{(ulong)resource:X}, allocation failed.");
return; return;
} }
MemoryUtility.MemCpyUnchecked(newData, Data, actualLength); MemoryUtility.MemCpyUnchecked(newData, Data, actualLength);
MemoryUtility.MemSet((byte*)data + actualLength, 0, paddedLength - actualLength); if (paddedLength > actualLength)
MemoryUtility.MemSet(newData + actualLength, 0, paddedLength - actualLength);
Manager.XivAllocator.Release((void*)data, length);
Manager.XivFileAllocator.Release((void*)data, length);
resource->SetData((nint)newData, paddedLength); resource->SetData((nint)newData, paddedLength);
} }
} }

View file

@ -73,6 +73,24 @@ public sealed unsafe class XivFileAllocator : IFileAllocator, IService
} }
} }
public sealed unsafe class XivDefaultAllocator : IFileAllocator, IService
{
public T* Allocate<T>(int length, int alignment = 1) where T : unmanaged
{
var ret = (T*)IMemorySpace.GetDefaultSpace()->Malloc((ulong)(length * sizeof(T)), (ulong)alignment);
Penumbra.Log.Verbose($"Allocating {length * sizeof(T)} bytes via FFXIV Default Allocator to 0x{(nint)ret:X}.");
return ret;
}
public void Release<T>(ref T* pointer, int length) where T : unmanaged
{
IMemorySpace.Free(pointer, (ulong)(length * sizeof(T)));
Penumbra.Log.Verbose($"Freeing {length * sizeof(T)} bytes from 0x{(nint)pointer:X} via FFXIV Default Allocator.");
pointer = null;
}
}
public unsafe class MetaBaseFile(MetaFileManager manager, IFileAllocator alloc, MetaIndex idx) : IDisposable public unsafe class MetaBaseFile(MetaFileManager manager, IFileAllocator alloc, MetaIndex idx) : IDisposable
{ {
protected readonly MetaFileManager Manager = manager; protected readonly MetaFileManager Manager = manager;

View file

@ -28,24 +28,26 @@ public class MetaFileManager : IService
internal readonly ImcChecker ImcChecker; internal readonly ImcChecker ImcChecker;
internal readonly AtchManager AtchManager; internal readonly AtchManager AtchManager;
internal readonly IFileAllocator MarshalAllocator = new MarshalAllocator(); internal readonly IFileAllocator MarshalAllocator = new MarshalAllocator();
internal readonly IFileAllocator XivAllocator; internal readonly IFileAllocator XivFileAllocator;
internal readonly IFileAllocator XivDefaultAllocator;
public MetaFileManager(CharacterUtility characterUtility, ResidentResourceManager residentResources, IDataManager gameData, public MetaFileManager(CharacterUtility characterUtility, ResidentResourceManager residentResources, IDataManager gameData,
ActiveCollectionData activeCollections, Configuration config, ValidityChecker validityChecker, ObjectIdentification identifier, ActiveCollectionData activeCollections, Configuration config, ValidityChecker validityChecker, ObjectIdentification identifier,
FileCompactor compactor, IGameInteropProvider interop, AtchManager atchManager) FileCompactor compactor, IGameInteropProvider interop, AtchManager atchManager)
{ {
CharacterUtility = characterUtility; CharacterUtility = characterUtility;
ResidentResources = residentResources; ResidentResources = residentResources;
GameData = gameData; GameData = gameData;
ActiveCollections = activeCollections; ActiveCollections = activeCollections;
Config = config; Config = config;
ValidityChecker = validityChecker; ValidityChecker = validityChecker;
Identifier = identifier; Identifier = identifier;
Compactor = compactor; Compactor = compactor;
AtchManager = atchManager; AtchManager = atchManager;
ImcChecker = new ImcChecker(this); ImcChecker = new ImcChecker(this);
XivAllocator = new XivFileAllocator(interop); XivFileAllocator = new XivFileAllocator(interop);
XivDefaultAllocator = new XivDefaultAllocator();
interop.InitializeFromAttributes(this); interop.InitializeFromAttributes(this);
} }