Windows上的系统调用

B.G*_*ill 13 windows system-calls

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

Kel*_*nch 7

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

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

  • 在较新的处理器上,使用sysenter/sysexit指令而不是使用INT指令发出软件中断.这个概念是一样的,它是一种切换到内核模式的方法.但是在内核中不管理窗口,你不会找到CreateWindow系统调用,而是建立在许多其他系统调用之上,包括与其他进程通信 - 例如窗口管理器 (5认同)
  • 是的,我知道dll里面有需要的调用,是我写的。但是,基本上我所要求的是:是否有dll例程以软件中断的形式绘制Windows syscall,或者,如果没有,它将如何告诉Windows内核创建一个窗口?据我所知,由于铃声限制,您无法从程序运行的空间切换到另一种方式,而不是int指令。 (2认同)
  • 哇,终于我接近想要的答案了。因此,我认为您希望操作系统执行的每个动作都在一个或多个内核调用中表示。因此,根据您所写的内容,有一个在内核模式下运行的窗口管理器进程,您可以使用.dll库与之进行通信,该例程可以通过内核调用与Windows Manager建立进程间通信。也许,您能推荐我一些有关此的好文章吗?谢谢。 (2认同)

Ugn*_*gne 7

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

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

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

因此,如果您想创建一个窗口,您可以调用CreateWindowuser32.dll,然后CreateWindowEx调用扩展版本以实现向后兼容性,该版本调用私有系统调用存根NtUserCreateWindowEx,该存根调用 win32k 窗口管理器中的代码。