正讲着驱动开发呢,这里突然插一篇Win32的博文。事实上。还是做引子,上一篇博文“IRP与派遣函数”中,我们知道了驱动程序须要处理I/O请求。我们先来看看怎么发出一个I/O请求。
一般的程序不会直接去訪问磁盘,毕竟有文件系统(FileSystem)帮助我们轻松地组织文件,可是有时候必须訪问磁盘,由于文件系统隐藏了低层次的实现,linux人喜欢把文件系统叫做“虚拟文件系统(VFS)”,事实上原因就在这里。比方我们把一个文件从一个分区拷贝到还有一个分区(事实上就是从一个分区中读取文件再向还有一个分区写入文件,当然通常是分段读取写入的,或者是用虚拟内存(线性地址空间)映射文件),我们不须要关心磁盘上分区的组织方法。比方MBR格式或GPT格式,也不须要关心分区对数据的组织方式,无论是FAT32。NTFS,exFAT,ext2/3/4格式等等,这就是文件系统的魅力所在。咳咳,扯的有点远哈,回归正题,,我们的目的是绕过文件系统,直接訪问磁盘上的扇区,就像市面上的PE盘制作器一样。能够把引导程序写人U盘的主引导扇区(第一个扇区。通常是512字节)。
演示一下将第一块磁盘的主引导扇区读出来。写的话把ReadFile换成WriteFile,再略微改下代码就能够了。这些API函数在我之前的一篇博客中有详解(參见:)。对了。用BIOS引导系统的看官千万别乱写啊,写坏了MBR就引导不了系统了,修复非常麻烦的,用UEFI引导系统的随便写,不怕,由于UEFI不从MBR载入引导程序,这也是UEFI天生免疫鬼影病毒的原因之中的一个。
代码例如以下:
效果图:
代码中须要注意的几个地方:
1。"\\.\PhysicalDrive0"表示第一个物理磁盘。"\\.\PhysicalDrive1"表示第二个物理磁盘。不区分大写和小写,以此类推。另外别忘了C/C++字符串转义应该写成\\\\.\\
2。dwCreationDisposition參数必须具有OPEN_EXISTING标志。不要问我为什么,微软就是这么说的,不信查MSDN。
3。MSDN上说假设读写的是卷设备,dwShareMode必需要有FILE_SHARE_WRITE标志。可是在w10系统上读写磁盘设备假设不加这个标志CreateFile也会失败,但在w8.1上不会。至于说为什么别问我。问微软吧。
4。假设你用的uefi引导。那么你的mbr前400多个字节可能是空白,博主由于一些特殊原因(方便载入u盘的mbr引导),专门改成了BIOS引导。所以mbr中的引导程序不是空的,所以假设你执行代码发现前400多字节都是0,不要以为出错了。
特别提醒:读写物理磁盘须要管理员权限,怎样获取管理员权限看这里,别由于没注意这个导致执行失败而折腾。
另外,不准学会了后拿去做病毒啊。做病毒后果自负!
我们就好像读写一个文件一样读写了“磁盘”这个设备。事实上上就是把读写操作的I/O请求发送到了“磁盘”这个设备所在驱动程序注冊的派遣函数中。
对了。Microsoft为Windows提供了基础的硬件驱动程序。无论磁盘的类型是什么,是IDE磁盘,SCSI磁盘,SATA磁盘,还是从USB上挂的磁盘,都抽象成统一接口的磁盘设备。所以,仅仅要你用的磁盘是Microsoft支持的类型。或者硬件厂商提供了驱动程序,那么上面的代码均可用!
回归正题,我们通过打开“\\.\PhysicalDrive0”。打开了磁盘设备。假设接着我前几篇的博文看。你就会发现,这不就是符号连接吗,没错。这就是磁盘设备的符号连接。