Событие Powershell, когда запись компакт-диска начинается из проводника

Мне не удалось найти какой-либо надежный способ определить, когда начинается процесс записи CD/DVD. Инструмент записи будет только проводником файлов.

Я знаю, что есть журнал событий "Службе COM-записи CD-диска IMAPI успешно отправлен элемент управления запуском".

Проблема в том, что это (и соответствующая остановка) будет срабатывать, даже если ожог не произошел. Кажется, что некоторые вещи, такие как WMP, будут вызывать это событие при инициализации (нажмите на вкладку записи).

Что мне нужно, так это метод (wmi, imapi, что угодно), который будет информировать меня в любое время, когда процесс записи действительно начинается.

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

Спасибо,

2 ответа

Вы можете отслеживать состояние операции записи, но только в своем собственном приложении: Мониторинг хода выполнения с помощью событий

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

Тем не менее, не существует действия Pre-Burn:

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

Единственное, что я мог придумать для мониторинга IMAPI в масштабе всей системы, это перехватывать вызовы DLL:

Можно ли подключить метод интерфейса COM с помощью MadChook? На самом деле я хочу подключить интерфейс IMAPI (IDiscMaster) для записи компакт-дисков. Я хочу подключить метод RecordNow для этого интерфейса. Теперь этот интерфейс реализован с помощью imapi.exe, а проводник выполняет внеконкурсный вызов этого метода с использованием прокси-сервера Actxprxy.dll.

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

Я пишу простую программу, которая отслеживает запись компакт-дисков в проводнике Windows. Я подключил IDiscMaster::RecordDisc в XP и IDiscFormat2Data::Write, и он отлично работает. Но если я записываю CD как живую файловую систему, он не контролируется.

  1. Какую функцию я должен подключить?
  2. Я подключил ICDBurn::Burn (эта функция имеет смещение 0x10 от vft ICDBurn). Всякий раз, когда я щелкаю во всплывающем меню, проводник не работает, и Windows закрывает его. Код ошибки: STATUS_STACK_BUFFER_OVERRUN.

Но это подвержено ошибкам и требует определенных навыков.

Спасибо за помощь. С тех пор, как я спросил, я обнаружил, что, по крайней мере, в Windows 7, но, возможно, в других версиях Windows, монопольную блокировку дисковода компакт-дисков выполняют непосредственно перед записью. Это обсуждается в справочном документообороте IMAPI на MSFT. Это на самом деле делается практически всеми приложениями для записи, а не только файловым обозревателем, чтобы не допустить путаницы в процессе записи.

Событие отправляется в систему с идентификатором 133 с помощью cdrom, который можно отслеживать, чтобы определить момент начала записи. Это событие создается только тогда, когда начинается прожиг, а не другими вещами, подобными тем, которые обсуждались в ОП.

Следующий фрагмент кода прикрепит прослушиватель событий, и когда событие обнаружится, он среагирует.

Я не очень хорошо знаю 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
Другие вопросы по тегам