如何逐位读取整个磁盘的内容
How to read the contents of an entire disk bit by bit
我有一个闪存卡,需要对驱动器的所有内容计算校验和。
如果我能获得整个驱动器的流,我就可以一点一点地读取它。
有人知道是否有API可以这样做吗?
到目前为止,我看到的一切都需要我打开一个文件。
有没有办法一点一点地读取整个驱动器的内容?
如果要编写C#代码,则必须使用p/Invoke从磁盘读取数据(RAW访问)。
有没有办法一点一点地读取整个驱动器的内容?
您必须区分驱动器(闪存卡的逻辑表示,上面安装了文件系统,由硬盘号指定)和磁盘。
请参阅我之前关于如何从驱动器/磁盘读取RAW数据的回答:
基本上,您首先需要一个磁盘/驱动器的句柄:
// For a DISK:
IntPtr hDisk = CreateFile(string.Format("\\.\PhysicalDrive{0}", diskNumber),
GenericRead,
Read | Write,
0,
OpenExisting,
0,
IntPtr.Zero);
// For a DRIVE
IntPtr hDrive = NativeMethods.CreateFile(
string.Format("\\.\{0}:", DriveLetter)
GenericRead,
Read | Write,
IntPtr.Zero,
OpenExisting,
0,
IntPtr.Zero);
然后使用SetFilePointerEx
(这样您就可以将偏移量移动到要读取的位置)、ReadFile
(用从磁盘/驱动器读取的字节填充缓冲区)和CloseHandle
(关闭CreateFile打开的句柄)。
按块读取磁盘/驱动器(因此,基本上是从偏移量"0"到偏移量"磁盘/驱动器大小"的循环)。
重要的是(或者ReadFile
总是会失败):读取块的大小必须是磁盘扇区大小的倍数(通常为512字节)。
我不确定.NET
中是否对此有直接支持,但您可以使用平台调用来调用Win32 API函数。CreateFile()
应该是您的起点,因为它允许您获得物理驱动器的句柄:
您可以使用CreateFile函数打开物理磁盘驱动器或卷返回一个可与一起使用的直接访问存储设备(DASD)句柄DeviceIoControl功能。这使您能够直接访问磁盘或卷例如分区表之类的磁盘元数据。
文档会通知您限制(例如需要管理权限),并提示如何从卷号中获取物理驱动器号等。
"Stream"是一个抽象,通常假设存在文件系统,因此从概念上讲,它并没有那么简单。
在Windows上,您可能想从查看Windows碎片整理API开始。以下是我发现的几个链接:
- MSDN页面
- 碎片整理API C#包装
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 对字符数组中的元素执行逐位操作
- 逐位操作的隐式类型转换
- 在C++中对int使用逐位AND
- 计算校验和的逐位运算符
- C++逐位增加指针遍历结构
- CRC32 C++使用布尔数组和手动逐位异或实现
- 如何在 AVX2 中实现车道交叉逻辑逐位移位/旋转(左和右)
- 使用C++逐位运算符查找匹配的颜色
- 逐位比较
- 加法的逐位操作
- 如何有效地将逐位运算应用于(大)压缩位向量
- 对布尔值使用逐位not运算符(~)是否会调用Undefined Behavior
- 对条件语句执行逐位AND XOR
- 两个数组的逐位AND优化
- Eigen中的逐位运算
- 逐位操作和移位问题
- C++通过长-长指针对double进行逐位操作,中断输出
- 从逐位OR组合中确定原始常数
- 如何逐位读取整个磁盘的内容