使用 C++ 从硬盘中删除分区 table
Delete partition table from HDD with c++
我试图编写一个程序作为概念验证,以便从我的 HDD 中删除 GPT 分区 table。要在打开磁盘后缩短它,我会执行以下操作:
//Removes the first partition table in the beginning of the disk
::lseek(fd, 0, SEEK_SET);
::write(fd, '[=11=]', GPT_PARTITION_TABLE_SIZE);
//Removes the backup partition in the end of the disk
::lseek(fd, -GPT_PARTITION_TABLE_SIZE, SEEK_END);
::write(fd, '[=11=]', GPT_PARTITION_TABLE_SIZE);
尽管这似乎工作得很好,但我从朋友那里得知这种方式不正确,我应该使用本地缓冲区进行写入,并且我的代码尝试使用 NULL 作为指向 write() 的指针这不是正确的方法。
我花了好几个小时才明白他的意思,但我仍然不确定我是否明白了。
有没有人试过类似的东西?
在这行代码中:
::write(fd, '[=10=]', GPT_PARTITION_TABLE_SIZE);
write
的第二个参数是 const void *
。发生的事情是 char
NUL ('[=15=]'
) 值是一个常量 0
,因此相当于 NULL
,或转换为 nullptr
值。然后 write
调用尝试从该地址开始读取 GPT_PARTITION_TABLE_SIZE
字节。在典型的系统上,NULL 的地址实际上是 0,通常没有页面映射到那里,它会导致异常。在操作系统内核或某些嵌入式系统中,地址 0 处可能存在映射可读的内存,这可能会写入映射在那里的任何内容。
对比代码示例:
char buffer[GPT_PARTITION_TABLE_SIZE];
memset(buffer, '[=11=]', sizeof(buffer));
write(fd, buffer, sizeof(buffer));
我试图编写一个程序作为概念验证,以便从我的 HDD 中删除 GPT 分区 table。要在打开磁盘后缩短它,我会执行以下操作:
//Removes the first partition table in the beginning of the disk
::lseek(fd, 0, SEEK_SET);
::write(fd, '[=11=]', GPT_PARTITION_TABLE_SIZE);
//Removes the backup partition in the end of the disk
::lseek(fd, -GPT_PARTITION_TABLE_SIZE, SEEK_END);
::write(fd, '[=11=]', GPT_PARTITION_TABLE_SIZE);
尽管这似乎工作得很好,但我从朋友那里得知这种方式不正确,我应该使用本地缓冲区进行写入,并且我的代码尝试使用 NULL 作为指向 write() 的指针这不是正确的方法。
我花了好几个小时才明白他的意思,但我仍然不确定我是否明白了。 有没有人试过类似的东西?
在这行代码中:
::write(fd, '[=10=]', GPT_PARTITION_TABLE_SIZE);
write
的第二个参数是 const void *
。发生的事情是 char
NUL ('[=15=]'
) 值是一个常量 0
,因此相当于 NULL
,或转换为 nullptr
值。然后 write
调用尝试从该地址开始读取 GPT_PARTITION_TABLE_SIZE
字节。在典型的系统上,NULL 的地址实际上是 0,通常没有页面映射到那里,它会导致异常。在操作系统内核或某些嵌入式系统中,地址 0 处可能存在映射可读的内存,这可能会写入映射在那里的任何内容。
对比代码示例:
char buffer[GPT_PARTITION_TABLE_SIZE];
memset(buffer, '[=11=]', sizeof(buffer));
write(fd, buffer, sizeof(buffer));