阅读:1334回复:4
关于驱动的卸载问题,60分!
大家好,小弟最近写了一个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, 结果发现还是不行,各位有经验的兄台有没有遇到过这种 问题的?该怎么解决呢? 多谢!!!!! |
|
最新喜欢:![]() |
沙发#
发布于:2002-06-01 09:08
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2002-05-31 16:38
引用:
―――――――――――――――――――――――――――――― 大家好,小弟最近写了一个TCP Filter ―――――――――――――――――――――――――――――― 你的想法没有错,但从你的代码看你只防止了驱动卸载时没有IRP在处理,但并不能防止在卸载的过程中又有IRP进来--你在PassThrough函数中没有判断是否可以处理该IRP。为防止此情况你可以用一个变量来标示驱动是否要卸载,此时所有的IRP都应返回失败(除了要卸载的IRP) |
|
地板#
发布于:2002-05-31 15:53
恩。。。。。现象是这样的。。。。。
正常情况下都能卸载没有问题, 但如果在抓包过程中,有大量的IRP 在处理,这时候忽然卸载就会死机。。。。。 |
|
地下室#
发布于:2002-05-31 15:39
你问题的现象是什么?
|
|