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