diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Unlocker/Module.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Unlocker/Module.cs index 6a86cf04..11fed195 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Unlocker/Module.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Unlocker/Module.cs @@ -1,8 +1,6 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using System.Runtime.CompilerServices; - namespace Snap.Hutao.Service.Game.Unlocker; internal readonly struct Module 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 5863567c..6a4b4b82 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Unlocker/RequiredLocalModule.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Unlocker/RequiredLocalModule.cs @@ -2,8 +2,8 @@ // Licensed under the MIT license. using Snap.Hutao.Win32.Foundation; -using Snap.Hutao.Win32.System.ProcessStatus; -using System.Diagnostics; +using Snap.Hutao.Win32.System.Diagnostics.Debug; +using Snap.Hutao.Win32.System.SystemService; using static Snap.Hutao.Win32.Kernel32; namespace Snap.Hutao.Service.Game.Unlocker; @@ -14,16 +14,11 @@ internal readonly struct RequiredLocalModule : IDisposable public readonly Module UnityPlayer; public readonly Module UserAssembly; - public RequiredLocalModule(in HMODULE unityPlayer, in HMODULE userAssembly) + public unsafe RequiredLocalModule(in HMODULE unityPlayer, in HMODULE userAssembly) { HasValue = true; - HANDLE process = Process.GetCurrentProcess().Handle; - - K32GetModuleInformation(process, unityPlayer, out MODULEINFO upInfo); - UnityPlayer = new((nuint)(nint)unityPlayer, upInfo.SizeOfImage); - - K32GetModuleInformation(process, userAssembly, out MODULEINFO uaInfo); - UserAssembly = new((nuint)(nint)userAssembly, uaInfo.SizeOfImage); + UnityPlayer = new((nuint)(nint)unityPlayer, ((IMAGE_NT_HEADERS64*)((IMAGE_DOS_HEADER*)(nint)unityPlayer)->e_lfanew)->OptionalHeader.SizeOfImage); + UserAssembly = new((nuint)(nint)userAssembly, ((IMAGE_NT_HEADERS64*)((IMAGE_DOS_HEADER*)(nint)userAssembly)->e_lfanew)->OptionalHeader.SizeOfImage); } public void Dispose() diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/FACILITY_CODE.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/FACILITY_CODE.cs index 4beca576..5f6cc22e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/FACILITY_CODE.cs +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/FACILITY_CODE.cs @@ -159,4 +159,4 @@ internal enum FACILITY_CODE : uint FACILITY_GAME = 2340u, FACILITY_PIX = 2748u, FACILITY_NT_BIT = 268435456u, -} +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_DATA_DIRECTORY.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_DATA_DIRECTORY.cs new file mode 100644 index 00000000..9c1fef4c --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_DATA_DIRECTORY.cs @@ -0,0 +1,10 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.System.Diagnostics.Debug; + +internal struct IMAGE_DATA_DIRECTORY +{ + public uint VirtualAddress; + public uint Size; +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_DLL_CHARACTERISTICS.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_DLL_CHARACTERISTICS.cs new file mode 100644 index 00000000..30ca3a8c --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_DLL_CHARACTERISTICS.cs @@ -0,0 +1,26 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.System.Diagnostics.Debug; + +[Flags] +internal enum IMAGE_DLL_CHARACTERISTICS : ushort +{ + IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA = 0x20, + IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x40, + IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY = 0x80, + IMAGE_DLLCHARACTERISTICS_NX_COMPAT = 0x100, + IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = 0x200, + IMAGE_DLLCHARACTERISTICS_NO_SEH = 0x400, + IMAGE_DLLCHARACTERISTICS_NO_BIND = 0x800, + IMAGE_DLLCHARACTERISTICS_APPCONTAINER = 0x1000, + IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = 0x2000, + IMAGE_DLLCHARACTERISTICS_GUARD_CF = 0x4000, + IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000, + IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT = 1, + IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE = 2, + IMAGE_DLLCHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE = 4, + IMAGE_DLLCHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC = 8, + IMAGE_DLLCHARACTERISTICS_EX_CET_RESERVED_1 = 0x10, + IMAGE_DLLCHARACTERISTICS_EX_CET_RESERVED_2 = 0x20, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_FILE_CHARACTERISTICS.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_FILE_CHARACTERISTICS.cs new file mode 100644 index 00000000..e2b85a4d --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_FILE_CHARACTERISTICS.cs @@ -0,0 +1,24 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.System.Diagnostics.Debug; + +[Flags] +internal enum IMAGE_FILE_CHARACTERISTICS : ushort +{ + IMAGE_FILE_RELOCS_STRIPPED = 0x1, + IMAGE_FILE_EXECUTABLE_IMAGE = 0x2, + IMAGE_FILE_LINE_NUMS_STRIPPED = 0x4, + IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x8, + IMAGE_FILE_AGGRESIVE_WS_TRIM = 0x10, + IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x20, + IMAGE_FILE_BYTES_REVERSED_LO = 0x80, + IMAGE_FILE_32BIT_MACHINE = 0x100, + IMAGE_FILE_DEBUG_STRIPPED = 0x200, + IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x400, + IMAGE_FILE_NET_RUN_FROM_SWAP = 0x800, + IMAGE_FILE_SYSTEM = 0x1000, + IMAGE_FILE_DLL = 0x2000, + IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000, + IMAGE_FILE_BYTES_REVERSED_HI = 0x8000, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_FILE_HEADER.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_FILE_HEADER.cs new file mode 100644 index 00000000..e12f91d6 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_FILE_HEADER.cs @@ -0,0 +1,17 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Win32.System.SystemInformation; + +namespace Snap.Hutao.Win32.System.Diagnostics.Debug; + +internal struct IMAGE_FILE_HEADER +{ + public IMAGE_FILE_MACHINE Machine; + public ushort NumberOfSections; + public uint TimeDateStamp; + public uint PointerToSymbolTable; + public uint NumberOfSymbols; + public ushort SizeOfOptionalHeader; + public IMAGE_FILE_CHARACTERISTICS Characteristics; +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_NT_HEADERS64.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_NT_HEADERS64.cs new file mode 100644 index 00000000..ae6a8058 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_NT_HEADERS64.cs @@ -0,0 +1,11 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.System.Diagnostics.Debug; + +internal struct IMAGE_NT_HEADERS64 +{ + public uint Signature; + public IMAGE_FILE_HEADER FileHeader; + public IMAGE_OPTIONAL_HEADER64 OptionalHeader; +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_OPTIONAL_HEADER64.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_OPTIONAL_HEADER64.cs new file mode 100644 index 00000000..d42cf8ae --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_OPTIONAL_HEADER64.cs @@ -0,0 +1,50 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Snap.Hutao.Win32.System.Diagnostics.Debug; + +[StructLayout(LayoutKind.Sequential, Pack = 4)] +internal struct IMAGE_OPTIONAL_HEADER64 +{ + public IMAGE_OPTIONAL_HEADER_MAGIC Magic; + public byte MajorLinkerVersion; + public byte MinorLinkerVersion; + public uint SizeOfCode; + public uint SizeOfInitializedData; + public uint SizeOfUninitializedData; + public uint AddressOfEntryPoint; + public uint BaseOfCode; + public ulong ImageBase; + public uint SectionAlignment; + public uint FileAlignment; + public ushort MajorOperatingSystemVersion; + public ushort MinorOperatingSystemVersion; + public ushort MajorImageVersion; + public ushort MinorImageVersion; + public ushort MajorSubsystemVersion; + public ushort MinorSubsystemVersion; + public uint Win32VersionValue; + public uint SizeOfImage; + public uint SizeOfHeaders; + public uint CheckSum; + public IMAGE_SUBSYSTEM Subsystem; + public IMAGE_DLL_CHARACTERISTICS DllCharacteristics; + public ulong SizeOfStackReserve; + public ulong SizeOfStackCommit; + public ulong SizeOfHeapReserve; + public ulong SizeOfHeapCommit; + + [Obsolete] + public uint LoaderFlags; + public uint NumberOfRvaAndSizes; + public IMAGE_DATA_DIRECTORY_16 DataDirectory; + + [InlineArray(16)] + internal struct IMAGE_DATA_DIRECTORY_16 + { + public IMAGE_DATA_DIRECTORY Value; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_OPTIONAL_HEADER_MAGIC.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_OPTIONAL_HEADER_MAGIC.cs new file mode 100644 index 00000000..604edfa4 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_OPTIONAL_HEADER_MAGIC.cs @@ -0,0 +1,12 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.System.Diagnostics.Debug; + +internal enum IMAGE_OPTIONAL_HEADER_MAGIC : ushort +{ + IMAGE_NT_OPTIONAL_HDR_MAGIC = 523, + IMAGE_NT_OPTIONAL_HDR32_MAGIC = 267, + IMAGE_NT_OPTIONAL_HDR64_MAGIC = 523, + IMAGE_ROM_OPTIONAL_HDR_MAGIC = 263, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_SUBSYSTEM.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_SUBSYSTEM.cs new file mode 100644 index 00000000..1b938420 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/Diagnostics/Debug/IMAGE_SUBSYSTEM.cs @@ -0,0 +1,23 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Win32.System.Diagnostics.Debug; + +internal enum IMAGE_SUBSYSTEM : ushort +{ + IMAGE_SUBSYSTEM_UNKNOWN = 0, + IMAGE_SUBSYSTEM_NATIVE = 1, + IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, + IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, + IMAGE_SUBSYSTEM_OS2_CUI = 5, + IMAGE_SUBSYSTEM_POSIX_CUI = 7, + IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8, + IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9, + IMAGE_SUBSYSTEM_EFI_APPLICATION = 10, + IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11, + IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12, + IMAGE_SUBSYSTEM_EFI_ROM = 13, + IMAGE_SUBSYSTEM_XBOX = 14, + IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16, + IMAGE_SUBSYSTEM_XBOX_CODE_CATALOG = 17, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/SystemInformation/IMAGE_FILE_MACHINE.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/SystemInformation/IMAGE_FILE_MACHINE.cs new file mode 100644 index 00000000..8e5bad92 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/SystemInformation/IMAGE_FILE_MACHINE.cs @@ -0,0 +1,46 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Snap.Hutao.Win32.System.SystemInformation; + +internal enum IMAGE_FILE_MACHINE : ushort +{ + IMAGE_FILE_MACHINE_AXP64 = 644, + IMAGE_FILE_MACHINE_I386 = 332, + IMAGE_FILE_MACHINE_IA64 = 512, + IMAGE_FILE_MACHINE_AMD64 = 34404, + IMAGE_FILE_MACHINE_UNKNOWN = 0, + IMAGE_FILE_MACHINE_TARGET_HOST = 1, + IMAGE_FILE_MACHINE_R3000 = 354, + IMAGE_FILE_MACHINE_R4000 = 358, + IMAGE_FILE_MACHINE_R10000 = 360, + IMAGE_FILE_MACHINE_WCEMIPSV2 = 361, + IMAGE_FILE_MACHINE_ALPHA = 388, + IMAGE_FILE_MACHINE_SH3 = 418, + IMAGE_FILE_MACHINE_SH3DSP = 419, + IMAGE_FILE_MACHINE_SH3E = 420, + IMAGE_FILE_MACHINE_SH4 = 422, + IMAGE_FILE_MACHINE_SH5 = 424, + IMAGE_FILE_MACHINE_ARM = 448, + IMAGE_FILE_MACHINE_THUMB = 450, + IMAGE_FILE_MACHINE_ARMNT = 452, + IMAGE_FILE_MACHINE_AM33 = 467, + IMAGE_FILE_MACHINE_POWERPC = 496, + IMAGE_FILE_MACHINE_POWERPCFP = 497, + IMAGE_FILE_MACHINE_MIPS16 = 614, + IMAGE_FILE_MACHINE_ALPHA64 = 644, + IMAGE_FILE_MACHINE_MIPSFPU = 870, + IMAGE_FILE_MACHINE_MIPSFPU16 = 1126, + IMAGE_FILE_MACHINE_TRICORE = 1312, + IMAGE_FILE_MACHINE_CEF = 3311, + IMAGE_FILE_MACHINE_EBC = 3772, + IMAGE_FILE_MACHINE_M32R = 36929, + IMAGE_FILE_MACHINE_ARM64 = 43620, + IMAGE_FILE_MACHINE_CEE = 49390, +} diff --git a/src/Snap.Hutao/Snap.Hutao/Win32/System/SystemService/IMAGE_DOS_HEADER.cs b/src/Snap.Hutao/Snap.Hutao/Win32/System/SystemService/IMAGE_DOS_HEADER.cs new file mode 100644 index 00000000..7d673264 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Win32/System/SystemService/IMAGE_DOS_HEADER.cs @@ -0,0 +1,32 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using System.Runtime.InteropServices; + +namespace Snap.Hutao.Win32.System.SystemService; + +[SuppressMessage("", "SA1307")] +[SuppressMessage("", "SA1310")] +[StructLayout(LayoutKind.Sequential, Pack = 2)] +internal struct IMAGE_DOS_HEADER +{ + public ushort e_magic; + public ushort e_cblp; + public ushort e_cp; + public ushort e_crlc; + public ushort e_cparhdr; + public ushort e_minalloc; + public ushort e_maxalloc; + public ushort e_ss; + public ushort e_sp; + public ushort e_csum; + public ushort e_ip; + public ushort e_cs; + public ushort e_lfarlc; + public ushort e_ovno; + public unsafe fixed ushort e_res[4]; + public ushort e_oemid; + public ushort e_oeminfo; + public unsafe fixed ushort e_res2[10]; + public int e_lfanew; +}