将用户模式 dll 中的高级函数映射到 NTDLL.dll
Posted
技术标签:
【中文标题】将用户模式 dll 中的高级函数映射到 NTDLL.dll【英文标题】:Mapping high-level functions in user-mode dlls to 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
函数
【问题讨论】:
【参考方案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”)
【讨论】:
Wine 使用wine_nt_to_unix_file_name
,后跟rename
。最好链接到ReactOS MoveFileWithProgressW
。如果目标位于同一卷上,则它使用 NtSetInformationFile
和 FILE_RENAME_INFORMATION
结构。以上是关于将用户模式 dll 中的高级函数映射到 NTDLL.dll的主要内容,如果未能解决你的问题,请参考以下文章