【问题标题】:Mapping high-level functions in user-mode dlls to NTDLL.dll将用户模式 dll 中的高级函数映射到 NTDLL.dll
【发布时间】:2012-10-16 03:32:37
【问题描述】:
Windows NT/2000 Native API Reference 这本书提供了一份关于未记录的(由 Microsoft 提供的)本机 API 的综合文档(尽管已经过时)。但我很好奇,有没有办法找到在 ntdll.dll 中声明的低级函数与 kernel32.dll、advapi.dll 等中的用户模式函数之间的映射。
例如:
我知道函数 CreateFile 映射到 NtCreateFile。但我不知道 ntdll.dll 中的确切函数对于 kernel32.dll 中的 MoveFileWithProgressW 函数
【问题讨论】:
标签:
c++
api
dll
ntdll
nt-native-api
【解决方案1】:
您可以使用 Windows SDK/Visual Studio 中的 dumpbin.exe 实用程序从用户模式系统 DLL 转储导出并查找转发函数:
dumpbin -exports kernel32.dll | find/I "forwarded" > fwd.txt
这将创建包含转发函数列表的fwd.txt 文件,如下所示:
151 96 EnterCriticalSection (forwarded to NTDLL.RtlEnterCriticalSection)
361 168 GetLastError (forwarded to NTDLL.RtlGetLastWin32Error)
518 205 HeapAlloc (forwarded to NTDLL.RtlAllocateHeap)
524 20B HeapFree (forwarded to NTDLL.RtlFreeHeap)
528 20F HeapReAlloc (forwarded to NTDLL.RtlReAllocateHeap)
530 211 HeapSize (forwarded to NTDLL.RtlSizeHeap)
等等
【解决方案2】:
与标准 Windows(用户模式)API 相比,NT 原生 API 是较低级别的 API。所以很多情况下没有一一对应的关系。我猜MoveFileWithProgress 是在用户空间中使用较低级别的打开/读取/写入/关闭例程实现的。
也就是说,如果你想使用 Native API,你需要重新实现一堆方便的函数,比如MoveFileWithProgress。
Wine 项目重新实现了 Windows API。您可以查看their implementation 以了解它是如何完成的。 (在页面中搜索“MoveFileWithProgress”)