如何判断Windows内核事件对象是自动重置还是手动重置?

如何判断Windows内核事件对象是自动重置还是手动重置?,第1张

概述如何判断Windows内核事件对象是自动重置还是手动重置?

windows允许创build(命名) 事件对象 。

一个事件(windows中的同步原语)可以是自动重置types(在这种情况下,你可以说它是一种信号量 ),或者它可以是手动重置types,在这种情况下,它保持设置,直到有人重置它。

现在,从CreateEvent , OpenEvent , SetEvent等文档看来,一旦创build事件,似乎无法确定是自动重置还是重置。

我处于这种情况,一个进程创build一个命名的事件,第二个进程将不得不对这个事件进行 *** 作(它通过名字,然后打开事件并最终发出信号)。 由于事件应该始终是一个手动重置事件的整个事情是有道理的,我希望在第二个过程中添加一个检查,以确保它是一个手动重置事件。 有没有办法检查这个?

setEvent被调用,没有resetEvent

(是的,在我的情况下更好,因为如果任何代码会创build一个自动重置事件,然后将其传递给这个进程,它将会是一个错误,但是错误会发生,我可以检测到他们)

没有记录的方法来做到这一点,但如果你冒险进入无证的土地其实并不难。 (为了您的目的,这应该没问题,因为它不会真的影响您的程序功能。)

你需要做的第一件事是弄清楚给你的句柄是不是一个事件。 你用这个NtqueryObject。 该功能记录在这里: http : //msdn.microsoft.com/en-us/library/bb432383(v=vs.85).aspx 。 它附带了本地API的通常要求,它可能会在没有通知的情况下消失或更改。 部分例子:

#include <winternl.h> typedef NTSTATUS (NTAPI * PFN_NtqueryObject)( HANDLE Handle,OBJECT_informatION_CLASS ObjectinformationClass,PVOID Objectinformation,ulONG ObjectinformationLength,PulONG ReturnLength ); HMODulE ntdll = GetmoduleeHandle( L"ntdll.dll" ); auto NtqueryObject = (PFN_NtqueryObject)GetProcAddress( ntdll,"NtqueryObject" ); NTSTATUS result = NtqueryObject( eventHandle,ObjectTypeinformation,buffer,length,&length );

这会给你一个PUBliC_OBJECT_TYPE_informatION结构。 如果对象实际上是一个事件,Typename字段将是“事件”。

接下来,调用NtqueryEvent来获取事件的类型。 所有这些完全没有记录。

typedef enum _EVENT_informatION_CLASS { EventBasicinformation } EVENT_informatION_CLASS,*PEVENT_informatION_CLASS; typedef enum _EVENT_TYPE { NotificationEvent,SynchronizationEvent } EVENT_TYPE,*PEVENT_TYPE; typedef struct _EVENT_BASIC_informatION { EVENT_TYPE EventType; LONG EventState; } EVENT_BASIC_informatION,*PEVENT_BASIC_informatION; typedef NTSTATUS (NTAPI * PFN_NtqueryEvent)( HANDLE EventHandle,EVENT_informatION_CLASS EventinformationClass,PVOID Eventinformation,ulONG EventinformationLength,PulONG ReturnLength ); auto NtqueryEvent = (PFN_NtqueryEvent)GetProcAddress( ntdll,"NtqueryEvent" ); EVENT_BASIC_informatION info; ulONG length = sizeof( info ); NTSTATUS result = NtqueryEvent( eventHandle,EventBasicinformation,&info,&length );

现在,只需检查信息中的EventType字段,就完成了。 “NotificationEvent”表示手动重置,“SynchronizationEvent”表示自动重置。

如果你想知道我是如何计算出第二部分的话,我没有。 信息来自这里: http : //undocumented.ntinternals.net/ 。 请使用负责任!

在初始WaitForSingleObject返回后立即调用WaitForSingleObject( handle,0 ) 。 如果返回值是WAIT_TIMEOUT那么你知道这是一个自动重置事件,如果它是WAIT_OBJECT_0将被返回,这是一个手动重置事件。

这依赖于两个调用之间的句柄,所以有一个潜在的竞争条件,它不会检测到自动重置事件,但它应该大部分时间工作。 因为这是一个很好的,希望这是足够的?

总结

以上是内存溢出为你收集整理的如何判断Windows内核事件对象是自动重置还是手动重置?全部内容,希望文章能够帮你解决如何判断Windows内核事件对象是自动重置还是手动重置?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1274122.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存