B.G*_*ill 13 windows system-calls
我只是想问一下,我知道Linux中的标准系统调用是通过指向中断向量表的int指令完成的.我认为这在Windows上类似.但是,您如何调用某些更高级别的特定系统例程?比如你怎么告诉Windows创建一个窗口?我知道这是由dll中的代码处理的,但在汇编程序指令级别实际发生了什么?dll中的例程是通过int指令调用软件中断,还是有任何不同的方法来处理它?谢谢.
进行Win32调用以创建窗口与中断无关.客户端应用程序已与提供调用的.dll链接,该调用公开了链接器要使用的地址.既然你是在调用机制询问的区别,我在这里将讨论限制在以可用来,而不是内核级调用或设备驱动程序的任何应用程序的Win32调用.在汇编语言级别,它将与任何其他函数调用相同,因为大多数Win32调用是内部进行所需内核调用的用户级调用.链接器提供Win32函数的地址作为某种分支指令的目标,具体取决于编译器.
[编辑]看起来你对中断和int是正确的.矢量表.CodeGuru有一篇关于NT内核调用如何工作的操作系统细节的文章.链接:http:
//www.codeguru.com/cpp/wp/system/devicedriverdevelopment/article.php/c8035
Windows 不允许您直接调用系统调用,因为系统调用号可能会在版本之间发生变化,如果添加新的系统调用,其他系统调用可以向前移动,或者如果系统调用被删除,其他系统调用可以向后移动。因此,为了保持向后兼容性,您可以调用 DLL 中的 win32 或本机函数。
现在有 2 组系统调用,由内核 (ntoskrnl) 和 win32 内核层 (win32k) 提供服务。
内核系统调用存根可以从 ntdll.dll 轻松访问,而 win32k 系统调用存根不会导出,它们在 user32.dll 中是私有的。这些存根包含系统调用号和执行该工作的实际系统调用指令。
因此,如果您想创建一个窗口,您可以调用CreateWindowuser32.dll,然后CreateWindowEx调用扩展版本以实现向后兼容性,该版本调用私有系统调用存根NtUserCreateWindowEx,该存根调用 win32k 窗口管理器中的代码。
| 归档时间: |
|
| 查看次数: |
19236 次 |
| 最近记录: |