如何在Windows上使用C读取原始数据并将其写入USB驱动器

时间:2019-06-11 12:57:51

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

因此,我制定了自己的加密方案,然后想到了一个USB驱动器,可以将原始数据(根本没有文件系统)用作加密方案中的“密钥”。 / p>

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

我还发现有一种方法可以在Windows上使用CreateFile函数打开USB驱动器的句柄,但是我无法弄清所需的参数,因此尝试获取ERROR_INVALID_PARAMETER时阅读。

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

任何帮助表示感谢,谢谢!

1 个答案:

答案 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