《Windows内核编程》---同步事件

同步对象:

内核中的事件是一个数据结构,这个结构的指针可以当作一个参数传入一个等待函数中。如果这个事件不被“设置”,则这个等待函数不会返回,这个线程被阻塞;如果这个事件被“设置”,则等待结束,线程可以继续执行。

如果一个线程需要等待另一个线程完成某事之后才能做某事,则可以使用事件等待。这个数据结构就是KEVENT,这个结构总是用KeInitializeEvent初始化:

VOID KeInitializeEvent(

IN PRKEVENT Event,

IN EVENT_TYPE Type,

IN BOOLEAN State

);

参数Event是要初始化的事件;Type是事件类型;参数State是初始化状态,一般设置为FALSE,也就是未设置状态,这样等待线程需要等待。注意,事件不需要销毁。

设置事件使用函数KeSetEvent

LONG KeSetEvent(

IN PRKEVENT Event,       //要设置的事件

IN KPRIORITY Increment,      //用于提升优先权,可设为0

IN BOOLEAN Wait //表示函数后面是否紧接着一个KeWaitSingleObject来等待这个事件,

//一般设置为TRUE(事件初始化后,一般就要开始等待了)

);

 

使用事件的简单代码如下:

//等待一个事件

KEVENT event;

//事件初始化

KeInitializeEvent(&event, SynchronizationEvent, TRUE);

--

//事件初始化之后就可以使用了,在一个函数中,我们可以等待某个事件

//如果这个事件没有被人设置,那就会阻塞在这里继续等待

KeWaitForSingleObject(&event, Executive, KernelMode, 0, 0);

-..

 

//在另一个函数或其他地方,设置了这个事件。而一旦设置了这个事件

//前面等待的地方就会开始继续执行

KeSetEvent(&event);

上面代码中KeInitializeEvent中使用了SynchronizationEvent,导致这个事件成为所谓的“自动重设”事件。一个事件如果被设置,那么所有KeWaitForSingleObject等待这个事件的地方都会通过。如果要继续重复使用这个事件,必须重设这个事件。当KeInitializeEvent第二个参数设置为NotificationEvent时,这个事件必须要手动重设才能使用。手动重设使用函数:

LONG KeResetEvent(

IN PRKEVENT Event

);

上面代码中的事件初始化为SynchronizationEvent事件,因此只有一个线程的KeWaitForSingleObject可以通过,通过之后被自动重设,其他的线程只能继续等待,这就是一个同步事件

不能起到同步作用的是通知事件(NotificationEvent),注意,不能用手工设置通知事件的方式来取代同步事件,Dont be stupid, ok?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows内核对象是系统提供给用户模式下代码与内核模式下代码进行交互的基本接口。它们是一种管理资源的机制,用于在操作系统内部进行进程间通信、同步线程、共享数据等操作。 Windows内核对象可以通过使用Process Explorer来查看其创建情况,并且可以使用对象句柄继承来实现进程边界共享内核对象。此外,lsobj工具可以使用NtQueryDirectoryObject()函数来列出Windows内核对象名称空间中的所有可见对象。它最初具有与WinObj相同的功能,可以在无头服务器和服务器孤岛上运行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Windows核心编程(三)内核对象](https://blog.csdn.net/jzz5072/article/details/112848284)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [lsobj:列出Windows内核对象名称空间(命令行WinObj)中的所有可见对象](https://download.csdn.net/download/weixin_42117082/18786082)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值