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

drivereworks中断服务程序的问题

楼主#
更多 发布于:2003-11-27 08:59
你好:
    我使用driverworks生成的wdm驱动程序,请问在中断服务程序(isr)中如何通知应用程序中断产生,如何向应用
程序传递参数,能否有详细的说明,如果有例子更好(我是新手,刚编了几天,基本上中断和dma都用起了,但是不知道如何在中断中通知应用程序,谢谢)
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-27 19:27
用事件来通知应用程序
我记得Driverworks有一个关于Event的类可以使用
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-28 09:06
用事件来通知应用程序
我记得Driverworks有一个关于Event的类可以使用
 



可以这样
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
Always!978
驱动小牛
驱动小牛
  • 注册日期2002-05-09
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-11-28 09:50
通知应用程序用Event,传递参数不能主动传递,都是由应用程序来主动发送,驱动程序在接收应用程序消息的时候,可以填写接收缓冲区以给应用程序传递参数
Tomorrow Never Die
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2003-11-28 16:58
楼上的各位能不能提供一个driverworks的event的例子程序啊,包括应用程序和驱动程序的event例子的使用,我对windows编程不熟悉
高分相送哦,多谢各位
nianhu
驱动牛犊
驱动牛犊
  • 注册日期2003-10-31
  • 最后登录2003-12-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-29 11:18
驱动程序以事件通知方式通知应用程序,其具体操作是怎么样?哪位DX可以指点一下那?比如用到什么函数,应用程序是不是一定要不断查询这个事件是否发生呢?如果是这样,好像失去了中断的本身含义了,不知道我理解的对不对?请各位指教。
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
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();









Goge
驱动牛犊
驱动牛犊
  • 注册日期2002-07-26
  • 最后登录2004-10-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-12-01 22:20
你要完成的是驱动的基本功能,不用担心,很简单^o^

在DW的安装目录下有例子程序,example\\NT\\inter???
具体名字太久远,忘了
虽然是NT的,但方法在WDM下是一样的
这个例子简直就是为你设计的
zxw_top
驱动大牛
驱动大牛
  • 注册日期2003-07-18
  • 最后登录2020-04-26
  • 粉丝0
  • 关注0
  • 积分1116分
  • 威望2537点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
  • 社区居民
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;
}
游客

返回顶部