【问题标题】:How can I Read&Write raw data to a USB-Drive using C on windows如何在 Windows 上使用 C 读取和写入原始数据到 USB 驱动器
【发布时间】:2019-10-25 21:52:48
【问题描述】:

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

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

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

我知道操作系统会认为驱动器/它的文件系统已损坏(因为它不会有),但没关系,我只需要一种存储原始数据的方法。

任何帮助表示赞赏,谢谢!

【问题讨论】:

  • 请在您尝试打开该卷的位置显示您的代码。

标签: c windows usb usb-drive raw-data


【解决方案1】:

您的方法的问题是,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

【讨论】:

  • 在这种情况下,范围仅限于可移动磁盘。默认情况下,自 Vista 以来,本地交互式用户(即包含 SID S-1-5-4 的用户令牌)对可移动存储设备具有读写访问权限(请参阅ACLs and the Device Stack)。这可以通过“可移动存储访问”组策略锁定。请注意,拒绝交互式用户的读取、写入或执行访问权限将包括交互式管理员。只有非交互式用户(例如服务)不受影响。
  • 另外,我们可以通过经典的驱动器号挂载点访问卷,例如“//./E:”。我们不必使用内部卷名。即使没有可识别的文件系统,也会为该卷分配一个驱动器号。 GUI 还可以通过FindFirstVolumeW 等自动执行列表。如果没有可识别的文件系统,卷将由 RAW“文件系统”安装,它只提供低级读写访问,有效地将这些请求转发到底层磁盘设备。
  • @eryksun 谢谢你,我考虑到你的观点并改变了我的答案
  • 谢谢,我的问题似乎一直是我使用的缓冲区的长度不是扇区对齐的。
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多