阅读:2467回复:12
帮帮我:驱动程序怎样通知应用程序?
假如有一串口驱动程序,在收到数据以后,他怎样通知上层应用程序?
救救小弟吧! |
|
最新喜欢:utahyj |
沙发#
发布于:2001-07-10 18:31
有两种方法:
1.通过发送消息通知上层应用程序; 2.应用程序和驱动之间共享一个Event。 |
|
|
板凳#
发布于:2001-07-11 09:38
还有一个方法就是,发一个异步的IOCONTROL包(用DeviceIoControl),驱动程序在收到数据后才IoCompleteRequest它。看programming WDM吧,第九章。
|
|
|
地板#
发布于:2001-07-11 12:30
LitteSW:
请你说说如何发送消息给Win32 ? 这个问题我研究很久,总没有结果.这是一种主动的方法么? 先谢谢 . |
|
地下室#
发布于:2001-07-12 12:08
用VTOOLSD中的SHELL_PostMessage发送消息。
在98DDK中也有两个函数,_SHELL_PostShellMessage和_SHELL_PostMessage应该也是实现这个功能的,但我没用过。 |
|
|
5楼#
发布于:2001-07-12 22:35
关于共享EVENT:
1)打开驱动程序,获得驱动程序的句柄; 2)建立一个事件,并将事件传递给驱动; 3)在应用程序中设置一个辅助线程,用同步对象挂起; 这样,驱动程序就可以和应用程序通信了。 |
|
|
6楼#
发布于:2001-07-13 08:31
谢谢各位大虾,小弟不胜感激!
|
|
7楼#
发布于:2001-07-13 12:15
没关系,大家共同提高。
BTW:别忘了散分。 |
|
|
8楼#
发布于:2001-07-13 22:26
用户被禁言,该主题自动屏蔽! |
|
9楼#
发布于:2001-07-13 23:46
在Win32环境下,你可以用3中方法:
1.消息方式 2.APC(Asynchronous Procedure Calls)异步过程调用机制 3.Win32事件机制 消息方式是一种被动的方法,VxD通过外壳VxD(SHELL VxD)将消息送入系统的消息队列,便可通知应用程序.但消息队列是由系统管理的,很有可能被延迟,即时性差; Apc机制通过DeviceIoControl将回调函数的地址传给VxD,然后应用程序执行Win32调用SleepEx将其自身置为“挂起”(asleep yet alertable)状态时。当应用程序处于“挂起”状态,VxD能够通过VWIN32 VxD提供的QueueUserApc服务调用应用程序的回调函数。效不高,应用程序在唤醒前是无限期的等待. Win32事件机制是最好但也最不好掌握的方法,但及时性相当好.App可以开一个字线程用于等待被VxD唤醒,主线程继续做其他的事务;VWIN32 VxD提供了一些可以访问Win32事件的Api: _VWIN32_ResetWin32Event _VWIN32_SetWin32Event _VWIN32_PulseWin32Event _VWIN32_WaitSingleObject _VWIN32_WaitMultipleObjects 利用这些服务,VxD可唤醒一个等待的Win32应用程序线程,或是等待被一个Win32应用程序线程唤醒。不幸的是VxD不只是通过简单调用相应的事件服务,就能够获得Win32事件的句柄。因此,为获得Win32事件的句柄要涉及到一个复杂的过程和一个未公布的系统调用(OpenVxDHandle这是个例外,可以通过别名引用,Gates良心发现:D)。事件通常是由应用程序产生(Win32 API CreateEvent),然后使用未公布的Win32 API函数OpenVxDHandle将获得的事件句柄(Ring3)转换为VxD事件句柄(Ring0),再通过DeviceIoControl将这一ring 0级事件句柄传给VxD,于是VxD便可将其作为VWIN32事件函数的参数来使用,唤醒App字线程. 可看DDK或VtoolsD下的相关示例. |
|
|
10楼#
发布于:2001-07-14 07:25
LitteSW:
你说的那两个函数,没有吧? 我找了好久.能否再说一次2000下的. |
|
11楼#
发布于:2001-07-14 19:29
2000下好象没有,在98DDK中可以查到。
是VXD用的。 |
|
|
12楼#
发布于:2004-11-06 16:00
小弟还有一个问题不明白,要是第一次通知了他应用程序后,第二次还需要在使用deviceioctrl再传入一次Event吗?就是第一次使用时间通知以后,怎么连续地通知?
|
|