阅读:932回复:0
共享事件应用中的新问题:
共享事件应用中的新问题:
各位大侠,鄙人在使用共享事件实现驱动对应用程序通信的过程中遇到了麻烦,热盼指点。 源码如下: 应用程序方: ...... 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); 这一行代码出现问题,导致失败。 请问,为什么?怎样解决? 谢谢。 |
|
最新喜欢:acidfi...
|