阅读:1677回复:6
Create, Close, Cleanup例程什么时候被调用?
我在DriverEntry里初始化了这三个例程的入口点,
DriverObject->MajorFunction[IRP_MJ_CREATE]=DriverCreate; DriverObject->MajorFunction[IRP_MJ_CLEANUP]=DriverCleanup; DriverObject->MajorFunction[IRP_MJ_CLOSE]=DriverClose; 但是我的应用程序在调用CreateFile获得设备句柄时却跳到DriverClose里两次,其他的操作,如启动驱动程序,停止驱动程序,释放获得的设备句柄,都不会跳到这三个例程中。这是怎么一回事?这三个例程究竟什么时候被调用? |
|
|
沙发#
发布于: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属于这个文件对象但仍停留在你的队列中。从驱动程序的角度来看,这些请求都有一个共同点,即在任何时刻它们的堆栈单元都指向同一个文件对象。 |
|
|
板凳#
发布于:2002-04-15 14:39
谢谢。那本书叫什么名字?
那么,在应用程序调用CreateFile时,应该调用到Create例程,在CloseHandle时,调用Cleanup和Close例程,对吧?过去我也是这么理解的,但今天用SoftIce跟了一下,却发现了上述奇怪的现象。不信你试试看。 |
|
|
地板#
发布于:2002-04-15 15:18
书的名字:
programming the windows driver model waltoney著 驱动网就有下载的,中英文版都有 肯定是那里搞错了,这种情况怎么会有呢。 |
|
|
地下室#
发布于:2002-04-16 14:09
我在这三个例程中打印调试信息,确确实实在CreateFile的时候调用了两次Close例程,其他两个压根儿就没调用过。而且,代码就这么几行,在DriverObject的相应位置填上这几个例程的名称,没有什么特殊的啦。
What\'s wrong??? |
|
|
5楼#
发布于:2002-04-16 14:28
代码贴出来看看
|
|
|
6楼#
发布于:2002-04-16 16:27
除了上面三行在DriverEntry中注册例程的入口之外,就是三个例程了。
NTSTATUS DriverCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { KdPrint(\"DriverCreate routine.\\n\"); return STATUS_SUCCEESS; } 没有什么特殊啦。 |
|
|