介绍三种应用程序对设备异步操作的方法

        应用程序对设备的操作就要是通过“ReadFile"、”WriteFile“和”DeviceIOControl“等Win32 API发起。这些Win32 API都支持同步和异步两种操作方式。从应用程序的调用来看,其主要差异是:1)调用CreateFile函数的时候,是否设置了它的第六个参数”dwFlagsAndAttributes“(设备属性)。同步操作设为NULL,异步操作设为FILE_FLAG_OVERLAPPED。2)调用实际操作请求函数时,如DeviceIoControl,是否设置了lpOverLapped参数。


一、同步操作和异步操作的原理

        以DeviceIoControl函数为例,它的同步操作如下图所示:


        

         当应用程序调用DeviceIoControl函数时,它的内部会创建一个IRP_MJ_DEVICE_CONTROL类型的IRP,并将这个IRP传递到驱动函数的派遣函数中。处理该IRP需要一段时间,直到该IRP处理完毕后(调用了IoCompleteRequest),DeviceIOControl函数才会返回。

        同步操作时,在DeviceIoControl的内部,会调用WaitForSingleObject函数去等待一个事件。这个事件直到IRP被结束时,才会被触发。如果通过反汇编IoCompleteRequest内核函数,就会发现在其内部设置了该事件。DeviceIoControl会暂时进入休眠状态,直到IRP被结束。

        在异步操作的情况下,当DeviceIoControl被调用时,其内部会产生IRP,并将该IRP传递给驱动程序内部的派遣函数。但此时DeviceIoControl函数不会等待该IRP结束,而是直接返回。当IRP经过一段时间被结束时,操作系统会触发一个IRP相关事件。这个事件可以通知应用程序IRP请求被执行完毕。

        Win32 API的异步操作必须得到驱动程序的支持,如果驱动程序不支持异步操作,Win32 API的异步操作将会失败。


二、自定义事件异步操作

        异步操作时,主要需要设置OVERLAP参数,Windows用数据结构”OVERLAPPED“来表示。摘要如下:

Contains information used in asynchronous (or overlapped) input and output (I/O).

Syntax

C++
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值