系统调用窗口和原生API?

最近我在* NIX操作系统中使用了很多汇编语言。 我想知道的Windows域。


在linux中调用约定:

mov $SYS_Call_NUM, %eax mov $param1 , %ebx mov $param2 , %ecx int $0x80 

而已。 这就是我们应该如何在Linux中进行系统调用。

在Linux中引用所有的系统调用:

关于哪个$ SYS_Call_NUM&我们可以使用这个参考: http ://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

官方参考: http : //kernel.org/doc/man-pages/online/dir_section_2.html


在Windows中调用约定:

???

在Windows中引用所有系统调用:

???

非官方的: http : //www.metasploit.com/users/opcode/syscalls.html ,但我怎样才能在汇编中使用这些,除非我知道调用约定。

官方:???

  • 如果你说,他们没有logging。 那么如何在不知道系统调用的情况下为Windows编写libc? 如何做一个Windows汇编程序devise? 至less在驱动程序编程中需要知道这些。 对?

现在,所谓的Native API呢? 本Native APISystem calls for windows都是不同的术语是指同一件事情? 为了证实我比较了这两个非官方来源

系统调用: http : //www.metasploit.com/users/opcode/syscalls.html

原生API: http : //undocumented.ntinternals.net/aindex.html

我的观察:

  1. 所有系统调用都以字母Nt开头,其中Native API由许多不以字母Nt开头的函数组成。
  2. System Call of windowsNative API子集。 系统调用只是Native API的一部分。

任何人都可以证实这一点并解释。

编辑:

还有另一个答案。 这是第二个答案。 我真的很喜欢它,但我不知道为什么回答者已经删除它。 我要求他重新发表他的回答。

Solutions Collecting From Web of "系统调用窗口和原生API?"

如果你在Windows下进行汇编编程,你不要手动系统调用。 您可以使用NTDLL和Native API为您执行此操作。

Native API仅仅是一些内核模式的封装。 它所做的只是为正确的API执行系统调用。

你永远不需要手动系统调用,所以你的整个问题是多余的。

Linux系统调用代码不会改变,Windows是这样的,这就是为什么你需要通过一个额外的抽象层(又名NTDLL)。

编辑:

另外,即使您在汇编级别工作,仍然可以完全访问Win32 API,没有理由使用NT API开始! 汇编程序中的导入,导出等工作都很好。

EDIT2:

如果你真的想要手动系统调用,你将需要为每个相关的Windows版本反向NTDLL,添加版本检测(通过PEB),并为每个调用执行系统调用查找。

但是,这将是愚蠢的。 NTDLL是有原因的。

关于windows系统调用约定的另一件事是,据我所知,系统调用表是作为构建过程的一部分生成的。 这意味着他们可以简单地改变 – 没有人跟踪他们。 如果有人在列表顶部添加一个新的,没关系。 NTDLL仍然有效,所以其他所有调用NTDLL的人仍然可以工作。

甚至用于执行系统调用(int或sysenter)的机制也不是固定的,并且在过去已经发生了变化,我认为,同一版本的Windows使用不同的DLL,它们使用不同的入口机制,具体取决于机器中的CPU。

Windows系统调用是通过调用系统DLL(如kernel32.dllgdi32.dll )来完成的,这是使用普通的子程序调用完成的。 陷入到操作系统特权层的机制是没有记录的,但这是可以的,因为像kernel32.dll这样的DLL为你做这个。

通过系统调用,我指的是像CreateProcess()GetWindowText()这样记录的Windows API入口点。 设备驱动程序通常会使用Windows DDK中的不同API。

Windows中的OFFICIAL调用约定: http : //msdn.microsoft.com/en-us/library/7kcdt6fy.aspx

(希望这个链接在未来能够存活;如果不存在,只需在MSDN上搜索“x64软件约定”)。

函数调用约定在Linux和Windows x86_64中有所不同。 在两个ABI中,参数最好通过寄存器传递,但所使用的寄存器不同。 有关Linux ABI的更多信息, 请访问http://www.x86-64.org/documentation/abi.pdf