Использование CreateFile для доступа к разделу диска

У меня есть права администратора, и у меня нет проблем с получением правильного дескриптора и, в конечном итоге, чтения всего жесткого диска с помощью:

IntPtr handle = CreateFile(@"\\.\PHYSICALDRIVE1", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

Я также могу получить действительный дескриптор, когда я пытаюсь открыть каталог этого диска:

IntPtr handle = CreateFile(@"\\.\Z:\\", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

Но я не могу получить правильный дескриптор, когда пытаюсь просто открыть раздел этого диска:

IntPtr handle = CreateFile(@"\\.\Z:", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

GetLastWin32Error возвращает отказано в доступе (5).

Конечно, если я отключу диск, то получуThe system cannot find the file specifiedMsgstr «Я перепробовал все, что мог придумать с разными разделами, разными вариантами и т. Д., Но ничего не доступно

1

Решение

Я нашел ответ сам. Позвольте мне исправить себя, указав, что CreateFile (@ «\. \ Z:» открывает том, не обязательно раздел. Однако я даже не смог открыть том.

Пока я не добавил FILE_SHARE_WRITE к параметрам следующим образом:

IntPtr handle = CreateFile (@ «\. \ Z:», GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

Это был ключ к получению правильной ручки. Это конечно не интуитивно понятно!

Почему это так, известно только Microsoft, я думаю.

1

Другие решения

Я хотел бы отметить, что документация CreateFile говорит следующее о FILE_SHARE_WRITE:

Позволяет последующим операциям открытия файла или устройства запрашивать доступ для записи.

В противном случае другие процессы не могут открыть файл или устройство, если они запрашивают доступ для записи.

Если этот флаг не указан, но файл или устройство были открыты для доступа на запись или имеет сопоставление файлов с доступом на запись, функция не работает.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector