/Frostbite-BugSentryContextData

Traversing frostbites BugSentry->StringContextData

Primary LanguageC++

Frostbite-BugSentryContextData

Traversing frostbites BugSentry->StringContextData
the following code works on BFV, BF1, SWBF2

Game Class

class BugSentry
{
public:
	
	static BugSentry* GetInstance()
	{
		return *(BugSentry**)(BugSentry__instance);
	}
#if defined(_CompileMode_SWBF2)
	PAD(0x30);
	seastl::rbtree m_unknown;
#endif
	seastl::rbtree m_intContextData;
	seastl::rbtree m_floatContextData;
	seastl::rbtree m_vec3ContextData;
	seastl::rbtree m_stringContextData;
};

Traversing

void TraverseStringContextData()
{
  	typedef seastl::string<char> string;
	seastl::rbtree_node< seastl::pair<char*, seastl::ring_buffer<string>*> > * Node = NULL;
  
	//48 83 E3 FC E8 ?? ?? ?? ?? 48 8B C8
	//https://github.com/Speedi13/Frostbite-BugSentryContextData/blob/master/classes.hpp#L91
	BugSentry* g_BugSentry = BugSentry::GetInstance();
	
	seastl::rbtree* StringContextData = &g_BugSentry->m_stringContextData;
	seastl::rbtree_node_base *Base = &g_BugSentry->m_stringContextData.mAnchor;

	FILE* pFile = fopen("D:\\BugSentryStringContextData.log", "a");

	unsigned int TreeNodes = StringContextData->mnSize;
	void** TreeBuffer = (void**)alloca( TreeNodes * sizeof( void* ) );
	unsigned int BufferedNodes = 0;

	Node = (decltype(Node))Base->mpNodeParent;

	TreeBuffer[BufferedNodes++] = Node;
	
	fprintf(pFile, "TreeNodes: %u\nRoot Node: 0x%I64X\n\n",TreeNodes,Node);

	while (BufferedNodes != NULL)
	{
		Node = (decltype(Node))TreeBuffer[ (BufferedNodes--) - 1 ];

		char* dataKey = Node->mValue.first;
		if ( ValidPointer(dataKey) )
		{
			seastl::ring_buffer<string>* RingBuffer = Node->mValue.secound;
			if ( ValidPointer(RingBuffer) )
			{
				string* dataValueAsEastlString = RingBuffer->mBegin;
				if ( ValidPointer(dataValueAsEastlString) )
				{
					char* dataValue = dataValueAsEastlString->mpBegin;
					if ( ValidPointer(dataValue) )
					{
						
						fprintf(pFile, "[%s]\n%s\n\n",dataKey,dataValue);
						
					}
				}
			}
		}

		//overflow check
		if ( (BufferedNodes+1) >= TreeNodes ) continue;

		if (Node->mpNodeLeft != NULL)
			TreeBuffer[BufferedNodes++] = Node->mpNodeLeft;

		//overflow check
		if ( (BufferedNodes+1) >= TreeNodes ) continue;

		if (Node->mpNodeRight != NULL)
			TreeBuffer[BufferedNodes++] = Node->mpNodeRight;
	}
	fclose(pFile);
}

Output

https://github.com/Speedi13/Frostbite-BugSentryContextData/blob/master/BugSentryStringContextData_bfV.log https://github.com/Speedi13/Frostbite-BugSentryContextData/blob/master/BugSentryStringContextData_bf1.log