xuplus
驱动牛犊
驱动牛犊
  • 注册日期2008-04-10
  • 最后登录2010-06-11
  • 粉丝1
  • 关注0
  • 积分2分
  • 威望28点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:5178回复:2

应用层跟驱动异步通信的问题,irp该如何处理?

楼主#
更多 发布于:2008-09-18 10:02
我写了一个驱动,测试异步处理irp,然后写了一个应用层的测试程序,通过
DeviceIOControl与驱动通信。
我的问题:
1,我在应用层打开设备时,是否需要异步打开?即:
2,打开设备文件后,我通过发送自己定义的IOCTL码与驱动通信,驱动里面进行响应。
3,应用层将IO_TEST_PENDING发送到驱动后,驱动将此irp设置为pending 状态,按理讲我在应用层应该获取到ERROR_IO_PENDING错误码,但我却根本得不到!
我的本意是:采用异步方式通信,ioctol码发送出去后,DeviceIoControl可以立刻返回。
要想实现这种功能,我应该在驱动层和应用层怎么做呢?

请各位大侠帮帮小弟弟。
//这是应用层的代码
OVERLAPPED ov;
    DWORD dwReads = 0;
    BOOL bRes = FALSE;
    ZeroMemory(&ov, sizeof(ov));
    HANDLE dioevent = CreateEvent(NULL, FALSE, FALSE, NULL);
    ov.hEvent = dioevent;

    bRes = DeviceIoControl(hFile,
        IO_TEST_PENDING,
        NULL,
        0,
        NULL,
        0,
        &dwReads,
        &ov);
    
    if (!bRes)
    {
        //得到异步处理的条件
        if (ERROR_IO_PENDING == GetLastError())
        {
            AfxMessageBox("OK, Pending return...");
        }
        else
        {
            AfxMessageBox("failed!...");
        }
        
    }
    

//IOCtrolDispatch例程里面的代码
//获取irp状态
    pIrp->IoStatus.Information = 0;
    pIrp->IoStatus.Status = STATUS_SUCCESS;

    pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
    IoCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
        switch (IoCode)
    {
    case IO_TEST_PENDING:
        status = PsCreateSystemThread(&hthread, (ACCESS_MASK)0L, NULL, (HANDLE)0, NULL, ThreadPending, NULL);
        if (!NT_SUCCESS(status))
        {
            return status;
        }
        
        KdPrint(("Pending thread ok..."));

    //直接设置为pending 返回给应用层。
        status = STATUS_PENDING;
        IoMarkIrpPending(pIrp);
        pIrp->IoStatus.Status = status;
        return status;
        break;    
    }
    
    
    
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2008-09-18 16:49
DeviceIoControl

If hDevice was opened without specifying FILE_FLAG_OVERLAPPED, lpOverlapped is ignored.
xuplus
驱动牛犊
驱动牛犊
  • 注册日期2008-04-10
  • 最后登录2010-06-11
  • 粉丝1
  • 关注0
  • 积分2分
  • 威望28点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-09-19 10:26
基本搞定了。
多谢。
游客

返回顶部