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