вроде бы дошло, по крайней мере адрес получил, спасибо! так сложно глупые вопросы не задавать, наверно надо в виртуальные функции углубиться?!), но можешь концептуально описать значение данных структур (типа struct СlassDescription), (не знаю как правильно спросить) чем они полезны в данном случае? ну или помоги советом, что почитать на подобную тематику, чтобы как-то понятнее стало, praydog с первого раза не очень помог, может перечитать надо.
функция FindDeclaredClass возвращает указатель на неопределенную структуру. то есть указатель на кучу какой-то информации. я беру несколько таких указателей и сравниваю и нахожу какието закономерности(ну например понятно что если я запросил класс C_BaseEntity и где-то в этой структуре вижу указатель на строку C_BaseEntity то данный член этой структуры это имя класса. потом потыкал на другие члены, нашел описание самих нетваров класса, посмотрел какого они размера(то есть расстояние от первого нетвара до второго нетвара) блаблабла и т.д., посчитал сколько всего нетваров, допустим их 10 штук, и нашел число 10(или 9 или 11, в общем похожее число) в самой структуре, понятно что этот член означает количество нетваров(либо количество нетваров минус один/плюс один).
эти структуры никакого значения не имеют, это просто коллекция оффсетов которые я глазами нашел. ты можешь спокойно вместо ClassDescription->Size использовать оффсет +28 и считывать оттуда 2 байта(short). или можешь все это сделать в структуру чтобы компилятор сам за тебя все эти оффсеты прописывал(ну естественно тебе самому предварительно нужно будет их высчитать и просто в нужном порядке все это расположить чтобы оффсеты в структуре совпадали с реальными оффсетами).в общем эта структура - отражение того что я увидел в памяти. я бы мог и просто оффсет прибавлять но это не так красиво.
насчет твоего первого вопроса про классы и виртуальные функции, тебе сначала нужно понимать как какой класс получать.нельзя просто так вызывать CreateInterface и думать что тебе выдаст любой класс в доте. вообще получить класс это довольно сложная задача. чтобы ее решить тебе нужно посмотреть как этот класс получает сама программа. есть два типа классов: классы которые ты получаешь напрямую из сиги(то есть находишь какую-то функцию где в регистр суется указатель на класс, и потом просто считываешь с этого указателя и вот тебе класс. то есть ты ищешь хреф на класс, а потом делаешь сигу на этот хреф.), и классы которые обернуты самой программой в этакие массивы(менеджеры,фабрики как угодно можешь их называть), которые хранят в себе и управляют различными объектами. то есть в первом случае ты просто ищешь руками и потом когда нашел делаешь сигу, а во втором ты пытаешься понять как работает эта фабрика(менеджер/что угодно) и потом когда ты понимаешь как она работает можешь получить любой класс из этой фабрики.
например CreateInterface работает очень просто. где-то там в памяти есть массив(кучка указателей) со всеми интерфейсами. он по каждому проходится, смотрит имя, если совпадает возвращает тебе этот указатель, если не находит совпадения то создает новый интерфейс и возвращает его тебе. в этом массиве есть только те интерфейсы которые принадлежат конкретно данной фабрике/менеджеру.
а CSchemaSystem имеет свой внутренний менеджер(ну то есть опять же просто массив/его аналог) где хранятся указатели на экземпляры класса CSchemaSystemTypeScope. у CSchemaSystemTypeScope свой менеджер где хранятся указатели на ClassDescription. и вместо того чтобы все это говно разгребать руками и искать хрен пойми где, ты просто вызываешь CreateInterface("schemasystem.dll", "SchemaSystem_001")->GetScope("client.dll")->FindDeclaredClass("C_BaseEntity")
в итоге все что тебе нужно это просто найти эти все функции(CreateInterface это экспорт, GetScope это виртуальная функция, FindDeclaredClass тоже) и теперь ты просто можешь передавать строки и тебе само там все внутри найдет.