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; 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
} }

View file

@ -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

View file

@ -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>

View file

@ -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>