图形模块包括用户模式gdi32和内核模式的win32k,gdi32的代码在目录reactos/dll/win32/gdi32里,win32k的代码在目录reactos/subsystems/win32/win32k里。所有客户端的应用程序都是调用gdi32库里的API函数,编译时也是连接这个库里的函数。由于gdi32的代码是在用户模式下的,那么它是怎么样去访问内核提供的功能呢?其实它在编译时,会调用一个工具去分析内核的函数代码,然后生成一个汇编文件,连接到gdi32里,这个文件名称是reactos/obj-i386/lib/win32ksys/win32k.S。它是每次编译时自动生成的,里面的代码就是一些模板的代码,然后设置每个内核函数访问的编号,把参数传送进去和参数返回,就实现相应的内核功能调用了。在文件里的调用代码如下:
.global _NtGdiExttextoutW@36
_NtGdiExttextoutW@36:
这里是把API的编号移到EAX寄存器。
movl $0x1092,%eax
movl $KUSER_SHARED_SYSCALL,%ecx
这里是调用系统功能调用的函数,可以是中断0x2E,也可以是sysenter,syscall等系统调用。
call *(%ecx)
ret $0x24
原文地址:https://www.jb51.cc/react/308371.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。