_sheva740 Да, проблемы с ms link. Я пользуюсь переделанным PoLink. В аттаче всё, что нужно для сборки vm2. Удачи! http://webfile.ru/5461267
Mikl___ Спасибо! Действительно link! C polink все пошло! Вот такой вариант правда, DbgPrint() видно еще и стек не чистит после себя. Код (Text): .386 .model flat,stdcall option casemap:none includelib \masm32\lib\ntdll.lib include \masm32\include\windows.inc includelib \masm32\lib\kernel32.lib extern _imp__DbgPrint@8:dword .data $IsVdm db "IsVdmProcess: %X", 13, 10, 0 _outnumb dd -1 .code Start: lea edi,_outnumb push dword ptr [edi] push offset $IsVdm call _imp__DbgPrint@8 add esp,8 ret end Start
_sheva740 Хорошо, что Инди не видел эту хню, нужно писать Код (Text): extern _imp__DbgPrint:dword и тогда link создает exe -- ты же сам пишешь, что "DbgPrint() видно еще и стек не чистит после себя"
_sheva740 DbgPrint proto C :PSTR, :VARARG зы: Код (Text): CHAR typedef BYTE PSTR typedef Ptr CHAR Для инфокласса VdmQueryVdmProcess размер структуры 4+1 байт, тоесть поле IsVdmProcess типа BOOLEAN, но у меня он задефинен как дворд. Иначе размер локалей получается не выравненным на 4, что вызывает проблемы. Изза этого отладочный вывод не корерктный - нужно либо занулять дворд перед запросом инфы, либо movzx/push.
Mikl___ Уже кажется увидел phoukait Инде - от твоих знаний оторопь берет! Покажи пальцем что нужно тут поменять чтобы строчка "IsVdmProcess: -1" в окошке Dbgview-ра появилась. Ну не всем же дано, а хочется ))) Код (Text): .386 .model flat,stdcall option casemap:none includelib \masm32\lib\ntdll.lib include \masm32\include\windows.inc includelib \masm32\lib\kernel32.lib extern _imp__DbgPrint:dword .data IsVdm db "IsVdmProcess: %X", 13, 10, 0 _outnumb dd -1 .code Start: lea edi,_outnumb push dword ptr [edi] push offset IsVdm call _imp__DbgPrint add esp,8 ret end Start
_sheva740 Во первых нужно определить направление вывода отладочных сообщений. Если имеется отладочный порт, тоесть например приложение запущено под олли, то сообщения в ядро не направляются, а посредством механизма исключений доставляются отладчику, который их выводит. В этом случае ядерные логгеры ничего отображать не будут. Во вторых Dbgview не годная тулза. Смотрите вывод через сиську(Syser). В третих чтобы не было проблем с очисткой стека для C-конвенций, используйте макро invoke. Mikl их не использует для того, чтобы линкер не вставлял в модуль стабы в виде jmp, что уменьшает размер модуля. Это ведь не малварь, размер не критичен.
phoukait Ну уже легче, спасибо! То есть такое Syser отразит? У меня его нет пока. Код (Text): .386 .model flat,stdcall option casemap:none includelib \masm32\lib\ntdll.lib include \masm32\include\windows.inc includelib \masm32\lib\kernel32.lib DbgPrint proto C :BYTE, :VARARG .data IsVdm db "IsVdmProcess: %X", 13, 10, 0 _outnumb dd -1 .code Start: lea edi,_outnumb push dword ptr [edi] push offset IsVdm call DbgPrint add esp,8 ret end Start
_sheva740 Код (Text): .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc includelib e:\masm32\lib\ntdll.lib DbgPrint proto C :dword, :vararg CRLF equ 13, 10, 0 .data _outnumb DWORD 1 $IsVdm BYTE "IsVdmProcess: -%X", CRLF .code Ep: invoke DbgPrint, addr $IsVdm, _outnumb ret end Ep Олли выводит лог, не хуже чем сиська. А типы следует ввести полюбому, код с кучей dd, db и без сишных типов не читабелен. Не понятно что какой параметр означает. В директиву proto опционально указывается имя параметра. proto $Message:PSTR даёт понять что это за параметр. Также следует для себя определить префиксы для макро и строк, например я использую префикс % для обозначения макро и $ для строк.