簡體   English   中英

如何逐位讀取整個磁盤的內容

[英]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是否有直接支持,但您可以使用Platform Invoke來調用Win32 API函數。 CreateFile()應該是你的起點,因為它允許你獲得物理驅動器的句柄:

您可以使用CreateFile函數打開物理磁盤驅動器或卷,它返回可與DeviceIoControl函數一起使用的直接訪問存儲設備(DASD)句柄。 這使您可以直接訪問磁盤或卷,例如分區表等磁盤元數據。

該文檔告知您限制(例如要求管理權限)以及如何從卷號等獲取物理驅動器號的提示。

“Stream”是一種抽象, 通常假定存在文件系統,因此從概念上講它並不那么簡單。

在Windows上,您可能希望從查看Windows Defragmentation API開始。 以下是我發現的一些鏈接:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM