fish9527
驱动牛犊
驱动牛犊
  • 注册日期2004-09-16
  • 最后登录2009-07-20
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望8点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1434回复:2

用DS得驱动程序与应用程序的通信(抛砖引玉)

楼主#
更多 发布于:2005-07-21 12:32
  用DS做了一个驱动,看到有人问这类问题,写一下经验,抛砖引玉了:)
首先要在你的设备类中增加一个KEvent类:KEvent  *m_pEvent;在适当的时候掉用set成员函数(注意如果是要在中断中调用,那应该放在DPC中):if (m_pEvent){m_pEvent->Set();}
要加一个在I/O控制函数,关键代码如下:
NTSTATUS status = STATUS_SUCCESS;
       HANDLE hEvent = *(HANDLE*)I.IoctlBuffer();//从应用程序接收句柄
       if (m_pEvent != NULL) delete m_pEvent;//判定
       m_pEvent = new(NonPagedPool)KEvent(hEvent,OBJECT_TYPE_ALL_ACCESS);//注意是非分页内存
       return status;
在应用程序中要做下面的工作:
           HANDLE m_hEvent;
       m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
       if (m_hEvent == INVALID_HANDLE_VALUE)
       {
              CloseHandle(m_hEvent);
              return INVALID_HANDLE_VALUE;
       }
      
       if (!DeviceIoControl(DeviceHandle,(I/O控制代码),&m_hEvent,sizeof(m_hEvent),NULL,0,&nByteRead,NULL))
       {
              CloseHandle(m_hEvent);
              return INVALID_HANDLE_VALUE;
       }
在一个循环中等待信号就基本上ok了  
fish9527
驱动牛犊
驱动牛犊
  • 注册日期2004-09-16
  • 最后登录2009-07-20
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望8点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-21 12:33
沙发自己座
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-21 16:03
还可以用异步DeviceIoControl。
游客

返回顶部