因此,我制定了自己的加密方案,然后想到了一个USB驱动器,可以将原始数据(根本没有文件系统)用作加密方案中的“密钥”。 / p>
我需要一种直接在USB中读取和写入数据的方法,但我尝试使用libusb,但我无法弄清楚(对我来说太低了)。
我还发现有一种方法可以在Windows上使用CreateFile
函数打开USB驱动器的句柄,但是我无法弄清所需的参数,因此尝试获取ERROR_INVALID_PARAMETER
时阅读。
我知道操作系统会认为驱动器/它的文件系统已损坏(因为它没有一个),但没关系,我只需要一种存储原始数据的方法。
任何帮助表示感谢,谢谢!
答案 0 :(得分:3)
您的方法存在的问题是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
)