如何打开特定驱动程序的ETW/WPP?

问题描述:

喜欢在主题中,我想知道如何“打开”特定的Windows驱动程序的ETW或WPP。 让我们以一个vdrvroot.sys为例。当我们拆开这个驱动程序,我们在的DriverEntry夫妇函数的开头看到来电:如何打开特定驱动程序的ETW/WPP?

McGenEventRegister(); 
WppLoadTracingSupport() 
WppInitKm() 

其打开跟踪功能。 对于ETW在McGenEventRegister我看到下面的供应商注册:

result = EtwRegister(
    &VDRVROOT_PROVIDER_ID, 
    McGenControlCallbackV2, 
    &VDRVROOT_PROVIDER_ID_Context, 
    &Microsoft_Windows_VDRVROOTHandle); 

其中VDRVROOT_PROVIDER_ID等于900448e4-b685-DD11-ad8b-0800200c9a66。 我试图登录最终原木做:

tracelog.exe -start MyTrace -guid #900448e4-b685-dd11-ad8b-0800200c9a66 
(...) //some actions here 
tracelog.exe -start MyTrace 

,并通过TraceView查看日志文件。没有任何东西被抓到,但是在这个驱动程序中,EtwWrite只在一个地方被调用,我可能没有用我的动作触发它。 问题是我是否可以打开提到的跟踪机制而不反转驱动程序;)?

我不确定你会得到什么你显示的GUID。我将E4480490-85B6-11DD-AD8B-0800200C9A66视为VDRVROOT_PROVIDER_ID的GUID。我不确定900448E4 GUID的用途。还要注意,TraceView只会显示WPP事件(通过TraceMessage或TraceMessageVa编写),而不是基于清单的ETW事件。另请注意,WPP事件需要访问PDB或TMF文件 - 否则TraceView将无法解码它们。 (只要在系统上注册了正确的清单,您就能够自动解码基于清单的事件。)

您可以尝试使用tracerpt解码ETL文件,因为它支持更多类型的ETW事件编码。

总的来说,ETW并没有提供一个很好的方式来说“如何从特定的驱动程序获取事件”。您可以使用tracelog来列出系统中所有活动提供程序的所有活动GUID,并且可以使用tracelog列出所有已注册的清单,但没有办法说“哪些提供程序已被此特定激活DLL”。一个DLL可能会激活多个提供程序GUID(可能是一个用于基于清单的事件,另一个用于基于WPP的事件),或者许多DLL都共享相同的清单,因此它们都使用相同的提供程序GUID。即使驱动程序拥有正确的GUID,但如果驱动程序仅使用WPP(这很常见),则无法访问TMF或PDB文件就无法对事件进行解码。

+0

谢谢你的回答。 我只会添加你可以使用 逻辑查询提供者获得可用提供者列表 – user3305379