1

我正在尝试用 C# 完成 Live File System(或“Live UDF”)光盘。根据我阅读 MSDN 和 TechNet 文章以及各种论坛帖子的了解,Image Mastering API(或 IMAPI)不支持这种类型的文件系统,并且在我的编码工作中,我未能成功使用 IMAPI 完成 LiveUDF 光盘。因此,我使用了 FSCTL_MAKE_MEDIA_COMPATIBLE 控制代码的 DeviceIoControl 函数。

首先,我正在同步调用 DeviceIoControl,但该函数将返回 1117,并且磁盘最终会在几分钟后完成。这种结果是不可接受的,因为我需要该过程仅在最终失败或实际成功时返回。

接下来,我通过使用带有 FILE_FLAG_OVERLAPPED (0x40000000) dwFlagsAndAttributes 标志的 CreateFile 打开设备句柄并将 NativeOverlapped 对象传递给 DeviceIoControl 调用,继续异步调用 DeviceIoControl。在此之前,很明显,我设置了一个 IOCompletionCallback 来处理任何重叠事件。

如上所述异步调用 DeviceIoControl 时,它仍然几乎立即返回 1117(就像同步调用时一样),永远不会调用 IOCompletionCallback 方法,并且磁盘会在几分钟后完成。

我的问题是:如何在 Windows 7 平台上使用 C# 和 DeviceIoControl(同步或异步,能够“等待”其进程完成)完成 C# 中的 Live File System(或“Live UDF”)光盘捕捉最终的成功或失败结果)?

非常感谢提前。

4

2 回答 2

1

调用DeviceIoControl传递IOCTL_SCSI_PASS_THROUGH_DIRECT控制代码和使用Close Track/Session SCSI 多媒体命令 (MMC)定义的SCSI_PASS_THROUGH_DIRECT结构提供了一种方法来完成 Live UDF 光盘并在最终成功或失败时返回DeviceIoControl函数。

我在阅读INCITS T10 技术委员会关于 SCSI 多媒体命令的提案和http://sourceforge.net/projects/bwgburn/上的一个项目时将其拼凑在一起。

基本上,它归结为只是向设备发送 SCSI 命令(在委员会的提案中定义)。

于 2012-09-07T20:09:38.420 回答
0

我最近遇到了同样的问题,发现 IMAPI2.MsftDiscFormat2Data 的 .ForceMediaToBeClosed 可用于在刻录完成后完成 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)
于 2014-01-21T16:02:06.150 回答