Skip to content

Commit bfe52f6

Browse files
committed
Minor changes
1 parent f8d4d8e commit bfe52f6

File tree

3 files changed

+108
-55
lines changed

3 files changed

+108
-55
lines changed

Detours.cpp

Lines changed: 99 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3357,6 +3357,10 @@ namespace Detours {
33573357

33583358
namespace RTTI {
33593359

3360+
// ----------------------------------------------------------------
3361+
// IsValidCompleteObjectLocator
3362+
// ----------------------------------------------------------------
3363+
33603364
static inline bool IsValidCompleteObjectLocator(PRTTI_COMPLETE_OBJECT_LOCATOR pCompleteObjectLocator) {
33613365
if (!pCompleteObjectLocator) {
33623366
return false;
@@ -3494,6 +3498,10 @@ namespace Detours {
34943498
}
34953499
}
34963500

3501+
// ----------------------------------------------------------------
3502+
// GetCompleteObjectLocatorFromObjectAt
3503+
// ----------------------------------------------------------------
3504+
34973505
static inline const PRTTI_COMPLETE_OBJECT_LOCATOR GetCompleteObjectLocatorFromObjectAt(void* const pThisWithVfAt0) {
34983506
if (!pThisWithVfAt0) {
34993507
return nullptr;
@@ -3502,6 +3510,10 @@ namespace Detours {
35023510
return reinterpret_cast<PRTTI_COMPLETE_OBJECT_LOCATOR>((reinterpret_cast<void***>(pThisWithVfAt0)[0])[-1]);
35033511
}
35043512

3513+
// ----------------------------------------------------------------
3514+
// GetCompleteObjectLocatorFromObject
3515+
// ----------------------------------------------------------------
3516+
35053517
static inline const PRTTI_COMPLETE_OBJECT_LOCATOR GetCompleteObjectLocatorFromObject(void* const pAddress, const LONG nVfDelta) {
35063518
if (!pAddress) {
35073519
return nullptr;
@@ -3510,6 +3522,10 @@ namespace Detours {
35103522
return GetCompleteObjectLocatorFromObjectAt(reinterpret_cast<char*>(pAddress) + nVfDelta);
35113523
}
35123524

3525+
// ----------------------------------------------------------------
3526+
// FindCompleteObject
3527+
// ----------------------------------------------------------------
3528+
35133529
static inline void* const FindCompleteObject(void* const pAddress, const LONG nVfDelta) {
35143530
if (!pAddress) {
35153531
return nullptr;
@@ -3527,6 +3543,10 @@ namespace Detours {
35273543
return pCompleteObject;
35283544
}
35293545

3546+
// ----------------------------------------------------------------
3547+
// GuessVfDelta
3548+
// ----------------------------------------------------------------
3549+
35303550
static LONG GuessVfDelta(void* const pAddress) {
35313551
if (!pAddress) {
35323552
return 0;
@@ -3550,6 +3570,10 @@ namespace Detours {
35503570
return 0;
35513571
}
35523572

3573+
// ----------------------------------------------------------------
3574+
// __GetBaseClassDescriptor
3575+
// ----------------------------------------------------------------
3576+
35533577
#ifdef _M_X64
35543578
static inline const PRTTI_BASE_CLASS_DESCRIPTOR __GetBaseClassDescriptor(void const* const pBaseAddress, const PRTTI_BASE_CLASS_ARRAY pBaseClassArray, const size_t unIndex) {
35553579
#elif _M_IX86
@@ -3573,6 +3597,10 @@ namespace Detours {
35733597
#endif
35743598
}
35753599

3600+
// ----------------------------------------------------------------
3601+
// __GetBaseClassArray
3602+
// ----------------------------------------------------------------
3603+
35763604
#ifdef _M_X64
35773605
static inline const PRTTI_BASE_CLASS_ARRAY __GetBaseClassArray(void const* const pBaseAddress, const PRTTI_CLASS_HIERARCHY_DESCRIPTOR pClassHierarchyDescriptor) {
35783606
#elif _M_IX86
@@ -3596,6 +3624,10 @@ namespace Detours {
35963624
#endif
35973625
}
35983626

3627+
// ----------------------------------------------------------------
3628+
// __GetTypeDescriptor
3629+
// ----------------------------------------------------------------
3630+
35993631
#ifdef _M_X64
36003632
static inline const PRTTI_TYPE_DESCRIPTOR __GetTypeDescriptor(void const* const pBaseAddress, const PRTTI_BASE_CLASS_DESCRIPTOR pBaseClassDescriptor) {
36013633
#elif _M_IX86
@@ -3642,6 +3674,10 @@ namespace Detours {
36423674
#endif
36433675
}
36443676

3677+
// ----------------------------------------------------------------
3678+
// __GetClassHierarchyDescriptor
3679+
// ----------------------------------------------------------------
3680+
36453681
#ifdef _M_X64
36463682
static inline const PRTTI_CLASS_HIERARCHY_DESCRIPTOR __GetClassHierarchyDescriptor(void const* const pBaseAddress, const PRTTI_BASE_CLASS_DESCRIPTOR pBaseClassDescriptor) {
36473683
#elif _M_IX86
@@ -3688,6 +3724,10 @@ namespace Detours {
36883724
#endif
36893725
}
36903726

3727+
// ----------------------------------------------------------------
3728+
// IsTypeDescriptorEqual
3729+
// ----------------------------------------------------------------
3730+
36913731
static bool IsTypeDescriptorEqual(const PRTTI_TYPE_DESCRIPTOR pLeft, const PRTTI_TYPE_DESCRIPTOR pRight) {
36923732
if (!pLeft || !pRight) {
36933733
return false;
@@ -3696,6 +3736,10 @@ namespace Detours {
36963736
return (pLeft == pRight) || (strncmp(pLeft->m_szName, pRight->m_szName, 0x1000) == 0);
36973737
}
36983738

3739+
// ----------------------------------------------------------------
3740+
// PMDtoOffset
3741+
// ----------------------------------------------------------------
3742+
36993743
static inline ptrdiff_t PMDtoOffset(void* const pCompleteObject, const RTTI_PMD& pmd) {
37003744
if (!pCompleteObject) {
37013745
return 0;
@@ -3713,29 +3757,9 @@ namespace Detours {
37133757
return nOffset;
37143758
}
37153759

3716-
static inline const PRTTI_COMPLETE_OBJECT_LOCATOR GetCompleteObjectLocatorFromObject(void* const pAddress) {
3717-
if (!pAddress) {
3718-
return nullptr;
3719-
}
3720-
3721-
return reinterpret_cast<PRTTI_COMPLETE_OBJECT_LOCATOR>((reinterpret_cast<void***>(pAddress)[0])[-1]);
3722-
}
3723-
3724-
static inline void* const FindCompleteObject(void* const pAddress) {
3725-
if (!pAddress) {
3726-
return nullptr;
3727-
}
3728-
3729-
const auto& pCompleteObjectLocator = GetCompleteObjectLocatorFromObject(pAddress);
3730-
3731-
char* pCompleteObject = reinterpret_cast<char*>(pAddress) - pCompleteObjectLocator->m_unOffset;
3732-
3733-
if (pCompleteObjectLocator->m_unConstructorOffset) {
3734-
pCompleteObject -= *reinterpret_cast<int*>((char*)pAddress - pCompleteObjectLocator->m_unConstructorOffset);
3735-
}
3736-
3737-
return pCompleteObject;
3738-
}
3760+
// ----------------------------------------------------------------
3761+
// FindSITargetTypeInstance
3762+
// ----------------------------------------------------------------
37393763

37403764
#ifdef _M_X64
37413765
static PRTTI_BASE_CLASS_DESCRIPTOR FindSITargetTypeInstance(void const* const pBaseAddress, const PRTTI_COMPLETE_OBJECT_LOCATOR pCompleteObjectLocator, const PRTTI_TYPE_DESCRIPTOR pSourceTypeDescriptor, const PRTTI_TYPE_DESCRIPTOR pTargetTypeDescriptor) {
@@ -3816,6 +3840,10 @@ namespace Detours {
38163840
return pDestinationBCD;
38173841
}
38183842

3843+
// ----------------------------------------------------------------
3844+
// FindMITargetTypeInstance
3845+
// ----------------------------------------------------------------
3846+
38193847
#ifdef _M_X64
38203848
static PRTTI_BASE_CLASS_DESCRIPTOR FindMITargetTypeInstance(void const* const pBaseAddress, void* const pCompleteObject, const PRTTI_COMPLETE_OBJECT_LOCATOR pCompleteObjectLocator, const PRTTI_TYPE_DESCRIPTOR pSourceTypeDescriptor, const ptrdiff_t nSourceOffset, const PRTTI_TYPE_DESCRIPTOR pTargetTypeDescriptor) {
38213849
#elif _M_IX86
@@ -3947,6 +3975,10 @@ namespace Detours {
39473975
return nullptr;
39483976
}
39493977

3978+
// ----------------------------------------------------------------
3979+
// FindVITargetTypeInstance
3980+
// ----------------------------------------------------------------
3981+
39503982
#ifdef _M_X64
39513983
static PRTTI_BASE_CLASS_DESCRIPTOR FindVITargetTypeInstance(void const* const pBaseAddress, void* const pCompleteObject, const PRTTI_COMPLETE_OBJECT_LOCATOR pCompleteObjectLocator, const PRTTI_TYPE_DESCRIPTOR pSourceTypeDescriptor, const ptrdiff_t nSourceOffset, const PRTTI_TYPE_DESCRIPTOR pTargetTypeDescriptor) {
39523984
#elif _M_IX86
@@ -4095,6 +4127,10 @@ namespace Detours {
40954127
return nullptr;
40964128
}
40974129

4130+
// ----------------------------------------------------------------
4131+
// RT functions
4132+
// ----------------------------------------------------------------
4133+
40984134
#ifdef _M_X64
40994135
void* const RTDynamicCast(void const* const pBaseAddress, void* const pAddress, const LONG nVfDelta, const PRTTI_TYPE_DESCRIPTOR pSourceTypeDescriptor, const PRTTI_TYPE_DESCRIPTOR pTargetTypeDescriptor, const BOOL bIsReference) {
41004136
#elif _M_IX86
@@ -4347,7 +4383,7 @@ namespace Detours {
43474383
return m_pVTable;
43484384
}
43494385

4350-
std::deque<std::unique_ptr<Object>>& Object::GetBaseObjects() {
4386+
std::vector<std::unique_ptr<Object>>& Object::GetBaseObjects() {
43514387
return m_vecBaseClasses;
43524388
}
43534389

@@ -4616,7 +4652,7 @@ namespace Detours {
46164652
#endif
46174653

46184654
// ----------------------------------------------------------------
4619-
// DumpRTTI
4655+
// FindTypeInfo
46204656
// ----------------------------------------------------------------
46214657

46224658
static inline char* FindTypeInfo(void const* const pBegin, void const* const pEnd) {
@@ -4629,7 +4665,11 @@ namespace Detours {
46294665
return reinterpret_cast<char*>(const_cast<void*>(FindData(const_cast<void*>(pBegin), reinterpret_cast<size_t>(const_cast<char*>(reinterpret_cast<const char*>(pEnd))) - reinterpret_cast<size_t>(const_cast<void*>(pBegin)), reinterpret_cast<const unsigned char* const>(pPattern), strnlen(pPattern, 16))));
46304666
}
46314667

4632-
static inline void TryEmplaceUniqueByTD(std::deque<std::unique_ptr<Object>>& out, std::unordered_set<const void*>& seenTD, std::unique_ptr<Object> candidate) {
4668+
// ----------------------------------------------------------------
4669+
// TryEmplaceUniqueByTD
4670+
// ----------------------------------------------------------------
4671+
4672+
static inline void TryEmplaceUniqueByTD(std::vector<std::unique_ptr<Object>>& out, std::unordered_set<const void*>& seenTD, std::unique_ptr<Object> candidate) {
46334673
if (!candidate) {
46344674
return;
46354675
}
@@ -4644,6 +4684,10 @@ namespace Detours {
46444684
}
46454685
}
46464686

4687+
// ----------------------------------------------------------------
4688+
// BuildObjectFromCOL
4689+
// ----------------------------------------------------------------
4690+
46474691
static std::unique_ptr<Object> BuildObjectFromCOL(void const* const pBaseAddress, void const* const pBegin, void const* const pEnd, const PRTTI_TYPE_DESCRIPTOR pTD) {
46484692
if (!pBaseAddress || !pBegin || !pEnd || !pTD) {
46494693
return nullptr;
@@ -4730,6 +4774,10 @@ namespace Detours {
47304774
return nullptr;
47314775
}
47324776

4777+
// ----------------------------------------------------------------
4778+
// BuildObjectFromBCD
4779+
// ----------------------------------------------------------------
4780+
47334781
static std::unique_ptr<Object> BuildObjectFromBCD(void const* const pBaseAddress, void const* const pBegin, void const* const pEnd, const PRTTI_TYPE_DESCRIPTOR pTD) {
47344782
if (!pBaseAddress || !pBegin || !pEnd || !pTD) {
47354783
return nullptr;
@@ -4749,9 +4797,9 @@ namespace Detours {
47494797
}
47504798

47514799
#ifdef _M_X64
4752-
auto pBCD = reinterpret_cast<PRTTI_BASE_CLASS_DESCRIPTOR>(reinterpret_cast<char*>(pReference) - offsetof(RTTI_BASE_CLASS_DESCRIPTOR, m_unTypeDescriptor));
4800+
const auto& pBCD = reinterpret_cast<PRTTI_BASE_CLASS_DESCRIPTOR>(reinterpret_cast<char*>(pReference) - offsetof(RTTI_BASE_CLASS_DESCRIPTOR, m_unTypeDescriptor));
47534801
#else
4754-
auto pBCD = reinterpret_cast<PRTTI_BASE_CLASS_DESCRIPTOR>(reinterpret_cast<char*>(pReference) - offsetof(RTTI_BASE_CLASS_DESCRIPTOR, m_pTypeDescriptor));
4802+
const auto& pBCD = reinterpret_cast<PRTTI_BASE_CLASS_DESCRIPTOR>(reinterpret_cast<char*>(pReference) - offsetof(RTTI_BASE_CLASS_DESCRIPTOR, m_pTypeDescriptor));
47554803
#endif
47564804
if ((reinterpret_cast<const char*>(pBCD) < reinterpret_cast<const char*>(pBegin)) || (reinterpret_cast<const char*>(pBCD) >= reinterpret_cast<const char*>(pEnd))) {
47574805
pReference = reinterpret_cast<void*>(reinterpret_cast<char*>(pReference) + 1);
@@ -4785,8 +4833,7 @@ namespace Detours {
47854833
}
47864834
#endif
47874835

4788-
if ((reinterpret_cast<const char*>(pCHD) < reinterpret_cast<const char*>(pBegin)) || (reinterpret_cast<const char*>(pCHD) >= reinterpret_cast<const char*>(pEnd)))
4789-
{
4836+
if ((reinterpret_cast<const char*>(pCHD) < reinterpret_cast<const char*>(pBegin)) || (reinterpret_cast<const char*>(pCHD) >= reinterpret_cast<const char*>(pEnd))) {
47904837
pReference = reinterpret_cast<void*>(reinterpret_cast<char*>(pReference) + 1);
47914838
continue;
47924839
}
@@ -4817,16 +4864,19 @@ namespace Detours {
48174864
return nullptr;
48184865
}
48194866

4820-
static void EnumerateAllTypeDescriptors(void const* const pBaseAddress, void const* const pBegin, void const* const pEnd, std::deque<const RTTI_TYPE_DESCRIPTOR*>& out) {
4867+
// ----------------------------------------------------------------
4868+
// EnumerateAllTypeDescriptors
4869+
// ----------------------------------------------------------------
4870+
4871+
static void EnumerateAllTypeDescriptors(void const* const pBaseAddress, void const* const pBegin, void const* const pEnd, std::vector<const RTTI_TYPE_DESCRIPTOR*>& out) {
48214872
if (!pBaseAddress || !pBegin || !pEnd) return;
48224873

48234874
char* pTypeInfoName = FindTypeInfo(pBegin, pEnd);
48244875
if (!pTypeInfoName) {
48254876
return;
48264877
}
48274878

4828-
auto pTypeInfoTD = reinterpret_cast<PRTTI_TYPE_DESCRIPTOR>(reinterpret_cast<char*>(pTypeInfoName) - sizeof(void*) * 2);
4829-
4879+
const auto& pTypeInfoTD = reinterpret_cast<PRTTI_TYPE_DESCRIPTOR>(reinterpret_cast<char*>(pTypeInfoName) - sizeof(void*) * 2);
48304880
if ((reinterpret_cast<const char*>(pTypeInfoTD) < reinterpret_cast<const char*>(pBegin)) || (reinterpret_cast<const char*>(pTypeInfoTD) >= reinterpret_cast<const char*>(pEnd)) || (reinterpret_cast<const char*>(pTypeInfoTD->m_pVFTable) < reinterpret_cast<const char*>(pBegin)) || (reinterpret_cast<const char*>(pTypeInfoTD->m_pVFTable) >= reinterpret_cast<const char*>(pEnd))) {
48314881
return;
48324882
}
@@ -4843,7 +4893,7 @@ namespace Detours {
48434893
break;
48444894
}
48454895

4846-
auto pTD = reinterpret_cast<PRTTI_TYPE_DESCRIPTOR>(pScan);
4896+
const auto& pTD = reinterpret_cast<PRTTI_TYPE_DESCRIPTOR>(pScan);
48474897
const char* szName = pTD->m_szName;
48484898
if ((reinterpret_cast<const char*>(szName) >= reinterpret_cast<const char*>(pBegin)) && (reinterpret_cast<const char*>(szName) < reinterpret_cast<const char*>(pEnd))) {
48494899
out.push_back(pTD);
@@ -4853,19 +4903,22 @@ namespace Detours {
48534903
}
48544904
}
48554905

4856-
std::deque<std::unique_ptr<Object>> DumpRTTI(void const* const pBaseAddress, void const* const pAddress, const size_t unSize) {
4857-
std::deque<std::unique_ptr<Object>> result;
4906+
// ----------------------------------------------------------------
4907+
// DumpRTTI
4908+
// ----------------------------------------------------------------
48584909

4910+
std::vector<std::unique_ptr<Object>> DumpRTTI(void const* const pBaseAddress, void const* const pAddress, const size_t unSize) {
48594911
if (!pBaseAddress || !pAddress || !unSize) {
4860-
return result;
4912+
return {};
48614913
}
48624914

48634915
const void* pBegin = pAddress;
48644916
const void* pEnd = reinterpret_cast<const void*>(reinterpret_cast<const char*>(pAddress) + unSize);
48654917

4866-
std::deque<const RTTI_TYPE_DESCRIPTOR*> TDs;
4918+
std::vector<const RTTI_TYPE_DESCRIPTOR*> TDs;
48674919
EnumerateAllTypeDescriptors(pBaseAddress, pBegin, pEnd, TDs);
48684920

4921+
std::vector<std::unique_ptr<Object>> vecResult;
48694922
std::unordered_set<const void*> seenTD;
48704923

48714924
for (const auto& pTD : TDs) {
@@ -4875,18 +4928,18 @@ namespace Detours {
48754928

48764929
auto ObjFull = BuildObjectFromCOL(pBaseAddress, pBegin, pEnd, const_cast<PRTTI_TYPE_DESCRIPTOR>(pTD));
48774930
if (ObjFull) {
4878-
TryEmplaceUniqueByTD(result, seenTD, std::move(ObjFull));
4931+
TryEmplaceUniqueByTD(vecResult, seenTD, std::move(ObjFull));
48794932
continue;
48804933
}
48814934

48824935
auto ObjPartial = BuildObjectFromBCD(pBaseAddress, pBegin, pEnd, const_cast<PRTTI_TYPE_DESCRIPTOR>(pTD));
4883-
TryEmplaceUniqueByTD(result, seenTD, std::move(ObjPartial));
4936+
TryEmplaceUniqueByTD(vecResult, seenTD, std::move(ObjPartial));
48844937
}
48854938

4886-
return result;
4939+
return vecResult;
48874940
}
48884941

4889-
std::deque<std::unique_ptr<Object>> DumpRTTI(HMODULE hModule) {
4942+
std::vector<std::unique_ptr<Object>> DumpRTTI(HMODULE hModule) {
48904943
if (!hModule) {
48914944
return {};
48924945
}
@@ -4898,7 +4951,7 @@ namespace Detours {
48984951
return DumpRTTI(reinterpret_cast<void*>(hModule), reinterpret_cast<void*>(hModule), static_cast<size_t>(pOH->SizeOfImage) - 1);
48994952
}
49004953

4901-
std::deque<std::unique_ptr<Object>> DumpRTTIA(char const* const szModulePath) {
4954+
std::vector<std::unique_ptr<Object>> DumpRTTIA(char const* const szModulePath) {
49024955
if (!szModulePath) {
49034956
return {};
49044957
}
@@ -4911,7 +4964,7 @@ namespace Detours {
49114964
return DumpRTTI(hModule);
49124965
}
49134966

4914-
std::deque<std::unique_ptr<Object>> DumpRTTIW(wchar_t const* const szModulePath) {
4967+
std::vector<std::unique_ptr<Object>> DumpRTTIW(wchar_t const* const szModulePath) {
49154968
if (!szModulePath) {
49164969
return {};
49174970
}
@@ -4925,11 +4978,11 @@ namespace Detours {
49254978
}
49264979

49274980
#ifdef _UNICODE
4928-
std::deque<std::unique_ptr<Object>> DumpRTTI(wchar_t const* const szModulePath) {
4981+
std::vector<std::unique_ptr<Object>> DumpRTTI(wchar_t const* const szModulePath) {
49294982
return DumpRTTIW(szModulePath);
49304983
}
49314984
#else
4932-
std::deque<std::unique_ptr<Object>> DumpRTTI(char const* const szModulePath) {
4985+
std::vector<std::unique_ptr<Object>> DumpRTTI(char const* const szModulePath) {
49334986
return DumpRTTIA(szModulePath);
49344987
}
49354988
#endif

0 commit comments

Comments
 (0)