diff --git a/Penumbra/Interop/ResourceLoader.cs b/Penumbra/Interop/ResourceLoader.cs index 58874219..37afa75d 100644 --- a/Penumbra/Interop/ResourceLoader.cs +++ b/Penumbra/Interop/ResourceLoader.cs @@ -201,7 +201,7 @@ namespace Penumbra.Interop return ReadSqpackHook?.OriginalFunction( pFileHandler, pFileDesc, priority, isSync ) ?? 0; } - var gameFsPath = Marshal.PtrToStringAnsi( new IntPtr( pFileDesc->ResourceHandle->FileName ) ); + var gameFsPath = Marshal.PtrToStringAnsi( new IntPtr( pFileDesc->ResourceHandle->FileName() ) ); var isRooted = Path.IsPathRooted( gameFsPath ); diff --git a/Penumbra/Structs/ResourceHandle.cs b/Penumbra/Structs/ResourceHandle.cs index e16f5e0f..3318bb99 100644 --- a/Penumbra/Structs/ResourceHandle.cs +++ b/Penumbra/Structs/ResourceHandle.cs @@ -5,7 +5,25 @@ namespace Penumbra.Structs [StructLayout( LayoutKind.Explicit )] public unsafe struct ResourceHandle { + public const int SsoSize = 15; + + public byte* FileName() + { + if( FileNameLength > SsoSize ) + { + return _fileName; + } + + fixed( byte** name = &_fileName ) + { + return ( byte* )name; + } + } + [FieldOffset( 0x48 )] - public byte* FileName; + private byte* _fileName; + + [FieldOffset( 0x58 )] + public int FileNameLength; } } \ No newline at end of file