Приведем исходный текст программы CLUSTLST (листинг 5.6). Эта программа выводит на экран содержимое таблицы файлов и список кластеров для файла, полный путь которого передается программе в качестве параметра.
printf(" Информация об открытых файлах DOS, " "Frolov A., (C) 1995\n");
// Открываем файл, для которого будем // получать список кластеров handle = open(argv[1], O_BINARY ); if(handle == 0) { printf("Ошибка при открытии файла\n"); return(-1); }
// Разбиваем путь к файлу на компоненты: // - диск; // - каталог; // - имя файла; // - расширение имени _splitpath(argv[1], drive, dir, fname, ext);
if(drive[0] == '\0' dir[0] == '\0' argc < 2) { printf("\nУкажите полный путь к файлу\n"); return(-1); }
printf("Исследуем расположение файла '%s'", argv[1]);
// Комбинируем строку из имени и расширения strcpy(name, fname); for(i = 0; i < 8; i++) { if(name[i] == 0) break; } for(; i < 8; i++) name[i] = ' '; name[8] = 0;
if(flag == 0) { printf("Файл не найден"); close (handle); return(-1); }
// Заказываем буфер для чтения загрузочной записи 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); }
Получив список кластеров, распределенных защищаемому файлу, вы можете зашифровать его и записать, например, в конец защищаемого файла. Впоследствии, перед началом работы, защищенная программа может проверить свое расположение на диске и сравнить его с записанным в зашифрованном списке.