用C/C++读取磁盘某个扇区某字节内容

junhao051 2009-05-09 02:02:53
比如我想读取NTFS文件系统的一磁盘,想知道它的第i个扇区第k个字节的内容,该如何编程实现?希望大家指点,不胜感激。
...全文
1099 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangjie493664988 2009-05-10
  • 打赏
  • 举报
回复
山野万澫里 2009-05-09
  • 打赏
  • 举报
回复
读0磁盘1扇区的内容
HANDLE hDisk = CreateFileW(L"\\\\.\\PHYSICALDRIVE0"
, GENERIC_READ|GENERIC_WRITE
,FILE_SHARE_READ|FILE_SHARE_WRITE
,NULL
,OPEN_EXISTING
,NULL
,NULL) ;
ASSERT(hDisk != INVALID_HANDLE_VALUE) ;
SetFilePointer(hDisk , SECTOR_SIZE , 0 , FILE_BEGIN) ;
BYTE *buffer = new BYTE[SECTOR_SIZE];
DWORD dwReadLength = 0 ;
ReadFile(hDisk , buffer , SECTOR_SIZE , &dwReadLength , NULL) ;
lzh9955 2009-05-09
  • 打赏
  • 举报
回复
牛人啊!!!!
junhao051 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xteaj 的回复:]
在XP下好像不可以直接访问扇区了,只能访问文件。
文件在磁盘上怎么组织,那是文件系统的事,最好不要随便操作。
[/Quote]
我现在要做的是对磁盘数据的查看和恢复,必须对磁盘数据进行操作了。
Sou2012 2009-05-09
  • 打赏
  • 举报
回复
MARK!!!
zhiyongtu 2009-05-09
  • 打赏
  • 举报
回复
摘录Microsoft网站上的一段:


要在基于 Win 32 应用程序中打开用于直接磁盘访问 (原始 I / O) 的物理硬盘驱动器,使用窗体的设备名称
\\.\PhysicalDriveN
其中 N 是 0、 1、 2 和等,系统中表示的每个物理驱动器。

要打开逻辑驱动器直接访问是窗体
\\.\X:
其中,X: 是硬盘驱动器的分区号、 软盘驱动器或 CD-ROM 驱动器。


在可以打开一个物理或逻辑驱动器,使用这些设备名称中使用 CreateFile() 应用程序编程接口 (API) 提供您具有该驱动器在适当的访问权限 (这就是您必须是管理员)。 必须使用在 CreateFile() FILE_SHARE_READ 和 FILE_SHARE_WRITE 标志来访问该驱动器。

一旦打开逻辑或物理驱动器然后可以在整个驱动器上执行直接 I / O 数据。 执行直接磁盘 I / O 时, 您必须查找、,读写的设备和扇区的边界上的扇区大小的倍数。 调用 DeviceIoControl() 使用 IOCTL_DISK_GET_DRIVE_GEOMETRY 每扇区、 数扇区、 跟踪,等,每扇区字节,以便可以计算所需缓冲区的大小。

注意一个基于 Win 32 应用程序无法打开通过使用内部 Windows NT 对象名称 ; 文件是例如试图通过打开打开 CD-ROM 驱动器\Device\CdRom0 因为这不是有效的 Win 32 设备名称不起作用。 应用程序可以使用 QueryDosDevice() API 以获取所有有效的 Win 32 设备名称的列表,并查看特定的 Win 32 设备名称和内部 Windows NT 对象名称之间映射。 应用程序运行在足够的权限级别可以定义重新定义,或通过调用 DefineDosDevice() API 删除 Win 32 设备映射。


因为是机器自动翻译版,所以不是很通顺,但意思是明白的。原网址:
INFO:Win32下直接访问驱动器
英文原版:
INFO: Direct Drive Access Under Win32
Jinhao 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xteaj 的回复:]
在XP下好像不可以直接访问扇区了,只能访问文件。
文件在磁盘上怎么组织,那是文件系统的事,最好不要随便操作。
[/Quote]

可以的,直接打开磁盘就行。
jackyjkchen 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ltc_mouse 的回复:]
扇区跟文件系统没有关系吧~ 驱动直接读取磁盘的扇区不行吗?
[/Quote]

说得轻松,你得把驱动做出来吧,编底层驱动比调用api难得多,Windows不允许直接访问硬件
  • 打赏
  • 举报
回复
在XP下好像不可以直接访问扇区了,只能访问文件。
文件在磁盘上怎么组织,那是文件系统的事,最好不要随便操作。
junhao051 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Jinhao 的回复:]
直接调用CreateFile打开磁盘,然后ReadFile,每次读大小512,buffer地址对齐

想知道它的第i个扇区第k个字节的内容

先Seek到(i - 1) * 512的位置,然后读取这512字节到buffer,buffer[k]就是你要的字节
[/Quote]
没弄明白,能不能给一小段代码提示?
junhao051 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Jinhao 的回复:]
直接调用CreateFile打开磁盘,然后ReadFile,每次读大小512,buffer地址对齐

想知道它的第i个扇区第k个字节的内容

先Seek到(i - 1) * 512的位置,然后读取这512字节到buffer,buffer[k]就是你要的字节
[/Quote]
好像有一点儿明白,我琢磨下。
junhao051 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ltc_mouse 的回复:]
扇区跟文件系统没有关系吧~ 驱动直接读取磁盘的扇区不行吗?
[/Quote]
能不能说得详细点儿,怎么用驱动读取?学艺不精我。
Jinhao 2009-05-09
  • 打赏
  • 举报
回复
直接调用CreateFile打开磁盘,然后ReadFile,每次读大小512,buffer地址对齐

想知道它的第i个扇区第k个字节的内容

先Seek到(i - 1) * 512的位置,然后读取这512字节到buffer,buffer[k]就是你要的字节
ltc_mouse 2009-05-09
  • 打赏
  • 举报
回复
扇区跟文件系统没有关系吧~ 驱动直接读取磁盘的扇区不行吗?
「已注销」 2009-05-09
  • 打赏
  • 举报
回复
查MSDN吧:可能最大的问题是权限突破。
XP以上做限制了。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