当前位置: 首页 > 编程日记 > 正文

WMI技术介绍和应用——Event Consumer Provider

在《WMI技术介绍和应用——Event Provider》和《WMI技术介绍和应用——接收事件》中,我们展现了如何处理和事件相关的WMI知识。而《WMI技术介绍和应用——接收事件》一文则主要讲解了如何查询事件,这种查询是在我们进程存在时发生的,一旦我们进程不存在了,这种查询也无法执行。我们将这种行为称为消费事件,我们执行查询的进程叫做“事件临时消费者”。相对应的,WMI还存在“事件永久消费者”,它并不寄生我们的编写的进程中。本文主要讲解“事件永久消费者”的编写方法。(转载请指明出于breaksoftware的csdn博客)

由于VS2005没有这种模板,所以我便使用事件提供者模板生成了一个工程,并对这个工程进行改造。我们先从mof文件出发

由于我们不需要注册事件提供者,所以我们删除instance of __EventProviderRegistration内容。

我们先要声明一个事件消费类

class TestEventConsumer : __EventConsumer 
{[key] string name;[write] string value;
};

实例化该类

instance of TestEventConsumer as $Consumer
{name = "TestEventConsumer_Name1";value = "TestEventConsumer_Value";
};

再注册一个事件消费者提供者实例

instance of __EventConsumerProviderRegistration
{Provider = $EventConsumer;ConsumerClassNames = {"TestEventConsumer"};
};

ConsumerClassNames是一个数组,它记录了事件消费者名。

然后要实例化一个筛选器

instance of __EventFilter as $Filter
{Name = "TestEventFilter";QueryLanguage = "WQL";Query = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_USBCOntrollerDevice'";EventNamespace = "\\\\.\\root\\CIMV2";
};

其中定义了筛选器的名字、查询的语言、查询的命令和需要查询的命名空间。如果没有指定EventNamespace,则使用该mof中默认的命名空间。在本例中,我们要监控USB设备的创建,故要监控CIMV2空间。这儿需要注意的是,我们可以Query内部事件或者外部事件。

最后我们将筛选器绑定到消费者上。

instance of __FilterToConsumerBinding
{Consumer = $Consumer;Filter = $Filter;
};

如此,我们便将mof文件构建好了。

我们再回到cpp文件中,我们首先要定义一个事件消费者Sink

class CEventConsumerSink:public CComObjectRootEx<CComMultiThreadModel>,public IWbemUnboundObjectSink 
{ 
public:CEventConsumerSink() {}~CEventConsumerSink(){}BEGIN_COM_MAP(CEventConsumerSink) COM_INTERFACE_ENTRY(IWbemUnboundObjectSink) END_COM_MAP() // IWbemUnboundObjectSink 
public: STDMETHOD(IndicateToConsumer)(IWbemClassObject* pLogicalConsumer, long lNumObjects, IWbemClassObject** apObjects);
};

我们要实现IndicateToConsumer方法,将事件传到到该方法中处理

STDMETHODIMP CEventConsumerSink::IndicateToConsumer(IWbemClassObject* pLogicalConsumer, long lNumObjects, IWbemClassObject** apObjects)
{ObjectLock lock(this); HRESULT hr = WBEM_S_NO_ERROR; CComVariant varClass; hr = pLogicalConsumer->Get(CComBSTR("__CLASS"), 0, &varClass, 0, 0);if (0 == _wcsicmp(V_BSTR(&varClass), L"TestEventConsumer")) {for (long lIndex = 0; lIndex < lNumObjects; lIndex++) {CComVariant varEventType;hr = apObjects[lIndex]->Get(CComBSTR("TargetInstance"), 0, &varEventType, 0, 0);CComQIPtr<IWbemClassObject> spEvent = V_UNKNOWN(&varEventType);CComVariant varEventTypeClass;hr = spEvent->Get(CComBSTR("__CLASS"), 0, &varEventTypeClass, 0, 0);OutputTrace("CEventConsumerSink::IndicateToConsumer");    }  }else {hr = WBEM_E_NOT_FOUND;}return hr; 
}

这段逻辑,我们获取事件名称,并检测其是否是我们需要监控的事件。如果是,则遍历事件数组——发来的事件是一批的。

然后我们改造主类。事件消费者提供者不需要继承IWbemInstProviderImpl,但是要继承IWbemEventConsumerProvider。于是我们在模板生成的代码中将其他无关的方法去掉

