Dll windows pe文件的地址导出表中出现空项的原因是什么?

Dll windows pe文件的地址导出表中出现空项的原因是什么?,dll,export,portable-executable,user32,shell32,Dll,Export,Portable Executable,User32,Shell32,我有一个项目,我已经建立了检查一个Windows PE文件。在处理某些文件(如User32和Shell32)时,我注意到导出地址表中的条目为0。在导出地址表中设置空(0)项的目的是什么?(0项未解析为有效的虚拟地址) 仅供参考-使用NikPEViewer和Dll Export Viewer等应用程序根本不会显示这些条目,DumpBin会显示导出名称表和序号表中未包含的导出,但会跳过空条目。我只有部分响应。 假设我们编写下一个exports.def(win 8.1 x64 user32.dll)文

我有一个项目,我已经建立了检查一个Windows PE文件。在处理某些文件(如User32和Shell32)时,我注意到导出地址表中的条目为0。在导出地址表中设置空(0)项的目的是什么?(0项未解析为有效的虚拟地址)


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

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

并且在@2412和@2503之间没有任何序号-所以链接器,为了保留序号顺序,需要在导出地址表中生成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

新的API集导出从序号@2700开始(保留空格[@2586,@2700])。但user32.dll通常不导出已知(稳定)序号-因此不能在版本之间保留它。因此,DEF文件中所有直接集序号的原因对我来说都不清楚

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

并且在@2412和@2503之间没有任何序号-因此,为了保留序号顺序,链接器需要在导出地址表中生成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
新的API集导出从序号@2700开始(保留空格[@2586,@2700])。但user32.dll通常不导出已知(稳定)序号-因此不能从版本到版本保留。因此,我不清楚DEF文件中所有直接集序号的原因