阅读:1284回复:9
为什么老是重启
我在应用程序中用createevent产生一信号,然后用deviceiocontrol传递给驱动,然后在驱动中调用ObReferenceObjectByHandle,可是我的程序怎么一走到这就重启呢?
我的程序是这样写的:(参考专栏文章<<总结应用和驱动之间用事件通讯的办法>>) HEV=CreateEvent(NULL,0,0,Ename)产生了一个信号,然后用AMCC5920_GetEvent(hAMCC5920,HEV); void AMCC5920_GetEvent(AMCC5920_HANDLE hAMCC5920,HANDLE hEvent) { DeviceIoControl(hAMCC5920, IOCTL_AMCC5920_GET_EVENT,(PVOID)&hEvent, sizeof(HANDLE)); } 传送信号句柄给驱动程序。 在驱动程序中我的程序是这样写的: PKEVENT pEvent; case IOCTL_AMCC5920_GET_EVENT: { HANDLE hKevent = (HANDLE *) pInBuf; DebugDump(DBG_DIAG1, ("get evnet!!!.\n")); Status=ObReferenceObjectByHandle(hKevent,NULL,NULL,KernelMode,&pEvent, HandleInformation); pIrp->IoStatus.Information = sizeof(HANDLE); } 请大侠们指点指点亚,我看好以前有好多人问,可是好像没有解决亚?帮帮忙! |
|
最新喜欢:![]() |
沙发#
发布于:2004-03-24 11:50
我在应用程序中用createevent产生一信号,然后用deviceiocontrol传递给驱动,然后在驱动中调用ObReferenceObjectByHandle,可是我的程序怎么一走到这就重启呢? hKevent必须取得保存在pInBuf中的那个句柄,所以这句话不对,你取到的是Buffer地址: HANDLE hKevent = (HANDLE *) pInBuf; 应该是: HANDLE hKevent = *((HANDLE *) pInBuf); |
|
|
板凳#
发布于:2004-03-24 13:25
还有,注意一下你的IOCTL_AMCC5920_GET_EVENT的定义和DeviceIoControl里取InputBuffer的方法。
|
|
地板#
发布于:2004-03-25 09:17
seaquester :
我按你说的做了一下可是一到amcc5920_getevent 就重启了。我定义的pInBuf 是这样的: PVOID pInBuf = stack->Parameters.DeviceIoControl.Type3InputBuffer; 是不是这个将句柄传不过来的缘故呢? 请执教? |
|
地下室#
发布于:2004-03-25 09:20
qwdrv:
还有,注意一下你的IOCTL_AMCC5920_GET_EVENT的定义和DeviceIoControl里取InputBuffer的方法。 我觉得我的devicedIoControl没有问题因为我在程序中又定义了deviceIoControl将后面的参数省掉了。 |
|
5楼#
发布于:2004-03-25 09:43
RING3的句柄对RING0毫无意义,建议通过同名事件对象来通信。
|
|
|
6楼#
发布于:2004-03-25 11:00
不错
|
|
7楼#
发布于:2004-03-25 11:03
同名对象怎么用亚
不是有人用过传递句柄得么 |
|
8楼#
发布于:2004-03-25 12:29
同名对象怎么用亚 传递句柄是可以的,ObReferenceObjectByHandle函数可以将Ring3事件句柄转化为Ring0事件句柄。当然,ObReferenceObjectByHandle的调用必须在你创建Event的进程上下文中(一般说来,通过DeviceIoControl传递都会满足条件)。 命名Event在WinNT/2K下是一个更好的方法,但是win98下会遇到麻烦。 使用命名Event可以这样作: 首先在驱动创建一个命名的event,然后,在应用程序中通过它的名字打开同一个Event。 |
|
|
9楼#
发布于:2004-03-26 15:28
谢谢大家,我已经过了。原来是没有将句柄传过来,在前面在重写一边的取得缓存就行,谢谢大家的帮忙。
|
|