我正在尝试编译检测清单,以便构建基于清单的 Windows 事件日志provider。我希望编译后的
manifest.h
文件包含 ProviderGuid
符号,因为示例 here 有此符号。
我的
manifest.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<instrumentationManifest xmlns="http://schemas.microsoft.com/win/2004/08/events"
xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<instrumentation>
<events>
<provider name="MySampleProvider"
guid="{e585d1ba-488c-4adc-b752-f360e410d365}"
symbol="MyProvider"
resourceFileName="%SystemRoot%\\System32\\MySampleProvider.dll"
messageFileName="%SystemRoot%\\System32\\MySampleProvider.dll">
<events>
<event symbol="EVENT_MY_EVENT" value="1"
version="0" level="win:Informational"
template="MyEventTemplate"
message="$(string.MyEvent.Message)"/>
</events>
<templates>
<template tid="MyEventTemplate">
<data name="Message" inType="win:UnicodeString" outType="xs:string"/>
</template>
</templates>
<keywords>
<keyword name="MyKeyword" mask="0x1"/>
</keywords>
<tasks>
<task name="MyTask" eventGUID="{642836ec-9270-4b16-aacb-b971bcf357ae}" value="1"/>
</tasks>
<opcodes>
<opcode name="MyOpcode" value="10"/>
</opcodes>
<levels>
<level name="MyLevel" value="16" symbol="Informational"/>
</levels>
<channels>
<channel name="MyChannel" chid="MySampleProvider/Operational" type="Operational" enabled="true"/>
</channels>
</provider>
</events>
</instrumentation>
<localization>
<resources culture="en-US">
<stringTable>
<string id="MyEvent.Message" value="This is a sample event message."/>
</stringTable>
</resources>
</localization>
</instrumentationManifest>
我用
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\mc.exe" -h . -r . manifest.xml
编译这个文件。当我运行此命令时,控制台中没有显示任何错误或警告。
编译后,我搜索了生成的
manifest.h
文件,但该文件任何地方都不包含ProviderGuid
。
这是预期的吗?我是否误解了here的示例的用途?
我找到了解决办法。我需要将
symbol="MyProvider"
对象中的 provider
更改为 symbol="ProviderGuid"
,然后重新编译。然后ProviderGuid
出现在manifest.h
文件中。
当我注意到文档说时我意识到了这一点
该示例引用了为基于清单的提供程序发布事件架构中定义的事件。
ProviderGuid
作为示例中的符号名称manifest.xml
。
工作
manifest.xml
:
<?xml version="1.0" encoding="utf-8"?>
<instrumentationManifest xmlns="http://schemas.microsoft.com/win/2004/08/events"
xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<instrumentation>
<events>
<provider name="MySampleProvider"
guid="{e585d1ba-488c-4adc-b752-f360e410d365}"
symbol="ProviderGuid"
resourceFileName="%SystemRoot%\\System32\\MySampleProvider.dll"
messageFileName="%SystemRoot%\\System32\\MySampleProvider.dll">
<events>
<event symbol="EVENT_MY_EVENT" value="1"
version="0" level="win:Informational"
template="MyEventTemplate"
message="$(string.MyEvent.Message)"/>
</events>
<templates>
<template tid="MyEventTemplate">
<data name="Message" inType="win:UnicodeString" outType="xs:string"/>
</template>
</templates>
<keywords>
<keyword name="MyKeyword" mask="0x1"/>
</keywords>
<tasks>
<task name="MyTask" eventGUID="{642836ec-9270-4b16-aacb-b971bcf357ae}" value="1"/>
</tasks>
<opcodes>
<opcode name="MyOpcode" value="10"/>
</opcodes>
<levels>
<level name="MyLevel" value="16" symbol="Informational"/>
</levels>
<channels>
<channel name="MyChannel" chid="MySampleProvider/Operational" type="Operational" enabled="true"/>
</channels>
</provider>
</events>
</instrumentation>
<localization>
<resources culture="en-US">
<stringTable>
<string id="MyEvent.Message" value="This is a sample event message."/>
</stringTable>
</resources>
</localization>
</instrumentationManifest>