На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Запрещается поднимать старые темы (с последним ответом, датированным более года назад) без веской на то причины. Если ваш вопрос связан с этой же темой, лучше создайте новую и укажите ссылку на старую тему, если это нужно (старую тему разрешается поднимать только автору, если его вопрос ещё не решён, либо если тема касается какого-то проекта, у которого появилось обновление и т.п). По крайней мере, отвечать в такие темы точно не нужно!
3. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Не поленитесь, загляните в эти разделы перед созданием темы. Возможно, так уже имеется решение вашего вопроса.

4. Настоятельно рекомендую обратить особое внимание на правила форума, которые нарушаются чаще всего:
  4.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  4.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).

Не забывайте также про главные ПРАВИЛА ФОРУМА!
Участники форума, нарушающие правила, будут наказываться, а вносящие вклад в развитие форума – приветствовать и, по возможности, награждаться :)

Приятного вам общения! ;)
Модераторы: Jin X, Qraizer
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> ASM DOS Создание TSR без PSP, Непонятки в использование INT 21H функции 55H и другие пояснения авторов на похожие темы.
Я умудрился найти метод создания TSR без PSP.
Проверил его на WMVARE и на реальных компьютерах. Работает в MS-DOS 6, MS-DOS 7.10, WINDOWS-98(DOS-окно)
В литературе рекомендуют использовать функции DOS 50H и 55H (INT 21H)
Некоторые авторы не рекомендуют использовать функцию DOS 55H.
Хорошего описания этой функции не нашел.
Может кто знает отличие функции 55H от функции 26H.
Я проверил в своем методе их оба, и не заметил различий.
Вообще говоря, PSP резиденту часто просто не нужен. Самое важное, что там есть – открытые файлы, и если резидент выполняет дисковые операции, то да, о PSP ему надо заботиться. В противном случае можно легко затереть PSP собственными данными и не париться.
Что касается разницы в фукциях, вот тут хороший справочник.
Одни с годами умнеют, другие становятся старше.
Цитата andr00 @
кто знает отличие функции 55H от функции 26H.

Согласно описанию
Цитата
INT 21 - DOS Internal - CREATE PSP

AH = 55h
DX = Segment number to set up PSP at
Note: Like func 26h but creates "child" PSP rather than copying existing one.

Цитата andr00 @
Я умудрился найти метод создания TSR без PSP.

Тоже мне проблема. ВСЕ TSR, ставящиеся в верхние блоки памяти, не используют PSP. В частности, подавляющее большинство бутовых вирусов.
Реально PSP нужен в основном для того, чтобы соотв. функции DOS смогли правильно завершить работу программы (с оставлением резидентной части или без таковой). Плюс там располагается строка запуска с параметрами, откуда их можно обработать. И практически всё...
Цитата Qraizer @
если резидент выполняет дисковые операции, то да, о PSP ему надо заботиться.

Нафига? Если TSR имеет глупость использовать старые (0Fh-17h) функции работы с файлами, достаточно зарезервировать 20 байт под FCB. Если же хэндловые - то и FCB не нужен.
Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.
Причём тут устаревшие FCB? Речь о расширенных FCB внутри DOS, которые торчат наружу в лице параметра FILES в CONFIG.SYS. В PSP лежит массив соответствий между открытыми приложением handle и этими самыми FILES, и если резидент не озаботится охраной своих handles от handles приложений, будет большой бадабум.
Одни с годами умнеют, другие становятся старше.
В PSP? ничего не путаешь? потому как у меня было много программ, которые ставились резидентно в верхние адреса, полностью освобождая MCB инсталлера, и, работая с файлами, ни про какой PSP даже не думали - это забота DOS...

Цитата Qraizer @
массив соответствий между открытыми приложением handle и этими самыми FILES

:blink: Таблица открытых файлов находится в области данных DOS... может, я даже найду функцию (MS-DOS Internal), которая возвращает указатель на неё, если, конечно, вспомню, в какой доке она описана...

