正讲着驱动开发呢,这里突然插一篇Win32的博文。事实上。还是做引子,上一篇博文“IRP与派遣函数”中,我们知道了驱动程序须要处理I/O请求。我们先来看看怎么发出一个I/O请求。

一般的程序不会直接去訪问磁盘,毕竟有文件系统(FileSystem)帮助我们轻松地组织文件,可是有时候必须訪问磁盘,由于文件系统隐藏了低层次的实现,linux人喜欢把文件系统叫做“虚拟文件系统(VFS)”,事实上原因就在这里。比方我们把一个文件从一个分区拷贝到还有一个分区(事实上就是从一个分区中读取文件再向还有一个分区写入文件,当然通常是分段读取写入的,或者是用虚拟内存(线性地址空间)映射文件),我们不须要关心磁盘上分区的组织方法。比方MBR格式或GPT格式,也不须要关心分区对数据的组织方式,无论是FAT32。NTFS,exFAT,ext2/3/4格式等等,这就是文件系统的魅力所在。咳咳,扯的有点远哈,回归正题,我们的目的是绕过文件系统,直接訪问磁盘上的扇区,就像市面上的PE盘制作器一样。能够把引导程序写人U盘的主引导扇区(第一个扇区。通常是512字节)。

演示一下将第一块磁盘的主引导扇区读出来。写的话把ReadFile换成WriteFile,再略微改下代码就能够了。这些API函数在我之前的一篇博客中有详解(參见:http://blog.csdn.net/zuishikonghuan/article/details/46926787)。对了。用BIOS引导系统的看官千万别乱写啊,写坏了MBR就引导不了系统了,修复非常麻烦的,用UEFI引导系统的随便写,不怕,由于UEFI不从MBR载入引导程序,这也是UEFI天生免疫鬼影病毒的原因之中的一个。

代码例如以下:

#include "stdafx.h"

#include

//參数:输出的字符串指针,開始位置,长度

//返回值:读取的大小

DWORD ReadDisk(unsigned char* &out,DWORD start,DWORD size)

{

OVERLAPPED over = { 0 };

over.Offset = start;

HANDLE handle = CreateFile(TEXT("\\\\.\\PHYSICALDRIVE0"), GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

if (handle == INVALID_HANDLE_VALUE)return 0;

unsigned char* buffer = new unsigned char[size + 1];

DWORD readsize;

if (ReadFile(handle, buffer, size, &readsize, &over) == 0)

{

CloseHandle(handle);

return 0;

}

buffer[size] = 0;

out = buffer;

//delete [] buffer;

//注意这里须要自己释放内存

CloseHandle(handle);

return size;

}

int _tmain(int argc, _TCHAR* argv[])

{

unsigned char* a;

DWORD len=ReadDisk(a, 0, 512);

if (len){

for (int i = 0; i < len; i++){

printf("%02X ", a[i]);

}

}

getchar();

return 0;

}

效果图:

代码中须要注意的几个地方:

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”。打开了磁盘设备。假设接着我前几篇的博文看。你就会发现,这不就是符号连接吗,没错。这就是磁盘设备的符号连接。

同一时候。“卷”也是设备,卷就是Windows对磁盘上的分区创建的设备,就是“此电脑”(文件资源管理器)中列出的a盘。b盘,c盘……。没错。卷仅仅是一个逻辑上的概念。我们的电脑上也没有“卷”这样的设备,但Windows为其创建了设备(严格意义上并不是是操作系统创建的,创建设备不是操作系统的任务,应该说是Microsoft为Windows提供的基础设备驱动程序创建的)。比方c盘的设备名通常是“\Device\HarddiskVolume1”。符号连接名是“\??\C:”(R0下)和“\\.\C:”(R3下),事实上,我们看到的*盘就是驱动开发中的符号连接!

用设备管理器改动盘符,事实上就是通知卷驱动程序删除并又一次创建符号连接。

结合上一篇“IRP与派遣函数”和上上篇“NT驱动的基本结构”,想必你已经大致有眉目了吧。下一篇和下下篇就会具体介绍怎样在驱动程序中处理I/O请求了。



python读写磁盘扇区数据_[Win32] 直接读写磁盘扇区(磁盘绝对读写)相关推荐

  1. 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...

    数据挖掘入门与实战 公众号: datadw 本文讲述如何利用Python模拟淘宝的搜索过程并对搜索结果进行初步的数据可视化分析. 搜索过程的模拟:淘宝的搜索页面有两种形式, 一种形式是, 2019/2 ...

  2. python 删除特定行数据_怎么用 Python 做数据分析实例

    01 生成数据表 第一部分是生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据. Excel 中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导 ...

  3. python调用通达信数据_[python]沪深龙虎榜数据导入通达信的自选板块并标注于k线图上...

    [python] 沪深龙虎榜数据导入通达信的自选板块, 并标注于 K 线图上 1 #coding=utf-8 2 3 # 读取 '[paint]' 开头的 csv 文件 4 #copyright @ ...

  4. python玩转大数据_【小旭学长】大数据博士教你用python玩转时空大数据

    好消息!好消息!手把手教你用python玩大数据 小旭学长的python大数据教程完结撒花,共26P录制完毕,总时长4小时.每10分钟的视频的录制加剪辑时间加起来都要两小时以上,讲得很细但是节奏也很快 ...

  5. python爬取客流数据_【python爬取雅虎财经数据】“五一”和广交会客流叠加 广州出入境客流呈“双高峰”...

    [python爬取雅虎财经数据]"五一"和广交会客流叠加 广州出入境客流呈"双高峰" 发布时间:2020-10-13 18:06:00 阅读量:650 作者:乔 ...

  6. python爬大学生就业数据_小猪的Python学习之旅 —— 16.再尝Python数据分析:采集拉勾网数据分析Android就业行情...

    一句话概括本文: 爬取拉钩Android职位相关数据,利用numpy,pandas和matplotlib对招人公司 情况和招聘要求进行数据分析. 引言: 在写完上一篇<浅尝Python数据分析: ...

  7. python回归算法预测数据_数据回归分类预测的基本算法及python实现

    数据回归分类预测的基本算法及python实现 关于数据的回归和分类以及分析预测.讨论分析几种比较基础的算法,也可以算作是比较简单的机器学习算法. 一.KNN算法 邻近算法,可以用来做回归分析也可以用来 ...

  8. linux对磁盘进行分区_如何在Linux中对磁盘进行分区

    linux对磁盘进行分区 在Linux中创建和删除分区是一种常规做法,因为在使用存储设备(如硬盘驱动器和USB驱动器)之前,必须先对其进行某种结构化. 在大多数情况下,大型存储设备被分为称为parti ...

  9. python爬取qq数据_用Python爬取QQ好友空间说说进行分析

    前言: 本文涉及知识点有数据库的读写,python基础,浏览器开发者工具的使用,适用于有编程基础,了解过python的朋友阅读. 环境:PyCharm+Chrome+MongoDB Window10 ...

最新文章

  1. 启动php服务命令,启动|停止服务
  2. 模板:莫比乌斯反演(数论)
  3. java百钱白鸡的算法
  4. linux emmc vfs错误,Hi3519a EMMC挂载EXT4文件系统失败
  5. 用pycharm写python_如何利用pyCharm编写和运行python文件
  6. [转]C#网络编程(同步传输字符串) - Part.2
  7. 安装Bootstrap3编译版本
  8. 微观经济学 —— 公用品悲剧(tragedy of commons)
  9. linux zk服务 关闭_ORACLE数据库RAC安装部署--一键关闭Linux非必要服务
  10. 《老罗Android开发视频教程》更新
  11. 商用密码应用安全性评估
  12. Quartus-II之D触发器
  13. 天眼查企业工商信息查询接口
  14. 设计模式笔记 ------ 建造者模式
  15. Modifier private is redundant for enum constructor
  16. java 初始化duration_Java Duration toMinutes()用法及代码示例
  17. 如何批量获取过期老域名
  18. System.DllNotFoundException: Unable to load DLL 'XX.dll': 找不到指定的模块。 (Exception from HRESULT:
  19. Java课程大作业设计:实现联网对战、实时聊天、多线程编程的五子棋项目
  20. 项目绩效分析方法-挣值技术

热门文章

  1. 【干货】如何打造一流创业团队-创业者最实用的管理指南.pdf(附下载链接)...
  2. AI换脸APP“ZAO”刷屏并一夜爆火,它能红多久?
  3. Truncated Signed Distance Function: Experiments on Voxel Size
  4. pyhthon下中文报错问题
  5. Google PPRGo: 两分钟分类千万节点的最快GNN
  6. php 两个单词 正则表达式字符前_PHP正则表达式核心技术完全详解 第3节
  7. mysql语句6_MySQL的SQL语句 - 数据操作语句(6)- INSERT 语句
  8. Abbirb120型工业机器人_优傲UR5协作型机器人注塑台湾工厂的机器换人项目
  9. 用python快速将excel(含多sheet)导入MySQL(兼容中文)
  10. Cisco交换机设置管理IP