Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows上的系统调用_Windows_System Calls - Fatal编程技术网

Windows上的系统调用

Windows上的系统调用,windows,system-calls,Windows,System Calls,我只是想问一下,我知道Linux中的standart系统调用是通过int指令指向中断向量表来完成的。我想这在Windows上是类似的。但是,如何调用更高级别的特定系统例程?例如,如何告诉Windows创建窗口?我知道这是由dll中的代码处理的,但在汇编指令级别上实际发生了什么?dll中的例程是否通过int指令调用软件中断,或者是否有任何不同的方法来处理此问题?谢谢 进行Win32调用以创建窗口实际上与中断无关。客户端应用程序已与提供调用的.dll链接,该调用公开链接器要使用的地址。由于您询问的是

我只是想问一下,我知道Linux中的standart系统调用是通过int指令指向中断向量表来完成的。我想这在Windows上是类似的。但是,如何调用更高级别的特定系统例程?例如,如何告诉Windows创建窗口?我知道这是由dll中的代码处理的,但在汇编指令级别上实际发生了什么?dll中的例程是否通过int指令调用软件中断,或者是否有任何不同的方法来处理此问题?谢谢

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

[编辑] 关于中断和int.vector表,您似乎是对的。CodeGuru有一篇关于NT内核调用如何工作的操作系统细节的好文章。链接:

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

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

内核系统调用存根很容易从ntdll.dll访问,而win32k调用存根不导出,它们在user32.dll中是私有的。这些存根包含系统调用号和执行此任务的实际系统调用指令


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

Yes,我知道dll里面有必要的调用,我写的。但基本上我所要求的一切是:是否有dll例程以软件中断的形式绘制windows系统调用,或者,如果没有,它如何告诉windows内核生成窗口?因为据我所知,由于ringl Level limitaion的原因,您无法从程序运行的空间切换到int指令以外的其他方式。b-gen-jack-o-neill:好吧,内核不负责窗口管理。在较新的处理器上,使用sysenter/sysexit指令,而不是使用INT指令发出软件中断。概念是一样的,这是一种切换到内核模式的方法。虽然在内核中没有管理窗口,但您不会找到CreateWindow系统调用,相反,它是在许多其他系统调用之上构建的,包括与其他进程通信,例如window Manager。现在,我终于接近所需的答案了。所以,我认为您希望OS执行的每个操作都在一个或多个内核调用中表示。因此,根据您编写的内容,有一个在内核模式下运行的窗口管理器进程,您可以使用.dll库与之通信,该库包含通过内核调用与windows管理器建立进程间通信的例程?也许,你能给我推荐一些关于这方面的好文章吗?谢谢。窗口管理器是另一个用户空间进程,对于GUI内容,内核只干预与该进程的实际通信,以及该进程实际显示自身的方式。请在文本中添加一些换行符。目前很难阅读。