Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.187.121] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Я умудрился найти метод создания TSR без PSP.
Проверил его на WMVARE и на реальных компьютерах. Работает в MS-DOS 6, MS-DOS 7.10, WINDOWS-98(DOS-окно) В литературе рекомендуют использовать функции DOS 50H и 55H (INT 21H) Некоторые авторы не рекомендуют использовать функцию DOS 55H. Хорошего описания этой функции не нашел. Может кто знает отличие функции 55H от функции 26H. Я проверил в своем методе их оба, и не заметил различий. |
Сообщ.
#2
,
|
|
|
Вообще говоря, PSP резиденту часто просто не нужен. Самое важное, что там есть – открытые файлы, и если резидент выполняет дисковые операции, то да, о PSP ему надо заботиться. В противном случае можно легко затереть PSP собственными данными и не париться.
Что касается разницы в фукциях, вот тут хороший справочник. |
Сообщ.
#3
,
|
|
|
Цитата 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 не нужен. |
Сообщ.
#4
,
|
|
|
Причём тут устаревшие FCB? Речь о расширенных FCB внутри DOS, которые торчат наружу в лице параметра FILES в CONFIG.SYS. В PSP лежит массив соответствий между открытыми приложением handle и этими самыми FILES, и если резидент не озаботится охраной своих handles от handles приложений, будет большой бадабум.
|
Сообщ.
#5
,
|
|
|
В PSP? ничего не путаешь? потому как у меня было много программ, которые ставились резидентно в верхние адреса, полностью освобождая MCB инсталлера, и, работая с файлами, ни про какой PSP даже не думали - это забота DOS...
Цитата Qraizer @ массив соответствий между открытыми приложением handle и этими самыми FILES Таблица открытых файлов находится в области данных DOS... может, я даже найду функцию (MS-DOS Internal), которая возвращает указатель на неё, если, конечно, вспомню, в какой доке она описана... Добавлено fn 52h |
Сообщ.
#6
,
|
|
|
Ничего не путаю. Попробуй открыть файл, получишь хендл, эдак, 5, затем останься резидентом, потом в обычной программе открой другой файл, получишь внезапно 5-ый хендл. Для пущего теста всплыви резидентом и запиши чё-нить в свой 5-ый хендл.
|
Сообщ.
#7
,
|
|
|
Могу точно сказать, что после 30h можно спокойно всё затирать даже на этапе инсталляции резидента. По крайней мере, если не используется int 21h. После 80h, понятное дело, можно стирать всё при любом раскладе. Я себе ещё в заготовке для резидента сделал отметку 40h, но уже не помню зачем
.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 |
Сообщ.
#8
,
|
|
|
Цитата 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 |
Сообщ.
#9
,
|
|
|
Вообще то мне нужно было создать кучу маленьких TSR без PSP, и желательно в нижней памяти.
При этом желательно разместить их в фрагментированных свободных блоках памяти. Это мне удалось, все работает. Но гложет мысль, а вдруг где то сглючит из-за нерекомендуемого использования функции 55H. Чуть позже прикреплю файл описание работы программы и сам листинг. |
Сообщ.
#10
,
|
|
|
Спасибо Qraizer за хороший справочник.
Прилагаю описание работы и ASM файл. Но остались небольшие вопросы. Если освободить всю память и присвоить ее обратно, не получится ли, что в этот момент кто то вмешается и испортит всю картину распределения памяти ? Прикреплённый файлPSP_00.ASM (2,42 Кбайт, скачиваний: 200) Прикреплённый файлTSR________PSP.txt (2,37 Кбайт, скачиваний: 179) Добавлено Подумал о создание нового PSP. А не лутше ли просто скопировать (MOVS) в нужное место и объявить его текущим ? |
Сообщ.
#11
,
|
|
|
Цитата Qraizer @ Для пущего теста всплыви резидентом и запиши чё-нить в свой 5-ый хендл. Ну ты меня за идиота-то не держи! Если нужна работа с файлом из TSR, то открытие-работа-закрытие выполняются в одном потоке по выставленному флагу в обработчике DOS Idle. И если там при открытии будет получен хендл 5 - то он будет правильный. |
Сообщ.
#12
,
|
|
|
andr00, для чего резиденту нужен PSP? В нём используются функции DOS?
Если нет, в топку PSP! Резидентный модуль обычно – это просто обработчик прерывания. У BIOS'а нет PSP, и его "резидентные" функции (int 8, int 9 и пр) прекрасно работают |
Сообщ.
#13
,
|
|
|
Jin X, мне не нужен PSP только из за того, что он занимает в памяти 256 байт.
Но избавится от PSP не так уж просто. Добавлено Да, иногда я работаю с файлами из TSR, для этого я создаю и использую временный PSP, который сразу же удаляю когда он не нужен. Здесь нет никаких проблем. |
Сообщ.
#14
,
|
|
|
Цитата Jin X @ для чего резиденту нужен PSP? Не нужен. Более того - после постановки резидентной части и передачи управления командному процессору он уже не PSP, а просто блок в памяти, содержимое которого чертовски похоже на PSP. Цитата andr00 @ иногда я работаю с файлами из TSR, для этого я создаю и использую временный PSP Лишняя забота. И ненужная. |
Сообщ.
#15
,
|
|
|
andr00, а в чём проблема? Если "кусочки" резидента заполняют свободные дырки, то проблем вообще нет. Просто выходим из программы через int 20h и всё.
А если свободных дыр нет, значит берём исходник выше и оставляем только 30h байт от PSP (после int 27h, уверен, можно спокойно скопировать себя на 30h ниже, уменьшив в таблице векторов сегментный адрес на 3). Ну или проделать всё это с 80h для надёжности. Кстати, если резидент используется int 21h, то какой при этом используется PSP? Надо думать, что программы, которая исполняется в данный момент, не иначе. А если нужен свой PSP, тогда создаём его динамически (собственно, тут возникает вопрос: а надо ли было его удалять?) |