Добавлено
fn 52h
Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.
Ничего не путаю. Попробуй открыть файл, получишь хендл, эдак, 5, затем останься резидентом, потом в обычной программе открой другой файл, получишь внезапно 5-ый хендл. Для пущего теста всплыви резидентом и запиши чё-нить в свой 5-ый хендл.
Одни с годами умнеют, другие становятся старше.
Могу точно сказать, что после 30h можно спокойно всё затирать даже на этапе инсталляции резидента. По крайней мере, если не используется int 21h. После 80h, понятное дело, можно стирать всё при любом раскладе. Я себе ещё в заготовке для резидента сделал отметку 40h, но уже не помню зачем :)
ExpandedWrap disabled
    .MODEL Tiny
    .286
    .CODE
    .STARTUP
     
    LOCALS
     
    IntNo       =   08h     ; номер прерывания
    HandlerOfs  =   30h;40h;80h ; смещение, по которому будет копироваться обработчик (с отступом в 2-3 байта на инструкцию jmp), должно быть кратно 10h
    HandlerShift    =   HandlerOfs-100h ; разница нового и исходного смещения обработчика
     
            jmp InstallTSR
     
    ;-----------------------------------------------------------------------------------------------------------------------
     
    HandlerStart:               ; начало обработчика прерывания (между этой меткой и HandlerEntry могут храниться данные)
    ORG $-2
    VentilOfs   DB  ?
    VentilOfs1  DB  ?
    VentilChars DB  '\|/-'
    HandlerEntry:               ; точка входа обработчика прерывания
            push    ax
            push    bx
            push    ds
            
            push    cs
            pop ds
            mov al,VentilOfs
            inc ax
            and al,3
            mov VentilOfs,al
            lea bx,VentilChars
            xlat
            mov ah,1Eh
            push    0B800h
            pop ds
            mov ds:[0],ax
     
            pop ds
            pop bx
            pop ax
     
    RealInt     DB  0EAh        ; возвращаем управление прерыванию (jmp far)
    RealAddr    DW  ?,?
    HandlerEnd:
    ORG     $-4
     
    ;-----------------------------------------------------------------------------------------------------------------------
     
    InstallTSR:
            mov ah,9
            lea dx,msgOk
            int 21h
     
            ; копируем наш код со смещением HandlerShift
            mov si,offset HandlerStart
            mov di,offset HandlerStart+HandlerShift
            mov cx,(HandlerEnd-HandlerStart+1)/2
            rep movsw
     
            ; Освобождаем Environment
            mov ah,49h
            mov es,ds:[2Ch]
            int 21h
     
            ; Сдвигаем сегментный адрес
            mov ax,cs
            add ax,HandlerShift/16
            mov ds,ax
     
            ; Получаем старый вектор прерывания
            mov ax,3500h + IntNo
            int 21h
            mov RealAddr[0],bx
            mov RealAddr[2],es
     
            ; Перехватываем прерывание
            mov ah,25h
            mov dx,offset HandlerEntry
            int 21h
     
            ; Остаёмся резидентными
            mov dx,offset HandlerEnd+HandlerShift
            int 27h
     
    msgOk       DB  'TSR is installed!',13,10,'$'
     
    END
Tell me would you kill to save a life?
Tell me would you kill to prove you're right?
Crash, crash, burn, let it all burn
This hurricane's chasing us all underground...
Цитата int 21h, Fn=50h
Info: This function tells DOS that the PID▲ in BX identifies the
current active process. It is used in TSR programs to inform DOS
which process is running; i.e., after popping up.

Several DOS fns (including file handle operations and memory
allocation functions), refer to and make changes to the PSP of
the current process.

A TSR should call Fn 51H and save its PSP during initialization.
Before popping up, the TSR should use fn 51H to get the ID of the
interrupted program, then use fn 50H to set the PID to the saved
value. Be sure to change the PID back before popping down.


Добавлено
Цитата
PspRec
  Offset Size Contents
  ▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  +0       2  wInt20       INT 20H instruction (cd 20) (old way to exit)
  +2       2  wNextSeg     Segment addr just beyond end of program image
  +4       1  res1         (reserved)
  +5       5  abDispatch   FAR CALL to DOS function dispatcher (obs)
 +0aH      4  pfTerminate  terminate address.       See INT 22H
 +0eH      4  pfCtlBrk     Ctrl-Break handler address   INT 23H
 +12H      4  pfCritErr    Critical Error handler addr  INT 24H
 +16H     22  res2         DOS reserved area
           2  wParentPsp   ◄undoc► segment of parent's PSP
 +2cH      2  wEnvSeg      segment address of DOS environment
 +2eH     46  res3         DOS reserved area (handle table, et al.)
 +5cH     16  rFCB_1       an unopened FCB for 1st cmd parameter
 +6cH     20  rFCB_2       an unopened FCB for 2nd cmd parameter
 +80H      1  bCmdTailLen  count of characters in command tail at 81H (also
                           default setting for the DTA)
 +81H     127 abCmdTail    characters from DOS command line
          256              size of a PspRec structure
