因此,我制定了自己的加密方案,然后想到了一个USB驱动器,可以将原始数据(根本没有文件系统)用作加密方案中的“密钥”。
我需要一种直接在USB中读取和写入数据的方法,但我尝试使用libusb,但无法弄清楚(对我来说太低了)。
我还看到,有一种方法可以使用CreateFile
Windows上的函数打开USB驱动器的句柄,但我无法弄清所需的参数,并且ERROR_INVALID_PARAMETER
在尝试阅读时遇到了问题。
我知道操作系统会认为驱动器/它的文件系统已损坏(因为它没有一个),但这没关系,我只需要一种存储原始数据的方法即可。
任何帮助表示赞赏,谢谢!
您的方法存在的问题是,Windows总是询问是否应格式化驱动器。并且很可能在某一天或另一天以错误的方式回答问题;)
但是,如果您知道正确的名称,则可以打开Windows内部使用的卷。您可以获得WinObj
可以显示所有名称的Sysinternals 。对于驱动器,Windows还创建符号链接,例如\\.\C:
通过驱动器号访问它们。确保反斜杠在代码中(通常为"\\\\.\\C:"
)正确转义,并且冒号后没有尾随斜杠。
但我想为您指出CreateFile
特别是“备注”部分的文档(https://docs.microsoft.com/zh-cn/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
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句