dilsdgr8 Ответов: 1

Как предотвратить извлечение DVD программно


Мое приложение копирует файлы на DVD. Я хочу предотвратить извлечение DVD - диска во время этой копии.

Что я уже пробовал:

Использовать функции DeviceIoControl( hVolume,IOCTL_STORAGE_EJECTION_CONTROL,&ампер;PMRBuffer, оператор sizeof(PREVENT_MEDIA_REMOVAL),значение null, 0,&ампер;dwBytesReturned, нуль);

Блокировка работает нормально до тех пор, пока не будет скопирован первый файл. После копирования первого файла я могу извлечь DVD-диск. Я хочу, чтобы блокировка работала до тех пор, пока все файлы не будут скопированы

Является ли это ошибкой в API DeviceIoControl ()? Есть обходные пути?

1 Ответов

Рейтинг:
0

RDBurmon

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

однако это может помочь хорошо понять параметры функции

Call CreateFile with GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, and OPEN_EXISTING. The lpFileName parameter should be \.\X: (where X is the real drive letter). All other parameters can be zero.

Lock the volume by issuing the FSCTL_LOCK_VOLUME IOCTL via DeviceIoControl. If any other application or the system is using the volume, this IOCTL fails. Once this function returns successfully, the application is guaranteed that the volume is not used by anything else in the system.

Dismount the volume by issuing the FSCTL_DISMOUNT_VOLUME IOCTL. This causes the file system to remove all knowledge of the volume and to discard any internal information that it keeps regarding the volume.

Make sure the media can be removed by issuing the IOCTL_STORAGE_MEDIA_REMOVAL IOCTL. Set the PreventMediaRemoval member of the PREVENT_MEDIA_REMOVAL structure to FALSE before calling this IOCTL. This stops the device from preventing the removal of the media.

Eject the media with the IOCTL_STORAGE_EJECT_MEDIA IOCTL. If the device doesn't allow automatic ejection, then IOCTL_STORAGE_EJECT_MEDIA can be skipped and the user can be 
instructed to remove the media.

Close the volume handle obtained in the first step or issue the FSCTL_UNLOCK_VOLUME IOCTL. This allows the drive to be used by other processes.


надеюсь, что ваш синтаксис кода выглядит следующим образом -

bResult = DeviceIoControl(hDevice,                       // device to be queried
                            IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
                            NULL, 0,                       // no input buffer
                            pdg, sizeof(*pdg),            // output buffer
                            &junk,                         // # bytes returned
                            (LPOVERLAPPED) NULL);          // synchronous I/O\


dilsdgr8

Спасибо за ответ.
Моя реализация такая же, как и упомянутая. Диск заблокирован до тех пор, пока не будет скопирован первый файл. То есть перед началом копирования файлов диск блокируется и не может быть извлечен.
Предположим, мне нужно скопировать 3 файла.
Я заблокировал диск с помощью IOCTL_STORAGE_MEDIA_REMOVAL IOCTL
Попытался извлечь диск.. Не могу выкинуть дриов заблокирован.
Скопируйте первый файл.. Попытался извлечь диск,.. Диск выбрасывается

RDBurmon

Вы пытаетесь извлечь диск из кода или вручную?

dilsdgr8

я пытаюсь катапультироваться вручную.
Моя программа копирует файлы на диск.
Я хочу предотвратить извлечение носителей во время копирования файлов.
Но если я попытаюсь извлечь диск после копирования первого файла, блокировка будет потеряна.

По коду это как показано ниже:

1) блокировка извлечения диска с помощью DeviceIOControl() API IOCTL_STORAGE_EJECT_MEDIA IOCT
2) скопируйте первый файл
3) скопируйте второй файл.
..
4) разблокируйте диск с помощью IOCTL_STORAGE_EJECT_MEDIA IOCT

Но, к сожалению, я могу извлечь DVD-диск после копирования первого файла. Я хочу избежать этого.