У меня есть приложение, которое использует собственные плагины. У меня есть собственный двоичный формат для этих плагинов. Каждый подключаемый модуль загружается во время выполнения с использованием метода, аналогичного сопоставлению DLL с пространством процесса. Это означает, что каждый плагин имеет свой собственный ImageBase
, такие разделы, как .text
или .data
, обрабатываются так же, как и обычные библиотеки DLL. Единственное, что отличается, это двоичный формат плагина (это не файл PE
) и код загрузчика, который сопоставляет плагин с пространством процесса.
Теперь я знаю, что ETW при выполнении трассировки с помощью этой командной строки:
xperf -on latency -stackwalk profile -buffersize 1024 -minbuffers 300 -start tracea1 -on Microsoft-Windows-Win32k:::'stack'
будут генерировать события, которые можно использовать для восстановления среды процесса во время захвата трассировки. То есть он будет генерировать такие события, как «добавить процесс», «добавить поток в процесс», «добавить модуль DLL в процесс», чтобы такие инструменты, как xperfview
, могли построить виртуальную среду состояния процессов в системе и построить информация, такая как текущее дерево процессов. Эти события, например, События ImageLoad, которые предоставляют информацию о каждой библиотеке DLL, загружаемой до или во время трассировки.
Конечно, для моих плагинов эти события ImageLoad
не генерируются, потому что технически они не являются DLL (то есть не загружаются теми же функциями, что и DLL, хотя их функция такая же). Вот почему такие инструменты, как xperfview
, не знают о своем существовании в пространстве процесса.
Что я хотел бы сделать, так это написать свои собственные EventWrites в моем коде загрузчика плагинов и генерировать эти события ImageLoad
с необходимой информацией, чтобы xperfview
и подобные инструменты могли интерпретировать мои плагины как обычные библиотеки DLL. Я бы заполнил необходимую информацию, такую как ImageBase
, ProcessId
, ImageSize
и т. д.
Для этого я понимаю, что мне нужно зарегистрировать провайдера события MSNT_SystemTrace
, который является владельцем ImageLoad
событий, построить событие с такой структурой:
<Data Name="ImageBase">0x7FEFDBD0000</Data>
<Data Name="ImageSize">0x12D000</Data>
<Data Name="ProcessId"> 548</Data>
...
<Data Name="Reserved0"> 0</Data>
<Data Name="DefaultBase">0x7FEFDBD0000</Data>
и излучать событие.
Проблема в том, что я получаю ERROR_ACCESS_DENIED
при попытке зарегистрировать еще один MSNT_SystemTrace
, что логично, так как этот провайдер уже существует.
Но это заставляет меня задать вопрос, а поддерживается ли ETW тем, что я пытаюсь сделать?