MagicFuzzX
驱动牛犊
驱动牛犊
  • 注册日期2011-11-04
  • 最后登录2015-11-24
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望271点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3032回复:8

使用toaster\wdm\filter对U盘进行控制的几个问题

楼主#
更多 发布于:2012-03-01 16:27
我是在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E967-E325-11CE-BFC1-08002BE10318}(Disk Driver)下面增加一个Lowerfilter。

1.对U盘的识别问题,有人在AddDevice例程进行判断,不过这个例程应该只是在驱动初始化的时候调用一次,那么在驱动初始化后再插入的U盘如何识别呢?

2.如何读取U盘的指定扇区,在哪里读取呢?
catface
驱动小牛
驱动小牛
  • 注册日期2009-01-11
  • 最后登录2014-03-09
  • 粉丝1
  • 关注1
  • 积分155分
  • 威望1341点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2012-03-02 10:04
你加的是类驱动 所有USB 能正常工作的流程下 都会被这个驱动过滤到  不是驱动初始化调用一次  而是每次有设备被过滤到 就ADDDEVICE一次 这个可以动手实验
 
读取磁盘扇区 获取磁盘的设备名或者设备指针或者设备句柄  
使用READFILE 就可以
MagicFuzzX
驱动牛犊
驱动牛犊
  • 注册日期2011-11-04
  • 最后登录2015-11-24
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望271点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2012-03-02 13:06
回 catface 的帖子
catface:你加的是类驱动 所有USB 能正常工作的流程下 都会被这个驱动过滤到  不是驱动初始化调用一次  而是每次有设备被过滤到 就ADDDEVICE一次 这个可以动手实验
 
读取磁盘扇区 获取磁盘的设备名或者设备指针或者设备句柄  
使用READFILE 就可以
(2012-03-02 10:04)

Zwreadfile可以吗?我看到很多人都是自己构造SRB发送IRP啊
MagicFuzzX
驱动牛犊
驱动牛犊
  • 注册日期2011-11-04
  • 最后登录2015-11-24
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望271点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2012-03-02 16:39
如何判断U盘啊,在disk Lowerfilter下面如何判断啊
catface
驱动小牛
驱动小牛
  • 注册日期2009-01-11
  • 最后登录2014-03-09
  • 粉丝1
  • 关注1
  • 积分155分
  • 威望1341点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分2分
地下室#
发布于:2012-03-03 14:32
读取磁盘方法有很多
这个开源的代码应该有很多吧
找个代码引擎搜索下
 
RtlInitUnicodeString(&unDiskDeviceName, L"\\Device\\Harddisk0\\DR0");
    InitializeObjectAttributes(&ObjectAttributes, &unDiskDeviceName, OBJ_CASE_INSENSITIVE, NULL, NULL);
    status = ZwCreateFile(
    
status = ZwReadFile(
判断U盘的话 ZNSOFT版主有个查询BUSTYPE的代码 判断是否是U盘
论坛就有
catface
驱动小牛
驱动小牛
  • 注册日期2009-01-11
  • 最后登录2014-03-09
  • 粉丝1
  • 关注1
  • 积分155分
  • 威望1341点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分2分
5楼#
发布于:2012-03-03 14:38
// Create IRP Get The BusType
// 创建IRP 查询设备的BUSTYPE类型  为7 则说明是USB设备
  //
  status = FltGetDiskDeviceObject(FltObjects->Volume, &DiskDeviceObject);
  if (status == STATUS_FLT_NO_DEVICE_OBJECT )
  {
    return STATUS_SUCCESS;  
  }else if(!NT_SUCCESS(status))
  {
    return status;
  }
  KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE);
  Query.PropertyId = StorageDeviceProperty;//StorageDeviceType;//
  Query.QueryType = PropertyStandardQuery;
  NewIrp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, DiskDeviceObject,
      (PVOID)&Query, sizeof(STORAGE_DEVICE_DESCRIPTOR), (PVOID)pBuffer,
      sizeof(STORAGE_DEVICE_DESCRIPTOR) * 4, FALSE, &WaitEvent, &IoStatus);
  if (NULL == NewIrp)   // can't create new irp
  {
    DbgPrint(" BusTypeUnknown \n");
    return STATUS_SUCCESS;  
  }  
  status = IoCallDriver(DiskDeviceObject, NewIrp);
  
  if (status == STATUS_PENDING)
  {
    status = KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, NULL);
    status = IoStatus.Status;
  }
  if (!NT_SUCCESS(status))
  {
    DbgPrint(" BusTypeUnknown \n");
    return STATUS_SUCCESS;  
  }
  Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)pBuffer;
  if(Descriptor->BusType == 7)
  {
    DbgPrint("GetStorageDeviceBusType  SUCCEED: %d DevType:%x \n   ",
            Descriptor->BusType, DiskDeviceObject->DeviceType);
  }else if (Descriptor->BusType == 3)
  {
    DbgPrint("GetStorageDeviceBusType  SUCCEED: %d DevType:%x  \n   ",
            Descriptor->BusType, DiskDeviceObject->DeviceType);
MagicFuzzX
驱动牛犊
驱动牛犊
  • 注册日期2011-11-04
  • 最后登录2015-11-24
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望271点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2012-03-03 19:14
回 catface 的帖子
catface:// Create IRP Get The BusType
// 创建IRP 查询设备的BUSTYPE类型  为7 则说明是USB设备
  //
  status = FltGetDiskDeviceObject(FltObjects->Volume, &DiskDeviceObject);
  if (status == STATUS_FLT_NO_DEVICE_OBJECT )
... .. (2012-03-03 14:38)

这个是在文件过滤驱动下用的吧。。。。我现在是disk lowerfilter。。
catface
驱动小牛
驱动小牛
  • 注册日期2009-01-11
  • 最后登录2014-03-09
  • 粉丝1
  • 关注1
  • 积分155分
  • 威望1341点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分2分
7楼#
发布于:2012-03-04 21:50
这个事文件驱动而且是MINIFILTER下
但是它的关键在于 创建irp询问设备的BUFTYPE
这种做法不仅仅只能在文件驱动下使用
它取决于你发送的IRP和发送的目的设备
我只是举个例子
ZNSOFT版主的例子在这个网站也能查得到
 希望你能顺利找到并且能修改成符合自己要求的代码
defddr
驱动牛犊
驱动牛犊
  • 注册日期2010-07-08
  • 最后登录2012-03-04
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望121点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2012-03-04 21:57
这个是文件驱动MINIFILTER

但是我们只要得到设备的指针 内核句柄之类的
发送自建的查询IRP送的IRP和发送的目的设备
ZNSOFT版主的例子在这个网站也能查得到
毕竟完全符合你要求的代码很难找 还是要修改下
如果是练手的话  MINIFILTER获取后 传送过去也可以
多驱动合作么 更练手:)
游客

返回顶部