edbert
驱动牛犊
驱动牛犊
  • 注册日期2003-04-26
  • 最后登录2012-08-11
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望26点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
阅读:932回复:0

共享事件应用中的新问题:

楼主#
更多 发布于:2003-11-03 09:27
共享事件应用中的新问题:
    各位大侠,鄙人在使用共享事件实现驱动对应用程序通信的过程中遇到了麻烦,热盼指点。
    源码如下:
    应用程序方:
    ......
    HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
     CreateThread(0, 0x1000, ServiceThread, (PVOID)hEvent, 0, &Tid);
printf(\"\\nWdm1Test\\n\");
/////////////////////////////////////////////////////////////////////////
// Open device
printf(\"\\nTest %d\\n\",TestNo++);
HANDLE hWdm1 = GetDeviceViaInterface((LPGUID)&MYGUID,0);
if( hWdm1==NULL)
{
printf(\"XXX  Could not find open Wdm1 device\\n\");
return 1;
}
printf(\"     Opened OK\\n\");
//////////////////////////////////////////////////////////////////////////
    // Create an event for notification

  
    if (! DeviceIoControl(hWdm1,IOCTL_MY1_SET_NOTIFICATION_EVENT ,&hEvent,sizeof(hEvent),NULL,0,&nRet,NULL) )
//if (! DeviceIoControl(hWdm1,IOCTL_MY1_WRITE_TIMER  ,&hEvent,sizeof(hEvent),NULL,0,&nRet,NULL) )
{
      printf(\"Ioctl failed: %x\\n\", GetLastError());
    
}
else
printf(\"Ioctl ok!\");



    .......
   DWORD WINAPI ServiceThread(PVOID hEvent)
{
 //   DWORD TxdBytes;
ULONG Rvalue = 0;
    while (TRUE)
{
        WaitForSingleObject(hEvent, INFINITE);
        //ReadFile( hWdm1, &Rvalue, 4, &TxdBytes, NULL);
        printf(\"\\n transmission successful!\");
}

    return 0;
}
   .......
 
   驱动方面:
   ......
   switch( ControlCode)
{
case IOCTL_MY1_SET_NOTIFICATION_EVENT:
  
{
HANDLE hevent = *(PHANDLE) Irp->AssociatedIrp.SystemBuffer;
        
         if (hevent)
           status = ObReferenceObjectByHandle(hevent, EVENT_MODIFY_STATE, *ExEventObjectType, Irp->RequestorMode, (PVOID*) &pevent, NULL);
 status = STATUS_SUCCESS;
         else
             pevent = NULL;

}
  
   break;
     ......
    
     NTSTATUS My1Write( IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS status = STATUS_SUCCESS;
LONG BytesTxd = 0;
      ........
     KeSetEvent(pevent, IO_NO_INCREMENT,false);
    .......
}


如上所示,在应用程序中调用DeviceIoControl总是返回失败。通过初步调试得知, status = ObReferenceObjectByHandle(hevent, EVENT_MODIFY_STATE, *ExEventObjectType, Irp->RequestorMode, (PVOID*) &pevent, NULL);
   这一行代码出现问题,导致失败。
   请问,为什么?怎样解决?
   谢谢。

最新喜欢:

acidfishacidfi...
hhm
游客

返回顶部