Сообщение отредактировано: Qraizer -
Одни с годами умнеют, другие становятся старше.
Вообще то мне нужно было создать кучу маленьких TSR без PSP, и желательно в нижней памяти.
При этом желательно разместить их в фрагментированных свободных блоках памяти.
Это мне удалось, все работает. Но гложет мысль, а вдруг где то сглючит из-за нерекомендуемого использования функции 55H.
Чуть позже прикреплю файл описание работы программы и сам листинг.
Спасибо Qraizer за хороший справочник.
Прилагаю описание работы и ASM файл.
Но остались небольшие вопросы.

Если освободить всю память и присвоить ее обратно, не получится ли,
что в этот момент кто то вмешается и испортит всю картину распределения памяти ?
Прикреплённый файлПрикреплённый файлPSP_00.ASM (2,42 Кбайт, скачиваний: 8)
Прикреплённый файлПрикреплённый файлTSR________PSP.txt (2,37 Кбайт, скачиваний: 9)

Добавлено
Подумал о создание нового PSP.
А не лутше ли просто скопировать (MOVS) в нужное место и объявить его текущим ?
Цитата Qraizer @
Для пущего теста всплыви резидентом и запиши чё-нить в свой 5-ый хендл.

Ну ты меня за идиота-то не держи! Если нужна работа с файлом из TSR, то открытие-работа-закрытие выполняются в одном потоке по выставленному флагу в обработчике DOS Idle. И если там при открытии будет получен хендл 5 - то он будет правильный.
Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.
andr00, для чего резиденту нужен PSP? В нём используются функции DOS?
Если нет, в топку PSP! Резидентный модуль обычно – это просто обработчик прерывания. У BIOS'а нет PSP, и его "резидентные" функции (int 8, int 9 и пр) прекрасно работают :)
Tell me would you kill to save a life?
Tell me would you kill to prove you're right?
Crash, crash, burn, let it all burn
This hurricane's chasing us all underground...
Jin X, мне не нужен PSP только из за того, что он занимает в памяти 256 байт.
Но избавится от PSP не так уж просто.

Добавлено
Да, иногда я работаю с файлами из TSR, для этого я создаю и использую временный PSP, который сразу же удаляю когда он не нужен. Здесь нет никаких проблем.
Цитата Jin X @
для чего резиденту нужен PSP?

Не нужен. Более того - после постановки резидентной части и передачи управления командному процессору он уже не PSP, а просто блок в памяти, содержимое которого чертовски похоже на PSP.

Цитата andr00 @
иногда я работаю с файлами из TSR, для этого я создаю и использую временный PSP

Лишняя забота. И ненужная.
Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.
andr00, а в чём проблема? Если "кусочки" резидента заполняют свободные дырки, то проблем вообще нет. Просто выходим из программы через int 20h и всё.
А если свободных дыр нет, значит берём исходник выше и оставляем только 30h байт от PSP (после int 27h, уверен, можно спокойно скопировать себя на 30h ниже, уменьшив в таблице векторов сегментный адрес на 3). Ну или проделать всё это с 80h для надёжности.
Кстати, если резидент используется int 21h, то какой при этом используется PSP? Надо думать, что программы, которая исполняется в данный момент, не иначе. А если нужен свой PSP, тогда создаём его динамически (собственно, тут возникает вопрос: а надо ли было его удалять?)
Tell me would you kill to save a life?
Tell me would you kill to prove you're right?
Crash, crash, burn, let it all burn
This hurricane's chasing us all underground...
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:
Страницы: (3) [1] 2 3  все


Рейтинг@Mail.ru
[ Script Execution time: 0,1560 ]   [ 21 queries used ]   [ Generated: 20.11.17, 22:59 GMT ]