Как финализировать диск Live File System (LiveUDF) с помощью DeviceIoControl и FSCTL_MAKE_MEDIA_COMPATIBLE в C#?

Я пытаюсь доработать оптический диск Live File System (или Live UDF) на С#. Из того, что я понял из статей MSDN и TechNet, а также различных сообщений на форумах, Image Mastering API (или IMAPI) не поддерживает этот тип файловой системы, и в моих усилиях по кодированию мне не удалось завершить работу над диском LiveUDF с использованием IMAPI. В результате я использую функцию DeviceIoControl с управляющим кодом FSCTL_MAKE_MEDIA_COMPATIBLE.

Во-первых, я вызывал DeviceIoControl синхронно, но функция возвращала 1117, и через несколько минут диск становился финализированным. Этот результат неприемлем, поскольку мне нужно, чтобы процесс возвращался только в случае окончательной неудачи или фактического успеха.

Затем я перешел к асинхронному вызову DeviceIoControl, открыв дескриптор устройства с помощью CreateFile с флагом FILE_FLAG_OVERLAPPED (0x40000000) dwFlagsAndAttributes и передав объект NativeOverlapped вызову DeviceIoControl. Перед этим, очевидно, я настроил IOCompletionCallback для обработки любых событий Overlapped.

При асинхронном вызове DeviceIoControl, как описано, он по-прежнему возвращает 1117 почти сразу (как и при синхронном вызове), метод IOCompletionCallback никогда не вызывается, и диск становится финализированным через несколько минут.

У меня вопрос: Как мне финализировать оптический диск Live File System (или Live UDF) в C# на платформе Windows 7, используя C# и DeviceIoControl (синхронно или асинхронно, с возможностью «ожидания» его процесс, который нужно завершить, чтобы зафиксировать окончательный результат успеха или неудачи)?

Большое спасибо заранее.


person kokoabim    schedule 21.08.2012    source источник


Ответы (2)


Вызов DeviceIoControl с передачей управляющего кода IOCTL_SCSI_PASS_THROUGH_DIRECT и структуры SCSI_PASS_THROUGH_DIRECT, определенной с помощью мультимедийной команды SCSI Close Track/Session ( MMC) предоставляет возможность финализировать Live UDF-диск и вернуть функцию DeviceIoControl в случае окончательного успеха или неудачи.

Я собрал это воедино, прочитав предложения Технического комитета INCITS T10 по командам SCSI MultiMedia и проект на http://sourceforge.net/projects/bwgburn/.

По сути, дело сводилось к отправке на устройство SCSI-команд (которые определены в предложениях Комитета).

person kokoabim    schedule 07.09.2012

Недавно я столкнулся с той же проблемой и обнаружил, что .ForceMediaToBeClosed из IMAPI2.MsftDiscFormat2Data можно использовать для финализации компакт-диска после завершения записи. Это мой код (в powershell):

$TargetFolder="c:\path\to\files\to\be\burned"
$DiskMaster = New-Object -com IMAPI2.MsftDiscMaster2
$DiscRecorder = New-Object -com IMAPI2.MsftDiscRecorder2
$id = $DiskMaster.Item(0) #specify drive index here
$DiscRecorder.InitializeDiscRecorder($id)               
$FileSystemImage = New-Object -com IMAPI2FS.MsftFileSystemImage
$dir = $FileSystemImage.Root
$DiscFormatData  = New-Object -com IMAPI2.MsftDiscFormat2Data
$DiscFormatData.Recorder = $DiscRecorder
$DiscFormatData.ClientName = 'cd label' #specify cd label here
$DiscFormatData.ForceMediaToBeClosed = $true   #to finalize cd after burn
$FileSystemImage.ChooseImageDefaults($DiscRecorder)                
$dir.AddTree($TargetFolder, $false)
$result = $FileSystemImage.CreateResultImage()
$stream = $result.ImageStream
$DiscFormatData.Write($stream)
person mti2935    schedule 21.01.2014