阅读:1245回复:2
Ke386QueryIoAccessMap函数的疑问?请求支援,不甚感激!
这个驱动是想让应用程序直接访问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字节。但这样解释的话能解释的通,但好像不是老外的意思啊。。 我真的搞不懂了。。希望大虾给予帮助。。感激不尽。。 |
|
沙发#
发布于:2005-07-27 21:35
1.就是把以pIopm为起始地址,到2000h偏移内的所有数据全部用0FF填写,8-17行就是将70h和71h号端口对应的数据位清除,Ke386SetIoAccessMap函数将修改后的数据写回IOPM去
2.对于Ke386QueryIoAccessMap 的解释不太准确,其实当dwFlag等于0的时候,直接把pIopm用0xff填充,没有做从IOPM到pIopm的拷贝,当然这个细节的不准确,并不影响我们对这个函数的使用 |
|
板凳#
发布于:2005-08-03 11:54
2.对于Ke386QueryIoAccessMap 的解释不太准确,其实当dwFlag等于0的时候,直接把pIopm用0xff填充,没有做从IOPM到pIopm的拷贝,当然这个细节的不准确,并不影响我们对这个函数的使用
------------------------------------- 如果没有做拷贝的话,那么我们为什么还要调用这个函数呢? |
|