Windows系统调用的界面
来源:互联网 发布:英文seo工程师 编辑:程序博客网 时间:2024/06/05 04:41
#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 + 1ENDMMACRO(STUB_K, Name, ArgCount) Stackbytes = 4 * &ArgCount START_PROC Zw&Name, %Stackbytes STUBCODE_K SyscallId, %Stackbytes .ENDP SyscallId = SyscallId + 1ENDM
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&@&StackbytesENDM
再来看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 StackBytesENDMMACRO(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 StackBytesENDM
接下来是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 0
- Windows系统调用的界面
- 调用系统联系人的添加界面-android
- 【iphone开发】调用系统的设置界面
- 调用系统添加联系人界面的套路
- android 调用系统界面
- android 调用系统界面
- android 调用系统界面
- android 调用系统界面
- android 调用系统界面
- android 调用系统界面
- android 调用系统界面
- android 调用系统界面
- 调用系统界面
- 调用系统InstalledAppDetails界面
- 调用拨打电话界面、直接拨打电话、调用发送短信的界面、调用系统浏览器
- 如何捕获系统应用程序的界面&&调用系统的下载管理(Downloads)界面
- 初学者MFC界面可以调用的Windows消息
- 关于Windows系统调用实现的笔记
- java密码学学习整理--对称加密(着重描述3des)
- LaTeX常用表格绘制入门
- 心的开始
- Mockito:一个强大的用于 Java 开发的模拟测试框架
- Tomcat系列之一:理论篇
- Windows系统调用的界面
- 起点不重要
- iOS 技巧
- 【剑指offer】二叉树的镜像
- [ios专项]一个简单的浏览网页程序-object c
- 【CSDN编程挑战】3n+1
- PushbackReader类——用于回推字符
- 「转」安装Linux性能监测工具Conky
- hdu 2188 巴什博弈