mirror of
https://github.com/CookiePLMonster/SilentPatch.git
synced 2025-01-01 08:43:01 +05:00
III/VC can use non-serializable (local session only) hints
This commit is contained in:
parent
4b934419bf
commit
51fa496658
4 changed files with 29 additions and 23 deletions
|
@ -37,8 +37,8 @@ struct basic_fnv_1
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::uint64_t fnv_prime = 1099511628211u;
|
static constexpr std::uint64_t fnv_prime = 1099511628211u;
|
||||||
const std::uint64_t fnv_offset_basis = 14695981039346656037u;
|
static constexpr std::uint64_t fnv_offset_basis = 14695981039346656037u;
|
||||||
|
|
||||||
typedef basic_fnv_1<fnv_prime, fnv_offset_basis> fnv_1;
|
typedef basic_fnv_1<fnv_prime, fnv_offset_basis> fnv_1;
|
||||||
|
|
||||||
|
@ -56,7 +56,11 @@ namespace hook
|
||||||
|
|
||||||
|
|
||||||
#if PATTERNS_USE_HINTS
|
#if PATTERNS_USE_HINTS
|
||||||
static std::multimap<uint64_t, uintptr_t> g_hints;
|
static auto& getHints()
|
||||||
|
{
|
||||||
|
static std::multimap<uint64_t, uintptr_t> hints;
|
||||||
|
return hints;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void TransformPattern(std::string_view pattern, std::string& data, std::string& mask)
|
static void TransformPattern(std::string_view pattern, std::string& data, std::string& mask)
|
||||||
|
@ -148,13 +152,13 @@ void pattern::Initialize(const char* pattern, size_t length)
|
||||||
// if there's hints, try those first
|
// if there's hints, try those first
|
||||||
if (m_module == GetModuleHandle(nullptr))
|
if (m_module == GetModuleHandle(nullptr))
|
||||||
{
|
{
|
||||||
auto range = g_hints.equal_range(m_hash);
|
auto range = getHints().equal_range(m_hash);
|
||||||
|
|
||||||
if (range.first != range.second)
|
if (range.first != range.second)
|
||||||
{
|
{
|
||||||
std::for_each(range.first, range.second, [&] (const std::pair<uint64_t, uintptr_t>& hint)
|
std::for_each(range.first, range.second, [&] (const std::pair<uint64_t, uintptr_t>& hint)
|
||||||
{
|
{
|
||||||
ConsiderMatch(hint.second);
|
ConsiderHint(hint.second);
|
||||||
});
|
});
|
||||||
|
|
||||||
// if the hints succeeded, we don't need to do anything more
|
// if the hints succeeded, we don't need to do anything more
|
||||||
|
@ -181,7 +185,7 @@ void pattern::EnsureMatches(uint32_t maxCount)
|
||||||
auto matchSuccess = [&] (uintptr_t address)
|
auto matchSuccess = [&] (uintptr_t address)
|
||||||
{
|
{
|
||||||
#if PATTERNS_USE_HINTS
|
#if PATTERNS_USE_HINTS
|
||||||
g_hints.emplace(m_hash, address);
|
getHints().emplace(m_hash, address);
|
||||||
#else
|
#else
|
||||||
(void)address;
|
(void)address;
|
||||||
#endif
|
#endif
|
||||||
|
@ -229,13 +233,14 @@ void pattern::EnsureMatches(uint32_t maxCount)
|
||||||
m_matched = true;
|
m_matched = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pattern::ConsiderMatch(uintptr_t offset)
|
bool pattern::ConsiderHint(uintptr_t offset)
|
||||||
{
|
{
|
||||||
|
char* ptr = reinterpret_cast<char*>(offset);
|
||||||
|
|
||||||
|
#if PATTERNS_CAN_SERIALIZE_HINTS
|
||||||
const char* pattern = m_bytes.c_str();
|
const char* pattern = m_bytes.c_str();
|
||||||
const char* mask = m_mask.c_str();
|
const char* mask = m_mask.c_str();
|
||||||
|
|
||||||
char* ptr = reinterpret_cast<char*>(offset);
|
|
||||||
|
|
||||||
for (size_t i = 0, j = m_mask.size(); i < j; i++)
|
for (size_t i = 0, j = m_mask.size(); i < j; i++)
|
||||||
{
|
{
|
||||||
if (mask[i] == '?')
|
if (mask[i] == '?')
|
||||||
|
@ -248,18 +253,21 @@ bool pattern::ConsiderMatch(uintptr_t offset)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
m_matches.emplace_back(ptr);
|
m_matches.emplace_back(ptr);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PATTERNS_USE_HINTS
|
#if PATTERNS_USE_HINTS && PATTERNS_CAN_SERIALIZE_HINTS
|
||||||
void pattern::hint(uint64_t hash, uintptr_t address)
|
void pattern::hint(uint64_t hash, uintptr_t address)
|
||||||
{
|
{
|
||||||
auto range = g_hints.equal_range(hash);
|
auto& hints = getHints();
|
||||||
|
|
||||||
for (auto it = range.first; it != range.second; it++)
|
auto range = hints.equal_range(hash);
|
||||||
|
|
||||||
|
for (auto it = range.first; it != range.second; ++it)
|
||||||
{
|
{
|
||||||
if (it->second == address)
|
if (it->second == address)
|
||||||
{
|
{
|
||||||
|
@ -267,7 +275,7 @@ void pattern::hint(uint64_t hash, uintptr_t address)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_hints.emplace(hash, address);
|
hints.emplace(hash, address);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
|
@ -13,8 +13,6 @@
|
||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
#pragma warning(disable:4201)
|
#pragma warning(disable:4201)
|
||||||
|
|
||||||
#define PATTERNS_USE_HINTS 0
|
|
||||||
|
|
||||||
namespace hook
|
namespace hook
|
||||||
{
|
{
|
||||||
extern ptrdiff_t baseAddressDifference;
|
extern ptrdiff_t baseAddressDifference;
|
||||||
|
@ -103,7 +101,7 @@ namespace hook
|
||||||
void Initialize(const char* pattern, size_t length);
|
void Initialize(const char* pattern, size_t length);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool ConsiderMatch(uintptr_t offset);
|
bool ConsiderHint(uintptr_t offset);
|
||||||
|
|
||||||
void EnsureMatches(uint32_t maxCount);
|
void EnsureMatches(uint32_t maxCount);
|
||||||
|
|
||||||
|
@ -179,7 +177,7 @@ namespace hook
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
#if PATTERNS_USE_HINTS
|
#if PATTERNS_USE_HINTS && PATTERNS_CAN_SERIALIZE_HINTS
|
||||||
// define a hint
|
// define a hint
|
||||||
static void hint(uint64_t hash, uintptr_t address);
|
static void hint(uint64_t hash, uintptr_t address);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -99,7 +99,7 @@
|
||||||
<WarningLevel>Level4</WarningLevel>
|
<WarningLevel>Level4</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;_GTA_III;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;PATTERNS_USE_HINTS=1;_GTA_III;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>..\SilentPatch</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\SilentPatch</AdditionalIncludeDirectories>
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
<PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>
|
<PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>
|
||||||
|
@ -134,7 +134,7 @@
|
||||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
<OmitFramePointers>true</OmitFramePointers>
|
<OmitFramePointers>true</OmitFramePointers>
|
||||||
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;_GTA_III;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;PATTERNS_USE_HINTS=1;_GTA_III;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>..\SilentPatch</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\SilentPatch</AdditionalIncludeDirectories>
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
<PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>
|
<PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>
|
||||||
|
@ -171,7 +171,7 @@
|
||||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
<OmitFramePointers>true</OmitFramePointers>
|
<OmitFramePointers>true</OmitFramePointers>
|
||||||
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;_GTA_III;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;PATTERNS_USE_HINTS=1;_GTA_III;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>..\SilentPatch</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\SilentPatch</AdditionalIncludeDirectories>
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
<PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>
|
<PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>
|
||||||
|
|
|
@ -74,7 +74,7 @@
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level4</WarningLevel>
|
<WarningLevel>Level4</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;_GTA_VC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;PATTERNS_USE_HINTS=1;_GTA_VC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
<AdditionalIncludeDirectories>..\SilentPatch</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\SilentPatch</AdditionalIncludeDirectories>
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
@ -103,7 +103,7 @@
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;_GTA_VC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;PATTERNS_USE_HINTS=1;_GTA_VC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<StringPooling>true</StringPooling>
|
<StringPooling>true</StringPooling>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||||
|
@ -138,7 +138,7 @@
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;_GTA_VC;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_HAS_EXCEPTIONS=0;PATTERNS_USE_HINTS=1;_GTA_VC;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<StringPooling>true</StringPooling>
|
<StringPooling>true</StringPooling>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||||
|
|
Loading…
Reference in a new issue