jACKNI
驱动牛犊
驱动牛犊
  • 注册日期2005-07-18
  • 最后登录2008-07-29
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望19点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:1245回复:2

Ke386QueryIoAccessMap函数的疑问?请求支援,不甚感激!

楼主#
更多 发布于:2005-07-27 20:02
  这个驱动是想让应用程序直接访问I/O端口:
部分代码如下(代码不是我写的):

1                invoke PsLookupProcessByProcessId, \
2                        dword ptr (KEY_VALUE_PARTIAL_INFORMATION PTR [ecx]).Data, addr pProcess
3                .if eax == STATUS_SUCCESS
4                     invoke DbgPrint, $CTA0("giveio: PTR KPROCESS: %08X"), pProcess
5                     invoke Ke386QueryIoAccessMap, 0, pIopm
6                     .if al != 0
7                         ; I/O access for 70h port
8                         mov ecx, pIopm
9                         add ecx, 70h / 8
10                        mov eax, [ecx]
11                        btr eax, 70h MOD 8
12                        mov [ecx], eax                       ; I/O access for 71h port
13                        mov ecx, pIopm
14                        add ecx, 71h / 8
15                        mov eax, [ecx]
16                        btr eax, 71h MOD 8
17                        mov [ecx], eax
18                        invoke Ke386SetIoAccessMap, 1, pIopm
19                        .if al != 0
20                            invoke Ke386IoSetAccessProcess, pProcess, 1

进程ID传递给PsLookupProcessByProcessId函数,这样就可以在pProcess中得到指向进程对象的指针,后面的Ke386QueryIoAccessMap的函数将TSS中的IOPM拷贝到缓冲区中。将70h和71h号端口对应的数据位清除并使用Ke386SetIoAccessMap函数将修改后的数据写回IOPM去,为进程存取这两个端口做准备。

Ke386QueryIoAccessMap这个函数。老外对这个函数的使用解释是这样的:

Ke386QueryIoAccessMap proto stdcall dwFlag:DWORD, pIopm:PVOID

Ke386QueryIoAccessMap

copies current IOPM by the size of 2000h bytes from TSS to the memory buffer pointed to by pIopm parameter.

Parameter Description

dwFlag

0 - Fill memory buffer with 0FFh values (all bits are set - access denied);

1 - Copy current IOPM from TSS to the memory buffer.


pIopm

Points to the memory buffer to receive current IOPM. The buffer size must be not less than 2000h bytes.

罗云彬同志这样对它翻译:

Ke386QueryIoAccessMap proto stdcall dwFlag:DWORD, pIopm:PVOID

    Ke386QueryIoAccessMap函数从TSS中拷贝2000h字节的当前IOPM到指定的内存缓冲区中,缓冲区指针由pIopm参数指定。
    各参数描述如下:
dwFlag--0表示将全部缓冲区用0FFh填写,也就是所有的位都被设置,所有的端口都被禁止访问;1表示从TSS中将当前IOPM拷贝到缓冲区中
pIopm--用来接收当前IOPM的缓冲区指针,注意缓冲区的大小不能小于2000h字节

我的疑问:

如果按这里介绍函数的说法,第五行的“invoke Ke386QueryIoAccessMap, 0, pIopm”就是把TSS中拷贝2000h字节到IOPM中,并且把pIopm的内容全部用0FFh填写。。如果这样的话,不是就等于把以pIopm为起始地址,到2000h偏移内的所有数据全部用0FF填写吗?如果是这样的话,那么下面那个语句“18                        invoke Ke386SetIoAccessMap, 1, pIopm”不是根本就没什么意义了吗?因为第8到17行的语句并没有对这部分内容做根本性的改变。甚至这样写回去不是反而破坏了原来好的TSS中的IOPM吗?

或许应该是这样的,那就是当2000h字节被拷贝到pIopm以后,原来被拷贝的TSS中2000h字节内容用0FFh来填写。。然后再修改pIopm中数据内容,改完后再用Ke386SetIoAccessMap函数搬回到原来TSS中的2000h字节。但这样解释的话能解释的通,但好像不是老外的意思啊。。
我真的搞不懂了。。希望大虾给予帮助。。感激不尽。。
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-07-27 21:35
1.就是把以pIopm为起始地址,到2000h偏移内的所有数据全部用0FF填写,8-17行就是将70h和71h号端口对应的数据位清除,Ke386SetIoAccessMap函数将修改后的数据写回IOPM去
2.对于Ke386QueryIoAccessMap 的解释不太准确,其实当dwFlag等于0的时候,直接把pIopm用0xff填充,没有做从IOPM到pIopm的拷贝,当然这个细节的不准确,并不影响我们对这个函数的使用
jACKNI
驱动牛犊
驱动牛犊
  • 注册日期2005-07-18
  • 最后登录2008-07-29
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望19点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-08-03 11:54
2.对于Ke386QueryIoAccessMap 的解释不太准确,其实当dwFlag等于0的时候,直接把pIopm用0xff填充,没有做从IOPM到pIopm的拷贝,当然这个细节的不准确,并不影响我们对这个函数的使用
-------------------------------------
如果没有做拷贝的话,那么我们为什么还要调用这个函数呢?
游客

返回顶部