LittleCoffee
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2007-10-03
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1222回复:6

再问wdm与app用event通讯(25分)

楼主#
更多 发布于:2004-04-02 08:59
wdm主要程序段

NTSTATUS WDMDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
PIO_STACK_LOCATION IrpStack;
ULONG              dwInputBufferLength;
ULONG              dwOutputBufferLength;
ULONG              dwIoControlCode;
PVOID              pvIOBuffer;
NTSTATUS           ntStatus;
UNICODE_STRING    EventName;
NTSTATUS evt_res;
OBJECT_HANDLE_INFORMATION obj_info;
KEVENT event;


KdPrint( ("Enter\n") );
Irp->IoStatus.Status      = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IrpStack = IoGetCurrentIrpStackLocation(Irp);
pvIOBuffer           = Irp->AssociatedIrp.SystemBuffer;
dwInputBufferLength  = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
dwOutputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;

switch (IrpStack->MajorFunction)
{
   case IRP_MJ_DEVICE_CONTROL:
KdPrint( ("IRP_MJ_DEVICE_CONTROL\n") );
dwIoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
switch (dwIoControlCode)
{
      case IOCTL_WDMTEST:
KdPrint( ("IOCTL_WDMTEST\n") );
KdPrint( ("%x\n", pvIOBuffer ) );
evt_res = ObReferenceObjectByHandle( *((HANDLE*)pvIOBuffer), GENERIC_ALL, NULL,
KernelMode, &event, &obj_info );
if( NT_SUCCESS(evt_res) ){
KdPrint( ("ObReferenceObjectByHandle OK!\n") );
KeSetEvent( &event, IO_NO_INCREMENT, FALSE ); <------ 1
KdPrint( ("KeSetEvent OK!\n") );
ObDereferenceObject(&event);
KdPrint( ("ObDereferenceObject OK!\n") );
}else{
KdPrint( ("ObReferenceObjectByHandle Fail!\n") );
}
break;
    default:
KdPrint( ("ERROR\n") );
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
break;
}
break;
}
ntStatus = Irp->IoStatus.Status;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
KdPrint( ("Leaving\n") );

return ntStatus;
}

app调用程序段:
全局中定义
HANDLE evt;

函数中
DWORD dwBytesReturned;
evt = CreateEvent( 0, FALSE, FALSE, 0 );
InstallDrive();
OpenDrive();
        if (!DeviceIoControl(hDriver, IOCTL_WDMTEST, &evt, sizeof(evt), 0, 0, &dwBytesReturned, NULL))
AfxMessageBox("err");


当把那句“1”屏蔽掉后,不会兰屏,并且kdprint出的东西是我希望的东西,把“1”加上后,运行deviceiocontrol就兰屏


哪里错了(小弟学驱动刚一个星期,如果可以,请说明的详细一些,谢谢)
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-04-02 09:31
不要在ObReferenceObjectByHandle( *((HANDLE*)pvIOBuffer), GENERIC_ALL, NULL,
KernelMode, &event, &obj_info );
后直接KESETEVENT
而应该专门用一个SETEVENT的IOCONTROL来SETEVENT
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
LittleCoffee
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2007-10-03
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-02 09:50
那么KEVENT event这句话我应该申明在哪里?可不可以直接放在程序最前面的全局变量中??
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-04-02 11:19
可以用全局变量,不过最好放在设备扩展里。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
LittleCoffee
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2007-10-03
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-02 12:13
我用IoCreateNotificationEvent成功通讯了,但是我用ObReferenceObjectByHandle转换后,发现,原来在app中reset的event,被他这么一转换后,怎么event自动就变成了set了呢?我在ObReferenceObjectByHandle后直接用KeClearEvent也没用(我没有用ObDereferenceObject)
LittleCoffee
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2007-10-03
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-02 13:16
前面的问题解决了,最后一个问题,哪里调用ObDereferenceObject比较合适?
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-07 16:29
evt_res = ObReferenceObjectByHandle( *((HANDLE*)pvIOBuffer), GENERIC_ALL, NULL,KernelMode, &event, &obj_info );
编不过
dispatch.c(52) : error C4047: 'function' : 'void ** ' differs in levels of indir
ection from 'struct _KEVENT *'
我也是初学者根你学习

游客

返回顶部