5101|8

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

USB过滤驱动如何识别插入的设备是U盘还是移动硬盘? [复制链接]

最近才开始接触驱动程序,要做一个USB过滤驱动,其中需要识别U盘和移动硬盘并进行处理,其他的USB设备不做处理,请问大家应该怎么做?

最新回复

你把你的Filter驱动加载到系统 的Mass  Storage上面就可以了,这个驱动是USB 移动设备的驱动程序,因此他只可能是USB的移动存储设备。 蓝屏的时候,你通过WinDBG可以看到你哪个代码、哪行蓝屏就OK了。  详情 回复 发表于 2009-9-7 09:08
点赞 关注

回复
举报

90

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
读出来的配置信息中 应该有吧。
不太清楚,帮顶下。
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
是不是要截获IRP_MJ_QUERY_INFORMATION?
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼主找本书刊下嘛,讲usb驱动好多的。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
那本书?推荐一下
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
我在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吧?
蓝屏是什么原因呢
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
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;
        }       
}
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 
这个帮不了你哦,我也是新手,而且还没仔细看过usb驱动。
《windows驱动开发技术详解》这本据说是经典,我在看呢。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
你把你的Filter驱动加载到系统 的Mass  Storage上面就可以了,这个驱动是USB 移动设备的驱动程序,因此他只可能是USB的移动存储设备。

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

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表