Существует ли какой-нибудь способ получить из .COM файла доступ хоть к каким-нибудь средствам Windows? Хотя бы запустить .EXE-файл (PE, разумеется). Общая задача вообще следующая: исполняемый файл, состоящий только из печатных символов, но при этом делающий что-то красивое и/или полезное (например, демо). Сделать .COM файл из печатных символов гораздо проще, чем .EXE. Но возможности при этом сильно урезаны. Вот интересно, можно сделать так, чтобы .COM файл создавал какой-то другой файл и запускал его напрямую или косвенно.
Да, она работает. На этом форуме как-то выкладывалась демка в ком-файле, которая распаковывала из себя ПЕ-ехе и запускала его, потом он сам себя удалял. При попытке запустить её из-под ДОС в надежде увидеть приятную анимацию, это выяснилось
Или я что-то сделал не так, или так оно и должно быть, но... Выдаёт ошибку 08h - Insufficient memory. Надо ли выкладывать исходники, или данный результат и так является очевидным и вполне предсказуемым?
Да-да, я тоже начал что-то такое вспоминать (эх, давно это всю было): любая досовская программа автоматически занимает блок максимального размера и перед запуском программы необходимо этот блок уменьшить. Но всё-таки мне кажется, что для запуска виндового екзешника это не поможет и максимум, что я смогу добиться через INT 21/4B00 - это запустить DOS-stub. Нет ли каких-нибуль иных сервисных прерываний при запуске DOS-программы в винде?
Заглушка будет запускаться только если в CONFIG.NT написать словечко DOSONLY. По умолчанию его там нет, поэтому из-под NTVDM вендовые программы запускаться будут.
О! Всем спасибо, тестовая версия заработала! Код (Text): model tiny .code org 100h start: mov ax, ds mov es, ax mov word ptr segCmdLine, ax mov word ptr segFCB1, ax mov word ptr segFCB2, ax mov bx, BlockSize mov ah, 4Ah int 21h mov ax, 4B00h mov dx, offset PathName mov bx, offset ParmBlock int 21h mov ah, 4Ch int 21h PathName db 'c:\tools\tst.exe',0 ParmBlock dw 0 ;Default environment dw offset CmdLine ;Command line string segCmdLine dw ? dw offset Dummy ;Dummy FCBs segFCB1 dw ? dw offset Dummy ;Dummy FCBs segFCB2 dw ? CmdLine db 3,' A:',0dh Dummy db 20 dup (?) BlockSize equ ($-start)/16+17 end start