Здравствуйте всем. Есть небольшая проблема, в ниже приложенном коде, я не пойму где допустил ошибку. Вроде программа работает, т.е. "что то " читает, но не находит сбойные сектора вообще, как я только диск не портил - и ничего (. Подскажите где я мог допустить ошибку ? Вот функция отвечающая за проверку: Код (Text): void CheckDrive(DriveInfo &drive) { DriveGeometry geometry; // запросить геометрию диска if (!GetDriveGeometry(drive.number, geometry)) { printf("Error requesting drive geometry: %s%d", (drive.number & 0x80 ? "HDD" : "FDD"), drive.number & 0x7F); return; } // вывести уведомление о начале проверки printf("Checking %s%d\nPress Alt+X to abort.\n\b", (drive.number & 0x80 ? "HDD" : "FDD"), drive.number & 0x7F); unsigned c, h, s; // данные для рассчёта степени выполнения процесса double total = 1.0 * geometry.cylinders * geometry.heads; double current = 0; // буффер для хранения данных при верификацииы char buffer[512]; unsigned long errors = 0; // записывать файл отчёта FILE *log = fopen("checklog.txt", "w"); // пройтись по структурным элементам for (c = 0; c < geometry.cylinders; ++c) { for (h = 0; h < geometry.heads; ++h) { for (s = 0; s < geometry.sectors; ++s) { // запросить верификацию сектора через функцию 04h (DISK - VERIFY DISK SECTOR(S)) прерывания 13h (дисковая подсистема) /** Inp.: AH = 04h AL = number of sectors to verify (must be nonzero) CH = low eight bits of cylinder number CL = sector number 1-63 (bits 0-5) high two bits of cylinder (bits 6-7, hard disk only) DH = head number DL = drive number (bit 7 set for hard disk) ES:BX -> data buffer (PC,XT,AT with BIOS prior to 11/15/85) Return: CF set on error CF clear if successful AH = status AL = number of sectors verified Copied from Ralf Brown's Interrupt List */ char _ah; int ah; int cflag; int number = drive.number; _asm { push es mov ax, 401h mov cx, [c] rol cx, 8 shl cl, 6 or cl, byte ptr [s] mov dx, [number] mov dh, byte ptr [h] lea bx, buffer push ss pop es int 13h mov byte ptr [_ah], ah pushf pop dx and dx, 1 mov [cflag], dx pop es } // проанализировать результат выполнения операции if (cflag) { ah = _ah; // отработать возможные ошибки switch (ah & 0xFF) { case 0x31: fprintf(stderr, "\nError: no media in drive\n"); goto quit; case 0x80: fprintf(stderr, "\nError: drive not ready (timeout)\n"); goto quit; case 0x10: fprintf(stderr, "\nBad sector: CYL %d HEAD %d SECT %d\n", c, h, s); if (log) { fprintf(log, "Bad sector: CYL %d HEAD %d SECT %d\n", c, h, s); } ++errors; break; default:; } } // если клавиша нажата if (kbhit()) { if (getch() == 0) { if (getch() == 0x2D) { // и это Alt+X, то прекратить выполнение проверки printf("\n\nOperation aborted!\n\n"); goto quit; } } } } // нарастить счётчик выполнения current += 1.0; // и вывести отчёт о выполнении printf("CYL %3d HEAD %3d (%.1f%% done)\r", c, h, 100.0 * current / total); } } Подскажите кто сможет. Нужно срочно.... (.
не знаю как работает эта досовская функция на прерывании может когда bad sector то CF не должен быть выставлен ? если это функция проверки сектора то в случае удачи сектор либо битый либо целый такая логика
FirefishПривет такое дело надо твая рабочая програ если ты конечно ее дописал просто у меня похожа курсовая работа PLZ!
1. Насколько я помню, функция int 13h c ah=4 не тестирует качество сектора, т.к. не выполняет попытки чтения данных. Она просто проверяет существование сектора с данными c/h/s. Поэтому рекомендую юзать ah=2 и, кроме того, каждый сектор читать минимум 3 раза (чередуя со сбросами ah=0), а уж потом делать вывод о BAD или GOOD. По крайней мере 15 лет назад я делал именно так, и все работало. 2. Цилиндры и стороны должны нумероваться с 0 до максимума, а сектора - с 1. Поэтому надо Код (Text): for (s = 1; s <= geometry.sectors; ++s) Это все навскидку, може и еще ошибки есть.
Дело в том что в эту тематику еще не вникал! может всетаки остался рабочий исходничек PLZ! ___________________________________________ Студенты - народ НУ О4ЕНЬ ЛЕНИВЫЙ....
wad Ты не только не вникал, ты и не хочешь вникать. Тем более задание такое на самом деле не на курсовую, а максимум на лабу на неделю. Никто здесь тебе ничего не даст.