III/VC can use non-serializable (local session only) hints

This commit is contained in:
Silent 2017-09-12 22:53:20 +02:00
parent 4b934419bf
commit 51fa496658
4 changed files with 29 additions and 23 deletions

View file

@ -37,8 +37,8 @@ struct basic_fnv_1
}
};
const std::uint64_t fnv_prime = 1099511628211u;
const std::uint64_t fnv_offset_basis = 14695981039346656037u;
static constexpr std::uint64_t fnv_prime = 1099511628211u;
static constexpr std::uint64_t fnv_offset_basis = 14695981039346656037u;
typedef basic_fnv_1<fnv_prime, fnv_offset_basis> fnv_1;
@ -56,7 +56,11 @@ namespace hook
#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
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 (m_module == GetModuleHandle(nullptr))
{
auto range = g_hints.equal_range(m_hash);
auto range = getHints().equal_range(m_hash);
if (range.first != range.second)
{
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
@ -181,7 +185,7 @@ void pattern::EnsureMatches(uint32_t maxCount)
auto matchSuccess = [&] (uintptr_t address)
{
#if PATTERNS_USE_HINTS
g_hints.emplace(m_hash, address);
getHints().emplace(m_hash, address);
#else
(void)address;
#endif
@ -229,13 +233,14 @@ void pattern::EnsureMatches(uint32_t maxCount)
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* mask = m_mask.c_str();
char* ptr = reinterpret_cast<char*>(offset);
for (size_t i = 0, j = m_mask.size(); i < j; i++)
{
if (mask[i] == '?')
@ -248,18 +253,21 @@ bool pattern::ConsiderMatch(uintptr_t offset)
return false;
}
}
#endif
m_matches.emplace_back(ptr);
return true;
}
#if PATTERNS_USE_HINTS
#if PATTERNS_USE_HINTS && PATTERNS_CAN_SERIALIZE_HINTS
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)
{
@ -267,7 +275,7 @@ void pattern::hint(uint64_t hash, uintptr_t address)
}
}
g_hints.emplace(hash, address);
hints.emplace(hash, address);
}
#endif
}

View file

@ -13,8 +13,6 @@
#pragma warning(push)
#pragma warning(disable:4201)
#define PATTERNS_USE_HINTS 0
namespace hook
{
extern ptrdiff_t baseAddressDifference;
@ -103,7 +101,7 @@ namespace hook
void Initialize(const char* pattern, size_t length);
private:
bool ConsiderMatch(uintptr_t offset);
bool ConsiderHint(uintptr_t offset);
void EnsureMatches(uint32_t maxCount);
@ -179,7 +177,7 @@ namespace hook
}
public:
#if PATTERNS_USE_HINTS
#if PATTERNS_USE_HINTS && PATTERNS_CAN_SERIALIZE_HINTS
// define a hint
static void hint(uint64_t hash, uintptr_t address);
#endif

View file

@ -99,7 +99,7 @@
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<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>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>
@ -134,7 +134,7 @@
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<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>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>
@ -171,7 +171,7 @@
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<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>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>

View file

@ -74,7 +74,7 @@
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<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>
<AdditionalIncludeDirectories>..\SilentPatch</AdditionalIncludeDirectories>
<PrecompiledHeader>Use</PrecompiledHeader>
@ -103,7 +103,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<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>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
@ -138,7 +138,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<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>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>