簡體   English   中英

如何使用C on Windows將原始數據讀寫到USB驅動器

[英]How can I Read&Write raw data to a USB-Drive using C on windows

所以我制作了自己的加密方案,我想出了一個我可以擁有原始數據的USB驅動器(根本沒有文件系統)的想法,我可以將其用作加密方案中的“密鑰”。

我需要一種方法來讀取和寫入USB中的數據,Iv'e嘗試使用libusb但我無法弄明白(對我來說太低級別)。

我還看到有一種方法可以在Windows上使用CreateFile函數打開USB驅動器的句柄,但是我無法找出所需的參數,並且在嘗試讀取時我得到了ERROR_INVALID_PARAMETER

據我所知,操作系統會認為驅動器/其文件系統已損壞(因為它沒有),但沒關系,我只需要一種存儲原始數據的方法。

任何幫助表示感謝,謝謝!

您的方法的問題是,Windows始終詢問是否應格式化驅動器。 並且可能很可能在一天或那一天問題將以錯誤的方式回答;)

但是,如果您知道正確的名稱,則可以打開一個卷,Windows會在內部使用該卷。 您可以獲得Sysinternals WinObj ,它可以顯示所有名稱。 對於驅動器,Windows還會創建符號鏈接,如\\\\.\\C:通過驅動器號訪問它們。 確保反斜杠在代碼中正確轉義(通常為"\\\\\\\\.\\\\C:" )並且冒號后沒有尾部斜杠。

但我想指出您對CreateFile的文檔,特別是備注部分( https://docs.microsoft.com/en-us/windows/desktop/api/FileAPI/nf-fileapi-createfilea#remarks ):

也許你錯過了以下幾點之一:

要成功調用,必須滿足以下要求:

  • 調用者必須具有管理權限。 有關更多信息,請參閱使用特殊權限運行。
  • dwCreationDisposition參數必須具有OPEN_EXISTING標志。
  • 打開卷或軟盤時,dwShareMode參數必須具有FILE_SHARE_WRITE標志。

正如Eryksun指出的那樣:對於本身報告為可移動的驅動器,不需要管理權限。

打開帶有字母“D”的USB驅動器的示例;

HANDLE h = CreateFile("\\\\.\\D:", (GENERIC_READ | GENERIC_WRITE), FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

if (h != INVALID_HANDLE_VALUE) {
  unsigned char buffer[512];
  DWORD readBytes = 0;
  ReadFile(h, buffer, sizeof(buffer), &readBytes, NULL);
  /* .. */
  CloseHandle(h);
}

另請注意,根據https://stackoverflow.com/a/31712818/2331592中的引用,讀/寫數據塊必須是扇區對齊的。
所以首先要安全地確定扇區大小(例如使用GetDiskFreeSpace

暫無
暫無

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

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