- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以我制定了自己的加密方案,并想出了一个想法,我可以拥有一个带有原始数据(根本没有文件系统)的 USB 驱动器,我可以将其用作我的加密方案中的“ key ”。
我需要一种直接将数据读取和写入 USB 的方法,我试过使用 libusb但我想不通(对我来说太低级了)。
我还看到有一种方法可以在 Windows 上使用 CreateFile
函数打开 USB 驱动器的句柄,但我无法弄清楚所需的参数,我得到了 ERROR_INVALID_PARAMETER
尝试读取时。
我知道操作系统会认为驱动器/它的文件系统已损坏(因为它不会有)但这没关系,我只需要一种存储原始数据的方法。
感谢任何帮助,谢谢!
最佳答案
您的方法存在问题,Windows 总是询问是否应格式化驱动器。并且很可能有一天问题会以错误的方式回答;)
但是您可以打开一个卷,如果您知道正确的名称,windows 内部使用它。您可以获得 Sysinternals WinObj
,它可以显示所有名称。对于驱动器,Windows 还会创建符号链接(symbolic link),如 \\.\C:
以通过驱动器号访问它们。确保代码中的反斜杠已正确转义(通常是 "\\\\.\\C:"
)并且冒号后没有尾部斜杠。
但我想向您指出 CreateFile
的文档,尤其是备注部分 ( https://learn.microsoft.com/en-us/windows/desktop/api/FileAPI/nf-fileapi-createfilea#remarks ):
也许您错过了以下几点之一:
The following requirements must be met for such a call to succeed:
- The caller must have administrative privileges. For more information, see Running with Special Privileges.
- The dwCreationDisposition parameter must have the OPEN_EXISTING flag.
- When opening a volume or floppy disk, the dwShareMode parameter must have the FILE_SHARE_WRITE flag.
正如 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 中的引用读/写数据 block 必须扇区对齐。
所以为了安全起见,首先确定扇区大小(例如使用 GetDiskFreeSpace
)
关于c - 如何在 Windows 上使用 C 将原始数据读写到 USB 驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56544306/
我是一名优秀的程序员,十分优秀!