eric.hee
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2002-10-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1334回复:4

关于驱动的卸载问题,60分!

楼主#
更多 发布于:2002-05-30 16:35
大家好,小弟最近写了一个TCP Filter
结果出了一些问题,驱动可以正常的动态加载和动态卸载。

但是如果在抓包的过程中突然用driver monitor
执行unload,就会出错。

我怀疑是有些IRP没有处理完,在这个时候卸载会
出问题,于是加了计数器IrpsInProgress,并把他
定义在DeviceExtension中。


//在driverentry中
NTSTATUS DriverEntry( IN PDRIVER_OBJECT NFDriverObject, IN PUNICODE_STRING RegistryPath )
{
  .........
  deviceextension->IrpsInProgress = 0;
  ...........
}
//在过滤函数中

NTSTATUS PassThrough( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
  ..........
  IoCopyCurrentIrpStackLocationToNext(Irp);
  InterlockedIncrement(&(deviceextension->IrpsInProgress));
  IoSetCompletionRoutine( Irp,
                          NFGenericCompletion,
                          NULL,
                          TRUE,
                          TRUE,
                          TRUE
                        );


  ........................
}

//call back 处理


NTSTATUS NFGenericCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context )
{
   ...............................
   if(Irp->PendingReturned)
   {
      IoMarkIrpPending(Irp);
   }
   InterlockedDecrement(&(deviceextension->IrpsInProgress));
   return STATUS_SUCCESS;
}


然后在unload的时候等待,一直等到
deviceextension->IrpsInProgress为0才IoDeleteDevice,
结果发现还是不行,各位有经验的兄台有没有遇到过这种
问题的?该怎么解决呢?

多谢!!!!!

最新喜欢:

hbnhbnhbnhbnhbn...
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-06-01 09:08
用户被禁言,该主题自动屏蔽!
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-31 16:38
引用:
――――――――――――――――――――――――――――――
大家好,小弟最近写了一个TCP Filter
结果出了一些问题,驱动可以正常的动态加载和动态卸载。

但是如果在抓包的过程中突然用driver monitor
执行unload,就会出错。

我怀疑是有些IRP没有处理完,在这个时候卸载会
出问题,于是加了计数器IrpsInProgress,并把他
定义在DeviceExtension中。


//在driverentry中
NTSTATUS DriverEntry( IN PDRIVER_OBJECT NFDriverObject, IN PUNICODE_STRING RegistryPath )
{
  .........
  deviceextension->IrpsInProgress = 0;
  ...........
}
//在过滤函数中

NTSTATUS PassThrough( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
  ..........
  IoCopyCurrentIrpStackLocationToNext(Irp);
  InterlockedIncrement(&(deviceextension->IrpsInProgress));
  IoSetCompletionRoutine( Irp,
                          NFGenericCompletion,
                          NULL,
                          TRUE,
                          TRUE,
                          TRUE
                        );


  ........................
}

//call back 处理


NTSTATUS NFGenericCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context )
{
   ...............................
   if(Irp->PendingReturned)
   {
      IoMarkIrpPending(Irp);
   }
   InterlockedDecrement(&(deviceextension->IrpsInProgress));
   return STATUS_SUCCESS;
}


然后在unload的时候等待,一直等到
deviceextension->IrpsInProgress为0才IoDeleteDevice,
结果发现还是不行,各位有经验的兄台有没有遇到过这种
问题的?该怎么解决呢?

多谢!!!!!
 

――――――――――――――――――――――――――――――
你的想法没有错,但从你的代码看你只防止了驱动卸载时没有IRP在处理,但并不能防止在卸载的过程中又有IRP进来--你在PassThrough函数中没有判断是否可以处理该IRP。为防止此情况你可以用一个变量来标示驱动是否要卸载,此时所有的IRP都应返回失败(除了要卸载的IRP)
eric.hee
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2002-10-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-05-31 15:53
恩。。。。。现象是这样的。。。。。

正常情况下都能卸载没有问题,
但如果在抓包过程中,有大量的IRP
在处理,这时候忽然卸载就会死机。。。。。
yxjoyce
驱动牛犊
驱动牛犊
  • 注册日期2002-04-15
  • 最后登录2003-04-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-31 15:39
你问题的现象是什么?
游客

返回顶部