这篇文章主要讲解了“如何通过Async反向与内核通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何通过Async反向与内核通信”吧!在开始学习Async反向通信之前先来研究一个Sync正向通信案例,不论是正向反向通信其在通信模式上与通过ReadFile与内核层通信
的通信模式基本一致,都是通过ReadFile
触发驱动中的IRP_MJ_READ
读取派遣,唯一的区别是在传输数据时使用了MmGetSystemAddressForMdl
方式,它将给定MDL
描述的物理页面映射到系统空间,并调用RtlCopyMemory()
将全局字符串复制到这个空间内,这样客户端就可以循环读取内核传出的数据。我们来看驱动端代码是如何实现的这个功能,代码并没有什么特殊的无法理解的点,只是需要注意我们在驱动入口调用IoCreateDevice()
时传入了第二个参数FILE_DEVICE_EXTENSION
,该参数的作用是,创建设备时,指定设备扩展内存的大小,传一个值进去,就会给设备分配一块非页面内存。对于应用层来说并没有什么特别的,同样调用ReadFile
读取内核中的参数,同样for循环读取五次,代码如下:这段代码运行效果如下:与同步模式不同,异步模式
虽然同样使用ReadFile
实现通信,但在通信中引入了Event
事件通知机制,这也是异步与同步最大的区别所在,用户层可以分别创建多个Event事件,等待内核依次做出相应并最终一并返回。首先驱动内定义了_DeviceExtension
自定义接口,该接口用于保存此次事件所对应的Irp
以及其所对应的DPC时间等。异步分发函数_AsyncReadDispatch
同样是被IRP_MJ_READ
派遣函数触发的,触发后其内部会首先IoGetCurrentIrpStackLocation
得到当前IRP的堆栈信息,然后设置IoMarkIrpPending()
并最终将该IRP通过InsertTailList()
插入到IRP链表内等待被处理。IoMarkIrpPending用于标记指定的IRP,标志着某个驱动的分发例程(分发函数)因需要被其他的驱动程序进一步处理最终返回STATUS_PENDING状态。函数_CustomDpc
则是定时器内部要执行的具体操作,在DriverEntry
驱动入口处做了如下初始化,初始化了链表,并初始化了一个定时器,最后启动这个定时器每隔1秒都会执行一次_CustomDpc
如果我们的IRP链表内IsListEmpty() 检测
存在数据,则会主动拷贝内存RtlCopyMemory
并推送到应用层。驱动层完成代码如下所示:驱动层说完了,接下来是应用层,对于应用层来说,需要使用CreateEvent
打开通知事件,或者叫做事件对象,然后当有通知时,则直接使用ReadFile
读取对应的缓冲区,当所有读取全部结束WaitForMultipleObjects免费云主机域名
等待结束即输出结果。这段代码最终运行效果如下:感谢各位的阅读,以上就是“如何通过Async反向与内核通信”的内容了,经过本文的学习后,相信大家对如何通过Async反向与内核通信这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!
这篇文章主要介绍了怎么用Python和Pygame绘制小球的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Python和Pygame绘制小球文章都会有所收获,下面我们一起来看看吧。1.在文件里找到设置2.在项目里找到pytho…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。