阴沟里翻船之KeSetEvent

windows内核编程基础篇之使用同步事件 内核中的事件是一个数据结构,这个结构的指针可以当作一个参数传入一个等待函数中。若这个事件不被“设置”,则这个等待函数不会返回。这个线程被阻塞,若这个事件被“设置”,则等待结束,可以继续下去。        这个常常用于多线程之间的同步,若一个线程需要等待另外一个线程完成某事后才能做某事,则可以使用事件等待,另一个线程完成后设置事件即可。        该数据结构是KEVENT, 器被  K 阅读详情

阴沟里翻船之KeSetEvent

KeSetEvent是个使用频率很高的内核支持函数,但经常使用未必意味着确实了解它。上周就曾遇到一件怪事,系统线程在调用KeSetEvent后线程IRQL竟然从PASSIVE_LEVEL提升至DISPATCH_LEVEL,以至后续的操作出错:Bug Check 0xA: IRQL_NOT_LESS_OR_EQUAL。

先看看它的函数声明:

LONG 
KeSetEvent( 
    IN PRKEVENT Event, 
    IN KPRIORITY Increment, 
    IN BOOLEAN Wait 
);

比较简单,一共只有3个参数:

  • Event: 准备被激活的事件
  • Increment: 预备给被唤醒线程临时提升线程优先级的增量。一般情况下均为0,但针对不同的子系统及对响应快慢的不同要求,会有不同的取值。如网络相关:IO_NETWORK_INCREMENT=2;键盘、鼠标涉及用户界面交互部分:取值为6 (IO_KEYBOARD_INCREMENT, IO_MOUSE_INCREMENT);声音相关,IO_SOUND_INCREMENT=8
  • Wait: 这个参数名字起的太不妥贴,非常容易误导。我就曾以为将此参数设为TRUE表示KeSetEvent将等待睡眠在此Event上的线程被唤醒,直到KeWaitForXXXObject返回。现在看来这种自以为是的默认是全然没有根据的。先看DDK中怎么说这个参数吧:

    Specifies whether the call to KeSetEvent is to be followed immediately by a call to one of the KeWaitXxx routines. If TRUE, the KeSetEvent call must be followed by a call to KeWaitForMultipleObjects, KeWaitForMutexObject, or KeWaitForSingleObject.

    由此来看,此参数就是为了避免不必要的锁开销及可能的线程调度开销。你可能会认为,调用者先调用KeSetEvent(Event, 0, TRUE),然后直接跟上了KeWaitForXXXObject(Event …),那岂不是多此一举?控制权本就在自己手中,何必再搞个假放权真夺权的无用功呢?再说即便是有用功,也有点任人唯亲或肥水不流外人田的嫌疑吧?

    但反过来想想,如果KeSetEvent和KeWaitForXXXObject所操作的Event对象不是同一个的话,那所有的疑惑便都得到解答了:放的是权A,要夺的则是权B ,但无论如何,作为特权一层,还是可以享受些优待的,至少进入权B争夺之门时不用再去排队了。至于什么时间能得到权B,那是调度器说了才算的,你或许不由得去想,若去公关调度器话,那后门该如何走呢?!

    至此,就Wait参数的使用上,应该不会再有”To be or not to be, that’s a question”的疑惑了吧?

说了这么多,但对KeSetEvent为什么会导致IRQL的提升还没有解答,但其实答案已经明了:KeSetEvent执行时首先会调用KiLockDispatcherDatabase()来提升IRQL以阻止调度器的调度,在Wait = TRUE的情况下,返回时KeSetEvent会保持着高IRQL,而降低IRQL的工作将由后续的KeWaitForXXXObject来做。考虑到两个函数所操作的Event对象并不一定是同一个,所以二者都要通线程结构(KTHREAD)来进行通讯。

最后再说说返回值吧,DDK中是这样说的:If the previous state of the event object was signaled, a nonzero value is returned. 这句话说得还要让你玩“我猜猜”,其隐含的意思就是说如果此Event先前没有被激活,则返回0值。所以,简言之,KeSetEvent的返回值就是此Event先前的状态:Signaled or Not Signaled !

转自:http://blog.dynox.cn/?p=837

串口监视过滤驱动及应用系统开发.pdf 立即下载

相关推荐

XGBoost详解(原理篇)

XGBoost全称为eXtreme Gradient Boosting,即极致梯度提升树。XGBoost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器(个体学习器间存在强依赖关系,必须串行生成的序列化方法)。Note:关于Boosting算法详见博文集成学习详解_tt丫的博客-优快云博客XGBoost是一种提升树模型,即它将许多树模型集成在一起,形成一个很强的分类器。其中所用到的树模型则是CART回归树模型。

tt丫的博客 7万+

Windows驱动 - 事件

0x00 函数 KeWaitForSingleObject将当前线程置于等待状态,直到给定的Dispatcher对象被设置为一个信号状态,或者(可选)直到等待超时。 PsCreateSystemThread 创建一个以内核模式执行并返回线程句柄的系统线程。 PsTerminateSystemThread 终止当前系统线程。 ZwClose关闭一个对象句柄。 KeInitializeEvent 将事件对象初始化为同步(单个侍者)或通知类型事件,并将其设置为已发出信号或未发出信号的状态。 KeS..

