lecy-2005
驱动牛犊
驱动牛犊
  • 注册日期2008-06-30
  • 最后登录2009-05-10
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望128点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2277回复:6

为什么sfilter不能实现与应用程序通信

楼主#
更多 发布于:2009-03-27 22:59
我修改了分派例程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。万分感激
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
沙发#
发布于: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.
lecy-2005
驱动牛犊
驱动牛犊
  • 注册日期2008-06-30
  • 最后登录2009-05-10
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望128点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-03-29 17:15
thank u!
wesley2005
驱动牛犊
驱动牛犊
  • 注册日期2007-06-16
  • 最后登录2011-03-29
  • 粉丝1
  • 关注0
  • 积分34分
  • 威望327点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-04-03 16:39
在SfPassThrough中,如果发现targetDevice是自己的ControlDevice,那么,应该complete该IRP。

另外,像那位大哥说的,应该学会一些调试技术。
peng_intel
驱动牛犊
驱动牛犊
  • 注册日期2008-02-28
  • 最后登录2009-06-27
  • 粉丝0
  • 关注0
  • 积分248分
  • 威望76点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-04-23 05:20
回 1楼(michaelgz) 的帖子
你好,我想问一下:
现在我用写了一个应用程序和键盘过滤驱动通信,DevicePath是可以得到的,但是用CreateFile函数连接这个设备的时候,当进入驱动程序的Create函数时,竟然返回的NTSTATUS是c0000022(STATUS_ACCESS_DENIED),我就郁闷了,为什么呢?是没有足够的权限吗?

PS:我以前做DISK的lowerfilter的时候也是用Symblic Link来通信,很正常。
treeyan
驱动牛犊
驱动牛犊
  • 注册日期2008-04-14
  • 最后登录2013-09-11
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望487点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分1分
5楼#
发布于:2009-04-23 22:48
去掉自旋锁对,包你不会蓝了.
       KeAcquireSpinLock( &gControlDeviceStateLock, &oldIrql );            
       KeReleaseSpinLock( &gControlDeviceStateLock, oldIrql );
 
treeyan
驱动牛犊
驱动牛犊
  • 注册日期2008-04-14
  • 最后登录2013-09-11
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望487点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分1分
6楼#
发布于:2009-04-23 22:50
汗 还有
return Irp->IoStatus.Status;
已经完成了 IRP 不要访问其中成员
游客

返回顶部