我试图编写一个程序作为概念证明,以便从我的硬盘删除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()的指针,这是不是正确的方式。
我花了几个小时才明白他的意思,但我仍然不确定我是否理解。 有没有人尝试过类似的东西?
答案 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));