qq726232111的博客 859

虎符+红明谷+ctfshow渔人杯赛后复现

目录标题虎符CTFWeb-签到MISC-你会日志分析吗红明谷CTFWeb-write_shellMISC-我的心是冰冰的ctfshow渔人杯签到抽奖感受下气氛神仙姐姐阿拉丁迷飘啊飘简单二维码我跟你拼了 虎符CTF Web-签到 参考详细分析PHP源代码后门事件及其供应链安全启示 根据文章提示,添加恶意请求头 User-Agentt: zerodiumphpinfo(); 可以看到phpinfo内容 继续构造,查看根目录下的文件 User-Agentt: zerodiumsystem('ls /');

Atkx's Blog 1982

《Windows内核编程》---系统线程和同步事件

系统线程:在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是:NTSTATUS PsCreateSystemThread(OUT PHANDLE ThreadHandle,IN ULONG DesiredAccess,IN POBJECT_ATTRIBUTES objectAttributes OPTIONAL,IN HANDLE ProcessHandle OPTIONAL,OUT PCLIENT_ID ClientId OPTIONAL,IN PKSTART

ASCE1885 4738

VOLTE信令流程-IMS注册篇(五)

目录 VOLTE信令流程-IMS 注册 VOLTE信令流程-IMS 注册/注销 VOLTE信令流程-VoLTE呼叫流程 VoLTE-VoLTE VoLTE-CS CS-VoLTE CS-CS VOLTE信令流程 VOLTE信令流程-VOLTE-VOLTE信令 VOLTE信令流程-INVITE详细信息 VOLTE信令流程-eSRVCC信令流程 VOLTE信令流程-IP短信 VOLTE信令流程-IMS 注册 IMS注册流程简述  获取鉴权向量 IMS用户将注...

gender123的博客 2万+

使用 Java + PaddleOCR 实现表格识别,支持导出 HTML 和 Excel(附源码)

使用Java+PaddleOCR快速搭建表格识别系统,无需处理底层模型细节。系统支持表格结构识别和内容识别,可将图片转换为可编辑表格格式。文章提供了完整的实现流程,包括Maven依赖引入、模型下载(包含检测、识别、分类和表格结构模型)及参数配置说明。SmartJavaAI支持多种高性能模型选择,适用于不同应用场景,帮助开发者快速实现表格识别功能。

deng775747758的博客 1473

Windows驱动,一次死机教训

原创博客,来自:http://blog.youkuaiyun.com/u010147522/article/details/74068534 问题的症状是莫名死机,中断产生后,可能第一百次,可能第两百多次。 但只要你实验的足够久,注定某一次就死机了,完全卡死,没有蓝屏信息,就是电脑卡死。怀疑了分页内存的问题,当然,中断处理函数不能够指定放在分页内存中。因为可能会导致蓝屏,并且还有可能导致驱动安装过后需要重启电

Fezl的博客 922

FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译

FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译 什么是Firmament? Firmament (FMT) 是一款基于模型设计 (Model-Based-Design, MBD) 的开源自驾仪,可被用来快速构建无人机,无人车,无人船,机器人等平台的控制系统。 系统主要由两部分构成. FMT-Firmware: 一个基于C/C++开发的稳定、高性能的嵌入式系统. FMT-Model: 一个基于MATLAB/Simulink开发的仿真框架以及算法库. 昨天得知FMT开源飞控项目已经开

weixin_45786595的博客 2869

【转】阴沟里翻船之KeSetEvent

原帖:阴沟里翻船之KeSetEvent KeSetEvent是个使用频率很高的内核支持函数,但经常使用未必意味着确实了解它。上周就曾遇到一件怪事,系统线程在调用KeSetEvent后线程IRQL竟然从PASSIVE_LEVEL提升至DISPATCH_LEVEL,以至后续的操作出错:Bug Check 0xA: IRQL_NOT_LESS_OR_EQUAL。 先看看它的函数声明: ...

365

AutoSAR系列讲解 - 前言

博主xyfx是一名汽车行业的嵌入式软件工程师,本职工作是同步电机的驱动控制(主要做FOC的,这个大家要是有兴趣,以后可以单独开一个专栏来讲解一下),由于做控制器的时候需要用到AutoSAR,所以特意的去学习了相关知识,同时博主自己也在同步提高中,有写的不合理的地方也请大家指正。我准备对AutoSAR开设两个大的方面来讲解,一是AutoSAR的入门篇,二是AutoSAR的实践篇,分别讲述AutoSAR的理论基础和工具的使用。

雪云飞星的博客 4万+

python中使用squarify包可视化treemap图:为treemap图添加标题并自定义标题的字体大小、自定义设置treemap中标签字体的大小、添加数值数值标签、自定义设置边框的色彩

python中使用squarify包可视化treemap图:treemap将分层数据显示为一组嵌套矩形自定义设置每一个数据格的颜色、添加数值数值标签、自定义设置边框的色彩、自定义设置边框线条的粗细、为treemap图添加标题并自定义标题的字体大小、自定义设置treemap中标签字体的大小

data+scenario+science+insight 1061

KeSetEvent函数分析之第三个参数Wait设置为True还是False和KiLockDispatcherDatabase函数有关

KeSetEvent函数分析之第三个参数Wait设置为True还是False和KiLockDispatcherDatabase函数有关

linux-0.11调试教程 995

【Go语言实战】(2) Gin+Vue 电子商城

618来!!不用纠结去哪里剁手了!直接自己安排一个商场不香吗??

面向生活编程 4827

应用层和驱动层的同步与异步的处理逻辑及底层实现

应用层的实现: 1ReadFile、WriteFile、DeviceIoControl等,这些都有两种操作方式,一种是同步,一种是异步。 操作设备的Win32API主要是这3个函数ReadFile、WriteFile、DeviceIoControl 以DeviceIOControl为例,它的同步&异步操作如下: 同步操作时,它的内部会创建一个IRP_MJ_DEV

程序员人生 3023

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

驱动开发笔记1—内核中的事件、进程、线程、自旋锁

内核模式下的等待 KeWaitForSingleObject() 和 KeWaitForMultipleObjects() NTSTATUS KeWaitForSingleObject( IN PVOID Object, //同步对象的指针 IN KWAIT_REASON WaitReason, //等待的原因,一般为Executive IN KPROCESSOR_MODE WaitMode, //等待模式,说明是在用户模式还是在内核模式下等待,一般为KernelMode IN B

qq_42814021的博客 914

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

KeSetEvent在linux如何实现

KeSetEvent在Linux下没有对应的实现,因为它是Windows内核中的函数。在Linux内核中,可以使用信号量、条件变量或者管道来实现类似的功能。

weixin_42599908的博客 170

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WDF pci驱动开发的若干总结

最近在调试一套windows下的PCIE板卡驱动,采用的是WDF的驱动框架,驱动实现了阻塞式的读操作、写操作和IOCTL等三类操作,在实际的应用过程中,遇到了如下问题: 1、驱动加载后,PCI分配的IO和Mem对应地址内的内容完全变成了0xFF,无法进行驱动的配置; 2、应用程序中,开启两个任务分别进行设备的读和写的操作,发现写的任务也会进行阻塞,必须等到read返回之后才能调度,导致没法并行处理。 针对第一个问题,同样的程序在win xp上可以正常运行,win7 32和64位的版本均不能运行,.

lixiaojun216的专栏 1242

Window XP驱动开发(二十二) 驱动程序的同步处理

转载请标明是引用于 http://blog.youkuaiyun.com/chenyujing1234  欢迎大家拍砖!    参考书籍:> 1、中断请求级 在Windows的时候,设计者将中断请求分别划分为软件中断和硬件中断,并将这些中断都映射成不同级别的中断请求级(IRQL)。 同步处理机制很大程序上依赖于中断请求级,本节对中断请求级做介绍。 1、1 中断请求(IRQ)与可编程中断控制器(P

chenyujing1234的专栏 7887

windows驱动开发-内核调度(一)

内核调度-事件详解

王马的博客 1142

WaitForSingleObject惹的祸

        前几天, 师弟的程序遇到了一个问题: 在窗口线程里可以改变ProcessCtrl控件的状态, 但把这段代码放在线程里就无法改变ProcessCtrl控件的状态, 其实是线程执行到这段代码,一直停在这里,不往下执行.    差不多花了我一个下午的时间,才找出了原因. 原来是WaitForSingleObject惹的祸.在窗口线程里创建一个工作线程, 就直接用WaitForSingle

riag的专栏 3336

驱动程序使用 EVENT 主动和应用程序通信

背景 用户层程序使用 DeviceIoControl 将 IOCTL 控制码、输入缓冲区、输出缓冲区传入到内核;内核响应 IRP_MJ_DEVICE_CONTRL 消息,并从 IRP 中获取传入的 IOCTL 控制码、输入缓冲区、输出缓冲区,以此实现数据的交互。 但是,当内核层想主动传递数据到用户层,用户层又怎样才能知道呢?因为只有用户层知道内核层有数据输出的时候,它才会调用 DeviceIoControl 函数去获取数据。所以,本文要介绍的就是基于事件 EVENT 实现的同步框架,可以解决这个的问题。 函

LYSM 2793

驱动程序与驱动程序交互事件对象

最近看张帆的《windows驱动技术开发详解》,看了一些东西通过写一些Demo来加深理解,这里把自己学习的东西和写的Demo记录下来,如有不妥,还请批评指正。 8.5.5 驱动程序与驱动程序交互事件对象 当我们在Ring0与Ring0交互的时候,类似于Ring0A与RingB各自的派遣函数要同步则我们要在这两者之间进行交互事件对象。 这里的关键是,A与B的事件对象的问题,即如何让A获得B的事...

weixin_34195142的博客 350
上一篇: 关于DO_POWER_INRUSH 和DO_POWER_INRUSH 同时设置问题
下一篇: (精华)Ring3与Ring0通信方法若干
vbsourcecode
博客等级 码龄17年 19粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值