Как использовать DIA SDK для чтения * кода * (особенно включая таблицы переходов)? - PullRequest
3 голосов
/ 28 февраля 2012

Я использую DIA SDK из C #.

Прямо сейчас у меня есть что-то вроде:

static void Main(string[] args)
{
    var v = new DiaSource();
    v.loadDataForExe("Temp.exe", null, null);  // native, with symbols

    Dia2Lib.IDiaSession session;
    v.openSession(out session);
        var items = new Stack<KeyValuePair<IDiaSymbol, int>>();

    items.Push(new KeyValuePair<IDiaSymbol, int>(session.globalScope, 0));
    while (items.Count > 0)
    {
        var pair = items.Pop();

        var symbol = pair.Key;
        if (symbol.function != 0)
        {
            // What do I do?
        }

        // Push child symbols onto stack
        IDiaEnumSymbols enumSymbols;
        symbol.findChildren(SymTagEnum.SymTagNull, null, 0, out enumSymbols);
        if (enumSymbols != null)
        {
            foreach (IDiaSymbol child in enumSymbols)
            {
                if (symbol.symIndexId == child.symIndexId)
                {
                    // Why do some nodes contain themselves?
                    // Break out if that's the case...
                    break;
                }
                items.Push(
                    new KeyValuePair<IDiaSymbol, int>(child, pair.Value + 1));
            }
        }
    }
}

Как мне использовать DIA SDK для просмотра кода и, в частности, найти в моем исполняемом файле любые таблицы переходов и их целевые адреса (т. Е. Созданные оператором switch)?

Я уже проверил, что они существуют, я просто не знаю, как получить к ним доступ.

Я пометил C #, потому что я использую C # с COM, но я также пометил C ++, потому что SDK изначально был на C ++ (с COM). Не стесняйтесь удалять то, что может быть неуместным; спасибо.

...