Не могу разобраться что тут не так: мне нужно вызвать функцию EnumProcessModules. Удалив весь не имеющий отношения к этому выводу код я получил то, что вы можете увидеть ниже: Код (Text): .386 .model flat, stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\shlwapi.inc include C:\masm32\include\kernel32.inc includelib C:\masm32\lib\kernel32.lib include C:\masm32\include\user32.inc includelib C:\masm32\lib\user32.lib include \masm32\include\masm32.inc includelib \masm32\lib\masm32.lib include c:\masm32\include\psapi.inc includelib c:\masm32\lib\psapi.lib pid dd 0 mzm dd 0 need dd 0 .code start: invoke LocalAlloc,NULL,1024 mov mzm,eax invoke GetCurrentProcess mov pid,eax invoke EnumProcessModules,pid,mzm,10,need cmp eax,0 jnz @exit invoke MessageBox,NULL,NULL,NULL,MB_OK @exit: ret end start В OllyDBG все выглядит нормально, но после вызова EnumProcessModules вижу ERROR_NOACCESS. В MSDN написано, что GetCurrentProcess возращает "виртуальный" хэндл текущего процесса "с максимальными привелегиями". Аналогичный код на Си работает нормально. Отладчик запускается под администратором, ОС: Windows 7 Pro, ассемблер: masm32
cdump Я не силён в масме, но подозреваю, что ".data", где должны быть объявлены переменные, а также взятие адреса при передаче need в ф-ию, удалять всё-таки не стоило. К тому же маловероятно, что функции хватит десяти байт, чтобы записать все хэндлы (видимо "24" после "10" тоже удалили за иррелевантностью...).
cdump Первый параметр - хэндл процесса. Для текущего это -1(локальный псевдохэндл). Второй параметр это ссылка на массив, в который возвращается список баз загруженных модулей. У вас передаётся ноль. Память в первой странице не выделена, возникает сепшен и возвращается ошибка. Пользовательские коды ошибок малоинформативны, используйте при проблемах системные через вызов RtlGetLastNtStatus(). Необходимо задать массив как например ModuleList DD 128 DUP (?) и загружать его смещение addr MuduleList. Последний параметр это ссылка на переменную принимающую размер возвращённой инфы в буфер, размер которого задаётся в 3-м параметре.
Да, ".data" там действительно должна быть (и есть, удалил случайно при вставке сюда). Насчет 10 - в msdn сказано, что нужно сравнить то, что она запишет в 4й параметр (сколько реально прочитала) и если мы запросили меньше, то вызвать ф-цию заново с бОльшим размером. p.s. в "реальных условиях" там было аж около 10 кб
CrystalIC Спасибо вам за подсказку с addr! Замена need на addr need решила проблему с ошибкой. Пошел дальше разбираться..
CrystalIC Думаю, Ваше альтерэго вряд ли бы с Вами согласилось. Там из кучи память выделяется. cdump А смысл задавать 10 байт, если целый килобайт выделен? Интересненько... 10k/4 = 2,5k модулей. Что ж это за процесс такой? О_О Даже для 64-битной тачки (т.е. 1,25k модулей) многовато. Читали бы внимательнее, заметили бы "подсказку" про "взятие адреса при передаче need в ф-ию".
Пропустил этот момент, когда "удалял все лишнее", чтобы разобраться конкретно в этом моменте. Задал "с запасом", когда еще не знал sizeof(HMODULE) и предположил о проблеме нехватки памяти для записи. Я всегда потом стараюсь подогнать под реальные условия (и 2.5к модулей я бы конечно не оставил..) Угу, пропустил
l_inc Ну да, верно, я забыл про это. Тогда сепшен на последнем параметре. Это смысла не меняет. Более того я против этой функи, её не следует юзать.