beaveror
驱动中牛
驱动中牛
  • 注册日期2002-06-13
  • 最后登录2003-07-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1222回复:8

请教 事件问题。

楼主#
更多 发布于:2002-06-26 10:25
用途:等待驱动层发事件。
1。应用程。
IOCTL_FIRST_SEND_EVENT 已定义。
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
int Length;
DeviceIoControl(hDevice,
IOCTL_FIRST_SEND_EVENT,
&hEvent, sizeof(HANDLE),// input
NULL, 0, // output
&length,NULL))
2。驱动层。
KEVENT keWrite;
KeInitializeEvent(&keWrite,NotificationEvent,FALSE);
switch( ControlCode)
{
case IOCTL_FIRST_SEND_EVENT:
ObReferenceObjectByHandle((HANDLE)(*Buffer), 0x0002,
NULL, UserMode,
(PVOID *)(&keWrite),
NULL);
KeClearEvent(&keWrite);
break;
//.................
}

有什么地方不对吗?



 
只要能解决问题,就一定给分。 希望高手赐教!
beaveror
驱动中牛
驱动中牛
  • 注册日期2002-06-13
  • 最后登录2003-07-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-26 15:42
高手们要帮帮忙啊!!!!!!!!!!!
只要能解决问题,就一定给分。 希望高手赐教!
beaveror
驱动中牛
驱动中牛
  • 注册日期2002-06-13
  • 最后登录2003-07-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-27 10:56
typedef struct _FIRST_DEVICE_EXTENSION
{
PDEVICE_OBJECT fdo;
PDEVICE_OBJECT NextStackDevice;
UNICODE_STRING ifSymLinkName;
//HANDLE          hEvent;   //for Event send
KEVENT*          hEvent;

} FIRST_DEVICE_EXTENSION, *PFIRST_DEVICE_EXTENSION;


在DeviceControl中的处理:

PFIRST_DEVICE_EXTENSION dx =
            (PFIRST_DEVICE_EXTENSION)fdo->DeviceExtension;

switch( ControlCode)
//............................
case IOCTL_FIRST_SEND_EVENT:
         status = ObReferenceObjectByHandle(Buffer,
                                           0x0002,
  NULL,
  UserMode,
 (PVOID*)(&dx->hEvent),
 NULL);

KeClearEvent(dx->hEvent);
break;
//...................................


//..................在需要发生事件的地方加入..................
KeSetEvent( dx->hEvent, 2, FALSE);
//...........................

//......................应用层加入........................
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(!DeviceIoControl(hDevice, IOCTL_FIRST_SEND_EVENT,
                            &hEvent, sizeof(HANDLE),// input
   NULL, 0, // output
   &length,
   NULL))
        WaitForSingleObject(hEvent, INFINITE);
//..........................................        
问题是:现在应用程序执行到WaitForSingleObject()之前就重启了。
只要能解决问题,就一定给分。 希望高手赐教!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-27 11:16
跟一下
看到底是那儿发生错误死机的
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
ysr
ysr
驱动牛犊
驱动牛犊
  • 注册日期2001-05-11
  • 最后登录2015-01-29
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望48点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-27 11:22
这样可能不行吧,那IRP什么时候完成啊(就是调用IoCompleteRequest 函数),如果采取异步方式的话,也应该先调用IoMarkIrpPending吧。
beaveror
驱动中牛
驱动中牛
  • 注册日期2002-06-13
  • 最后登录2003-07-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-27 11:31
这样可能不行吧,那IRP什么时候完成啊(就是调用IoCompleteRequest 函数),如果采取异步方式的话,也应该先调用IoMarkIrpPending吧。


本人对DDK刚入门,运行机制也不熟,大侠能否讲的详细点。
或者我应该怎么改?
只要能解决问题,就一定给分。 希望高手赐教!
ysr
ysr
驱动牛犊
驱动牛犊
  • 注册日期2001-05-11
  • 最后登录2015-01-29
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望48点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-27 11:46
应用程序调用DEVICEIOCONTROL的时候,传一个初始化的事件给最后一个参数的相关域,接着调用WAITFORSINGLEOBJECT等待这个事件。
驱动收到这个IRP时调用IoMarkIrpPending,并在出现你希望的情况下调用IoCompleteRequest,你的应用程序就被唤醒了。当然,除此之外,还应该考虑IRP排队,取消例程等,去看看DDK的帮助文档吧。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-27 13:18
不需要这么麻烦的

有个简单的方法,以前的帖子我也发过,看来又的写一编

你可以在驱动中创建事件,然后在应用层打开这个事件,只需要两边的事件同名就可以,然后你就可以在合适的地方置事件,并等待这个事件的发生,这样不需要考虑irp队列完成之类的东东
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-06 14:14
不需要这么麻烦的

有个简单的方法,以前的帖子我也发过,看来又的写一编

你可以在驱动中创建事件,然后在应用层打开这个事件,只需要两边的事件同名就可以,然后你就可以在合适的地方置事件,并等待这个事件的发生,这样不需要考虑irp队列完成之类的东东
这种方法的确可行,可用本帖子说的那种方法如何实现?我百思不得其解!!!请高手指点
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
游客

返回顶部