调用kisystemservice()时,需提供两个参数,由int 2eh的调用者通过eax和edx寄存器传入。eax包含从0开始的索引,该索引可用于一个api函数指针的数组,edx指向调用者的参数堆栈。kisystemservice()通过读取servicetable的一个成员的值(该成员是ntoskrnl.exe的一个公开数据结构:keservicedescriptortable,图5-1的左面列出了该结构)来获取函数数组的基地址。实际上,keservicedescriptortable指向一个包含四个服务表的结构,但默认情况下,仅有第一个服务表是有效的。kisystemservice()通过eax中的索引值进入内部结构kiservicetable,以查找可处理此api调用的函数的入口地址。在调用目标函数之前,kisystemservie()以相同的方式查询kiargumenttable结构,以找出调用者在参数堆栈中传入了多少字节,然后使用这个值将参数复制到当前内核堆栈中。此后,就只需要一个简单的汇编指令:call来执行api处理例程了。这里涉及的所有函数都符合__stdcall标准。