diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Unlocker/RequiredLocalModule.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Unlocker/RequiredLocalModule.cs index 4b16193a..299c0b45 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Unlocker/RequiredLocalModule.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Unlocker/RequiredLocalModule.cs @@ -15,30 +15,35 @@ internal readonly struct RequiredLocalModule : IDisposable public readonly Module UnityPlayer; public readonly Module UserAssembly; + private readonly HMODULE hModuleUnityPlayer; + private readonly HMODULE hModuleUserAssembly; + [SuppressMessage("", "SH002")] public RequiredLocalModule(HMODULE unityPlayer, HMODULE userAssembly) { + hModuleUnityPlayer = unityPlayer; + hModuleUserAssembly = userAssembly; + // Align the pointer - unityPlayer = (nint)(unityPlayer & ~0x3L); - userAssembly = (nint)(userAssembly & ~0x3L); + nint unityPlayerMappedView = (nint)(unityPlayer & ~0x3L); + nint userAssemblyMappedView = (nint)(userAssembly & ~0x3L); HasValue = true; - UnityPlayer = new((nuint)(nint)unityPlayer, GetImageSize(unityPlayer)); - UserAssembly = new((nuint)(nint)userAssembly, GetImageSize(userAssembly)); + UnityPlayer = new((nuint)unityPlayerMappedView, GetImageSize(unityPlayerMappedView)); + UserAssembly = new((nuint)userAssemblyMappedView, GetImageSize(userAssemblyMappedView)); } public void Dispose() { - FreeLibrary((nint)UnityPlayer.Address); - FreeLibrary((nint)UserAssembly.Address); + FreeLibrary(hModuleUnityPlayer); + FreeLibrary(hModuleUserAssembly); } - [SuppressMessage("", "SH002")] [MethodImpl(MethodImplOptions.AggressiveInlining)] - private unsafe uint GetImageSize(HMODULE hModule) + private unsafe uint GetImageSize(nint baseAddress) { - IMAGE_DOS_HEADER* pImageDosHeader = (IMAGE_DOS_HEADER*)(nint)hModule; - IMAGE_NT_HEADERS64* pImageNtHeader = (IMAGE_NT_HEADERS64*)(pImageDosHeader->e_lfanew + hModule); + IMAGE_DOS_HEADER* pImageDosHeader = (IMAGE_DOS_HEADER*)baseAddress; + IMAGE_NT_HEADERS64* pImageNtHeader = (IMAGE_NT_HEADERS64*)(pImageDosHeader->e_lfanew + baseAddress); return pImageNtHeader->OptionalHeader.SizeOfImage; } } \ No newline at end of file