阅读:1168回复:8
drivereworks中断服务程序的问题
你好:
我使用driverworks生成的wdm驱动程序,请问在中断服务程序(isr)中如何通知应用程序中断产生,如何向应用 程序传递参数,能否有详细的说明,如果有例子更好(我是新手,刚编了几天,基本上中断和dma都用起了,但是不知道如何在中断中通知应用程序,谢谢) |
|
沙发#
发布于:2003-11-27 19:27
用事件来通知应用程序
我记得Driverworks有一个关于Event的类可以使用 |
|
板凳#
发布于:2003-11-28 09:06
用事件来通知应用程序 可以这样 |
|
|
地板#
发布于:2003-11-28 09:50
通知应用程序用Event,传递参数不能主动传递,都是由应用程序来主动发送,驱动程序在接收应用程序消息的时候,可以填写接收缓冲区以给应用程序传递参数
|
|
|
地下室#
发布于:2003-11-28 16:58
楼上的各位能不能提供一个driverworks的event的例子程序啊,包括应用程序和驱动程序的event例子的使用,我对windows编程不熟悉
高分相送哦,多谢各位 |
|
5楼#
发布于:2003-11-29 11:18
驱动程序以事件通知方式通知应用程序,其具体操作是怎么样?哪位DX可以指点一下那?比如用到什么函数,应用程序是不是一定要不断查询这个事件是否发生呢?如果是这样,好像失去了中断的本身含义了,不知道我理解的对不对?请各位指教。
|
|
6楼#
发布于:2003-11-30 16:51
其实方法也不难,可以参考dw中的Signaling an Application from a Kernel Mode Driver 这一篇的Method 3。
例如: 在驱动程序中写入: KEvent* m_pEventToSignal; HANDLE hEvent = *(HANDLE*)I.IoctlBuffer(); m_pEventToSignal = new(NonPagedPool) KEvent(hEvent); status = (m_pEventToSignal != NULL) ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES; 在要往上层应用程序发消息的地方写入 m_pEventToSignal->Set(); 然后在应用程序中写入 HANDLE hDevice; hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); CWinThread *Thread; Thread=AfxBeginThread(ThreadProc, this, THREAD_PRIORITY_NORMAL); UINT ThreadProc(LPVOID pParam) { while(1) { WaitForSingleObject(hEvent,INFINITE); ....... } return 0; } 其中要注意的地方: 应用程序的hEvent要传给驱动程序的*(HANDLE*)I.IoctlBuffer(); |
|
7楼#
发布于:2003-12-01 22:20
你要完成的是驱动的基本功能,不用担心,很简单^o^
在DW的安装目录下有例子程序,example\\NT\\inter??? 具体名字太久远,忘了 虽然是NT的,但方法在WDM下是一样的 这个例子简直就是为你设计的 |
|
8楼#
发布于:2003-12-02 09:49
qje你帮我看看有什么问题,为什么一产生中断就蓝屏了,而去掉
m_pEvent->Set()就工作正常 以下是我的程序,两位帮我看看有什么问题 //插入事件 IOWaiter = CreateEvent(NULL, FALSE, FALSE, NULL); if (! DeviceIoControl( hDevice, PCIWDM_IOCTL_INTCSR, &IOWaiter, sizeof(IOWaiter), NULL, 0, &nBytesRead, NULL ) ) { printf(\"wrong event !\\n\"); CloseHandle(hDevice); CloseHandle(IOWaiter); return 0; } //响应事件 do { WaitForSignal(hEvent, INFINITE); printf(\"EVENT ACT!\"); i++; } while (i<=5000); 驱动程序部分: NTSTATUS PciwdmDevice:CIWDM_IOCTL_INTCSR_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; HANDLE hEvent; hEvent = *(HANDLE*)I.IoctlBuffer(); if (m_pEvent) delete m_pEvent; m_pEvent = new (NonPagedPool) KEvent(hEvent, OBJECT_TYPE_ALL_ACCESS); return I.Complete(STATUS_SUCCESS); } dpc程序: VOID PciwdmDevice:pcFor_Irq(PVOID Arg1, PVOID Arg2) { m_pEvent->Set(); // or Pulse UNREFERENCED_PARAMETER(Arg1); UNREFERENCED_PARAMETER(Arg2); } 中断服务程序: BOOLEAN PciwdmDevice::Isr_Irq(void) { unsigned int state; state=m_IoPortRange0.ind(0x4); if ((state&0x3)!=0x3) return FALSE; if ((state&0x3)==0x3) { m_IoPortRange0.outd(0x4,0x2); m_IoPortRange0.outd(0x8,m_PAddr); m_IoPortRange0.outd(0xc,fwLength); if (kk==0) { m_IoPortRange0.outd(0x10,0x1);} if (kk==1) { m_IoPortRange0.outd(0x10,0x100);} } m_DpcFor_Irq.Request(NULL, NULL); return TRUE; } |
|