社区导航

 

搜索
查看: 3677|回复: 8

USB过滤驱动如何识别插入的设备是U盘还是移动硬盘?

[复制链接]

109

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 09:04 | 显示全部楼层 |阅读模式
最近才开始接触驱动程序,要做一个USB过滤驱动,其中需要识别U盘和移动硬盘并进行处理,其他的USB设备不做处理,请问大家应该怎么做?

138

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 10:06 | 显示全部楼层
读出来的配置信息中 应该有吧。
不太清楚,帮顶下。

回复

使用道具 举报

109

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-2 10:07 | 显示全部楼层
是不是要截获IRP_MJ_QUERY_INFORMATION?

回复

使用道具 举报

104

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-3 10:23 | 显示全部楼层
楼主找本书刊下嘛,讲usb驱动好多的。

回复

使用道具 举报

105

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-3 13:23 | 显示全部楼层
那本书?推荐一下

回复

使用道具 举报

94

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-3 17:33 | 显示全部楼层
我在AddDevice函数是这么写的,但是重启的时候蓝屏了
NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{       
        // AddDevice

        //确保当前函数运行在分页内存中
        PAGED_CODE();
        NTSTATUS status;

        PDEVICE_OBJECT fido;
        ULONG DeviceType = 0;
        DeviceType = GetDeviceTypeToUse(pdo);
        if (DeviceType == FILE_DEVICE_DISK)
        {
                KdPrint(("IDE disk!"));
                return STATUS_SUCCESS;
        }
        else if (DeviceType == FILE_DEVICE_MASS_STORAGE)
        {
                KdPrint(("usb disk!"));
        }

        //创建设备对象
        status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL,
                DeviceType, 0, FALSE, &fido);
        //判断是否成功创建设备对象
        if (!NT_SUCCESS(status))
        {                                                // can't create device object
                KdPrint((DRIVERNAME " - IoCreateDevice failed - %X\n", status));
                //如果不能成功创建设备对象就返回
                return status;
        }                                                // can't create device object

        //获得设备扩展
        PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;

        do
        {                                                // finish initialization
                //初始化自旋锁
                IoInitializeRemoveLock(&pdx->RemoveLock, 0, 0, 0);
                pdx->DeviceObject = fido;
                pdx->Pdo = pdo;
                //将过滤驱动附加在底层驱动之上
                PDEVICE_OBJECT fdo = IoAttachDeviceToDeviceStack(fido, pdo);
                if (!fdo)
                {                                        // can't attach                                                                 
                        KdPrint((DRIVERNAME " - IoAttachDeviceToDeviceStack failed\n"));
                        status = STATUS_DEVICE_REMOVED;
                        break;
                }                                        // can't attach
                //记录底层驱动
                pdx->LowerDeviceObject = fdo;
                //由于不知道底层驱动是直接IO还是BufferIO,因此将标志都置上
                fido->Flags |= fdo->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO | DO_POWER_PAGABLE);
                // Clear the "initializing" flag so that we can get IRPs
                fido->Flags &= ~DO_DEVICE_INITIALIZING;
        }        while (FALSE);                                        // finish initialization

        if (!NT_SUCCESS(status))
        {                                        // need to cleanup
                //如果没有成功,则从设备堆栈中删除设备
                if (pdx->LowerDeviceObject)
                        IoDetachDevice(pdx->LowerDeviceObject);
                IoDeleteDevice(fido);
        }                                        // need to cleanup

        return status;
}                                                        // AddDevice

U盘的DeviceType是FILE_DEVICE_MASS_STORAGE,
硬盘的DeviceType是FILE_DEVICE_DISK吧?
蓝屏是什么原因呢

回复

使用道具 举报

104

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-3 17:34 | 显示全部楼层
SCSI派遣函数是这么写的
#pragma LOCKEDCODE
NTSTATUS DispatchForSCSI(IN PDEVICE_OBJECT fido, IN PIRP Irp)
{
    KdPrint((DRIVERNAME " - Enter DispatchForSCSI \n"));
    //获得设备扩展
        PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
        //获得I/O堆栈
        //PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);

        ULONG DeviceType = 0;
        DeviceType = GetDeviceTypeToUse(pdx->Pdo);
        if (FILE_DEVICE_DISK == DeviceType)
        {
                return STATUS_SUCCESS;
        }
        else if (FILE_DEVICE_MASS_STORAGE == DeviceType)
        {
                IoCompleteRequest(Irp,IO_NO_INCREMENT);
                return STATUS_ACCESS_DENIED;
        }       
}

回复

使用道具 举报

120

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-4 10:09 | 显示全部楼层
这个帮不了你哦,我也是新手,而且还没仔细看过usb驱动。
《windows驱动开发技术详解》这本据说是经典,我在看呢。

回复

使用道具 举报

108

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-7 09:08 | 显示全部楼层
你把你的Filter驱动加载到系统 的Mass  Storage上面就可以了,这个驱动是USB 移动设备的驱动程序,因此他只可能是USB的移动存储设备。

蓝屏的时候,你通过WinDBG可以看到你哪个代码、哪行蓝屏就OK了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-4-10 18:37 , Processed in 0.290888 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表