Системное программное обеспечение персональных ЭВМ


Пример 2



Пример 2

/*== ПРИМЕР 11.2 ==*/ /*============ Определение места PID в системе ===========*/ #include <dos.h> #define word unsigned int word mypid; /* PID программы */ word dosend; /* конец памяти DOS*/ word seg,off; /* текущий адрес */ word vpid; /* прочитанный PID */ word /* массивы для запоминания адресов */ mseg[10], moff[10]; int nmem; /* число адресов */ int i; union REGS rr; struct SREGS sr; main() { /* получение адреса конца памяти DOS */ rr.h.ah=0x52; intdosx(&rr,&rr,&sr); dosend=peek(sr.es,rr.x.bx-2); /* Получение своего PSP (PID )*/ rr.h.ah=0x62; intdos(&rr,&rr); mypid=rr.x.bx; printf("PID программы = %04X\n",mypid); /* Поиск PID в системе */ nmem=0; /* поиск происходит начиная от сегмента 60 до конца памяти, занимаемой DOS */ for(seg=0x60;seg<dosend;seg++) for(off=0;off<16;off++) if (peek(seg,off)==mypid) { /* PID найден */ /* изменяется текущий PID */ rr.h.ah=0x50; rr.x.bx=mypid+1; intdos(&rr,&rr); /* повторная выборка из памяти */ vpid=peek(seg,off); /* PID восстанавливается */ rr.h.ah=0x50; rr.x.bx=mypid; intdos(&rr,&rr); if (vpid==mypid+1) { /* адрес слова, хранящего PID, запоминается */ mseg[nmem]=seg; moff[nmem++]=off; } } /* Контрольные операции */ /* По найденным адресам записывается другой PID */ for(i=0; i<nmem; i++) poke(mseg[i],moff[i],mypid+1); /* проверяется, изменился ли PID, хранящийся в системе */ rr.h.ah=0x62; intdos(&rr,&rr); vpid=rr.x.bx; /* Восстанавливается содержимое */ for(i=0; i<nmem; i++) poke(mseg[i],moff[i],mypid); /* Печатаемое значение должно совпадать с mypid+1 */ printf("Измененный PID = %04X\n",vpid); /* Распечатка адресов хранения PID в DOS */ for (i=0;i<nmem; i++) printf("Адрес хранения PID = %04X:%04X\n", mseg[i],moff[i]); printf("Нажмите любую клавишу...\n"); getch(); }

Примененная в примере 11.2 техника - поиск места PID в системе и изменение его прямой записью в память может быть использована в резидентных программах, если почему-либо невозможно применить функцию 0x50.




- Начало -  - Назад -  - Вперед -