首页
社区
课程
招聘
[求助]关于IoGetDeviceObjectPointer获得设备对象的疑问?
发表于: 2008-4-14 17:21 11153

[求助]关于IoGetDeviceObjectPointer获得设备对象的疑问?

2008-4-14 17:21
11153
1.为何在有些程序中使用"IoGetDeviceObjectPointer"获得设备对象时,其返回值本身就含有相应文件对象和设备对象(FileObject,DeviceObject), 为什么不直接用该设备对象,却再要通过文件对象中检索设备对象呢? 而且,经调试分析这两个设备对象指针不同, 应该是不同的设备对象,为何它们不同,具体原因是什么?

贴出来太乱了,调整了半天,还是原样,干脆搞个图片:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
查DDK有如下参考信息:
NTSTATUS IoGetDeviceObjectPointer(
    IN PUNICODE_STRING  ObjectName,
    IN ACCESS_MASK  DesiredAccess,
    OUT PFILE_OBJECT  *FileObject,
    OUT PDEVICE_OBJECT  *DeviceObject
    );
 
FILE_OBJECT STRUCT
    _Type       SWORD       ?   ; 0000h  IO_TYPE_FILE  (original field name Type)
    _Size       SWORD       ?   ; 0002h  (original name Size)
    DeviceObject    PVOID       ?   ; 0004h  PTR DEVICE_OBJECT
    .....
FILE_OBJECT ENDS
PFILE_OBJECT typedef PTR FILE_OBJECT
 
代码片段:
        ... ...
                push    esi             ; DeviceObject
                push    edi             ; FileObject         <──┐
                push    FILE_READ_ATTRIBUTES        ; DesiredAccess     │
                lea     eax, usDestinationString                                │
                push    eax             ; ObjectName              │
                call    IoGetDeviceObjectPointer                                                          │
                test    eax, eax                                       │
                jz      @                                                              │
         nop                                │
@@:                                                 │
                mov     eax, [edi]          ; FileObject                  │
                mov     eax, [eax+4]                        │
                mov     [esi], eax          ; DeviceObject     <──┘
        ... ...

2.如何将驱动服务的说明信息添加到服务列表中?
3.KAV是如何做到服务列表禁止对其服务进行控制?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费
支持
分享
最新回复 (4)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
对驱动还不熟,不过看IoGetDeviceObjectPointer的函数参考说明,IoGetDeviceObjectPointer函数返回的值并不是设备对象的值,而是让你用来判断获取设备有没有成功的值。

Return Value
IoGetDeviceObjectPointer can return one of the following NTSTATUS values:

STATUS_SUCCESS
STATUS_OBJECT_TYPE_MISMATCH
STATUS_INVALID_PARAMETER
STATUS_PRIVILEGE_NOT_HELD
STATUS_INSUFFICIENT_RESOURCES
STATUS_OBJECT_NAME_INVALID
2008-4-14 17:34
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不是Return Value
而是接受输出的参数:
OUT PFILE_OBJECT  *FileObject,
OUT PDEVICE_OBJECT  *DeviceObject
2008-4-14 17:37
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
哦?看错了。
2008-4-14 17:55
0
雪    币: 191
活跃值: (95)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
如果想获取的Device被Attach了若干个设备,
那么直接返回的DeviceObject指向的是最顶层的那个Attach Device。
FileObject->DeviceObject指向的才是真正想获取的。
2008-7-24 21:28
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册