如何在 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
)
所以我制定了自己的加密方案,我想出了一个想法,我可以拥有一个带有原始数据(根本没有文件系统)的 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
)