Windows系统调用的界面

#define SVC_(name, argcount) STUB_U name, argcount

整个系统的调用由上面的宏经过依次展开之后形成,并且根据不同的宏形成不同的调用界面。因为内核调用实际包含两层含义。一层是Nt开头的用户可以调用的函数,另一类是Zw开头的只能用于系统调用的函数。

MACRO(STUB_U, Name, ArgCount)
    Stackbytes = 4 * &ArgCount
    MAKE_LABEL Zw&Name, %Stackbytes
    START_PROC Nt&Name, %Stackbytes
    STUBCODE_U SyscallId, %Stackbytes
    .ENDP
    SyscallId = SyscallId + 1
ENDM
MACRO(STUB_K, Name, ArgCount)
    Stackbytes = 4 * &ArgCount
    START_PROC Zw&Name, %Stackbytes
    STUBCODE_K SyscallId, %Stackbytes
    .ENDP
    SyscallId = SyscallId + 1
ENDM

STUB_U宏用于生成用户可以调用的native原生服务函数的同时也会生成仅仅只供系统调用的zw函数,而STUB_K则仅仅生成zw内核函数。

MACRO(MAKE_LABEL, Name, Stackbytes)
    PUBLIC _&Name&@&Stackbytes
    _&Name&@&Stackbytes:
ENDM

MAKE_LABEL宏将展开为一个标号,注意这个宏和后面的START_PROC宏进行区分,后面才是真正的定义函数调用过程。_&Name&@&Stackbytes当中的&类似于C语言当中的#符号,用于将两个字符连接起来,所以整个宏展开为为下划线加上函数名称(或者标号名称)加上堆栈的数字,而这样的变化刚好是C语言的修饰。

MACRO(START_PROC, Name, Stackbytes)

   PUBLIC _&Name&@&Stackbytes

   .PROC _&Name&@&Stackbytes

ENDM

再来看START_PROC宏,这个宏定义真正的函数调用,实际上STUB_U(STUB_K)里面的.ENDP正是对这个展开宏的结束。而由于标号仅仅只是作为一个地址符号,所以实际上nt函数和zw内核函数是调用的同一个地址。

#define KUSER_SHARED_SYSCALL HEX(7ffe0300)
#define KGDT_R0_CODE 8
<p><span style="color:black;">#define KERNEL_USER_SHARED_DATA                 </span>0x7FFE0000</p><p><span style="color:black;">#define KUSER_SHARED_SYSCALL                    </span>KERNEL_USER_SHARED_DATA +0x300</p>MACRO(STUBCODE_U, SyscallId, StackBytes)
    FPO 0, 0, 0, 0, 0, FRAME_FPO
    mov eax, SyscallId
    mov ecx, KUSER_SHARED_SYSCALL
    call dword ptr [ecx]
    ret StackBytes
ENDM
MACRO(STUBCODE_K, SyscallId, StackBytes)
    FPO 0, 0, 0, 0, 0, FRAME_FPO
    mov eax, SyscallId
    lea edx, [esp + 4]
    pushfd
    push KGDT_R0_CODE
    call _KiSystemService
    ret StackBytes
ENDM

接下来是STUBCODE_U和STUBCODE_K的展开,这里存在一些不同。因为调用的源头不相同STUBCODE_K表明是从内核发起的调用,而STUBCODE_U则是从用户空间进行的调用,所以lea edx, [esp + 4]这一句是用于获得堆栈的地址,而堆栈上存放的是整个函数的参数。push KGDT_R0_CODE用于表明当前调用来自于内核,而

mov ecx,KUSER_SHARED_SYSCALL 

calldword ptr [ecx]

这两句实际上是进入一个指定的地址调用函数。

FPO宏是一个用于调试信息的宏,具体可见http://msdn.microsoft.com/zh-cn/library/9c9k076y.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值