fqhuang
驱动牛犊
驱动牛犊
  • 注册日期2001-07-09
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2467回复:12

帮帮我:驱动程序怎样通知应用程序?

楼主#
更多 发布于:2001-07-10 18:14
假如有一串口驱动程序,在收到数据以后,他怎样通知上层应用程序?
救救小弟吧!

最新喜欢:

utahyjutahyj
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-07-10 18:31
有两种方法:
1.通过发送消息通知上层应用程序;
2.应用程序和驱动之间共享一个Event。
穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
KDriver
驱动中牛
驱动中牛
  • 注册日期2001-06-09
  • 最后登录2008-09-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-07-11 09:38
还有一个方法就是,发一个异步的IOCONTROL包(用DeviceIoControl),驱动程序在收到数据后才IoCompleteRequest它。看programming WDM吧,第九章。
“萎软”,是Microsoft的小名!
peng-416
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-07-11 12:30
LitteSW:

   请你说说如何发送消息给Win32 ?
这个问题我研究很久,总没有结果.这是一种主动的方法么?
先谢谢 .
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-07-12 12:08
用VTOOLSD中的SHELL_PostMessage发送消息。

在98DDK中也有两个函数,_SHELL_PostShellMessage和_SHELL_PostMessage应该也是实现这个功能的,但我没用过。
穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-07-12 22:35
关于共享EVENT:
1)打开驱动程序,获得驱动程序的句柄;
2)建立一个事件,并将事件传递给驱动;
3)在应用程序中设置一个辅助线程,用同步对象挂起;

这样,驱动程序就可以和应用程序通信了。
穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
fqhuang
驱动牛犊
驱动牛犊
  • 注册日期2001-07-09
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2001-07-13 08:31
谢谢各位大虾,小弟不胜感激!
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-07-13 12:15
没关系,大家共同提高。

BTW:别忘了散分。
穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
lcx119
禁止发言
禁止发言
  • 注册日期2001-07-12
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2330分
  • 威望11503点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2001-07-13 22:26
用户被禁言,该主题自动屏蔽!
dolphin
驱动中牛
驱动中牛
  • 注册日期2001-04-30
  • 最后登录2013-03-08
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望23点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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下的相关示例.
[b]弃我去者昨日之日不可留,乱我心者今日之日多烦忧。[/b]
peng-416
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2001-07-14 07:25
LitteSW:
     你说的那两个函数,没有吧?
我找了好久.能否再说一次2000下的.
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2001-07-14 19:29
2000下好象没有,在98DDK中可以查到。
是VXD用的。
穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
yueleixinghan
驱动牛犊
驱动牛犊
  • 注册日期2004-08-21
  • 最后登录2005-05-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-11-06 16:00
小弟还有一个问题不明白,要是第一次通知了他应用程序后,第二次还需要在使用deviceioctrl再传入一次Event吗?就是第一次使用时间通知以后,怎么连续地通知?
游客

返回顶部