ldd
ldd
驱动牛犊
驱动牛犊
  • 注册日期2001-08-18
  • 最后登录2003-11-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1832回复:2

请教斑竹和大虾们:passthru中的ptunload什么时候被调用?

楼主#
更多 发布于:2001-08-20 11:47
我从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?

最新喜欢:

txysptxysp
Nemesis2k
驱动牛犊
驱动牛犊
  • 注册日期2002-03-29
  • 最后登录2004-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-04 20:38
不能怪你,要怪m$
ufo_online
驱动牛犊
驱动牛犊
  • 注册日期2002-04-26
  • 最后登录2004-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-15 16:21
对于第一个问题,很可能是个Bug。我经常安装修改后的程序时,却发现运行的是修改前的程序,怀疑是老程序没有被完全卸载掉。
游客

返回顶部