2012-02-23 58 views
3

我有一个闪存卡,需要计算驱动器整个内容的校验和。如何逐点读取整个磁盘的内容

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

有没有人知道是否有这样做的API?

到目前为止我看到的一切都需要我打开一个文件。

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

+0

你可以用WMI来做到这一点..你熟悉WMI吗 – MethodMan 2012-02-23 17:05:58

回答

4

我不确定在.NET中是否有直接支持,但可以使用Platform Invoke来调用Win32 API函数。 CreateFile()应该是你的起点,因为它可以让你获得一个句柄物理驱动器:

您可以使用CreateFile函数打开一个物理磁盘驱动器或卷,其 返回一个直接访问存储设备(DASD)句柄,该句柄可与 DeviceIoControl函数一起使用。这使您可以直接访问磁盘或卷,例如分区表等磁盘元数据。

的文件通知的限制(如需要管理员权限),并提示在如何从卷号一个物理驱动器号,你等

0

“流”是一个抽象正常假定存在一个文件系统,所以从概念上讲,它不是那么简单。

在Windows上,您可能希望从查看Windows Defragmentation API开始。这里有几个链接,我发现:

+3

实际上,'stream'抽象的全部意义在于它并不假设文件系统。您可以将内存中的流,文件流和串行端口都视为相同。如果操作系统允许你使用整个磁盘。 – MSalters 2012-02-24 10:00:19

7

如果你想编写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个字节)的扇区大小的倍数。