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


Пример 3



Пример 3

/*== ПРИМЕР 11.3 ==*/ /*=============== Чтение заголовка EXE-файла =============*/ #include <dos.h> #include <string.h> #include <stdlib.h> #define byte unsigned char #define word unsigned int /* Форматированная часть заголовка EXE-файла */ struct EXEH { byte ExeFlag[2]; /* 0x4D5a признак EXE-файла ('MZ') */ word LastPag; /* длина неполной последней страницы */ word PageCnt; /* длина образа в 512-байтовых стр. */ word ReloCnt; /* число элементов в табл.перемещения */ word HdrSize; /* длина заголовка в параграфах */ word MinMem; /* мин. памяти за концом прогр.*/ word MaxMem; /* макс.требуемой памяти */ word ReloSS; /* смещение сегмента стека */ word ExeSP; /* значение регистра SP при запуске */ word ChkSum; /* контрольная сумма */ word ExeIP; /* значение регистра IP при запуске */ word ReloCS; /* смещение кодового сегмента */ word TabOff; /* смещение 1-го эл-та перемещения */ word Overlay; /* номер оверлея */ } exeh; word psp; /* сегм.адрес PSP */ char fname[80], *fn; /* имя EXE-файла */ int exef; /* дескриптор EXE-файла */ union REGS rr; struct SREGS sr; main() { clrscr(); /* получение сегментного адреса PSP */ rr.h.ah=0x51; intdos(&rr,&rr); psp=rr.x.bx; /* получение имени файла из окружения */ for(fn=(char *)MK_FP(peek(psp,0x2C),0);*fn|*(fn+1);fn++); strcpy(fname,fn+4); if (strchr(fname,'.')==NULL) strcat(fname,".EXE"); printf("Файл: %s\n",fname); /* открытие файла */ rr.h.ah=0x3d; rr.h.al=0; sr.ds=FP_SEG(fname); rr.x.dx=FP_OFF(fname); intdosx(&rr,&rr,&sr); if (rr.x.cflag) { printf("Невозможно открыть файл\n"); exit(0); } else exef=rr.x.ax; /* чтение заголовка */ rr.h.ah=0x3f; rr.x.bx=exef; rr.x.cx=sizeof(struct EXEH); sr.ds=FP_SEG(&exeh); rr.x.dx=FP_OFF(&exeh); intdosx(&rr,&rr,&sr); if (rr.x.cflag) { printf("Ошибка чтения\n"); exit(0); } printf("======= Заголовок файла %s =======\n",fname); printf("Подпись файла .EXE = %02X%02X (%c%c)\n", exeh.ExeFlag[0],exeh.ExeFlag[1], exeh.ExeFlag[0],exeh.ExeFlag[1]); printf("Длина последней страницы = %d\n", exeh.LastPag); printf("Длина модуля в страницах = %d\n", exeh.PageCnt); printf("Число эл-тов в табл.перемещ. = %d\n", exeh.ReloCnt); printf("Длина заголовка = %d\n", exeh.HdrSize); printf("Минимум памяти = %04Xh\n", exeh.MinMem); printf("Максимум памяти = %04Xh\n", exeh.MaxMem); printf("Смещение сегмента стека = %04Xh\n", exeh.ReloSS); printf("Значение регистра SP = %04Xh\n", exeh.ExeSP); printf("Контрольная сумма = %d\n", exeh.ChkSum); printf("Значение регистра IP = %04Xh\n", exeh.ExeIP); printf("Смещение кодового сегмента = %04Xh\n", exeh.ReloCS); printf("Смещение 1-го элемента таблицы = %04Xh\n", exeh.TabOff); printf("Номер оверлея = %d\n", exeh.Overlay); getch(); }




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