Я пытался написать программу для проверки концепции, чтобы удалить таблицу разделов GPT с моего жесткого диска. Короче говоря, после открытия диска я делаю что-то вроде следующего:
//Removes the first partition table in the beginning of the disk
::lseek(fd, 0, SEEK_SET);
::write(fd, '\0', GPT_PARTITION_TABLE_SIZE);
//Removes the backup partition in the end of the disk
::lseek(fd, -GPT_PARTITION_TABLE_SIZE, SEEK_END);
::write(fd, '\0', GPT_PARTITION_TABLE_SIZE);
Несмотря на то, что это сработало, я получил сообщение от друга, что этот путь не верен, и я должен использовать локальный буфер для записи, и что мой код пытается использовать NULL в качестве указателя на write (), что неправильно путь.
Я провожу довольно много часов, чтобы понять, что он имел в виду, но я все еще не уверен, что понял.
Кто-нибудь когда-нибудь пробовал что-то подобное?
В этой строке кода:
::write(fd, '\0', GPT_PARTITION_TABLE_SIZE);
второй аргумент write
это const void *
, То, что происходит, это char
NUL ('\0'
) значение является константой 0
и, таким образом, эквивалентно NULL
или преобразован в nullptr
значение. write
звонок потом пытается прочитать GPT_PARTITION_TABLE_SIZE
байты, начинающиеся с этого адреса. В типичных системах адрес для NULL буквально равен 0, и обычно там нет отображаемой страницы, и это вызывает исключение. Внутри ядра операционной системы или в некоторых встроенных системах может отображаться память, читаемая по адресу 0, и это может записывать все, что там отображается.
Сравните с примером кода:
char buffer[GPT_PARTITION_TABLE_SIZE];
memset(buffer, '\0', sizeof(buffer));
write(fd, buffer, sizeof(buffer));
Других решений пока нет …