

アセンブラで、逆アセンしていると、CALL
MFC42.#800のような行をみかけるのですが、この番号から、これがどのようなDLLなのかを知る方法は無いでしょうか？  
或いは、関連サイトなど  
よろしく、お願いいたします。


CC BY-SA 4.0
2020-09-04T09:44:41.903
70135
2020-11-06T03:56:33.517
15090
question
windows mfc dll
MFC DLLの概要


「これがどのようなDLLなのかを知る」方法は、番号では無くファイル名を使います。

広く知られたDLLなら、検索すればどんなものかは出てきます。  
コメントにあるように、MFC42.DLLはVisual C++
4.2～6.0のMFCライブラリを動的リンクで使用するように作成したプログラムの実行に必要なDLLです。

ちなみにMFC42.DLLはANSI/MBCS(日本ならShift
JIS)版、MFC42U.DLLはUNICODE版です。さらにDが付いているとデバッグ版ですね。

検索で分からない場合は、PCの中でそのファイルをExplorerで検索して、そのファイルの有るフォルダがどのアプリケーションのものか、ファイルを右クリックしてプロパティを見た時に表示される内容は何か、といったことから推測出来る(場合もある)でしょう。

* * *

「DLLの概要」は「MFC42.#800」からは分かりませんが、「800」番の関数が何か？は調べられる可能性があります。  
ただし、DLLファイルではなくプログラムビルドのリンク時に使用する`.LIB`ファイルが必要なようです。(デバッグ版のDLLなら情報が取れるかもしれませんが)

こちらのVisualStudioあるいはBuildTools等に入っている [DUMPBIN](https://docs.microsoft.com/ja-
jp/cpp/build/reference/dumpbin-reference?view=msvc-160) を使います。

> **注意**  
>  このツールは、Visual Studio コマンド プロンプトからのみ開始できます。 システム コマンド
> プロンプトやエクスプローラーからは開始できません。

番号についての説明と、情報を探すためのdumpbinの使い方の説明はこちら。  
[What is an Ordinal number?](https://docs.microsoft.com/en-
us/archive/blogs/vishalsi/what-is-an-ordinal-number)

凡例は`dumpbin /exports $dll | findstr $ordinal`で、`dumpbin /exports mfc42u.lib |
findstr 6928`のように使うとあります。

試しに`dumpbin /exports mfc42u.dll | findstr 800`のようにDLLに使ってみたら`800 0006D320
[NONAME]`となって情報は取れませんでした。  
**追記：**  
@sayuri さんのコメントによると、更に下の方に追記したシンボル情報をダウンロードして使える環境にしておけば、DLLでも分かるそうです。

また、以下のように番号やオフセットに`800`が含まれているものが全て表示されます。(長いのでいくつかピックアップ)

[code]

     399      00006800 [NONAME]
     800      0006D320 [NONAME]
     942      00074800 [NONAME]
     ...
    1709      000D7800 [NONAME]
    1800      00144000 [NONAME]
     ...
    
[/code]

MFC42.LIBは持っていないのでMFC140.LIBに`dumpbin /exports mfc140.lib | findstr
800`と使ってみたら、これも800を含むものがいっぱい列挙されましたが、最後に以下のものが表示されたので、MFC140ではこれが該当するのだと思われます。

[code]

    800    ??0CMFCZoomKernel@@QEAA@XZ (public: __cdecl CMFCZoomKernel::CMFCZoomKernel(void))
    
[/code]

C++の名前付けルールの影響で無機質な情報が色々付いていますが、文字列の一部から推測していけるでしょう。

* * *

@a simpleton さんの回答をみて、そちらの方法があったのを忘れていました。  
上記の回答はプログラムを動かさない状況で調べる方法です。

動かしながら調べるには、VC++に情報の入っているDLLなら気にする必要はない(ソースも含めてインストールしていると尚良いかも)でしょうが、それ以外ならこの辺の記事で環境設定が必要ですね。  
WinDbgではなくVisualStudioIDEでも出来るかも。

[WinDbg でのシンボルと実行可能イメージ パスの設定](https://docs.microsoft.com/ja-jp/windows-
hardware/drivers/debugger/setting-symbol-and-source-paths-in-windbg)  
[Visual Studio デバッガーでシンボル (.pdb) ファイルとソース ファイルを指定します (C#、C++、Visual
Basic、F#)](https://docs.microsoft.com/ja-jp/visualstudio/debugger/specify-
symbol-dot-pdb-and-source-files-in-the-visual-studio-debugger?view=vs-2019)  
[Windows シンボル パッケージ](https://docs.microsoft.com/ja-jp/windows-
hardware/drivers/debugger/debugger-download-symbols)  
[Downloading MFC Debug
Information](https://support.smartbear.com/testcomplete/docs/app-
testing/desktop/visual-c/preparing/mfc-debug-info.html)

Microsoft製ではないDLLは、開発元が公開していれば出来るでしょう。  
[レガシ シンボル パッケージ (.symbols.nupkg) の作成](https://docs.microsoft.com/ja-
jp/nuget/create-packages/symbol-packages)  
[シンボル パッケージ (.snupkg) の作成](https://docs.microsoft.com/ja-jp/nuget/create-
packages/symbol-packages-snupkg)  
[NuGetパッケージのデバッグ](https://techinfoofmicrosofttech.osscons.jp/index.php?NuGet%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0)


CC BY-SA 4.0
2020-11-06T00:55:01.687
71757
2020-11-06T03:56:33.517
2020-11-06T03:56:33.517
26370
26370
70135
answer


デバッガ上で、MFC42.DLL のシンボル ファイル (MFC42.PDB) のロードはきちんと行っているのでしょうか？

あと、WinDbg 上で確認してみましたか？  
WinDbg Preview なら、シンボル ファイルを自動でダウンロードしてくれるので、MFC42.DLL
内部の関数名も、コールスタック上にばっちり表示してくれます。


CC BY-SA 4.0
2020-11-06T01:51:14.410
71759
2020-11-06T01:51:14.410
34652
70135
answer