adward0072001
驱动牛犊
驱动牛犊
  • 注册日期2007-08-09
  • 最后登录2010-05-06
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望91点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:2623回复:6

关于IoGetBaseFileSystemDeviceObject和ObReferenceObjectByName

楼主#
更多 发布于:2008-11-19 20:50
有问题请大家帮助一下,我现在的问题是想获取一个驱动文件在内核中对应的驱动对象,或者驱动对象的设备对象也行,比如system32/drivers/portcls.sys,这个驱动,从devicetree那个工具的列表里面看不到这个驱动,但是使用icesword查看内核模块,发现这个驱动加载了,我现在就想获得这个驱动的驱动对象

经尝试发现,如果在devicetree这个工具中可以看到驱动名称的话,/driver/tcpip,就可以采用下面的代码通过ObReferenceObjectByName获得驱动对象,但是如果devicetree这个工具中看不到名称,下面的代码就不行了

代码:
UNICODE_STRING DriverName;
  PDRIVER_OBJECT DriverObject = NULL;
  PDEVICE_OBJECT DeviceObject = NULL;


  RtlInitUnicodeString( &DriverName, pwszDeviceName );


  ObReferenceObjectByName( &DriverName,
                           OBJ_CASE_INSENSITIVE,
                           NULL,
                           0,
                           ( POBJECT_TYPE ) IoDriverObjectType,
                           KernelMode,
                           NULL,
                           &DriverObject );

  if ( DriverObject == NULL )
  {
    return NULL;
  }

本来相通过下面的代码实现,但是也是获取不到,主要是对这几个函数没理解清,有知道的帮忙解释一下,多多感谢了啊

代码:
PDEVICE_OBJECT DeviceObject1;
  PFILE_OBJECT FileObject;
  PDEVICE_OBJECT DeviceObject;

  UNICODE_STRING sysname;
  RtlInitUnicodeString(&sysname,L"\\??\\C:\\windows\\System32\\Drivers\\sysaudio.sys");
  status = IoGetDeviceObjectPointer(&sysname, FILE_ATTRIBUTE_NORMAL, &FileObject, &DeviceObject);
  if ( status )
  {
    DbgPrint("IoGetDeviceObjectPointer: %x", status);
  }
  else
  {
    DeviceObject1 = (PDEVICE_OBJECT)IoGetBaseFileSystemDeviceObject(FileObject);
    DbgPrint("IoGetDeviceObjectPointer: %x", DeviceObject1);    
  }


图片:2008112013959109_thumb.jpg

wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2008-11-20 10:59
portcls.sys虽然名字是SYS,但实际上是个内核DLL,没有驱动对象.和你调用的函数无关.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
adward0072001
驱动牛犊
驱动牛犊
  • 注册日期2007-08-09
  • 最后登录2010-05-06
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望91点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-11-20 13:14
多谢wowocock 大大,那这种dll的话肯定就不能附加过滤驱动了吧?既然是内核dll,是不是说有很多导出函数供其它驱动使用啊?其实我现在的主要目的是想找一个音频驱动,挂上过滤驱动在过滤驱动中截获mic输入的声音和speaker输出的声音,我看了windows音频组件图,portcls.sys在底层,才想挂到它上面,我现在把过滤驱动挂到sysaudio,wdmaud,kmixer都捕获不到数据,挂到系统安装的声卡驱动上面可以捕获到speaker的数据,捕获不到mic 的数据
adward0072001
驱动牛犊
驱动牛犊
  • 注册日期2007-08-09
  • 最后登录2010-05-06
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望91点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-11-20 13:24
我把音频驱动的架构放到我发的主题末尾了,你可以看看,非常感谢,这一块郁闷了很久了

看了你说的之后,看看ddk,的确portcls.sys是一个 kernel-mode DLL,但是也说了是A collection of audio port drivers ,这些port drivers不知道是不是wavecyclic,wavepci,midi,topology这些,如果是的话,这些驱动能不能获得驱动对象,附加过滤驱动呢?
PortCls is an audio port-class driver that Microsoft includes as part of the operating system. PortCls is implemented in system file portcls.sys as an export driver (a kernel-mode DLL) that provides kernel-streaming functionality for ISA/DMA and PCI audio device drivers. The portcls.sys file contains the following:

A set of helper functions that can be called by the adapter driver
A collection of audio port drivers
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2008-11-20 21:16
把过滤挂在声卡驱动上应该可以获得相应的信息,不过可能对硬件的依赖比较大.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
adward0072001
驱动牛犊
驱动牛犊
  • 注册日期2007-08-09
  • 最后登录2010-05-06
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望91点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-11-20 23:55
我是挂到声卡驱动上,但是现在捕获不到mic的声音,不知为何,对于对硬件的依赖比较大这个问题,我考虑的是从注册表中媒体类驱动的表项下查找当前安装的声卡驱动的驱动名,然后附加过滤驱动,这样应该对不论什么声卡驱动都能实现了
adward0072001
驱动牛犊
驱动牛犊
  • 注册日期2007-08-09
  • 最后登录2010-05-06
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望91点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-11-20 23:57
还有声卡驱动的话应该就是相当于上图中的adapter driver了吧,按说既然数据要传输到应用层,从sysaudio,或者kmixer应该可以捕获到数据阿
游客

返回顶部