windows pe 文件的地址导出 table 中出现空条目的原因是什么?

What is the reason for null entries in address export table of a windows pe file?

我有一个我构建的项目,用于检查 Windows PE 文件。在处理某些文件(例如 User32 和 Shell32)时,我注意到导出地址 table 中的条目为 0。导出地址 table 中包含空 (0) 条目的目的是什么? (条目 0 不会解析为有效的虚拟地址)

仅供参考 - 使用 NikPEViewer 和 Dll Export Viewer 等应用程序根本不会显示这些条目,DumpBin 显示不包含在导出名称 table 和序号 table 中的导出但它会跳过空条目。

我只有部分回应。 假设我们写下一个 exports.def (win 8.1 x64 user32.dll) file:

EXPORTS
...
wvsprintfW          @2412 
NtUserDelegateInput @2503 NONAME
...

并且@2412 和@2503 之间没有任何序数 - 因此链接器,为了保留您的序数顺序,需要在导出地址 Table 中生成 90 个零条目。所以链接器的原因很明确——它符合我们的指定。但这将我们重定向到另一个问题 - 写这种 def 文件的原因是什么? 认为这与将此文件从一个版本重写到另一个版本有某种关系。 在 win7 x64 中说 user32.dll - 最高序号是 @2502(与 NtUserDelegateInput @2503 比较)

在 win 10 x64 中 user32.dll 可以查看:

...
NtUserUpdateWindowTrackingInfo  @2585 NONAME

; interval [@2586, @2700) is zero

GetDialogBaseUnits96            @2700 NONAME

; @2701 is zero

EnablePerMonitorMenuScaling     @2702 NONAME

new API set export begin from ordinal @2700 (space [@2586, @2700) 已保留?)。但 user32.dll 通常不会导出已知的(稳定的)序数 - 所以它不能在不同版本之间保留。所以我不清楚 DEF 文件中所有直接设置序数的原因