Как программно получить имя процесса из файла дампа памяти(IDebugClient) в Windows

#kernel #symbols #windbg #dump #bsod

Вопрос:

Используя windbg, откройте файл дампа и запустите»! analyze-v», в результате будет указано свойство PROCESS_NAME, например, PROCESS_NAME: notmyfault64.exe.

Но как получить ИМЯ ПРОЦЕССА с помощью API отладки Windows?

Один из возможных способов-использовать IDebugClient::OpenDumpFile() для открытия файла дампа, а затем использовать IDebugControl::Execute() для выполнения»! analyse-v » и получения ИМЕНИ ПРОЦЕССА из выходных данных. Но это похоже на обходной путь.

Есть ли какой-либо прямой способ получить ИМЯ ПРОЦЕССА через API отладки? например, IDebugSymbols3::GetModuleNames()? Я попробовал такой код:

 ULONG loaded = 0, unloaded = 0;
symbols->GetNumberModules(amp;loaded, amp;unloaded);
const ULONG count = loaded   unloaded;

DEBUG_MODULE_PARAMETERS* parameters = new DEBUG_MODULE_PARAMETERS[count];
symbols->GetModuleParameters(loaded, 0, NULL, parameters);
for (int i = 0; i < count; i  ) {
  symbols->GetModuleNames(DEBUG_ANY_ID, parameters[i].Base, ImageNameBuffer, MAX_PATH   1, amp;ImageNameSize,
        ModuleNameBuffer, MAX_PATH   1, amp;ModuleNameSize,
     LoadedImageNameBuffer, MAX_PATH   1,
     amp;LoadedImageNameSize);

     std::cout << ImageNameBuffer<<", base level:"<<i << "n";
  }
 

Но как решить, какой индекс или база должны быть для имени модуля?

А также здесь есть несколько примеров: https://medium.com/swlh/windows-debugger-api-the-end-of-versioned-structures-ac4acaa351bd , вопрос также в том, как выбрать правильное имя процесса, чтобы оно совпадало с результатом анализа Windbg?

И так до ИМЯ_ОБРАЗА и ИМЯ_МОДУЛЯ в результате анализа windbg, как получить их с помощью IDebugClient?

Спасибо!

Комментарии:

1. Вы смотрели/пробовали docs.microsoft.com/en-us/windows-hardware/drivers/ddi/dbgeng/… и в качестве альтернативы вы можете проверить _PEB docs.microsoft.com/en-us/windows-hardware/drivers/ddi/dbgeng/… Поэтому вам придется инициализировать и использовать COM-объект для IDebugSystemObjects2

2. Спасибо за предложение. Значение просто » srv*», когда я попробовал API GetCurrentProcessExecutableName (), что не является ожидаемым «notmyfault64.exe»