首页
社区
课程
招聘
[求助]关于IoGetBaseFileSystemDeviceObject和ObReferenceObjectByName
发表于: 2008-11-19 20:33 9510

[求助]关于IoGetBaseFileSystemDeviceObject和ObReferenceObjectByName

2008-11-19 20:33
9510
有问题请大家帮助一下,我现在的问题是想获取一个驱动文件在内核中对应的驱动对象,或者驱动对象的设备对象也行,比如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);		
	}



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
2
""但是使用icesword查看内核模块,发现这个驱动加载了,我现在就想获得这个驱动的驱动对象""              就是获取驱动对象是吧... 通过 DriverObject->DriverSection; 然后遍历就行....
2008-11-19 21:58
0
雪    币: 75
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
ZwOpenDirectoryObject
  ObReferenceObjectByHandle
  ObDereferenceObject
ZwClose

你也可以反编译下 devicetree 这个软件
2008-11-20 02:11
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Sysnap 的方法我没找到DriverSection结构,没法实现,可能怨我太挫了,bird的方法获取的应该是文件系统的驱动对象吧,好像和贴的第二段代码达到的效果差不多

其实我本来主要是想获取portcls.sys的驱动对象,为他附加一个过滤驱动,现在知道portcls.sys实际上是个内核DLL,没有驱动对象,不过还是多谢两位

我现在的主要目的是想找一个音频驱动,挂上过滤驱动在过滤驱动中截获mic输入的声音和speaker输出的声音,我看了windows音频组件图,portcls.sys在底层,才想挂到它上面,我现在把过滤驱动挂到sysaudio,wdmaud,kmixer都捕获不到数据,挂到系统安装的声卡驱动上面可以捕获到speaker的数据,捕获不到mic 的数据
2008-11-20 15:46
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
把windows音频组件的图放在主题的结尾处了,哪位牛人了解的话,帮帮忙,应该把过滤驱动加载到哪个音频驱动才能捕获音频输入和输出的数据啊,或者有可能捕获输入需要一个驱动,捕获输出是另一个驱动
2008-11-20 15:49
0
雪    币: 75
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我说的办法可以哦

他们的关系是互相连着的。
创建一个驱动也是靠文件系统的
2008-11-20 23:48
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看完各位的回复,我想请问:
     已知某一驱动程序文件(*.sys)的BaseDllName(*.sys),FullDllName(路径\*.sys),DllBase......
       即,如下结构体中的信息都为已知项
typedef struct _LDR_DATA_TABLE_ENTRY {
    LIST_ENTRY InLoadOrderLinks; //0x00
    LIST_ENTRY InMemoryOrderLinks; //00x08
    LIST_ENTRY InInitializationOrderLinks; //0x10
    PVOID DllBase; //0x18
    PVOID EntryPoint; //0x01c
    ULONG SizeOfImage; // 0x20
    UNICODE_STRING FullDllName; //0x24
    UNICODE_STRING BaseDllName; //0x2c
    ULONG Flags; //0x3
    USHORT LoadCount;
    USHORT TlsIndex;
    union {
        LIST_ENTRY HashLinks;
        struct {
            PVOID SectionPointer;
            ULONG CheckSum;
        };
    };
    union {
        struct {
            ULONG TimeDateStamp;
        };
        struct {
            PVOID LoadedImports;
        };
    };
    struct _ACTIVATION_CONTEXT * EntryPointActivationContext;
    PVOID PatchInformation;

} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

      那么,怎样获取该驱动程序所唯一对应的驱动对象呢?
    主要是我想通过获取的驱动对象得到该驱动对象的MajorFunction。
    非常感谢。
2009-6-9 19:09
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
8
遍历object directory
2009-6-9 19:12
0
游客
登录 | 注册 方可回帖
返回
//