SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1914回复:4

内核事件的计数器处理问题.

楼主#
更多 发布于:2005-01-22 02:31
关于使用事件实现驱动与Win32 AP通迅的例子已经很多了。
但我在实际使用中,发现了一些关于Windows 计数的问题,请各位指教一下:

案例一: 我希望驱动建立一个事件,然后由Win32 AP来读取信息。
于是Win32 AP启动时,会如下操作:
h1=CreateFile("\\.\Driver1")
DeviceIoControl(h,Cmd_EventReady,...)    //驱动建立事件 Event1
h2=OpenEvent("Event1")

Driver中的例程:
DeviceIoControl(obj, irp)
 case Cmd_EventReady:
    Event=IoCreateSynchronizationEvent(&EventName,&EventHandle);
  
这时建立成功, Event指针为FCEA59B0, 用windbg 查看,
!object FCEA59B0
HandleCount: 2  PointerCount: 3

这时, 两个 Handle 均为 Win32 AP相关,如果Win32程序退出,那么 事件Event1会消失,这是什么原因呢?
有办法在Driver中,创建完事件后,就立即增加其 HandleCount 计数吗?
我试过所有 ObReferenceObject ,但它们只会增加 PointerCount。

我能在驱动中,用 ZwCreateFile 来打开的事件,以达到增加事件的HandleCount的值吗?
或者还有其它的方法?

梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
simba
驱动牛犊
驱动牛犊
  • 注册日期2002-01-28
  • 最后登录2009-02-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-22 03:07
你建立共享事件的位置大约没有问题吧?
再有就是你为什么要驱动建立事件而不是APP呢?

关于使用事件实现驱动与Win32 AP通迅的例子已经很多了。
但我在实际使用中,发现了一些关于Windows 计数的问题,请各位指教一下:

案例一: 我希望驱动建立一个事件,然后由Win32 AP来读取信息。
于是Win32 AP启动时,会如下操作:
h1=CreateFile(".Driver1")
DeviceIoControl(h,Cmd_EventReady,...)    //驱动建立事件 Event1
h2=OpenEvent("Event1")

Driver中的例程:
DeviceIoControl(obj, irp)
 case Cmd_EventReady:
    Event=IoCreateSynchronizationEvent(&EventName,&EventHandle);
  
这时建立成功, Event指针为FCEA59B0, 用windbg 查看,
!object FCEA59B0
HandleCount: 2  PointerCount: 3

这时, 两个 Handle 均为 Win32 AP相关,如果Win32程序退出,那么 事件Event1会消失,这是什么原因呢?
有办法在Driver中,创建完事件后,就立即增加其 HandleCount 计数吗?
我试过所有 ObReferenceObject ,但它们只会增加 PointerCount。

我能在驱动中,用 ZwCreateFile 来打开的事件,以达到增加事件的HandleCount的值吗?
或者还有其它的方法?

 


[编辑 -  1/22/05 by  simba]
SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-22 11:52
其实由Win AP来建立事件,也是一样的。
由 Win AP来建立事件,也需要将 Win AP的事件句柄传进Driver中,再由Driver使用 ObReferenceObjectByHandle(
     *((PHANDLE)Irp->AssociatedIrp.SystemBuffer),
     0, (POBJECT_TYPE) NULL,
     UserMode, (PVOID)&UserEvent,
     (POBJECT_HANDLE_INFORMATION) NULL);
相关的资料说,这时会增加 事件的 handleCount,但我检测不到。

我采用由驱动建立,是因为我在上面有多个AP。我现在在Driver中建立的事件的方法是
// Create event for user-mode processes to monitor
 RtlInitUnicodeString(&uszNotifyEventString,
     L"\\BaseNamedObjects\\KnotifyEvent");
 extension->NotifyEvent =  
     IoCreateNotificationEvent(&uszNotifyEventString,
         &extension->NotifyHandle);
这个 NotifyHandle,有什么用呢?我发现这个 NotifiyHandle好像也属于Win App(因为我的IoCreate由Win App触发),一旦Win App close, 那 NotifyHandle 也失效
梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
SunMing.Cai
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-22 15:43
换个简单的说法
我在Win32APP中创建一个事件,然后传给driver(用obRefereByHandle获得kevent)。但当 Win32APP关闭时,事件对象就消失了,要怎样才能固定这个事件呢?
让下次 Win32 App 可以直接 OpenEvent即可.

我测试了,无论 事件是先由 APP 创建,还是先由 Driver 创建(在DeviceIoControl),也是一样的。
前者还说得过去,但后者,事件由Driver用IoCreateSynchronizationEvent创建,为什么Win32APP关闭后,也会消失呢?
注:事件消失是指在 \BaseNameObjects 下找不到了(用Windbg监视得到)
梦想驱动人生 ------------------------ MSN:saleonnet@hotmail.com ICQ:175745619 OQ:14892627
simba
驱动牛犊
驱动牛犊
  • 注册日期2002-01-28
  • 最后登录2009-02-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-22 17:20
嗯...看来你是还有好几个APP并行,难怪,不过不止一种方法约定这个事件,如果APP建可以传handle然后用obRefereByHandle,也可以先约好名称,直接IoCreateSynchronizationEvent,我用的后者,事件存在的周期受ZwClose(Handle)和CloseHandle(hEvent)影响,但不用在驱动里找handle。

还有就是你的APP什么时候CloseHandle(hEvent)的?呵呵
游客

返回顶部