mirror of
https://jihulab.com/DGP-Studio/Snap.Hutao.git
synced 2025-11-19 21:02:53 +08:00
1.6.5 rc1
This commit is contained in:
@@ -61,4 +61,46 @@ internal static partial class EnumerableExtension
|
||||
{
|
||||
return new ObservableCollection<T>(source);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Concatenates each element from the collection into single string.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Type of array elements.</typeparam>
|
||||
/// <param name="collection">Collection to convert. Cannot be <see langword="null"/>.</param>
|
||||
/// <param name="separator">Delimiter between elements in the final string.</param>
|
||||
/// <param name="defaultValue">A string to be returned if collection has no elements.</param>
|
||||
/// <returns>Converted collection into string.</returns>
|
||||
public static string ToString<T>(this IEnumerable<T> collection, string separator, string defaultValue = "")
|
||||
{
|
||||
string result = string.Join(separator, collection);
|
||||
if (result.Length > 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Concatenates each element from the collection into single string.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Type of array elements.</typeparam>
|
||||
/// <param name="collection">Collection to convert. Cannot be <see langword="null"/>.</param>
|
||||
/// <param name="separator">Delimiter between elements in the final string.</param>
|
||||
/// <param name="defaultValue">A string to be returned if collection has no elements.</param>
|
||||
/// <returns>Converted collection into string.</returns>
|
||||
public static string ToString<T>(this IEnumerable<T> collection, char separator = ',', string defaultValue = "")
|
||||
{
|
||||
string result = string.Join(separator, collection);
|
||||
if (result.Length > 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ internal enum AchievementStatus
|
||||
STATUS_UNRECOGNIZED = -1,
|
||||
|
||||
/// <summary>
|
||||
/// 非法值
|
||||
/// 不使用的成就
|
||||
/// </summary>
|
||||
STATUS_INVALID = 0,
|
||||
|
||||
|
||||
@@ -7,80 +7,22 @@ namespace Snap.Hutao.Model.Intrinsic;
|
||||
/// 元素类型
|
||||
/// </summary>
|
||||
[HighQuality]
|
||||
[SuppressMessage("", "SA1602")]
|
||||
internal enum ElementType
|
||||
{
|
||||
/// <summary>
|
||||
/// 无元素
|
||||
/// </summary>
|
||||
None = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 火元素
|
||||
/// </summary>
|
||||
Fire = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 水元素
|
||||
/// </summary>
|
||||
Water = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 草元素
|
||||
/// </summary>
|
||||
Grass = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 雷元素
|
||||
/// </summary>
|
||||
Electric = 4,
|
||||
|
||||
/// <summary>
|
||||
/// 冰元素
|
||||
/// </summary>
|
||||
Ice = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 冻元素
|
||||
/// </summary>
|
||||
Frozen = 6,
|
||||
|
||||
/// <summary>
|
||||
/// 风元素
|
||||
/// </summary>
|
||||
Wind = 7,
|
||||
|
||||
/// <summary>
|
||||
/// 岩元素
|
||||
/// </summary>
|
||||
Rock = 8,
|
||||
|
||||
/// <summary>
|
||||
/// 燃元素
|
||||
/// </summary>
|
||||
AntiFire = 9,
|
||||
|
||||
/// <summary>
|
||||
/// 枫丹玩法
|
||||
/// </summary>
|
||||
VehicleMuteIce = 10,
|
||||
|
||||
/// <summary>
|
||||
/// 弹弹菇
|
||||
/// </summary>
|
||||
Mushroom = 11,
|
||||
|
||||
/// <summary>
|
||||
/// 激元素
|
||||
/// </summary>
|
||||
Overdose = 12,
|
||||
|
||||
/// <summary>
|
||||
/// 木元素
|
||||
/// </summary>
|
||||
Wood = 13,
|
||||
|
||||
/// <summary>
|
||||
/// 个数
|
||||
/// </summary>
|
||||
Count = 14,
|
||||
None = 0, // 无元素
|
||||
Fire = 1, // 火元素
|
||||
Water = 2, // 水元素
|
||||
Grass = 3, // 草元素
|
||||
Electric = 4, // 雷元素
|
||||
Ice = 5, // 冰元素
|
||||
Frozen = 6, // 冻元素
|
||||
Wind = 7, // 风元素
|
||||
Rock = 8, // 岩元素
|
||||
AntiFire = 9, // 燃元素
|
||||
VehicleMuteIce = 10, // 枫丹玩法
|
||||
Mushroom = 11, // 弹弹菇
|
||||
Overdose = 12, // 激元素
|
||||
Wood = 13, // 木元素
|
||||
Count = 14, // 个数
|
||||
}
|
||||
@@ -25,7 +25,7 @@ public static partial class Program
|
||||
[STAThread]
|
||||
private static void Main(string[] args)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[Arguments]:{args}");
|
||||
System.Diagnostics.Debug.WriteLine($"[Arguments]:[{EnumerableExtension.ToString(args)}]");
|
||||
|
||||
XamlCheckProcessRequirements();
|
||||
ComWrappersSupport.InitializeComWrappers();
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
using Snap.Hutao.Core.Diagnostics;
|
||||
using Snap.Hutao.Core.ExceptionService;
|
||||
using Snap.Hutao.Win32.Memory;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
using Windows.Win32.Foundation;
|
||||
@@ -235,7 +236,7 @@ internal sealed class GameFpsUnlocker : IGameFpsUnlocker
|
||||
|
||||
using (localMemory)
|
||||
{
|
||||
int offset = IndexOfPattern(localMemory.GetBuffer()[(int)moduleEntryInfo.UnityPlayer.Size..]);
|
||||
int offset = IndexOfPattern(localMemory.Span[(int)moduleEntryInfo.UnityPlayer.Size..]);
|
||||
Must.Range(offset >= 0, SH.ServiceGameUnlockerInterestedPatternNotFound);
|
||||
|
||||
byte* pLocalMemory = (byte*)localMemory.Pointer;
|
||||
|
||||
@@ -84,7 +84,7 @@ internal sealed partial class MetadataOptions : IOptions<MetadataOptions>
|
||||
/// <returns>服务器上的本地化元数据文件</returns>
|
||||
public string GetLocalizedRemoteFile(string fileNameWithExtension)
|
||||
{
|
||||
return Web.HutaoEndpoints.RawGithubUserContentMetadataFile(LocaleName, fileNameWithExtension);
|
||||
return Web.HutaoEndpoints.HutaoMetadata2File(LocaleName, fileNameWithExtension);
|
||||
}
|
||||
|
||||
private string GetLocaleName()
|
||||
|
||||
25
src/Snap.Hutao/Snap.Hutao/Win32/Memory/IUnmanagedMemory.cs
Normal file
25
src/Snap.Hutao/Snap.Hutao/Win32/Memory/IUnmanagedMemory.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
namespace Snap.Hutao.Win32.Memory;
|
||||
|
||||
/// <summary>
|
||||
/// 非托管内存
|
||||
/// </summary>
|
||||
internal unsafe interface IUnmanagedMemory : IDisposable
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets a pointer to the allocated unmanaged memory.
|
||||
/// </summary>
|
||||
void* Pointer { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets size of referenced unmanaged memory, in bytes.
|
||||
/// </summary>
|
||||
uint Size { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a span of bytes from the current instance.
|
||||
/// </summary>
|
||||
Span<byte> Span { get; }
|
||||
}
|
||||
@@ -4,22 +4,22 @@
|
||||
using Windows.Win32.System.Memory;
|
||||
using static Windows.Win32.PInvoke;
|
||||
|
||||
namespace Snap.Hutao.Service.Game.Unlocker;
|
||||
namespace Snap.Hutao.Win32.Memory;
|
||||
|
||||
/// <summary>
|
||||
/// NativeMemory.AllocZeroed wrapper
|
||||
/// </summary>
|
||||
internal readonly unsafe struct VirtualMemory : IDisposable
|
||||
internal readonly unsafe struct VirtualMemory : IUnmanagedMemory
|
||||
{
|
||||
/// <summary>
|
||||
/// 缓冲区地址
|
||||
/// </summary>
|
||||
public readonly void* Pointer;
|
||||
private readonly void* pointer;
|
||||
|
||||
/// <summary>
|
||||
/// 长度
|
||||
/// </summary>
|
||||
public readonly uint Length;
|
||||
private readonly uint size;
|
||||
|
||||
/// <summary>
|
||||
/// 构造一个新的本地内存
|
||||
@@ -27,28 +27,23 @@ internal readonly unsafe struct VirtualMemory : IDisposable
|
||||
/// <param name="dwSize">长度</param>
|
||||
public unsafe VirtualMemory(uint dwSize)
|
||||
{
|
||||
Length = dwSize;
|
||||
size = dwSize;
|
||||
VIRTUAL_ALLOCATION_TYPE commitAndReserve = VIRTUAL_ALLOCATION_TYPE.MEM_COMMIT | VIRTUAL_ALLOCATION_TYPE.MEM_RESERVE;
|
||||
Pointer = VirtualAlloc(default, dwSize, commitAndReserve, PAGE_PROTECTION_FLAGS.PAGE_READWRITE);
|
||||
pointer = VirtualAlloc(default, dwSize, commitAndReserve, PAGE_PROTECTION_FLAGS.PAGE_READWRITE);
|
||||
}
|
||||
|
||||
public static unsafe implicit operator Span<byte>(VirtualMemory memory)
|
||||
{
|
||||
return memory.GetBuffer();
|
||||
}
|
||||
/// <inheritdoc/>
|
||||
public void* Pointer { get => pointer; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取缓冲区
|
||||
/// </summary>
|
||||
/// <returns>内存</returns>
|
||||
public unsafe Span<byte> GetBuffer()
|
||||
{
|
||||
return new Span<byte>(Pointer, (int)Length);
|
||||
}
|
||||
/// <inheritdoc/>
|
||||
public uint Size { get => size; }
|
||||
|
||||
/// <inheritdoc/>
|
||||
public Span<byte> Span { get => new(pointer, (int)size); }
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Dispose()
|
||||
{
|
||||
VirtualFree(Pointer, 0, VIRTUAL_FREE_TYPE.MEM_RELEASE);
|
||||
VirtualFree(pointer, 0, VIRTUAL_FREE_TYPE.MEM_RELEASE);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user