【问题标题】:How to read the contents of an entire disk bit by bit如何逐位读取整个磁盘的内容
【发布时间】:2012-02-24 01:43:15
【问题描述】:

我有一张闪存卡,我需要计算驱动器全部内容的校验和。

如果我可以获取到整个驱动器的流,我可以一点一点地读取它。

有谁知道是否有用于执行此操作的 API?

到目前为止,我看到的所有内容都需要我打开一个文件。

有没有办法一点一点地读取整个驱动器的内容?

【问题讨论】:

  • 你可以使用 WMI 来做到这一点。你熟悉 WMI

标签: c# c++


【解决方案1】:

如果您想编写 C# 代码,则必须使用 P/Invoke 从磁盘读取数据(RAW 访问)。

有什么方法可以一点一点地读取整个驱动器的内容吗?

您必须区分 驱动器(闪存卡的逻辑表示,上面安装了文件系统,由 驱动器指定字母)和磁盘(您的闪存卡的物理表示,由磁盘编号指定)。

请参阅my previous answer,了解如何从驱动器/磁盘读取 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 字节)。

【讨论】:

    【解决方案2】:

    我不确定.NET 是否直接支持此功能,但您可以使用Platform Invoke 调用 Win32 API 函数。 CreateFile() 应该是您的起点,因为它允许您获取物理驱动器的句柄:

    您可以使用 CreateFile 函数打开物理磁盘驱动器或卷,这 返回可与 DeviceIoControl 函数。这使您可以直接访问磁盘或卷,例如 例如分区表等磁盘元数据。

    该文档会告知您限制(例如需要管理权限)并提示如何从卷号中获取物理驱动器号等。

    【讨论】:

      【解决方案3】:

      “流”是一种抽象,通常假定存在文件系统,因此从概念上讲它并不那么简单。

      在 Windows 上,您可能需要先查看 Windows 碎片整理 API。以下是我找到的几个链接:

      【讨论】:

      • 实际上,stream 抽象的全部意义在于它假设一个文件系统。您可以对内存中的流、文件流和串行端口一视同仁。如果操作系统允许,整个磁盘。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2016-05-26
      • 2015-07-19
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多