将用户模式 ​​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。如果目标位于同一卷上,则它使用 NtSetInformationFileFILE_RENAME_INFORMATION 结构。

以上是关于将用户模式 ​​dll 中的高级函数映射到 NTDLL.dll的主要内容,如果未能解决你的问题,请参考以下文章

将第三方 dll 链接到我的 dll

Mego开发文档 - 建模高级主题

20_高级映射:多对多查询

MyBatis从入门到精通:MyBatis高级结果映射之一对多映射

达内科技NTD1712 cisco远程控制路由,交换。

什么是动态链接库