Как можно получить «имя» начального адреса процесса, как в Process Explorer? - PullRequest
3 голосов
/ 11 декабря 2010

Хорошо, я пишу приложение, предназначенное для перечисления потоков в данном процессе, как это делает Process Explorer.Я хорошо знаю, что это может привести к разрыву между различными версиями Windows, потому что он опирается на «неофициальные» API, такие как NtQuerySystemInformation, и я в порядке с этим.

У меня уже есть кодчтобы получить базовый адрес данного потока.Теперь я хотел бы превратить это в нечто вроде того, что делает проводник процессов, например, «ntdll.dll! EtwDeliverDataBlock + 0x453».На самом деле мне не нужно имя функции или смещение, просто имя модуля.

Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 11 декабря 2010

Если вам нужно только имя модуля, самый простой способ - использовать EnumProcessModules , чтобы получить список всех загруженных модулей, затем использовать GetModuleInformation для каждого из них. Одна из вещей, которую возвращает GetModuleInformation - это базовый адрес, куда загружается этот модуль. Технически целочисленное значение самого HMODULE совпадает с базовым адресом, но мне это кажется немного хрупким ...

Тогда просто нужно найти модуль с базовым адресом чуть ниже текущего (или начального) адреса потока.

Да, и чтобы получить фактическое имя модуля, есть GetModuleBaseName .

1 голос
/ 11 декабря 2010

Вы можете использовать GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, чтобы получить дескриптор модуля с заданным адресом. Затем вы можете использовать GetModuleBaseName , чтобы получить имя модуля.

Редактировать: Возможно, вы также захотите использовать флаг GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, чтобы не увеличивать счетчик ссылок модуля.

0 голосов
/ 07 марта 2011

Вы можете использовать этот код для получения дескриптора модуля (он быстрее, чем GetModuleHandleEx ), а затем вызвать GetModuleBaseName .

HMODULE GetCallingModule( LPCVOID pCaller ) const
{
    HMODULE hModule = NULL;
    MEMORY_BASIC_INFORMATION mbi;
    if ( VirtualQuery(pCaller, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) == sizeof(MEMORY_BASIC_INFORMATION) )
    {
        // the allocation base is the beginning of a PE file 
        hModule = (HMODULE) mbi.AllocationBase;
    }
    return hModule;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...