驱动开发(13)IRP 的异步完成和 CancelRoutine

本文介绍了Windows驱动中IRP的异步完成和CancelRoutine的概念与实现。通过异步访问设备,理解了Dispatch Function如何处理IRP。详细讲解了如何在驱动中设置CancelRoutine来允许应用程序取消I/O请求,并提供了IRP异步完成和取消例程的代码示例。
摘要由CSDN通过智能技术生成

本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/51301922

在之前的博文中,我们对于IRP,都是同步完成的,但是 Windows 对异步操作很友好,我们来看看如何异步完成 IRP 。

在应用程序中异步访问设备

在开始之前,我认为有必要提一句异步访问设备。在之前的博文中,与驱动通信的代码都是采用同步访问设备的,其实所谓同步访问,是 Win32 子系统封装了“等待”这一过程。 Win32API 会在内部创建事件,并在向设备发送 I/O 请求后直接等待事件被完成,一旦驱动程序完成 I/O ,那么就会激活事件,从而使 Win32API 中的等待状态结束,线程恢复运行。(关于“事件”对象,见上一篇博文“内核中开启多线程和同步对象”)

其实,这个等待操作我们可以自己来做,就像这样:

#include "stdafx.h"
#include<Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    //如果 CreateFile 的第 6 个参数 dwFlagsAndAttributes 被指定为 FILE_FLAG_OVERLAPPED,
    HANDLE handle = CreateFile(TEXT("\\\\.\\D:\\1.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL, NULL);
    if (handle == INVALID_HANDLE_VALUE){
        MessageBoxA(0, "打开文件/设备失败", "错误", 0);
        return 0;
    }

    unsigned char buffer[50] = { 0 };
    OVERLAPPED over = { 0 };
    HANDLE Event = CreateEvent(NULL, FALSE, FALSE, NULL);
    over.hEvent = Event;

    ReadFile(handle, buffer, 49, NULL, &over);

    //Do somethings

    WaitForSingleObject(Event, INFINITE);
    for (int i = 0; i < sizeof(buffer); i++)
        printf("0x%X ", buffer[i]);
    CloseHandle(handle);
    getchar();
    return 0;
}

当然,还有一种方法异步访问设备,即使用ReadFileEx/WriteFileEx,这是通过APC来实现异步访问的,这里不展开了。

为什么要说异步访问设备呢,这是为了避免大家和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值