class ATL_NO_VTABLE CEventConsumer : public CComObjectRootEx<CComMultiThreadModel>,public CComCoClass<CEventConsumer, &CLSID_EventConsumer>,public IWbemProviderInit,public IWbemEventConsumerProvider
{    public:CEventConsumer(){                  }~CEventConsumer(){}DECLARE_REGISTRY_RESOURCEID(IDR_EVENTCONSUMER)DECLARE_NOT_AGGREGATABLE(CEventConsumer)BEGIN_COM_MAP(CEventConsumer)COM_INTERFACE_ENTRY(IWbemProviderInit)COM_INTERFACE_ENTRY(IWbemEventConsumerProvider)END_COM_MAP()//IWbemProviderInitHRESULT STDMETHODCALLTYPE Initialize( __in_opt LPWSTR pszUser,LONG lFlags,__in LPWSTR pszNamespace,__in_opt LPWSTR pszLocale,IWbemServices *pNamespace,IWbemContext *pCtx,IWbemProviderInitSink *pInitSink);// IWbemEventConsumerProviderHRESULT STDMETHODCALLTYPE FindConsumer( /* [in] */ IWbemClassObject *pLogicalConsumer,/* [out] */ IWbemUnboundObjectSink **ppConsumer);};

Initialize中删除模板生成的多余代码就可以了,我们主要要实现的就是FindConsumer方法

STDMETHODIMP CEventConsumer::FindConsumer( /* [in] */ IWbemClassObject *pLogicalConsumer,/* [out] */ IWbemUnboundObjectSink **ppConsumer)
{HRESULT hr = WBEM_E_NOT_FOUND;*ppConsumer = NULL;CComVariant varClass;hr = pLogicalConsumer->Get(L"__Class", 0, &varClass, 0, 0);if (0 == _wcsicmp(V_BSTR(&varClass), L"TestEventConsumer")) {CComObject<CEventConsumerSink>* pEventSink = NULL;hr = CComObject<CEventConsumerSink>::CreateInstance(&pEventSink);if (FAILED(hr)) {return hr;}hr = pEventSink->QueryInterface(IID_IWbemUnboundObjectSink, (LPVOID*)ppConsumer);if (FAILED(hr)) {return hr;}}else {hr = WBEM_E_NOT_FOUND;}return hr;
}

这段逻辑我们在检测完消费者类是否正确后,就去获取消费者指针。

如此Event Consumer Provider便搭建起来了。

相关文章:

shell练习四

2019独角兽企业重金招聘Python工程师标准>>> 模拟linnux登录shell #!/bin/bash echo -n "login:" read name echo -n "passwd:" read passwdif [ $name"aaa" -a passwd"aaa" ]; thenecho "the host and passwd is rig…

WMI技术介绍和应用——总结(完)

断断续续的&#xff0c;历经三年将WMI这个主题给写完了。记得最开始时接触该技术&#xff0c;是因为传统获取CPU序列号的方法总是出错。于是接触了这种已经很老的技术。本着打破砂锅问到底的想法&#xff0c;我决定稍微研究一下&#xff0c;结果越来越深。正好借着年前这点时间…

2020年,大火的Python和JavaScript是否会被取而代之?

作者 | Richard Kenneth Eng 译者 | 明明如月&#xff0c;编辑 | 郭芮 来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; Python 和 JavaScript 是目前最火的两大编程语言。然而&#xff0c;他们不可能永远屹立不倒。最终&#xff0c;必将像其他编程语言一样跌下神坛…

WaveSwipeRefreshLayout

WaveSwipeRefreshLayout 介绍&#xff1a; 水滴效果的下拉刷新&#xff0c;效果非常不错。 http://itlanbao.com/code/20150815/10000/100423.html 运行效果&#xff1a; 相关代码 android Gallery 图片滚动 BalloonPerformerCountryRankDelightfulMenuDrawableFancyBackground…

Google Test(GTest)使用方法和源码解析——概况

GTest是很多开源工程的测试框架。虽然介绍它的博文非常多&#xff0c;但是我觉得可以深入到源码层来解析它的实现原理以及使用方法。这样我们不仅可以在开源工程中学习到实用知识&#xff0c;还能学习到一些思想和技巧。我觉得有时候思想和技巧是更重要的。&#xff08;转载请指…

Reddit票选 | 2019年绝对不能错过的机器学习论文

来源 | reddit.com编辑 | 神经星星 神经小兮技术顾问 | 姜汉&#xff08;openbayes.com&#xff09;来源 | HyperAI超神经&#xff08;ID:HyperAI&#xff09;【导读】回顾 2019 年&#xff0c;人工智能领域时有大事发生&#xff0c;吸引着各界人士的关注。这一年&#xff0c;也…

ASP中的常用服务器检测源码

在写ASP网页时常用的检测代码:服务器现在时间: 引用<% now %>服务器CPU型号: 引用<%Request.ServerVariables("HTTP_UA_CPU")%>当前分辨率: 引用<% Request.ServerVariables("HTTP_UA_PIXELS")%>可显示颜色:[qoute]<%Request.ServerV…

选IDC房时,用脚本截取丢失包和rtt的值作比对

由于业务增长&#xff0c;需要选一个IDC房托管接入。网络质量要求比较高。在IDC给出测试机时&#xff0c;利用smokping来测试&#xff0c;是测出去的包。由于我们在各个地区都有接入机。再从这些接入机去测IDC网络质量&#xff0c;比对指标&#xff1a;丢失的包和rtt返回时延。…

Google Test(GTest)使用方法和源码解析——自动调度机制分析

在《Google Test(GTest)使用方法和源码解析——概况 》一文中&#xff0c;我们简单介绍了下GTest的使用和特性。从这篇博文开始&#xff0c;我们将深入代码&#xff0c;研究这些特性的实现。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 测试用例的自动保存…

D3D中简单的截图方法 (转)

【ZT】D3D中简单的截图方法 试了下&#xff0c;果然可以。在渲染完所有东东后&#xff08;Present之前&#xff09; 获得BackBuffer表面 然后用D3DX的函数保存 voidScreenShot (char*filename) { IDirect3DSurface9 *tmp NULL; IDirect3DSurface9 *back NULL; //生成固定…

2019年,自动化机器学习AutoML技术还火吗? | BDTC 2019

整理 | 王银出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 【导读】12 月 5-7 日&#xff0c;由中国计算机学会主办&#xff0c;CCF 大数据专家委员会承办&#xff0c;CSDN、中科天玑协办的中国大数据技术大会&#xff08;BDTC 2019&#xff09;在北京长城饭店隆重…

第一次使用51cto博客

阿梅第一次使用51cto博客&#xff0c;以后将学习中的总结写到这里来。加油。转载于:https://blog.51cto.com/hopit/1690465

Google Test(GTest)使用方法和源码解析——结果统计机制分析

在分析源码之前&#xff0c;我们先看一个例子。以《Google Test(GTest)使用方法和源码解析——概况 》一文中最后一个实例代码为基准&#xff0c;修改最后一个“局部测试”结果为错误。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; class ListTest : publi…

贾扬清感谢信:阿里开源10年,致敬千万开源人

整理 | 夕颜【导读】2019 年 10 月&#xff0c;有人曾根据 www.gharchive.org 的数据整理出一份 2019 年GitHub 开源贡献排行榜&#xff0c;获取 GitHub 2019 年的 PushEvent&#xff0c;通过分析 GitHub 用户提交记录中的邮件地址&#xff0c;分辨其所属组织。从这份榜单上可…

热烈庆祝我国神七发射成功!

热烈庆祝我国神七发射成功&#xff01;

云计算设计模式(十)——守门员模式

云计算设计模式&#xff08;十&#xff09;——守门员模式 通过使用充当客户端和应用程序或服务之间的代理&#xff0c;验证和进行消毒的请求&#xff0c;并将它们之间的请求和数据的专用主机实例保护的应用程序和服务。这可以提供一个额外的安全层&#xff0c;并限制了系统的攻…

“不会Linux,怎么干程序员?”骨灰级工程师:干啥都不行!

说起优秀程序员的必备技能&#xff0c;我想大家都可以说很多&#xff0c;比如&#xff1a;数据结构、算法、数学、编程语言等等。但是&#xff0c;你可能会忽略了每一个程序员都应该掌握的技能&#xff1a;Linux。想一想&#xff0c;我们日常学习、求职、工作场景的中&#xff…

Google Test(GTest)使用方法和源码解析——Listener技术分析和应用

在《Google Test(GTest)使用方法和源码解析——结果统计机制分析》文中&#xff0c;我么分析了GTest如何对测试结果进行统计的。本文我们将解析其结果输出所使用到的Listener机制。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 解析 源码中&#xff0c;我们…

SSH连接不上Linux的解决方法

SSH连接不上Linux的解决方法: 连续弄了几次&#xff0c;今天早上终于把SSH连接虚拟机连接不通的问题解决了。 先简单说下概要&#xff1a; 主机装的是XP系统&#xff0c;虚拟机用的是red hat Linux。 我用的是nat连接方式是虚拟机内也能上网。 主机是用的校园内寝室共享上网。 …

熬夜翻译完的PureFTPd配置文件

[url]http://www.chinaunix.net[/url] 作者:jeffwu 发表于&#xff1a;2006-07-08 10:31:58 干了个通宵&#xff0c;一边玩一边把配置文件翻译完了&#xff0c;翻得不好的地方还请各位多多提点&#xff0c;少许不是很明白的地方就留在那了。 鼓励转贴&#xff0c;分发&#xf…

挑战NLP、量子计算难题,300多支本科生队伍同场角逐,2020 ASC超算竞赛一触即发...

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;ASC世界大学生超级计算机竞赛&#xff08;ASCStudent Supercomputer Challenge&#xff09;是由中国发起的世界最大规模的大学生超算竞赛&#xff0c;与美国SC、德国ISC并称全球三大超算竞赛&#xff0c;也是目前全球最…

Google Test(GTest)使用方法和源码解析——断言的使用方法和解析

在之前博文的基础上&#xff0c;我们将介绍部分断言的使用&#xff0c;同时穿插一些源码。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 断言&#xff08;Assertions&#xff09; 断言是GTest局部测试中最简单的使用方法&#xff0c;我们之前博文中举得例子…

精品软件 推荐 硬盘物理序列号修改专家

硬盘物理序列号修改专家不是市面上那些简单修改硬盘驱动器的序列号的东西&#xff0c;而是修改硬盘厂商在烧制时刻录在硬盘盒上的&#xff0c;即&#xff08;硬盘物理序列号&#xff09;&#xff0c;大约20位字母数字的组合1、可以解决部分软件封用户电脑&#xff0c;导致这台电…

知识图谱实体链接是什么?一份“由浅入深”的综述

作者 | 尼古拉瓦砾来源 | Paperweekly&#xff08;ID:paperweekly&#xff09;【导读】这个世界充斥着无数的结构化数据&#xff08;wiki&#xff09;和非结构化数据&#xff08;web&#xff09;&#xff0c;然而&#xff0c;如何将两者有效地集成仍然是个非常困难的问题。本文…

Google Test(GTest)使用方法和源码解析——预处理技术分析和应用

预处理 在《Google Test(GTest)使用方法和源码解析——概况》最后一部分&#xff0c;我们介绍了GTest的预处理特性。现在我们就详细介绍该特性的使用和相关源码。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 测试特例级别预处理 Test Fixtures是建立一个固…

出色管理者的时间管理

出色管理者的时间管理不少管理者都有这样的感慨&#xff1a;“忙了一天&#xff0c;也不知道忙了什么&#xff0c;时间还不够用。”其实&#xff0c;只要有效地运用时间&#xff0c;就可以提高工作效率&#xff0c;在相同的时间里做更多的事&#xff0c;而且做得更好&#xff0…

精品软件 推荐 瑞星 杀毒软件 安全软件

一句话评价一下这软件&#xff1a; 功能好&#xff0c;速度一般。功能&#xff1a;设置中心&#xff1a;最后&#xff0c; 下载地址请到官方下载吧。转载于:https://blog.51cto.com/hangtc/1690981

Google Test(GTest)使用方法和源码解析——自定义输出技术的分析和应用

在介绍自定义输出机制之前&#xff0c;我们先了解下AssertResult类型函数。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 在函数中使用AssertionResult AssertionResult只有两种类型&#xff1a; AssertionSuccess()AssertionFailure()要么成功&#xff0…

五年循环期限已到,我们又要步入“AI寒冬”了吗?

作者 | Sam Shead译者 | Kolen编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 【导读】过去的十年对人工智能来说是一个重要的十年&#xff0c;但该领域的研究人员认为该行业即将进入一个新的阶段。 过去几年里&#xff0c;人工智能这项技术的…

相知用心.相爱用情

人如花 一生匆匆而过 不要等到你凋落的时候才去眷恋天空&#xff0c;眷恋蝴蝶爱情是短暂的&#xff0c;但却是美丽的该追求的就去追求吧不要留给自己遗憾&#xff0c;不要让自己美丽的花朵枯萎 人生就象一列急驰的火车 机遇和缘分会让许多素昧平生的乘客在旅途中相遇、相识、相…