ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1677回复:6

Create, Close, Cleanup例程什么时候被调用?

楼主#
更多 发布于:2002-04-15 09:06
我在DriverEntry里初始化了这三个例程的入口点,
DriverObject->MajorFunction[IRP_MJ_CREATE]=DriverCreate;
DriverObject->MajorFunction[IRP_MJ_CLEANUP]=DriverCleanup;
DriverObject->MajorFunction[IRP_MJ_CLOSE]=DriverClose;
但是我的应用程序在调用CreateFile获得设备句柄时却跳到DriverClose里两次,其他的操作,如启动驱动程序,停止驱动程序,释放获得的设备句柄,都不会跳到这三个例程中。这是怎么一回事?这三个例程究竟什么时候被调用?
没有你,我不知道怎么办...
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-15 11:47
推荐你去看waltoney那本书,讲得很清楚:

当应用程序或其它驱动程序要访问你的设备时,它们首先打开该设备的一个句柄。应用程序可以调用CreateFile函数做到这一点;驱动程序则调用ZwCreateFile函数。在内部,这些函数先创建一个内核文件对象,然后把这个文件对象附加到IRP_MJ_CREATE请求中,最后把IRP_MJ_CREATE请求发往你的驱动程序。当这个句柄完成使命后,应用程序或其它驱动程序就调用CloseHandle或ZwClose函数关闭该句柄。在内部,这些函数向你的驱动程序发送IRP_MJ_CLOSE请求。然而,就在发送IRP_MJ_CLOSE请求前,I/O管理器先向你发送了IRP_MJ_CLEANUP请求,这样你就可以有机会取消所有未处理的IRP,这些IRP属于这个文件对象但仍停留在你的队列中。从驱动程序的角度来看,这些请求都有一个共同点,即在任何时刻它们的堆栈单元都指向同一个文件对象。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-15 14:39
谢谢。那本书叫什么名字?

那么,在应用程序调用CreateFile时,应该调用到Create例程,在CloseHandle时,调用Cleanup和Close例程,对吧?过去我也是这么理解的,但今天用SoftIce跟了一下,却发现了上述奇怪的现象。不信你试试看。
没有你,我不知道怎么办...
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-15 15:18
书的名字:
programming the windows driver model
waltoney著
驱动网就有下载的,中英文版都有

肯定是那里搞错了,这种情况怎么会有呢。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-16 14:09
我在这三个例程中打印调试信息,确确实实在CreateFile的时候调用了两次Close例程,其他两个压根儿就没调用过。而且,代码就这么几行,在DriverObject的相应位置填上这几个例程的名称,没有什么特殊的啦。

What\'s wrong???
没有你,我不知道怎么办...
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-16 14:28
代码贴出来看看
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-16 16:27
除了上面三行在DriverEntry中注册例程的入口之外,就是三个例程了。
NTSTATUS
DriverCreate(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
KdPrint(\"DriverCreate routine.\\n\");
           return STATUS_SUCCEESS;
}

没有什么特殊啦。

没有你,我不知道怎么办...
游客

返回顶部