MS-DOS для программиста


Программа CLUSTLST - часть 3


// Заказываем буфер для чтения загрузочной записи boot_rec = (BOOT far*)farmalloc(sizeof(*boot_rec)); if(boot_rec == NULL) { printf("Мало памяти"); close (handle); return(-1); }

// Читаем загрузочную запись в буфер status = getboot((BOOT far*)boot_rec, disk);

// Вычисляем размер кластера в байтах i = boot_rec->bpb.clustsize * boot_rec->bpb.sectsize; printf("Размер кластера, байт : %d",i);

// Если произошла ошибка (например, неправильно указано // обозначение диска), завершаем работу программы if(status) { printf("\nОшибка при чтении загрузочного сектора"); close (handle); return(-1); }

buf = (char*)malloc(i); if(buf == NULL) { printf("Мало памяти"); close (handle); return(-1); }

printf("\nСписок кластеров файла:\n");

// Читаем файл по кластерам, выводим номер // последнего прочитанного кластера, который // берем из таблицы файлов for(;;) { read (handle, buf, i); if(eof(handle)) break; printf("%u ",file_dfcb->last_clu); }

close (handle); farfree(boot_rec); free(buf); return(0); }

// Функция для отображения содержимого таблицы файлов void show(DFCB far *dfcb) { int k;

printf("\nИмя файла: "); for(k = 0; k < 11; k++) { putchar(dfcb->filename[k]); }

printf("\nКоличество идентификаторов: %d\n" "Режим доступа: %d\n" "Поле reserv1: %04X\n" "Информация об устройстве: %04X\n" "Адрес драйвера: %Fp\n" "Начальный кластер: %u\n" "Время: %04X\n" "Дата: %04X\n" "Размер файла в байтах: %ld\n" "Текущее смещение в файле: %ld\n" "Поле reserv2: %04X\n" "Последний прочитанный кластер: %u\n" "Сегмент PSP владельца файла: %04X\n" "Поле reserv7: %u\n", dfcb->handl_num, dfcb->access_mode, dfcb->reserv1, dfcb->dev_info, dfcb->driver, dfcb->first_clu, dfcb->time, dfcb->date, dfcb->fl_size, dfcb->offset, dfcb->reserv2, dfcb->last_clu, dfcb->ownr_psp, dfcb->reserv7); }

LPSFT get_nsft(LPSFT sft) { LPSFT sft_next;

sft_next = sft->next; if(FP_OFF(sft_next) == 0xffff) return((LPSFT)NULL);

return(sft_next); }

LPSFT get_fsft(LPCVT cvt) { LPSFT sft; sft = (LPSFT)cvt->file_tab; return(sft); }

int getboot(BOOT far *boot, int drive) { struct { unsigned long first_sect; unsigned nsect; void far* buf; } cb;

cb.first_sect = 0; cb.nsect = 1; cb.buf = (void far*)boot;

_BX = FP_OFF(&cb); _DS = FP_SEG(&cb); _CX = 0xffff; _DX = 0; _AX = drive; asm int 25h asm pop ax asm jc err

return 0; err: return 1; }

Получив список кластеров, распределенных защищаемому файлу, вы можете зашифровать его и записать, например, в конец защищаемого файла. Впоследствии, перед началом работы, защищенная программа может проверить свое расположение на диске и сравнить его с записанным в зашифрованном списке.




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