разбиение диска — удаление таблицы разделов с жесткого диска с переполнением стека

Я пытался написать программу для проверки концепции, чтобы удалить таблицу разделов 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 (), что неправильно путь.

Я провожу довольно много часов, чтобы понять, что он имел в виду, но я все еще не уверен, что понял.
Кто-нибудь когда-нибудь пробовал что-то подобное?

-2

Решение

В этой строке кода:

::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));
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]