阅读:2390回复:6
为什么sfilter不能实现与应用程序通信
我修改了分派例程sfcreate,代码如下
NTSTATUS SfCreate ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { NTSTATUS status; KIRQL oldIrql; PAGED_CODE(); //这部分代码是进行修改了的 if (DeviceObject == gSFilterControlDeviceObject) { KeAcquireSpinLock( &gControlDeviceStateLock, &oldIrql ); if (gControlDeviceState != CLOSED) { Irp->IoStatus.Status = STATUS_DEVICE_ALREADY_ATTACHED; Irp->IoStatus.Information = 0; } else { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = FILE_OPENED; gControlDeviceState = OPENED; } KeReleaseSpinLock( &gControlDeviceStateLock, oldIrql ); IoCompleteRequest( Irp, IO_NO_INCREMENT ); return Irp->IoStatus.Status; } //主要是前面的这部分代码进行修改了,后面的完全不变 ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject )); if (!FlagOn( SfDebug, SFDEBUG_DO_CREATE_COMPLETION | SFDEBUG_GET_CREATE_NAMES| SFDEBUG_DISPLAY_CREATE_NAMES )) { IoSkipCurrentIrpStackLocation( Irp ); return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); } else { KeInitializeEvent( &waitEvent, NotificationEvent, FALSE ); IoCopyCurrentIrpStackLocationToNext( Irp ); IoSetCompletionRoutine( Irp, SfCreateCompletion, &waitEvent, TRUE, TRUE, TRUE ); status = IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); if (STATUS_PENDING == status) { NTSTATUS localStatus = KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, NULL); ASSERT(STATUS_SUCCESS == localStatus); } ASSERT(KeReadStateEvent(&waitEvent) || !NT_SUCCESS(Irp->IoStatus.Status)); if (FlagOn(SfDebug, (SFDEBUG_GET_CREATE_NAMES|SFDEBUG_DISPLAY_CREATE_NAMES))) { SfDisplayCreateFileName( Irp ); } status = Irp->IoStatus.Status; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return status; } } 并且添加了DriverObject->[IRP_MJ_DEVICE_CONTROL]=sfIoDeviceControl分派例程。 但是问题出现在应用程序中使用CreateFile打开过滤驱动的控制设备时便会立即蓝屏,把应用程序改得非常简单就只剩CreateFile语句了,还是蓝屏。所以判断是sfilter中的sfCreate写得有问题,请大虾帮忙看看我上面贴出的代码有什么问题,这是从filespy中直接搬下来使用的,之前我自己写的是更简单的直接完成Irp返回成功,但也是蓝屏。如果不是sfCreate的问题,请有经验的高手指出其他可能的要注意的问题。 郁闷啊!!!怎么调试都是蓝屏,请做过sfilter与应用程序通信的高手指点一下问题所在,或者发给我实例代码参考一下,邮箱150350094@qq.com。万分感激 |
|
沙发#
发布于:2009-03-28 14:59
First, check device names in driver and your user mode application. They must be match. I think your application is using a wrong device name
Second, your CREATE dispatch routine completes IRP twice. I think this is the main reason why you see BSOD. Third, it's time for you to learn WinDbg now. I don't think a driver can be developed without using debugger. |
|
板凳#
发布于:2009-03-29 17:15
thank u!
|
|
地板#
发布于:2009-04-03 16:39
在SfPassThrough中,如果发现targetDevice是自己的ControlDevice,那么,应该complete该IRP。
另外,像那位大哥说的,应该学会一些调试技术。 |
|
地下室#
发布于:2009-04-23 05:20
回 1楼(michaelgz) 的帖子
你好,我想问一下:现在我用写了一个应用程序和键盘过滤驱动通信,DevicePath是可以得到的,但是用CreateFile函数连接这个设备的时候,当进入驱动程序的Create函数时,竟然返回的NTSTATUS是c0000022(STATUS_ACCESS_DENIED),我就郁闷了,为什么呢?是没有足够的权限吗? PS:我以前做DISK的lowerfilter的时候也是用Symblic Link来通信,很正常。 |
|
5楼#
发布于:2009-04-23 22:48
去掉自旋锁对,包你不会蓝了.
KeAcquireSpinLock( &gControlDeviceStateLock, &oldIrql ); KeReleaseSpinLock( &gControlDeviceStateLock, oldIrql ); ![]() |
|
6楼#
发布于:2009-04-23 22:50
汗 还有
return Irp->IoStatus.Status; 已经完成了 IRP 不要访问其中成员 |
|