[英]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.