emissary
驱动牛犊
驱动牛犊
  • 注册日期2006-10-17
  • 最后登录2011-06-14
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望32点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:2007回复:1

过滤驱动中.什么地方可以最早判断设备是否是移动介质?

楼主#
更多 发布于:2008-06-12 14:21
大家好.我有这样一个问题.因为自己刚学不到一星期...所以不太清楚.想请大家帮帮忙.

过滤驱动中.什么地方可以最早判断设备是否是移动介质
我用了sfilter做为开发起点

我做文件过滤驱动主要是想针对所有移动储存设备透明加解密..
所以想在驱动中判断是不是U盘等...
虽然有Device Type,但是只能得到FILE_DEVICE_DISK_FILE_SYSTEM...而不能区分.
blog:www.emissary.cn
emissary
驱动牛犊
驱动牛犊
  • 注册日期2006-10-17
  • 最后登录2011-06-14
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望32点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-06-13 16:16
这个问题捆扰我了好些时间,不过今天在群里朋友的帮助下得已解决.
现在分享出来.

凌云(904692) 10:19:58

我做文件过滤驱动主要是想针对所有移动储存设备..
所以想在驱动中判断是不是U盘等...
虽然有Device Type,但是只能得到FILE_DEVICE_DISK_FILE_SYSTEM...而不能区分.

qi(616768725) 10:22:53
晕 你看看系统的api的那个getdisktype的是什么逻辑
qi(616768725) 10:23:05
这个可以得到分区的属性
Jack Daniel(340211173) 10:23:28
你也可以在上层检测移动存储设备,然后把盘符传到驱动。

晴天(19775156) 10:23:46
内核中应该有判断方法
qi(616768725) 10:23:59
内核中 肯定有
qi(616768725) 10:24:25
0环得从总线上判断
qi(616768725) 10:24:39
这个是一个瑞星的开发的人说的
晴天(19775156) 10:25:29
杀毒软件的那帮人,微软公开了不少资料给他们
晴天(19775156) 10:25:58
你44看在mount的历程里能不能做判断
qi(616768725) 10:26:04
据我所知 他们没有
晴天(19775156) 10:26:22
有也不会说的
qi(616768725) 10:26:31
我写的usb 的filter 倒是可以区分
qi(616768725) 10:27:11
如果是在mount 的时候去判断的话,这个时候以后晚了 他的devicetype 已经是disk的了
qi(616768725) 10:28:02
这个device好像是 usb 的一个总线的functional device 来创建的
晴天(19775156) 10:29:10
哈,能搞到getdrivertype的源码就能搞定了

qi(616768725) 10:40:26
ULONG GetStorageDeviceBusType(IN PDEVICE_OBJECT DeviceObject)
{
   PIRP NewIrp;
   PSTORAGE_DEVICE_DESCRIPTOR Descriptor;
   STORAGE_PROPERTY_QUERY Query;
   CHAR Buffer[BUFFER_SIZE];
   KEVENT WaitEvent;
   NTSTATUS Status;
   IO_STATUS_BLOCK IoStatus;

   // first set the query properties
   Query.PropertyId = StorageDeviceProperty;
   Query.QueryType = PropertyStandardQuery;

   // initialize the waitable event
   KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE);

   // we should build the query irp ourselves
   NewIrp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, DeviceObject,
       (PVOID)&Query, sizeof(Query), (PVOID)Buffer, NAME_BUFFER_SIZE, FALSE, &WaitEvent, &IoStatus);

   if (NULL == NewIrp)    // can't create new irp
   {
       DbgPrint("[%s] [%u] I can't create a new irp to query the property of device (%p)!\n",
           __FILE__, __LINE__, DeviceObject);
       return BusTypeUnknown;
   }

   // send this irp to the storage device
   Status = IoCallDriver(DeviceObject, NewIrp);

   if (Status == STATUS_PENDING)
   {
       Status = KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, NULL);
       Status = IoStatus.Status;
   }
      
   if (!NT_SUCCESS(Status))
   {
       DbgPrint("[%s] [%u] Query IOCTL_STORAGE_QUERY_PROPERTY of device (%p) failed, Status=0x%08X!\n",
           __FILE__, __LINE__, DeviceObject, Status);
       return BusTypeUnknown;
   }

   Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)Buffer;
   return Descriptor->BusType;
}

qi(616768725) 10:40:54
凌云你 要的东西
凌云(904692) 10:41:51
我仔细看看
qi(616768725) 10:42:34
呵呵很简单的就是自己发送一个irp 请求类型就是特定的code 就可以了
blog:www.emissary.cn
游客

返回顶部