Защита дискет от копирования - часть 4
gets(buf); strcpy(diskbuf,buf);
di.drive = 0; di.head = 0; di.track = 20; di.sector = 1; di.nsectors = 1; di.buffer = diskbuf;
status = _bios_disk(_DISK_WRITE, &di) >> 8;
if(status) { printf("\nОшибка при записи в нестандартный сектор: %d", status); exit(-1); }
di.drive = 0; di.head = 0; di.track = 20; di.sector = 1; di.nsectors = 1; di.buffer = diskbuf1;
for(i = 0; i < 3; i++) { status = _bios_disk(_DISK_READ, &di) >> 8; if( !status ) break; }
printf("\nПрочитано из нестандартного сектора:\n%s\n", diskbuf1);
// Восстанавливаем старые значения в // таблице параметров дискеты
dpt_ptr->sec_size = old_sec_size; dpt_ptr->fill_char = old_fill_char; dpt_ptr->eot = old_eot;
exit(0); }
Какую информацию можно записать в нестандартный сектор?
Если вы делаете инсталляционную (установочную) дискету, которая рассчитана на ограниченное количество инсталляций, нестандартный сектор - самое подходящее место для хранения счетчика инсталляций. Даже такие программы, как Norton Utilities
или Norton Disk Editor, не помогут прочитать или изменить значение этого счетчика. В этот же сектор можно записать и другую информацию, необходимую для правильной инсталляции защищенного программного обеспечения.
Другой пример - использование нестандартного номера дорожки. Программа форматирует дорожку (стандартным образом) с номером 81. Обычно считается, что дискеты могут содержать 40 или 80 дорожек, соответственно, с номерами 0...39 или 0...79, однако возможно использование и дорожек с большими номерами. Обычные программы копирования будут копировать только 40 или 80 дорожек, "не заметив" нашей лишней дорожки.
Этим мы и воспользуемся, записав на 81-ю дорожку контрольную информацию. Для разнообразия в примере используем функции общего управления вводом/выводом GENERIC IOCTL.
Первая программа предназначена для форматирования 81-й дорожки:
#include <dos.h> #include <stdio.h> #include <malloc.h> #include <errno.h> #include "sysp.h"