1

Windows PE ファイルを検査するプロジェクトを作成しました。User32 や Shell32 などの特定のファイルを処理しているときに、エクスポート アドレス テーブルに 0 のエントリがあることに気付きました。エクスポート アドレス テーブルにヌル (0) エントリを持つ目的は何ですか? (0 のエントリは有効な仮想アドレスに解決されません)

参考までに - NikPEViewer や Dll Export Viewer などのアプリケーションを使用すると、これらのエントリはまったく表示されません。DumpBin は、エクスポート名テーブルと序数テーブルに含まれていないエクスポートを表示しますが、null エントリはスキップします。

4

1 に答える 1

1

私は部分的な反応しかありません。次の exports.def (win 8.1 x64 user32.dll) ファイルを作成するとします。

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

@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ファイルのすべての直接設定序数の理由が不明です

于 2016-07-09T15:30:33.393 に答える