阅读:1679回复:6
driverworks中驱动程序和应用程序同步的问题(20)
我用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] |
|
|
沙发#
发布于:2002-06-13 13:48
没有用过drivework。
你可以试试: 在WDM createevent,是有名字的(eventname)。 在app openevent(eventname) |
|
板凳#
发布于:2002-06-13 14:31
多谢
我所说的第一种方法就是这种思路,但要在类中定义一个kevent对象(ds中的一个类),也许我可以试试不产生对象,而只用句柄区分event。 但是编译时提示: error C2065: \'CreateEvent\' : undeclared identifier 这是个windows api吧?怎会不认呢。 现在经常觉得driver studio还不如用ddk呢,这也不行那也不行的, 可是来不及了。 都是那里不能分配非分页内存呢? |
|
|
地板#
发布于:2002-06-14 09:28
在WDM创建event是用函数IoCreateNotificationEvent吧? ;)
|
|
地下室#
发布于:2002-06-14 10:01
好,我去试试
|
|
|
5楼#
发布于:2002-06-14 10:08
不行,还是安装出现页错误。
在ddk中,如果要创建一个全局事件,要在哪里创建啊?也就是说那个函数里创建。 可能是我创建的地方不对,所以出现页错误。 多有麻烦,不胜感激,一定给分 |
|
|
6楼#
发布于:2002-06-14 12:58
又钻研了一下oney的书。
发现上面说得很明白:在win2000下异步过程调用或发送window消息的方法不可行。 可行的方法是使应用程序发出IOCTL操作,而驱动程序在被关注事件发生时完成该操作。 我又有得费劲了,不过总胜过没有方向。 谢谢。有问题再请教。 |
|
|