Windows上的系统调用

时间:2010-05-03 15:22:38

标签: windows system-calls

我只是想问一下,我知道Linux中的标准系统调用是通过指向中断向量表的int指令完成的。我认为这在Windows上类似。但是,您如何调用某些更高级别的特定系统例程?比如你怎么告诉Windows创建一个窗口?我知道这是由dll中的代码处理的,但在汇编程序指令级别实际发生了什么? dll中的例程是通过int指令调用软件中断,还是有任何不同的方法来处理它?谢谢。

2 个答案:

答案 0 :(得分:6)

进行Win32调用以创建窗口与中断无关。客户端应用程序已与提供调用的.dll链接,该调用公开了链接器要使用的地址。由于您在询问调用机制的不同之处,因此我将此处的讨论限制为可用于任何应用程序的Win32调用,而不是内核级调用或设备驱动程序。在汇编语言级别,它将与任何其他函数调用相同,因为大多数Win32调用是内部进行所需内核调用的用户级调用。链接器提供Win32函数的地址作为某种分支指令的目标,具体取决于编译器。

[编辑] 看起来你对中断和int是正确的。矢量表。 CodeGuru有一篇关于NT内核调用如何工作的操作系统细节的文章。链接:
http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035

答案 1 :(得分:0)

Windows不允许您直接调用系统调用,因为系统调用号可以在内部版本之间更改,如果添加了新的系统调用,则其他可以向前移动,或者如果删除了系统调用,则其他可以向后移动。因此,为了保持向后兼容性,您可以在DLL中调用win32或本机函数。

现在有两组系统调用,分别由内核(ntoskrnl)和win32内核层(win32k)提供服务。

可以从ntdll.dll轻松访问内核系统调用存根,而不会导出win32k存根,它们在user32.dll中是私有的。这些存根包含系统调用号和完成任务的实际系统调用指令。

因此,如果要创建窗口,请在user32.dll中调用CreateWindow,然后会调用扩展版本CreateWindowEx以实现向后兼容,从而调用私有系统调用存根{{ 1}},它将在win32k窗口管理器中调用代码。