kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1284回复:9

为什么老是重启

楼主#
更多 发布于:2004-03-24 10:03
我在应用程序中用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);
}

请大侠们指点指点亚,我看好以前有好多人问,可是好像没有解决亚?帮帮忙!

最新喜欢:

sunmaculasunmac...
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
沙发#
发布于:2004-03-24 11:50
我在应用程序中用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);
}

请大侠们指点指点亚,我看好以前有好多人问,可是好像没有解决亚?帮帮忙!


hKevent必须取得保存在pInBuf中的那个句柄,所以这句话不对,你取到的是Buffer地址:
HANDLE hKevent = (HANDLE *) pInBuf;

应该是:
HANDLE hKevent = *((HANDLE *) pInBuf);
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
qwdrv
驱动大牛
驱动大牛
  • 注册日期2004-03-19
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-24 13:25
还有,注意一下你的IOCTL_AMCC5920_GET_EVENT的定义和DeviceIoControl里取InputBuffer的方法。
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-25 09:17
seaquester :
    我按你说的做了一下可是一到amcc5920_getevent
就重启了。我定义的pInBuf 是这样的:
PVOID pInBuf = stack->Parameters.DeviceIoControl.Type3InputBuffer;
是不是这个将句柄传不过来的缘故呢?
请执教?
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-25 09:20
qwdrv:
还有,注意一下你的IOCTL_AMCC5920_GET_EVENT的定义和DeviceIoControl里取InputBuffer的方法。


我觉得我的devicedIoControl没有问题因为我在程序中又定义了deviceIoControl将后面的参数省掉了。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2004-03-25 09:43
RING3的句柄对RING0毫无意义,建议通过同名事件对象来通信。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
hbu_yst
驱动牛犊
驱动牛犊
  • 注册日期2004-03-05
  • 最后登录2004-04-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-25 11:00
不错
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-03-25 11:03
同名对象怎么用亚


不是有人用过传递句柄得么
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
8楼#
发布于:2004-03-25 12:29
同名对象怎么用亚


不是有人用过传递句柄得么
 


传递句柄是可以的,ObReferenceObjectByHandle函数可以将Ring3事件句柄转化为Ring0事件句柄。当然,ObReferenceObjectByHandle的调用必须在你创建Event的进程上下文中(一般说来,通过DeviceIoControl传递都会满足条件)。

命名Event在WinNT/2K下是一个更好的方法,但是win98下会遇到麻烦。

使用命名Event可以这样作:
首先在驱动创建一个命名的event,然后,在应用程序中通过它的名字打开同一个Event。
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-03-26 15:28
谢谢大家,我已经过了。原来是没有将句柄传过来,在前面在重写一边的取得缓存就行,谢谢大家的帮忙。
游客

返回顶部