zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1404回复:19

drivereworks中断服务程序的问题

楼主#
更多 发布于:2003-11-27 09:00


你好:
    大家好,我使用driverworks生成的wdm驱动程序,请问在中断服务程序(isr)中如何通知应用程序中断产生,如何向应用程序传递参数,能否有详细的说明,如果有例子更好(我是新手,刚编了几天,基本上中断和dma都用起了,但是不知道如何在中断中通知应用程序,谢谢)
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-12-12 23:57
哪位老大帮下忙?
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
板凳#
发布于:2003-12-11 12:32
没有用过DW, 帮你顶一下吧 :P
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-12-11 10:26
没人回啊,送分哦
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2003-12-05 15:45
请各位帮我看看,送分哦
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2003-12-01 23:13
wb_tiger我先看看你发的东西,有问题我就问
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2003-12-01 23:12
seaquester
     为什么我一产生中断就蓝屏了
     而把dpc里面的m_pEvent->Set()去掉
     就工作正常(当然没有event事件通知)
     你帮我看看,是不是哪个地方参数
     还有错误
wb_tiger
驱动牛犊
驱动牛犊
  • 注册日期2003-08-22
  • 最后登录2004-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-12-01 09:32
我写了一个例子,用定时器模拟中断通知应用程序。
其实不一定用deviceiocontrol传递Event,用ReadFile()
的overlop结构也可以传递,这时是异步读。
附件名称/大小 下载次数 最后更新
2003-12-01_Test.rar (370KB)  7
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
8楼#
发布于:2003-12-01 08:25
waitforsignal 应该是 WaitForSingleObject
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
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]
nianhu
驱动牛犊
驱动牛犊
  • 注册日期2003-10-31
  • 最后登录2003-12-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-11-29 12:45
我的应用程序中DeviceIoControl()得不到那个控制码,所以就不能传递那个事件给驱动,请问,那怎么解决呢?(设备可以打开,即CreateFile()函数调用成功。)
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2003-11-28 22:44
两位能不能帮我做个driverworks的wdm的中断event例子程序,
用driverwoks的向导生成应该很容易.
ddk的我看不大懂,例子程序希望能有应用程序和核心程序
两部分,这样我比较容易懂.在此多谢了,希望两位能鼎力相助啊
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
12楼#
发布于:2003-11-28 12:22
wb_tiger,seaquester两位:
       有没有event例子程序给我参考一下,我对windows编程不熟悉,这几天我是照着例子程序自己编的
       另外我新开一个贴子,两位来领分吧

 


例子(用的是DDK):
附件名称/大小 下载次数 最后更新
2003-11-28_Event.zip (28KB)  12
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2003-11-28 11:41
wb_tiger,seaquester两位:
       有没有event例子程序给我参考一下,我对windows编程不熟悉,这几天我是照着例子程序自己编的
       另外我新开一个贴子,两位来领分吧

wb_tiger
驱动牛犊
驱动牛犊
  • 注册日期2003-08-22
  • 最后登录2004-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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.

够清楚了吧
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
15楼#
发布于:2003-11-27 17:59
没看明白,wb_tiger能不能详细说明event在应用程序中如何传递?
另外增加了m_pEvent->Set()后,产生中断就蓝屏了,怎么回事?
另外怎么给分啊,几天没来就忘了,呵呵

[编辑 -  11/27/03 by  zxw_top]


m_pEvent->Set() 不要在中断处理例程里面调用,在DPC里面调用。
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2003-11-27 17:07
没看明白,wb_tiger能不能详细说明event在应用程序中如何传递?
另外增加了m_pEvent->Set()后,产生中断就蓝屏了,怎么回事?
另外怎么给分啊,几天没来就忘了,呵呵

[编辑 -  11/27/03 by  zxw_top]
wb_tiger
驱动牛犊
驱动牛犊
  • 注册日期2003-08-22
  • 最后登录2004-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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();

给分给分
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2003-11-27 13:18
event怎么用啊?
我是新手,有没有例子,发个来,高分送啊
CYoung
驱动中牛
驱动中牛
  • 注册日期2003-06-10
  • 最后登录2005-01-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-11-27 10:48
使用Event
答得好的话,请兄弟们加点分,那是对我的肯定
游客

返回顶部