【问题标题】:Are there different libraries of Windows system calls?是否有不同的 Windows 系统调用库?
【发布时间】:2018-05-21 03:11:35
【问题描述】:

通过查看 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 中存在不同的系统调用集,人们似乎以相同的名称(“系统调用”)引用它们。如果我错了,有人可以告诉我吗?如果我是对的,这些不同的系统调用集是否有名称?

谢谢

【问题讨论】:

  • Windows (NT) 系统调用通常以Nt (ntdll.dll) 或NtUserNtGdi (Windows 10 中的win32u.dll) 为前缀。这些是存根函数,将 system call table 中的函数号传递给内核模式调度程序(例如,通过 x64 sysentersyscall 指令)。您可能还会看到 Zw 前缀名称。在用户模式下,这些与Nt 函数名称相同。它们在内核中有所不同,但这与您的问题没有直接关系。
  • 其他如CreateFileWHeapAlloc 是Windows API 调用。通常这些在用户模式下执行尽可能多的工作和准备——通常通过运行时库函数,例如RtlDosPathNameToNtPathName_URtlAllocateHeap(在 ntdll.dll 中)。最终他们调用(或可能调用)内核系统函数,例如NtCreateFileNtAllocateVirtualMemory
  • 还有诸如CreateProcessWithLogonW之类的调用是通过对系统服务(例如本例中的辅助登录服务)进行RPC调用来实现的。如果它通过 LPC 端口,那么系统调用可能是NtAlpcSendWaitReceivePort。该服务通常有权进行其他调用,例如CreateProcessAsUser,最终调用NtCreateUserProcess

标签: windows kernel system-calls trace


【解决方案1】:

顶部的sn-p显示的是原生api函数名,操作系统的实际api。编写驱动程序时要定位的 api。但这很少是您编写自己的程序时使用的 api。 Windows NT 最初包含三个不同的 api 层,Win32、OS/2 和 Posix。

第二个 sn-p 显示来自 Win32 api 层的函数名称,这是您编写 Windows 程序时最常见的目标。 OS/2 子系统很久以前就退役了。 Posix 停止使用,并在 Win8 和 Server2012 中停止使用,但在 Win10 中重新使用了新的 Linux 子系统。

这样的子系统是通过将其 api 函数转换为等效的本机 api 函数(如果有)来实现的。大多数 Win32 子系统代码位于 kernel32.dll、gdi32.dll、user32.dll 和 advapi.dll 中。 ntdll.dll 是在必要时调用内核的原生 api 包装器。本机 api 函数名称以 Nt 或 Zw 开头。有一个粘合层将两者结合在一起,偶尔会暴露出来,它的函数名称以 Rtl 开头。

这种分层的主要优点是微软可以在不破坏现有程序的情况下在操作系统上进行创新。 30 年前编写的代码仍然很有可能在当前操作系统上正确编译和运行,尽管有两次非常剧烈的架构更改和许多 Windows 版本。本机 api 的最后一次重大变化是在 Vista,主要版本 6。

【讨论】:

  • Linux 的 Windows 子系统 (WSL) 不是传统的 NT 子系统,与之前的 POSIX 和 OS/2 子系统不同。它不需要从源代码构建 PE 二进制文件。相反,它使用 pico 进程和现有的 Linux ELF 二进制文件。
  • “定位”一个 api 层是什么意思?
  • 编写一个使用特定api的程序。
猜你喜欢
  • 1970-01-01
  • 2010-10-26
  • 2012-05-25
  • 1970-01-01
  • 2012-01-16
  • 2011-07-07
  • 1970-01-01
  • 2021-03-28
  • 2014-09-22
相关资源
最近更新 更多