0

我一直未能找到任何可靠的方法来检测 CD/DVD 刻录过程何时开始。刻录工具将只是文件资源管理器。

我知道有一个事件日志“IMAPI CD-Burning COM 服务服务已成功发送启动控制”。

这样做的问题是,即使从未发生过烧伤,也会触发此(以及相应的停止)。似乎 WMP 之类的某些东西会在您初始化时触发该事件(单击刻录选项卡)。

我需要的是一种方法(wmi、imapi 等),它会在刻录过程实际开始时通知我。

不幸的是,我不知道足够多的 powershell 甚至不知道从哪里开始寻找。在这一点上,我只是在黑暗中疯狂地搜索,希望有人做了一些与我想要的足够接近的事情,但还没有找到任何东西。

谢谢,

4

2 回答 2

0

谢谢您的帮助。自从询问以来,我发现至少在 Windows 7 中,但可能在其他版本的 Windows 中,就在 CD 驱动器进行写入之前,它会在 CD 驱动器上进行独占锁定。这在 MSFT 上的 IMAPI 参考 dox 中进行了讨论。这实际上是由几乎每个刻录应用程序完成的,而不仅仅是文件资源管理器,以防止多个事情弄乱写入过程。

cdrom 会向系统发送一个 id 代码为 133 的事件,可以对其进行监视以检测何时开始刻录。此事件似乎仅在刻录开始时生成,而不是由 OP 中讨论的其他事件生成。

下面的代码片段将附加一个事件监听器,当事件出现时它会做出反应。

我不太了解powershell或windows,所以如果有人对这个例子有更好的建议,我欢迎提出建议 ,但这似乎是有用的。

$WMI = @{
    Query = "select * from __InstanceCreationEvent 
        where TargetInstance isa 'Win32_NtLogEvent' 
        and TargetInstance.logfile = 'System' 
        and TargetInstance.SourceName = 'cdrom' 
        and TargetInstance.EventCode = '133'"
    Action = {
    write-host "CD Burn started"
    }
}
$Null = Register-WMIEvent @WMI
于 2016-03-16T08:32:07.867 回答
0

您可以监控写操作的状态,但只能在您自己的应用程序中:使用事件监控进度

几个接口让您实现一个事件处理程序来接收进度信息。例如,可以将事件对象附加到数据写入器以接收写入操作的状态。

但是,没有预烧操作

没有钩子或回调来预处理其他人正在刻录的数据

我唯一能想到的监控 IMAPI 系统范围的方法是挂钩 DLL 调用:

是否可以使用 MadChook 挂钩 COM 接口方法?实际上我想要做的是挂钩 IMAPI 接口 (IDiscMaster) 用于刻录 CD。我想为该接口挂钩方法 RecordNow。现在这个接口是通过 imapi.exe 实现的,并且资源管理器使用代理“Actxprxy.dll”对这个 mentod 进行进程外调用

通过挂钩 CoCreateInstance 并包装 IDiscMaster 的所有方法,我已经解决了这个问题,但是当资源管理器多次调用 Cocreateinstance 时,我最终对我的挂钩产生了很多不必要的影响。

我正在编写一个简单的程序来监视 Windows 资源管理器中的 CD 刻录。我在 XP 和 IDiscFormat2Data::Write 中连接了 IDiscMaster::RecordDisc,它工作正常。但是,如果我将 CD 刻录为实时文件系统,则不会对其进行监视。

  1. 我应该挂钩哪个功能?
  2. 我连接了 ICDBurn::Burn(这个函数与 ICDBurn 的 vft 有 0x10 偏移)。每当我弹出菜单单击时,资源管理器都会失败并且窗口会关闭它。错误代码是 STATUS_STACK_BUFFER_OVERRUN。

但这很容易出错,并且需要一些特定的技能。

于 2016-03-15T13:38:11.463 回答