Драйвер устройства Windows: FSCTL_LOCK_VOLUME в необработанном разделе - доступ запрещен - PullRequest
1 голос
/ 22 января 2012

В настоящее время я пишу утилиту для Windows, которая выполняет ту же работу, что и Linux dd. Но эта утилита копирует только ИСПОЛЬЗУЕМЫЙ блок вместо клонирования всего блока диска за блоком.

Я пишу это так: * (1) Скопируйте MBR с диска A, который содержит три раздела, на диск B. (2) после шага А. Я вижу три raw раздела из графического интерфейса управления дисками. (без буквы диска, без файловой системы). (3) Скопируйте все разделы из А в В в цикле. *

Проблема, с которой я столкнулся: на шаге (3) после того, как я получаю дескриптор файла из OpenDevice и пытаюсь использовать этот дескриптор для блокировки необработанного раздела, я получаю Access Denied (ошибка 5), и я на 100% уверен, что моя программа случайно не удержала блокировку где-нибудь остальное. Моя среда разработки и тестирования - сервер Windows 2003, и моя утилита выполняется с правами администратора.

Вот фрагмент кода:

   ...
   shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
   fHandle= OpenDevice(shareMode); 
   res = DeviceIoControl(fHandle, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &dummy, NULL); 
    if (res == 0)
    {
         DismountAndLockVolume();
    }
    ...  

в моей используемой функции OpenDevice:

DWORD access = (fOpenMode==forWriting) ? (GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE) : GENERIC_READ| SYNCHRONIZE;

 NTOpen(&fHandle, fName.c_str(), access, FILE_ATTRIBUTE_NORMAL, shareMode,   FILE_OPEN,FILE_SYNCHRONOUS_IO_NONALERT|FILE_RANDOM_ACCESS|FILE_NON_DIRECTORY_FILE);

чтобы получить дескриптор файла (fHandle).

В функции DismountAndLockVolume я пытаюсь отключить этот том и снова захватить его.

DeviceIoControl(fHandle, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &dummy, NULL);

DWORD shareMode = FILE_SHARE_DELETE | FILE_SHARE_WRITE | FILE_SHARE_READ;

ntStatus = OpenDevice(shareMode);

res = DeviceIoControl(fHandle, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &dummy, NULL);

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

Затем я просмотрел Интернет и получил следующую ветку обсуждения: QUOTE

Запись на дескриптор тома будет успешной, если том не смонтирован файловая система, или если выполняется одно из следующих условий: 1. Секторы для записи являются загрузочными секторами. 2. Секторы, которые должны быть записаны для размещения вне пространства файловой системы. 3. Вы явно заблокировали или отключили том с помощью FSCTL_LOCK_VOLUME или FSCTL_DISMOUNT_VOLUME. 4 Том не имеет файловой системы. (Другими словами, он был установлен в формате RAW.)

Запись на дескриптор диска будет успешной, если одно из следующих условий правда: 1. Секторы, которые должны быть записаны, не попадают в пределы объема. 2. Секторы, которые нужно записать, попадают в подключенный том, но вы явно заблокировали или отключили том с помощью FSCTL_LOCK_VOLUME или FSCTL_DISMOUNT_VOLUME. 3. Секторы, которые должны быть записаны, попадают в объем, который не смонтирован или не имеет файловой системы.

Модификация некоторых частей диска, таких как загрузочный сектор (до 16), все еще разрешено Но моя утилита опирается на сырой доступ для записи на диск. я не удается заблокировать громкость с помощью FSCTL_LOCK_VOLUME. Результат ОТКЛОНЕН. В то время как при поиске в сети я узнаю, что драйвер режима ядра решение. Но в этой группе я узнаю, что водитель не требуется. я работаю на услуги и проходят через SCSI, но я не могу найти решение. Если Требуется ли драйвер режима ядра, то какой это драйвер?

Кто-нибудь знает решение проблемы, тогда, пожалуйста, помогите мне

Эта тема заканчивается без заключения. Может кто-нибудь помочь мне в том, что происходит? Любой намек на возможное решение?

Миллионы благодарностей. Я почесал свои волосы в течение нескольких дней: - (((.

...