使用c ++从HDD中删除分区表

时间:2017-12-12 21:21:22

标签: c++ disk-partitioning

我试图编写一个程序作为概念证明,以便从我的硬盘删除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()的指针,这是不是正确的方式。

我花了几个小时才明白他的意思,但我仍然不确定我是否理解。 有没有人尝试过类似的东西?

1 个答案:

答案 0 :(得分:4)

在这行代码中:

::write(fd, '\0', GPT_PARTITION_TABLE_SIZE);

write的第二个参数是const void *。发生的事情是char NUL('\0')值是常量0,因此相当于NULL,或转换为nullptr值。 write调用然后尝试从该地址开始读取GPT_PARTITION_TABLE_SIZE个字节。在典型的系统上,NULL的地址实际上是0,通常tehre没有页面映射,它会导致异常。在操作系统内核或某些嵌入式系统中,可能存在可在地址0处读取的内存映射,这可能会写入映射到那里的任何内容。

与代码示例比较:

char buffer[GPT_PARTITION_TABLE_SIZE];
memset(buffer, '\0', sizeof(buffer));
write(fd, buffer, sizeof(buffer));