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


Пример 16



Пример 16

/*== ПРИМЕР 10.9 ==*/ /*=========== Получение информации о диске ==========*/ #include <dos.h> #include <ctype.h> #define byte unsigned char #define word unsigned int union REGS rr; struct SREGS sr; /* полученная информация о диске */ struct di { byte error; /* признак ошибки */ byte media; /* тип носителя */ word tot_clust; /* общее число кластеров */ word free_clust; /* число свободных кластеров */ word clust_size; /* секторов в кластере */ word sect_size; /* байт в секторе */ } info[3]; byte cdrive; /* текущий диск */ byte drive; /* анализируемый диск */ int n; main() { do { printf("\nУкажите идентификатор диска >"); drive=getche(); } while (!isalpha(drive)); drive=toupper(drive)-'A'; /*== 1-й способ ==*/ n=0; /* получить номер текущего диска */ rr.h.ah=0x19; intdos(&rr,&rr); cdrive=rr.h.al; /* задать номер текущего диска */ rr.h.ah=0x0e; rr.h.dl=drive; intdos(&rr,&rr); /* проверить результат */ rr.h.ah=0x19; intdos(&rr,&rr); if (rr.h.al!=drive) { printf("\nНеправильный идентификатор диска\n"); exit(); } /* получение информации о FAT текущего диска */ rr.h.ah=0x1b; intdosx(&rr,&rr,&sr); info[n].media=peekb(sr.ds,rr.x.bx); info[n].tot_clust=rr.x.dx; info[n].clust_size=rr.h.al; info[n].sect_size=rr.x.cx; info[n].free_clust=0xffff; /* восстановить номер текущего диска */ rr.h.ah=0x0e; rr.h.dl=cdrive; intdos(&rr,&rr); /*== 2-й способ ==*/ n++; /* получение информации о FAT заданного диска */ rr.h.ah=0x1c; rr.h.dl=drive+1; intdosx(&rr,&rr,&sr); info[n].media=peekb(sr.ds,rr.x.bx); info[n].tot_clust=rr.x.dx; info[n].clust_size=rr.h.al; info[n].sect_size=rr.x.cx; info[n].free_clust=0xffff; /*== 3-й способ ==*/ n=0; n++; /* получить информацию о дисковом пространстве */ rr.h.ah=0x36; rr.h.dl=drive+1; intdosx(&rr,&rr,&sr); info[n].media=0; info[n].tot_clust=rr.x.dx; info[n].clust_size=rr.x.ax; info[n].sect_size=rr.x.cx; info[n].free_clust=rr.x.bx; /* вывод результатов */ clrscr(); printf("Информация о диске %c",drive+'A'); printf(" | INT 1B | INT 1C | INT 36 |\n"); printf("Тип носителя | "); for(n=0;n<3;n++) if (info[n].media) printf("%02x | ", info[n].media); else printf("-- |"); printf("\nВсего кластеров |"); for(n=0;n<3;printf(" %-6d |",info[n++].tot_clust)); printf("\nСвободных кластеров |"); for(n=0;n<3;n++) if (info[n].free_clust!=0xffff) printf(" %-6d |",info[n].free_clust); else printf(" -- |"); printf("\nСекторов в кластере |"); for(n=0;n<3;printf(" %-6d |",info[n++].clust_size)); printf("\nБайт в секторе |"); for(n=0;n<3;printf(" %-6d |",info[n++].sect_size)); getch(); }




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