从Windows中查看系统调用的痕迹,我对它们的不同类型感到非常困惑。以下是我遇到的一些不同类型:
NtQueryPerformanceCounter( Counter=0xbcf6c8 [1.45779e+009], Freq=null ) => 0
NtProtectVirtualMemory( ProcessHandle=-1, BaseAddress=0xbcf6f4 …
NtProtectVirtualMemory( ProcessHandle=-1, BaseAddress=0xbcf6f4 [0x7702e000]…
NtQuerySystemInformation( SystemInformationClass=0 [SystemBasicInformation]
NtQueryVirtualMemory( ProcessHandle=-1, BaseAddress=0x76f20000, MemoryInformationClass=6, MemoryInformation=0xbcf440, Length=0xc, ReturnLength=null ) => 0
我知道这些被称为API系统调用。我未经训练的眼睛将这些视为以“Nt”开头的系统调用。
但我也遇到过这些:
"CreateSemaphoreW","CreateSemaphoreA","GlobalAddAtomW","lstrcpynW","LoadLibraryExW","SearchPathW",
"CreateFileW","CreateFileMappingW","MapViewOfFileEx","GetSystemMetrics","RegisterClipboardFormatW","SystemParametersInfoW",
"GetDC","GetDeviceCaps","ReleaseDC","LocalAlloc"
虽然我可能错了,但我认为这些系统调用的级别低于以Nt开头的系统调用。
这是我遇到的另一条痕迹:
HeapAlloc HeapAlloc HeapFree HeapFree HeapAlloc HeapAlloc HeapFree
HeapFree NtOpenKey GetProcessHeap HeapAlloc NtOpenKey HeapAlloc NtOpenKey
NtQueryValueKey NtQueryValueKey HeapFree HeapAlloc HeapAlloc NtOpenKey
NtQueryValueKey HeapAlloc HeapAlloc RegOpenKeyExW
这条曲线既包含Nt也包含没有...我明白在这个领域我听起来可能听起来太不可知但我真的想对这些是什么有更好的概括。
这些跟踪让我假设在Windows中,人们似乎在同一个名称(“系统调用”)中引用了不同的系统调用集。有人可以告诉我,如果我错了吗?如果我是对的,是否有这些不同系统调用的名称?
谢谢
答案 0 :(得分:2)
顶部代码段显示本机api函数名称,即操作系统的实际api。你编写驱动程序时的目标是api。但是,当您编写自己的程序时,很少使用api。 Windows NT最初包括三个不同的api层,Win32,OS / 2和Posix。
第二个片段显示Win32 api层中的函数名称,这是您编写Windows程序时最常见的函数名称。 OS / 2子系统很久以前就退役了。 Posix不再使用,在Win8和Server2012中停止使用,但是在新的Linux子系统中又回到了Win10。
通过将其api函数转换为等效的本机api函数(如果有的话)来实现这样的子系统。大多数Win32子系统代码都存在于kernel32.dll,gdi32.dll,user32.dll和advapi.dll中。 ntdll.dll是必要时调用内核的本机api包装器。本机api函数名称以Nt或Zw开头。有一个粘合层将两个偶尔暴露的粘合层结合在一起,其功能名称以Rtl开头。
这种分层的主要优点是,微软可以在不破坏现有程序的情况下在操作系统上进行创新。 30年前编写的代码仍然很可能在当前的操作系统上正确编译和运行,尽管有两个非常激烈的架构更改和许多Windows版本。原生api的最后一个重大变化是Vista,主要版本6.