.COM файлы и Windows

Тема в разделе "WASM.ASSEMBLER", создана пользователем Daniil, 16 июн 2008.

  1. Daniil

    Daniil New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2004
    Сообщения:
    12
    Адрес:
    Russia
    Существует ли какой-нибудь способ получить из .COM файла доступ хоть к каким-нибудь средствам Windows? Хотя бы запустить .EXE-файл (PE, разумеется).

    Общая задача вообще следующая: исполняемый файл, состоящий только из печатных символов, но при этом делающий что-то красивое и/или полезное (например, демо).

    Сделать .COM файл из печатных символов гораздо проще, чем .EXE. Но возможности при этом сильно урезаны. Вот интересно, можно сделать так, чтобы .COM файл создавал какой-то другой файл и запускал его напрямую или косвенно.
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    По идее должна работать обычная функция запуска программы - int 21h 4B00h
     
  3. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Да, она работает. На этом форуме как-то выкладывалась демка в ком-файле, которая распаковывала из себя ПЕ-ехе и запускала его, потом он сам себя удалял. При попытке запустить её из-под ДОС в надежде увидеть приятную анимацию, это выяснилось :derisive:
     
  4. Daniil

    Daniil New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2004
    Сообщения:
    12
    Адрес:
    Russia
    Или я что-то сделал не так, или так оно и должно быть, но... Выдаёт ошибку 08h - Insufficient memory.

    Надо ли выкладывать исходники, или данный результат и так является очевидным и вполне предсказуемым?
     
  5. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Daniil
    Попробуй функций int21/4A уменьшить размер блока который твоя программа занимает.
     
  6. Daniil

    Daniil New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2004
    Сообщения:
    12
    Адрес:
    Russia
    Да-да, я тоже начал что-то такое вспоминать (эх, давно это всю было): любая досовская программа автоматически занимает блок максимального размера и перед запуском программы необходимо этот блок уменьшить.

    Но всё-таки мне кажется, что для запуска виндового екзешника это не поможет и максимум, что я смогу добиться через INT 21/4B00 - это запустить DOS-stub.

    Нет ли каких-нибуль иных сервисных прерываний при запуске DOS-программы в винде?
     
  7. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Заглушка будет запускаться только если в CONFIG.NT написать словечко DOSONLY. По умолчанию его там нет, поэтому из-под NTVDM вендовые программы запускаться будут.
     
  8. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Daniil
    Только без вызова int21/4A виндовые тоже не запустятся :)
     
  9. Daniil

    Daniil New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2004
    Сообщения:
    12
    Адрес:
    Russia
    О! Всем спасибо, тестовая версия заработала!
    Код (Text):
    1. model tiny
    2.  
    3. .code
    4. org     100h
    5. start:     
    6.         mov ax, ds
    7.         mov es, ax
    8.         mov word ptr segCmdLine, ax
    9.         mov word ptr segFCB1, ax
    10.         mov word ptr segFCB2, ax
    11.  
    12.         mov bx, BlockSize
    13.         mov ah, 4Ah
    14.         int 21h
    15.  
    16.         mov     ax, 4B00h
    17.                 mov dx, offset PathName
    18.                 mov     bx, offset ParmBlock
    19.                 int     21h
    20.  
    21.                 mov ah, 4Ch
    22.                 int 21h
    23.  
    24. PathName        db  'c:\tools\tst.exe',0
    25. ParmBlock       dw  0                       ;Default environment
    26.         dw  offset CmdLine          ;Command line string
    27. segCmdLine      dw  ?
    28.         dw  offset Dummy        ;Dummy FCBs
    29. segFCB1         dw  ?
    30.         dw  offset Dummy        ;Dummy FCBs
    31. segFCB2         dw  ?
    32. CmdLine         db  3,' A:',0dh
    33. Dummy           db  20 dup (?)
    34.  
    35. BlockSize   equ ($-start)/16+17
    36.  
    37. end start