Как я могу читать и записывать необработанные данные на USB-накопитель с помощью C на Windows - PullRequest
1 голос
/ 11 июня 2019

Поэтому я создал собственную схему шифрования и пришел к мысли, что у меня может быть USB-накопитель с необработанными данными (вообще без файловой системы), который я могу использовать в качестве «ключа» в моей схеме шифрования.

Мне нужен способ чтения и записи данных прямо на USB, я пытался использовать libusb , но я не мог понять это (слишком низкий уровень для меня).

Я также видел, что есть способ открыть дескриптор USB-накопителя с помощью функции CreateFile в Windows, но я не смог определить необходимые параметры, и при попытке чтения я получил ERROR_INVALID_PARAMETER.

Я понимаю, что ОС будет думать, что диск / его файловая система повреждены (поскольку у нее ее нет), но это не имеет значения, мне просто нужен способ хранения необработанных данных.

Любая помощь приветствуется, спасибо!

1 Ответ

3 голосов
/ 11 июня 2019

Проблема вашего подхода в том, что 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.

Как указал Эриксун: для диска, который сам сообщает о том, что он съемный, административные привилегии не требуются.

Пример для открытияUSB-накопитель с буквой «D»;

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 thБлоки чтения / записи данных должны быть выровнены по секторам.
Таким образом, для безопасности сначала определите размер сектора (например, с помощью GetDiskFreeSpace)

...