C语言中的低级书写

C语言中的低级书写,c,io,dd,mbr,C,Io,Dd,Mbr,如何使用C编程语言写入硬盘上的任何块 有关于编写的,但它没有涵盖太多的C方面 正如这个词所说,由于文件描述符是用于文件的,我想在这种情况下没有办法使用它们。包含在C标准库中的也使用文件描述符实现 更准确地说: 这个问题是关于写硬盘块而不是文件(独立于操作系统) 上述问题的答案基本上建议在UNIX系统上使用(coreutils)。这就是为什么我要在C中寻找一种方法。也许引导加载程序()和引导扇区病毒使用不同的技术 我猜在filedescriptor中更改实际指针不是一种合法的方法 问题和限制: 我

如何使用C编程语言写入硬盘上的任何块

有关于编写的,但它没有涵盖太多的C方面

正如这个词所说,由于文件描述符是用于文件的,我想在这种情况下没有办法使用它们。包含在C标准库中的也使用文件描述符实现

更准确地说:
这个问题是关于写硬盘块而不是文件(独立于操作系统)

上述问题的答案基本上建议在UNIX系统上使用(coreutils)。这就是为什么我要在C中寻找一种方法。也许引导加载程序()和引导扇区病毒使用不同的技术

我猜在filedescriptor中更改实际指针不是一种合法的方法

问题和限制:
我知道有些方面需要记住,比如

  • 某些操作系统限制对卷的直接访问(例如Windows)
  • 写入错误以及将错误数据写入某些块 可能导致文件系统损坏(硬盘上的数据丢失)
  • 防病毒软件可能会将其标记为可疑代码

这个问题更倾向于理论。

对于类似Unix的操作系统,这是一个毫无疑问的问题:硬盘和其他任何文件一样是一个设备文件,访问方式也和其他文件一样。你得到一个文件描述符,你寻找,你写,你崩溃文件系统,一切都很好


这意味着您也应该使用C中的普通文件I/O例程。区分高级和低级I/O不是您的工作,而是操作系统的工作。因为现在大多数操作系统都支持将设备作为文件隐喻,所以在C中没有进一步的抽象。虽然这种方法可能不适用于DOS和衍生工具,这只是避免DOS以避免维护过时代码的一个原因。

C语言可以访问具有函数
fopen/fclose/fread/fwrite
等的文件。但在该语言中没有块设备(就这一点而言,甚至没有设备)

另一方面,POSIX具有访问文件的低级功能
open/close/read/write
,并且具有块设备的概念。这些功能可以(小心地)用于块设备,只要您遵循一些简单的规则(主要是块对齐),并且知道设备的名称(
/dev/xxx


如果您在非POSIX系统(如Windows)中,则操作系统将有一种特定的方式来处理块设备访问。例如,在Windows中,您可以将
CreateFile
函数与设备名
\.\PhysicalDrive0
\.\C:
等一起使用。

这与C几乎没有任何关系。如何通过编程访问硬件取决于CPU如何与该设备通信(即系统/硬件体系结构/设计)以及(如果涉及任何操作系统)操作系统如何允许运行在其中的其他软件访问设备(如果有)


在x86 PC上,如果没有运行操作系统,您可以使用BIOS中断13h函数来读取和写入HDD扇区。可以使用众所周知的I/O端口和ATA(PI)无需使用BIOS即可实现相同功能的命令。如果有DOS,则大致相同,对硬件访问没有限制。如果有Windows或Linux,则操作系统不允许您执行此类操作,除非您有足够的权限和/或以某种方式执行操作。

如果您想使其独立于操作系统,则可能需要然后你可以创建一个结构来支持你所需要的功能

创建一个结构,该结构将包含指向指针的函数,这些指针可以在代码移动操作系统时更改。然后,对于要支持的每个操作系统,都需要基于操作系统的实现。

open()close()read()write()不是C语言的一部分,它们是操作系统的一部分

此外:write()不写任何东西,它是一个系统调用,要求操作系统为您编写。操作系统可以通过此请求执行任何操作(例如忽略它)


/dev/*条目只是机器私有部分的一个钩子,由操作系统提供给您,使您能够执行其他操作无法完成的操作作为/dev/disk设备之一,操作系统仍然有能力忽略您的请求。

以下是在DOS中如何做到这一点。由于您没有提出特定的问题,因此很难给出答案:“不,没有用于写入未格式化硬盘扇区的标准C api。为什么会有这样的api?”这是一个非常令人满意的答案,但既然你没有回答:谢谢;)。我必须补充一句:“为什么会有一个呢?”真的吗?也许我想用C来改变MBR?问题是什么?在windows中也不是问题。有一些特殊的命名文件(如/dev/in*nix)允许直接访问驱动器。