Очень интересный цикл программ! Еще бы и текст сопроводительный, так получился бы туториал лучше чем у Iczelion’a . Правда, хотелось бы вставить и свои пять копеек . Мне нравиться Ваш отказ от PROTO и INC-файлов. Осталось еще объявить и другие директивы для экспортируемых функций. Например, у меня работают все варианты экспорта функций (достаточно выбрать любой комментарий): Код (Text): ; =========================================================================== .686p .mmx .model flat option casemap:none ; extrn MessageBoxA : proc extrn MessageBoxA@16 : proc ; extrn _imp__MessageBoxA : dword ; extrn _imp__MessageBoxA@16 : dword includelib Lib\user32.lib ; extrn ExitProcess : proc extrn ExitProcess@4 : proc ; extrn _imp__ExitProcess : dword ; extrn _imp__ExitProcess@4 : dword includelib Lib\kernel32.lib ; =========================================================================== .data Header db "Question", 0 MsgText db "Do you want quit?", 0 ; =========================================================================== .code _Start: push 4h ; MB_YESNO push offset Header push offset MsgText push 0 ; call MessageBoxA call MessageBoxA@16 ; call _imp__MessageBoxA ; call _imp__MessageBoxA@16 cmp eax, 6h ; IDYES : 6 - Yes, 7 - No. je Quit jmp _Start Quit: push 0 ; call ExitProcess call ExitProcess@4 ; call _imp__ExitProcess ; call _imp__ExitProcess@4 end _Start ; =========================================================================== Для это пришлось правда самому создать полноценные lib-файлы для нужных системных dll-ек.
Scholium Можо и без lib-файлов обойтись используя одни только dll. Вот вариант который возможно вас устроит использовать импорт не по именам, а по ординалам и при этом пользоваться MASM Код (Text): ; masm dos com # .586P .model tiny .code ;for WinXP - 323 bytes exebase equ 400000h begin: ;------------------------------------------------------------------- DOS_and_NT_SIGNATURES dd 'ZM','EP' ;00 ; signatures FILE_HEADER: Machine dw 14Ch ;8 Count_of_section dw 1 ;0Ah TimeStamp dd 0,0,0 ;0C ; who cares? Size_of_optional_header dw SECTION_HEADER-$-4 ;74h ;18 Characteristics1 dw 10Fh ;1A ; executable on 32-bit-machine OPTIONAL_HEADER: Magic dd 10Bh ;1C ; constant SizeOfCode dd END_SECTION-start,0,0;20 ; size of .code/.idata/.data AddressOfStart dd start ;2C ; beginning of code section BaseOfCode dd start ;30 ; RVA to code section: unused BaseOfData dd 0,exebase,4,4 ;38 ; 4 MB, chosen arbitrarily MajorOperatingSystemVersion dd 4,0,4,0 ;44 ;versions SizeOfImage dd END_SECTION ;54 ; total size SizeOfHeaders dd start ;58 ; offset to 1st section CheckSum dd 0,2,100000h,1000h ;5C ; subsystem,stack reserve/commit SizeOfHeapReserve dd 100000h,1000h,0 ;6C ; heap reserve/commit,flags Number_of_dirs dd 2 ;78 ; # directories DATA_DIRECTORY: DIRECTORY_ENTRY_EXPORT dd 0;export ;7C dd 0 ;80 dd import ;84 dd end_import-import ;88 dd 0;resource ;8C SECTION_HEADER: _Name dd 'xet.','t';exception ;90,94 ; ".text" VirtualSize dd 0 ;98 dd start;security;9C ; unused SizeOfRawData dd END_SECTION-start ;A0 ; size of code PointerToRawData dd start;fixup ;A4 ; file offset to code section PointerToRelocations dd 0 ;A8 ; unused dd 0;debug ;AC dd 0 ;B0 Characteristics2 dd 0E0000020h ;B4 ; code, executable, readable ; initialized data, writeable ;--------------------------------------------------------------------- start: push eax push offset wTitle+exebase push offset Message+exebase push eax call MessageBox+exebase retn ;---------------------------------------------------------------------- wTitle db 'Iczelion Tutorial #2:MessageBox',0 Message db 'Win32 Assembly with MASM is Great!' ;---------------------------------------------------------------------- import: dd 0,0,0,user32_dll dd user32_table,0,0 user32_table: MessageBox dd _MessageBoxA dw 0 _MessageBoxA db 0,0,'MessageBoxA',0 user32_dll db 'user32' end_import: END_SECTION: end begin компилируете как COM, а получаете полноценное Windows приложение, под WinXP занимает аж целых 323 байта, самостоятельно можете получать любой PE-заголовок, отрывать в импорте "ненужное" окончание в виде ".dll" и другие мелкие шалости
Для меня это было откровением! Действительно 323 байта и, действительно, без либов. Т.е. подобный метод надо взять на вооружение для какого-нибудь экстремального программирования . Однако замечания все же есть. 1. Приходится пользоваться устаревшим пакетом Masm32, вроде версии 6.11 (т.е. программы от последних версий студии не катят). 2. Нет либов, но практически присутствуют неявные дефы. Для больших программ, использующих множество апишных функций, придется писать самому значительные секции импорта, отражающие, по сути, структуру def-файлов. 3. Насчет ординалов я не понял. Вы же объявляете и используете имена функций. Привязка же к ординалам – это крайний случай, когда нет имен. Ибо нет гарантии, что одним и тем же ординалам в разных версиях системных длл-лек соответствуют одни и те же имена функций. Я с этим столкнулся когда писал универсальные дефы и либы для различных ОСей и их сервис паков. Так что главное преимущество Вашего метода это компактность и явное управление PE-заголовоком. Думаю, что для реальных приложений все же нужны универсальные либы, а точнее их текстовые описания – дефы. Ибо имея дефы, всегда можно скомпилировать либы. А при необходимости в них легко можно вносить изменения. Один раз сделав эту работу можно затем очень сильно упростить себе жизнь. Вот пример kernel32.def, который я использовал. Код (Text): LIBRARY "kernel32.dll" EXPORTS ActivateActCtx _ActivateActCtx@8 = ActivateActCtx AddAtomA _AddAtomA@4 = AddAtomA AddAtomW _AddAtomW@4 = AddAtomW AddConsoleAliasA _AddConsoleAliasA@12 = AddConsoleAliasA AddConsoleAliasW _AddConsoleAliasW@12 = AddConsoleAliasW AddLocalAlternateComputerNameA _AddLocalAlternateComputerNameA@8 = AddLocalAlternateComputerNameA AddLocalAlternateComputerNameW _AddLocalAlternateComputerNameW@8 = AddLocalAlternateComputerNameW AddRefActCtx _AddRefActCtx@4 = AddRefActCtx AddVectoredContinueHandler ; @9 AddVectoredExceptionHandler ; @10 AllocConsole _AllocConsole@0 = AllocConsole AllocateUserPhysicalPages _AllocateUserPhysicalPages@12 = AllocateUserPhysicalPages AreFileApisANSI _AreFileApisANSI@0 = AreFileApisANSI AssignProcessToJobObject _AssignProcessToJobObject@8 = AssignProcessToJobObject AttachConsole _AttachConsole@4 = AttachConsole BackupRead _BackupRead@28 = BackupRead BackupSeek _BackupSeek@24 = BackupSeek BackupWrite _BackupWrite@28 = BackupWrite BaseCheckAppcompatCache _BaseCheckAppcompatCache@16 = BaseCheckAppcompatCache BaseCheckRunApp _BaseCheckRunApp@40 = BaseCheckRunApp BaseCleanupAppcompatCacheSupport _BaseCleanupAppcompatCacheSupport@4 = BaseCleanupAppcompatCacheSupport BaseDumpAppcompatCache _BaseDumpAppcompatCache@0 = BaseDumpAppcompatCache BaseFlushAppcompatCache _BaseFlushAppcompatCache@0 = BaseFlushAppcompatCache BaseInitAppcompatCacheSupport _BaseInitAppcompatCacheSupport@0 = BaseInitAppcompatCacheSupport BaseIsAppcompatInfrastructureDisabled _IsShimInfrastructureDisabled@0 = BaseIsAppcompatInfrastructureDisabled BaseProcessInitPostImport _BaseProcessInitPostImport@0 = BaseProcessInitPostImport BaseQueryModuleData _BaseQueryModuleData@20 = BaseQueryModuleData BaseUpdateAppcompatCache _BaseUpdateAppcompatCache@12 = BaseUpdateAppcompatCache BasepCheckBadapp _BasepCheckBadapp@36 = BasepCheckBadapp BasepCheckWinSaferRestrictions _BasepCheckWinSaferRestrictions@24 = BasepCheckWinSaferRestrictions BasepFreeAppCompatData _BasepFreeAppCompatData@8 = BasepFreeAppCompatData Beep _Beep@8 = Beep . . . WriteFile _WriteFile@20 = WriteFile WriteFileEx _WriteFileEx@20 = WriteFileEx WriteFileGather _WriteFileGather@20 = WriteFileGather WritePrivateProfileSectionA _WritePrivateProfileSectionA@12 = WritePrivateProfileSectionA WritePrivateProfileSectionW _WritePrivateProfileSectionW@12 = WritePrivateProfileSectionW WritePrivateProfileStringA _WritePrivateProfileStringA@16 = WritePrivateProfileStringA WritePrivateProfileStringW _WritePrivateProfileStringW@16 = WritePrivateProfileStringW WritePrivateProfileStructA _WritePrivateProfileStructA@20 = WritePrivateProfileStructA WritePrivateProfileStructW _WritePrivateProfileStructW@20 = WritePrivateProfileStructW WriteProcessMemory _WriteProcessMemory@20 = WriteProcessMemory WriteProfileSectionA _WriteProfileSectionA@8 = WriteProfileSectionA WriteProfileSectionW _WriteProfileSectionW@8 = WriteProfileSectionW WriteProfileStringA _WriteProfileStringA@12 = WriteProfileStringA WriteProfileStringW _WriteProfileStringW@12 = WriteProfileStringW WriteTapemark _WriteTapemark@16 = WriteTapemark ZombifyActCtx _ZombifyActCtx@4 = ZombifyActCtx _hread __lread@12 = _hread _hwrite __lwrite@12 = _hwrite _lclose __lclose@4 = _lclose _lcreat __lcreat@8 = _lcreat _llseek __llseek@12 = _llseek _lopen __lopen@8 = _lopen _lread __lread@12 = _lread _lwrite __lwrite@12 = _lwrite lstrcat _lstrcatA@8 = lstrcat lstrcatA _lstrcatA@8 = lstrcatA lstrcatW _lstrcatW@8 = lstrcatW lstrcmp _lstrcmpA@8 = lstrcmp lstrcmpA _lstrcmpA@8 = lstrcmpA lstrcmpW _lstrcmpW@8 = lstrcmpW lstrcmpi _lstrcmpiA@8 = lstrcmpi lstrcmpiA _lstrcmpiA@8 = lstrcmpiA lstrcmpiW _lstrcmpiW@8 = lstrcmpiW lstrcpy _lstrcpyA@8 = lstrcpy lstrcpyA _lstrcpyA@8 = lstrcpyA lstrcpyW _lstrcpyW@8 = lstrcpyW lstrcpyn _lstrcpynA@12 = lstrcpyn lstrcpynA _lstrcpynA@12 = lstrcpynA lstrcpynW _lstrcpynW@12 = lstrcpynW lstrlen _lstrlenA@4 = lstrlen lstrlenA _lstrlenA@4 = lstrlenA lstrlenW _lstrlenW@4 = lstrlenW Для получения либов я использую polib.exe v. 5.0 из 10-й версии бесплатного пакета MASM32. Мелкософтовский lib.exe файл для построения универсальных либов использовать не стоит, с ним гороздо больше проблем. Может возникнуть вопрос. А как я получаю деф-файлы? Фактически, вся нужная мне информация находится в отладочных pdb-файлах. Их можно использовать напрямую (существует достаточно много кода для работы с pdb-форматом, но его еще нужно переварить), но проще всего, применяя собственный скрипт к дизассемблерному коду «Иды», с подгруженными отладочными символами.
1. не понял на счет 6.11 я пользуюсь 10 версией из Вижуал Си 2. Это скорее ваша проблема, чем моя 3. Насчет ординалов -- в примере импорт по имени функции, но если вам необходимо переделать в импорт по ординалам -- сделайте! А вот здесь вы правы -- одним и тем же именам функций в разных версиях системных dll соответствуют разные ординалы. Импорт по ординалам наверное подразумевает уменьшение размера ехе? Тогда есть примеры, как обойтись без импорта совсем -- Мессадж бокс в 97 байт и Каркас оконного приложения в 206 байтов
Это уже интересно! ml.exe у меня тоже из 10-й студии. Но link.exe v. 10.0 не поддерживает опцию /TINY, поэтому приходится использовать link16.exe 1995 года (из Masm32, v. 6.11). Или Вы компилируете без опции /TINY ? У меня проблем нет . Я использую универсальные либы и extrn директивы, как это и Вы делаете, в случае не экстремального программирования . Можно, конечно, вместо одной строки extrn написать несколько строчек собственного импорта, иногда это бывает полезно, но объем исходного кода не сокращает. Как раз по ординалам делать вызовы системных функций я не заинтересован, ибо ориентируюсь на различные версии виндозы. Согласен, Ваши примеры весьма показательны. Если вдруг надумаю писать внедряемый код , тогда буду заинтересован в его сверхкомпактности. А пока меня больше интересуют, скажем так, недокументированные возможности управления стандартными контролами, такими как SysListView32 и SysHeader32. Если Вы пожелаете использовать их в своих примерах, то буду весьма признателен за информацию об этом. Например, я работаю с их внутренними, не документированными структурами и областями данных для непосредственной манипуляции (изменение размеров, цветов, вывода разделительных линий и т.п.). Т.е. вместо того, чтобы писать свой собственный обработчик типа OnPaint, я просто меняю несколько байт недокументированных данных.
Очередной "урок Iczelion'a" -- M$Agent на ассемблере, работает под WinXP SP3, размер ехе 3200 байт (в аттаче сорц, ресурсы, inc и exe)
Я тестировал на лицензионной Windows 7 и XP. Если в системе не было какой-нибудь троянской программы то доступ к SeTcbPrivilege закрыт. Но так как у многих побывали троянцы, то скорее всего они оставляют доступ SeTcbPrivilege открытым. Поэтому у них DirectIO работает. Попробуйте установить с нуля лицензионную винду, и у вас тоже DirectIO работать не будет.
.......я ничего не путаю, или уже в уроках было такое, помню в билдере кажись были примеры, окна неправильной формы, элипсоид типа, вообщем круглые, есть ли исходники? (fasm) Всё, уже нашёл!!
Semiono Здесь пример вывода окна с закругленными краями, может быть пригодится А в аттаче пример вывода окна произвольной формы (сорц, ехе и рисунок)
Semiono Окну устанавливается ограничивающий регион. Это сервис NtUserSetWindowRgn, есчо апи была для него. Прежде регион должен быть создан. При создании передаётся массив точек образующий регион. Для динамического создания этого массива по шаблону лучше всего использовать попиксельное описание контуров http://www.wasm.ru/forum/viewtopic.php?id=38446. Анимешки это иной механизм, многослойные окна http://msdn.microsoft.com/en-us/library/ms997507.aspx.
Продолжаю опыты с MS Agent'ом на ассемблере. Для следующей программы вам потребуется файлы merlin.acs, genie.acs (по умолчанию они должны находится в папке Windows\msagent\chars) и скопируйте из папки Windows\srchasst\chars файл rover.acs в папку Windows\msagent\chars. Если почему-либо джина и Мерлина нет на вашей машине, то их можно скачать здесь http://www.microsoft.com/downloads/...4e-bc2d-4c1d-b5a0-3183fe206414&displaylang=en и здесь http://www.microsoft.com/downloads/...dd-2f23-41d0-8a81-2affd74c0aa5&displaylang=en вам также понадобятся компонент для произношения текстов (для русского языка) – http://speech-soft.ru/download/lhttsrur.exe и поддержка SAPI (нужна для произношения текстов) – http://speech-soft.ru/download/ms_speech_api.exe в аттаче находятся сорц, bmp для кнопок и ехе (6644 байта) работает под WinXP
MS Agent на ассемблере модифицированный. Для следующей программы вам потребуется файлы merlin.acs, genie.acs (по умолчанию они должны находится в папке Windows\msagent\chars) и скопируйте из папки Windows\srchasst\chars файл rover.acs в папку Windows\msagent\chars. Если почему-либо джина и Мерлина нет на вашей машине, то их можно скачать здесь http://www.microsoft.com/downloads/...4e-bc2d-4c1d-b5a0-3183fe206414&displaylang=en и здесь http://www.microsoft.com/downloads/...dd-2f23-41d0-8a81-2affd74c0aa5&displaylang=en вам также понадобятся компонент для произношения текстов (для русского языка) – http://speech-soft.ru/download/lhttsrur.exe и поддержка SAPI (нужна для произношения текстов) – http://speech-soft.ru/download/ms_speech_api.exe в аттаче находятся сорц, курсор-иконка, inc, bmp для кнопок и ехе (7812 байтов) работает под WinXP
+1 MS Agent - такие дебри! Порой элементарного не понятно бывает. Мне вот сейчас пацан дал код как консоль открыть по координатам в родительском окне, причём format PE Console, с которым проблемма была STARTUPINFO, вот это я понимаю! =) И парсинг люблю, регекспы... Примеров бы побольше.
Semiono разрешите с вами не согласиться. MS Agent - это набор анимированных гифов, для запуска которого нужно просто указать название гифа в юникоде, например персонаж машет ручкой Код (Text): push offset MSAg_szWave push edi call [edi].Play где MSAg_szWave du "Wave",0 Либо хотите, чтобы персонаж произнес: "Привет!" Код (Text): push offset TheText78;TheText78 db 'Привет!',0; push edi;hMerlin call [edi].Speak и, в зависимости от настроек, голос будет мужским, женским, детским, заикающимся и т.д. голос будет синтезироваться компьютером, причем вам это не будет стоить ни строчки кода хотите переместить персонаж по экрану из А в Б Код (Text): push offset Request push 1000 push 300 push 600 push edx;[edi].hAgentChar mov edx,[edx] assume edx: ptr IAgentCharacterEx call [edx].MoveTo assume edx: nothing где 600 - координата точки Б в пикселях по Х, 300 -- координата точки Б по Y, 1000 время перемещения из точки А в точку Б в миллисекундах... смотрите внимательно код, а разбираться с координатами консоли вам придется самому...
Если лезть в "мультимедиа" то не обязательно продукты майкрософт. Можно, например, какуюнибудь фитчу в Directory Opus программировать. Или вообще в Steinberg Cubase залезть. Я просто MS Agent твикнул у себя. Не, всё нормально, это я подзадориваю, чтоб веселее было. Но коммандная строка, grep, sed, regexp, скрипты, файлы, это всегда актуально...