Как завершить диск Live File System (LiveUDF) с помощью DeviceIoControl и FSCTL_MAKE_MEDIA_COMPATIBLE в C#?
Я пытаюсь финализировать оптический диск Live File System (или "Live UDF") в C#. Из того, что я понял из чтения статей MSDN и TechNet вместе с различными публикациями на форуме, API Мастеринга изображений (или IMAPI) не поддерживает этот тип файловой системы, и в моих усилиях по написанию кода мне не удалось завершить создание диска LiveUDF с использованием IMAPI. В результате я использую функцию DeviceIoControl, используя управляющий код FSCTL_MAKE_MEDIA_COMPATIBLE.
Во-первых, я синхронно вызывал DeviceIoControl, но функция возвращала 1117, и диск в конечном итоге становился завершенным через несколько минут. Этот результат неприемлем, так как мне нужно, чтобы процесс вернулся только после окончательного провала или фактического успеха.
Затем я перешел к асинхронному вызову DeviceIoControl, открыв дескриптор устройства с помощью CreateFile с флагом FILE_FLAG_OVERLAPPED (0x40000000) dwFlagsAndAttributes и передав объект NativeOverlapped в вызов DeviceIoControl. До этого, очевидно, я настраивал IOCompletionCallback для обработки любых перекрывающихся событий.
При асинхронном вызове DeviceIoControl, как описано, он по-прежнему возвращает 1117 почти сразу (как при синхронном вызове), метод IOCompletionCallback никогда не вызывается, и диск становится завершенным через несколько минут.
Мой вопрос: как мне завершить создание оптического диска Live File System (или "Live UDF") в C# на платформе Windows 7, используя C# и DeviceIoControl (синхронно или асинхронно, с возможностью "ждать" завершения процесса) чтобы захватить конечный результат успеха или неудачи)?
Большое спасибо заранее.
2 ответа
Вызов DeviceIoControl с передачей управляющего кода IOCTL_SCSI_PASS_THROUGH_DIRECT и структуры SCSI_PASS_THROUGH_DIRECT, определенной с помощью команды MultiMedia SCSI Close Track/Session (MMC), предоставил способ завершить Live UDF-диск и вернуть функцию DeviceIoControl после окончательного сбоя или сбоя.
Я собрал их вместе, прочитав предложения Технического комитета INCITS T10 по командам SCSI MultiMedia и проект по адресу http://sourceforge.net/projects/bwgburn/.
По сути, это сводилось к простой отправке команд SCSI на устройство (которые определены в предложениях Комитета).
Недавно я столкнулся с той же проблемой и обнаружил, что.ForceMediaToBeClosed из IMAPI2.MsftDiscFormat2Data может использоваться для финализации CD после завершения записи. Это мой код (в 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)