首页
社区
课程
招聘
[求助]简单的过滤驱动测试为何通不过
发表于: 2013-3-9 10:55 5607

[求助]简单的过滤驱动测试为何通不过

2013-3-9 10:55
5607

以下是一个简单的过滤驱动,简单将所有irp转发到下一层。我把它注册为卷过滤驱动,当只有1个卷的时候,运行正常,当有2个卷的时候就蓝屏了,为什么?
如果把它注册为磁盘过滤驱动,则不管1个磁盘还是2个磁盘,都蓝屏,为什么?
求驱动大牛指教。

#include <ntddk.h>
#include <wdm.h>

typedef struct MYFILTER_DEV_EXTENSION_
{
        PDEVICE_OBJECT                        FltDevObj;
        PDEVICE_OBJECT                        LowerDevObj;
        PDEVICE_OBJECT                        PhyDevObj;

} MYFILTER_DEV_EXTENSION, *PMYFILTER_DEV_EXTENSION;

NTSTATUS
myAddDevice(
    IN        PDRIVER_OBJECT        DriverObject,
    IN        PDEVICE_OBJECT        PhysicalDeviceObject
    )
{
        NTSTATUS        ntStatus = STATUS_SUCCESS;
        PMYFILTER_DEV_EXTENSION MyFlt_Ext;
        PDEVICE_OBJECT        FltDevObj = NULL;
        PDEVICE_OBJECT        LowerDevObj = NULL;
        ntStatus = IoCreateDevice(
                DriverObject,
                sizeof(MYFILTER_DEV_EXTENSION),
                NULL,
                FILE_DEVICE_DISK,
                FILE_DEVICE_SECURE_OPEN,
                FALSE,
                &FltDevObj);
        ntStatus = IoAttachDeviceToDeviceStackSafe(
                FltDevObj,
                PhysicalDeviceObject,
                &LowerDevObj);
        MyFlt_Ext=(PMYFILTER_DEV_EXTENSION)FltDevObj->DeviceExtension;
        MyFlt_Ext->LowerDevObj=LowerDevObj;
        return STATUS_SUCCESS;
}

VOID
myUnload(
        IN        PDRIVER_OBJECT        DriverObject
        )
{
        UNREFERENCED_PARAMETER(DriverObject);
        return;
}

NTSTATUS myDispatchAny( IN PDEVICE_OBJECT  DeviceObject, IN PIRP  Irp )
{       
        PMYFILTER_DEV_EXTENSION MyFlt_Ext;       
        PDEVICE_OBJECT lowdev;
        IoSkipCurrentIrpStackLocation(Irp);
        MyFlt_Ext=PMYFILTER_DEV_EXTENSION (DeviceObject->DeviceExtension);
        lowdev=MyFlt_Ext->LowerDevObj;
        return(IoCallDriver(lowdev, Irp));
}

NTSTATUS
DriverEntry(
    IN        PDRIVER_OBJECT        DriverObject,
    IN        PUNICODE_STRING        RegistryPath
    )
{
        int i;
        for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
        {
                DriverObject->MajorFunction[i] = myDispatchAny;
        }

        DriverObject->DriverExtension->AddDevice = myAddDevice;
        DriverObject->DriverUnload = myUnload;
        return STATUS_SUCCESS;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
dump在手,windbg有,符号代码都有,直接上调试就行了...

目测myDispatchAny 访问不和谐内存直接咔嚓碎掉~
2013-3-9 12:45
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请注意,在虚拟机只有一个卷,就是只有C盘的情况下,我这个过滤驱动挂载的卷FtDisk.sys的upperfiler上面,是成功运行了的。开机启动以后,正常进入桌面,使用xuetr查看,我的过滤驱动是挂载在Ftdisk.sys上面的VolSnap上面的。
但是我把分区增加到2个,同时存在C盘和D盘的情况下,启动系统没多久就出现蓝屏,而错误信息是classpnp.sys出错。
把这个过滤驱动挂载到Disk.sys的upperfilter上面,直接出错,也是classpnp.sys出错。不管是1个磁盘还是2个磁盘,1个磁盘也通不过,而1个卷的情况,正常进入了桌面。
2013-3-9 13:27
0
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
都说的很清楚了
看dump
现象啥的 真的不好诊断
2013-3-9 15:03
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
其实源代码很简单,
AddDevice函数,就调用两个函数
IoCreateDevice
IoAttachDeviceToDeviceStackSafe
Dispatch函数,也就调用两个函数,直接把irp传递给下层,这么简单的源代码,是不是哪里有错误呢?
难道简单传递给下层irp,还要加自旋锁吗?
IoSkipCurrentIrpStackLocation(Irp);
return(IoCallDriver(lowdev, Irp))
2013-3-9 15:20
0
雪    币: 40
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
LZ问题解决了否?
2013-7-14 00:45
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
早就解决了,忘记设置flag了。
正确设置flag以后就好了。
2013-7-15 10:15
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
8
Flag怎么设置的, 填的什么值的组合, 能贴出来么?
谢谢
2013-7-15 11:22
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
读取磁盘设备的缓冲flags啊,然后,磁盘设备是什么标志,你的缓冲区就设置什么标志.
2013-7-17 11:47
0
游客
登录 | 注册 方可回帖
返回
//