阅读:1881回复:2
请教斑竹和大虾们:passthru中的ptunload什么时候被调用?
我从ntddk\src中拷了一份干净的passthru,在ptunload中加入了一行:DbgPrint("ptunload");
编译连接后,打开dbgview,观察DbgPrint的输出。然后卸载passthru,在dbgview中,我没有发现 DbgPrint("ptunload");的输出。 我不知道ptunload被调用时的上下文和IRQL,可我想IRQL总不至于是DIRQL吧!microsoft在ptunload 中调用NdisDeregisterProtocol,而NdisDeregisterProtocol的IRQL <= DISPATCH_LEVEL, 所以ptunload最多是个DISPATCH_LEVEL,那我的DbgPrint应该有输出呀! 我开始怀疑ptunload有没有被调用,而让我加深这种怀疑的是我在ptunload中,在NdisDeregisterProtocol后 加入的下面的代码: if(DeviceHandle) { Status = NdisMDeregisterDevice(DeviceHandle); if(NT_SUCCESS(Status)) { DbgPrint("PtUnload : Success NdisMDeregisterDevice"); DeviceHandle = NULL; } else { DbgPrint("PtUnload : Fail NdisMDeregisterDevice"); } } 重新编译安装,我的device object和symbolic link已经成功的建立了,并且应用程序可以成功地create、 deviceiocontrol、close,当我选择卸载passthru后,我在dbgview没有发现ptunload中的任何DbgPrint 输出,并且这时我的app仍然可以访问device object,可以create, deviceiocontrol和close,种种结果 表明,ptunload根本没有被调用,从passthru的DriverEntry里看:NdisMRegisterUnloadHandler( WrapperHandle, PtUnload); ptunload是这个Driver的Unload例程,如果我们选卸载或是自己用SCM的 DeleteService(对NT4 driver)应该是可以触发这个Unload例程的。 我想请问大虾们,你们的ptunload被调用过吗? 如果没有,那岂不是NdisDeregisterProtocol也泡汤了?难道要在我见到上帝的时候被调用? 可总不能留着device object和symbolic link不管呀?没办法,只好想着往别处加,ddk有这么一句话: "A driver calls NdisMDeregisterDevice from its Halt or Unload function to deregister a stand-alone device object that it previously created with NdisMRegisterDevice." unload不行,那就试试halt吧,我就把上面的代码加到了MPHalt中,重新编译安装后,选卸载,嘿,倒成功了。 在dbgview中看到了"Success NdisMDeregisterDevice"输出;用winobj看不到设备对象和符号连接了; 用app访问,句柄返回VALID_HANDLE_VALUE。 不过,关于这段代码的地方,咋想咋不顺,删除一个驱动程序的设备对象和符号连接应该放在这个驱动程序的Unload 例程呀!(如packet在PacketUnload中删除符号连接和设备对象、卸掉协议)如果passthru是个miniport driver的话,倒还罢了,miniport driver的halt例程也就标志着 这个driver的结束;可passthru是个imd,它还有个protocol部分呀,miniport部分的halt能标志着imd的 结束吗? 删除设备对象和符号连接代码应该放在哪里更合适、更安全一些呀? 归根到底,还是对passthru卸载的流程不熟悉,请各位大虾指教。 上面的分析如果有错误的地方,务请大虾们指出,谢谢! 顺便问一句:我的ptreceive中的 Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); packet为什么总返回NULL,什么情况下返回非NULL? |
|
最新喜欢:txysp |
沙发#
发布于:2002-05-04 20:38
不能怪你,要怪m$
|
|
板凳#
发布于:2002-07-15 16:21
对于第一个问题,很可能是个Bug。我经常安装修改后的程序时,却发现运行的是修改前的程序,怀疑是老程序没有被完全卸载掉。
|
|