brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1679回复:6

driverworks中驱动程序和应用程序同步的问题(20)

楼主#
更多 发布于:2002-06-13 11:13
我用driverworks写wdm驱动程序。想通过event实现驱动和应用程序的同步。实现方法是在driverworks的帮助文档中找到的(\"how to signal an application\")
1。为在设备类中声明事件成员变量,在构造函数对事件进行构造。然后应用。
class TsDevice : public KPnpDevice
{
public:
KEvent m_pSynchEvent;
……
}
TsDevice::TsDevice(PDEVICE_OBJECT Pdo, ULONG Unit) :
KPnpDevice(Pdo, &TsDevice_Guid),
m_cfg(NULL),m_pSynchEvent(KUstring(DRIVER_EVENT_NAME),SynchronizationEvent)
{
……
m_pSynchEvent.Clear();
……
}
编译没错,安装时兰屏。
把成员变量改为指针,然后在构造函数中初始化,同样蓝屏。

2。应用函数产生event,通过ioctl把handle传给驱动,驱动用以得到event控制权。
switch (I.IoctlCode())
   {
     case MYDEVICE_IOCTL_SETUP_SIGNAL:
       // app passes event handle in input buffer
       HANDLE hEvent = *(HANDLE*)I.IoctlBuffer();
       m_pEventToSignal = new(NonPagedPool) KEvent(hEvent);
       NTSTATUS status = (m_pEventToSignal != NULL) :
         STATUS_SUCCESS ?
         STATUS_INSUFFICIENT_RESOURCES;
       return I.Complete(status);
       break;
       . . .
     }
运行至此softice显示出错,是irql不对。



我的理解,应该是在当前irql中申请非分页内存出错。那我应该怎么做才能获得event的控制呢???
大虾指点一下吧。

[编辑 -  6/13/02 by  brucezh]
打一枪……换个地方……再打一枪……
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-06-13 13:48
没有用过drivework。
你可以试试:
在WDM createevent,是有名字的(eventname)。
在app openevent(eventname)
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-13 14:31
多谢
我所说的第一种方法就是这种思路,但要在类中定义一个kevent对象(ds中的一个类),也许我可以试试不产生对象,而只用句柄区分event。
但是编译时提示:
error C2065: \'CreateEvent\' : undeclared identifier
这是个windows api吧?怎会不认呢。
现在经常觉得driver studio还不如用ddk呢,这也不行那也不行的,
可是来不及了。
都是那里不能分配非分页内存呢?
打一枪……换个地方……再打一枪……
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-06-14 09:28
在WDM创建event是用函数IoCreateNotificationEvent吧? ;)
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-14 10:01
好,我去试试
打一枪……换个地方……再打一枪……
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-14 10:08
不行,还是安装出现页错误。
在ddk中,如果要创建一个全局事件,要在哪里创建啊?也就是说那个函数里创建。
可能是我创建的地方不对,所以出现页错误。
多有麻烦,不胜感激,一定给分
打一枪……换个地方……再打一枪……
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-14 12:58
又钻研了一下oney的书。
发现上面说得很明白:在win2000下异步过程调用或发送window消息的方法不可行。
可行的方法是使应用程序发出IOCTL操作,而驱动程序在被关注事件发生时完成该操作。
我又有得费劲了,不过总胜过没有方向。
谢谢。有问题再请教。
打一枪……换个地方……再打一枪……
游客

返回顶部