Как я могу читать и записывать необработанные данные на USB-накопитель, используя C в Windows

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

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

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

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

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


person Community    schedule 11.06.2019    source источник
comment
пожалуйста, покажите свой код, где вы пытаетесь открыть том.   -  person vlad_tepesch    schedule 11.06.2019


Ответы (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.

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

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

person vlad_tepesch    schedule 11.06.2019
comment
В этом случае область действия ограничена съемным диском. По умолчанию, начиная с Vista, локальные интерактивные пользователи (т. е. пользовательские токены, содержащие SID S-1-5-4) имеют доступ для чтения и записи к съемным запоминающим устройствам (см. ACL и стек устройств). Это можно заблокировать с помощью групповой политики доступа к съемным носителям. Обратите внимание, что запрет на чтение, запись или выполнение для интерактивных пользователей будет распространяться и на интерактивных администраторов. Только неинтерактивные пользователи (например, сервисы) не будут затронуты. - person Eryk Sun; 11.06.2019
comment
Кроме того, мы можем получить доступ к тому через классическую точку монтирования с буквой диска, например. //./Е:. Нам не нужно использовать имя внутреннего тома. Тому будет присвоена буква диска, даже если он не имеет распознанной файловой системы. Графический интерфейс также может автоматизировать список с помощью FindFirstVolumeW и т. д. Без распознанной файловой системы том монтируется с помощью «файловой системы» RAW, которая просто обеспечивает низкоуровневый доступ для чтения и записи, фактически просто перенаправляя эти запросы на базовое дисковое устройство. - person Eryk Sun; 11.06.2019
comment
@eryksun спасибо, я учел ваши замечания и изменил свой ответ - person vlad_tepesch; 12.06.2019
comment
Спасибо, похоже, что все это время моя проблема заключалась в том, что длина используемого мной буфера не была выровнена по секторам. - person ; 13.06.2019