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