如何在 windows 上使用 C 将原始数据读写到 USB 驱动器

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

所以我制定了自己的加密方案,我想出了一个想法,我可以拥有一个带有原始数据(根本没有文件系统)的 USB 驱动器,我可以将其用作我的 "key"加密方案。

我需要一种直接在 USB 中读取和写入数据的方法,我试过使用 libusb 但我无法弄明白(对我来说太低级了)。

我还看到有一种方法可以使用 windows 上的 CreateFile 函数打开 USB 驱动器的句柄,但我无法弄清楚所需的参数,我得到了 ERROR_INVALID_PARAMETER 尝试阅读时。

我知道 OS 会认为 drive/its 文件系统已损坏(因为它不会有)但没关系,我只需要一种存储方式原始数据。

感谢任何帮助,谢谢!

您的方法存在问题,windows 总是询问是否应格式化驱动器。并且很可能有一天问题会以错误的方式回答 ;)

但是您可以打开一个卷,如果您知道 windows 内部使用的正确名称。您可以获得 Sysinternals WinObj,它可以显示所有名称。对于驱动器 Windows 还会创建符号链接,如 \.\C: 以通过驱动器号访问它们。确保代码中的反斜杠被正确转义(通常是 "\\.\C:")并且冒号后没有尾部斜杠。

但我想向您指出 CreateFile 的文档,尤其是备注部分 (https://docs.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-Drive 的示例;

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);
}

另请注意,根据 中的引用,read/written 数据块必须扇区对齐。
所以为了安全起见,首先确定扇区大小(例如 GetDiskFreeSpace