阅读:1404回复:19
drivereworks中断服务程序的问题你好: 大家好,我使用driverworks生成的wdm驱动程序,请问在中断服务程序(isr)中如何通知应用程序中断产生,如何向应用程序传递参数,能否有详细的说明,如果有例子更好(我是新手,刚编了几天,基本上中断和dma都用起了,但是不知道如何在中断中通知应用程序,谢谢) |
|
沙发#
发布于:2003-12-12 23:57
哪位老大帮下忙?
|
|
板凳#
发布于:2003-12-11 12:32
没有用过DW, 帮你顶一下吧 :P
|
|
|
地板#
发布于:2003-12-11 10:26
没人回啊,送分哦
|
|
地下室#
发布于:2003-12-05 15:45
请各位帮我看看,送分哦
|
|
5楼#
发布于:2003-12-01 23:13
wb_tiger我先看看你发的东西,有问题我就问
|
|
6楼#
发布于:2003-12-01 23:12
seaquester
为什么我一产生中断就蓝屏了 而把dpc里面的m_pEvent->Set()去掉 就工作正常(当然没有event事件通知) 你帮我看看,是不是哪个地方参数 还有错误 |
|
7楼#
发布于:2003-12-01 09:32
我写了一个例子,用定时器模拟中断通知应用程序。
其实不一定用deviceiocontrol传递Event,用ReadFile() 的overlop结构也可以传递,这时是异步读。 |
|
|
8楼#
发布于:2003-12-01 08:25
waitforsignal 应该是 WaitForSingleObject
|
|
|
9楼#
发布于:2003-11-30 15:52
MYDRV_IOCTL_800里面怎么定义?
waitforsignal编译说没有这个标示符? 以下是我的程序,两位帮我看看有什么问题 //插入事件 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::PCIWDM_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::DpcFor_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; } [编辑 - 11/30/03 by zxw_top] |
|
10楼#
发布于:2003-11-29 12:45
我的应用程序中DeviceIoControl()得不到那个控制码,所以就不能传递那个事件给驱动,请问,那怎么解决呢?(设备可以打开,即CreateFile()函数调用成功。)
|
|
11楼#
发布于:2003-11-28 22:44
两位能不能帮我做个driverworks的wdm的中断event例子程序,
用driverwoks的向导生成应该很容易. ddk的我看不大懂,例子程序希望能有应用程序和核心程序 两部分,这样我比较容易懂.在此多谢了,希望两位能鼎力相助啊 |
|
12楼#
发布于:2003-11-28 12:22
wb_tiger,seaquester两位: 例子(用的是DDK): |
|
|
13楼#
发布于:2003-11-28 11:41
wb_tiger,seaquester两位:
有没有event例子程序给我参考一下,我对windows编程不熟悉,这几天我是照着例子程序自己编的 另外我新开一个贴子,两位来领分吧 |
|
14楼#
发布于:2003-11-27 18:03
1、应用程序创建一个EVENT
2、通过IoDeviceControl()把这个event传递下去。 3、应用程序调用waitforsignal()等待event事件 4、驱动声明一个event,在驱动的IoDeviceControl()中得到 应用程序event的地址 hEvent = *(HANDLE*)I.IoctlBuffer(); m_pEvent = new (NonPagedPool) KEvent (hEvent,OBJECT_TYPE_ALL_ACCESS); 5、来中断后调用m_pEvent->set(); 6、应用程序的waitforsignal()响应这个event. 够清楚了吧 |
|
15楼#
发布于:2003-11-27 17:59
没看明白,wb_tiger能不能详细说明event在应用程序中如何传递? m_pEvent->Set() 不要在中断处理例程里面调用,在DPC里面调用。 |
|
|
16楼#
发布于:2003-11-27 17:07
没看明白,wb_tiger能不能详细说明event在应用程序中如何传递?
另外增加了m_pEvent->Set()后,产生中断就蓝屏了,怎么回事? 另外怎么给分啊,几天没来就忘了,呵呵 [编辑 - 11/27/03 by zxw_top] |
|
17楼#
发布于:2003-11-27 13:38
应用程序:
HANDLE IOWaiter; IOWaiter = CreateEvent(NULL, FALSE, FALSE, NULL); if (! DeviceIoControl( m_hDevice, MYDRV_IOCTL_800, &IOWaiter, sizeof(IOWaiter), NULL, 0, &nBytesRead, NULL ) ) { CloseHandle(m_hDevice); CloseHandle(IOWaiter); return 0; } 将要建立的EVENT传递下去 驱动程序: NTSTATUS MyDrvDevice::DeviceControl(KIrp I) { NTSTATUS status; HANDLE hEvent; switch (I.IoctlCode()) { case MYDRV_IOCTL_800: 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); } 使用EVENT:m_pEvent->Set(); 给分给分 |
|
18楼#
发布于:2003-11-27 13:18
event怎么用啊?
我是新手,有没有例子,发个来,高分送啊 |
|
19楼#
发布于:2003-11-27 10:48
使用Event
|
|
|