第02回 テキストメッセージに注目する

さて、今回からソースコードの中身を見ていくことにします。

今回使っているのは、配布されているWinny2のバイナリから逆に生成したソースコードですので、作者47氏の意図が見えづらくなってしまっています。そこで、逆生成によっても変化する余地のないメッセージ部分から探してみようと思います。

眺めるファイル

前回ファイル一覧から分かる範囲で切り分けてみました。とにかく、Winny の動作を知ることが先決と言うことで、最もファイルサイズの大きかった CMainControl.cpp を眺めることにします。

ざっとソースコードを広く眺めてみると、普通に日本語で書かれている部分が目立っているので探すのはそう大変ではなさそうです。問題は、11248行という大きさだけです。

メッセージ部分

さて、日本語で書かれたメッセージをいくつか見てみると、こういう事が分かります。

  • メッセージが書かれた行やその直後に ny_addlog が呼ばれている。

そこから、メッセージ内容と合わせて考えれば、Winny2 の動作ログ出力のために呼ばれる関数が ny_addlog であると言うことが分かります。このメッセージには当然 Winny の動作内容が書かれているわけです。「ny_addlog」を検索することで、Winnyの動作を追うことがとても楽になりそうです。

広く眺めてみる

さて、この ny_addlog とそこに書かれたメッセージを探すと、いくつかの関数の用途が推測できます。

関数(CMainControlクラス) メッセージ 推測される処理内容
mf_CMainControl_0040 アップフォルダファイル読み込み失敗 アップフォルダの設定ファイルの読み込み
mf_CMainControl_0050 アップフォルダファイル書き込み失敗 アップフォルダの設定ファイルの書き込み
mf_CMainControl_0290 ネットワークサブシステム異常のため待ちうけポートを再初期化しました ネットワーク関係の何か
mf_CMainControl_0290 WSAsyncSelect(accepted) 失敗 WinSock の非同期select
mf_CMainControl_0290 BBSポート待ち受け開始 BBSポートの待ち受け開始
mf_CMainControl_0290 accept() 失敗 ネットワークのコネクション受付(accept)
mf_CMainControl_0450 BBSファイルが多すぎます BBSファイルの読み込み
mf_CMainControl_0460 名前の長すぎるファイルがあります 何かのファイル読み込み
mf_CMainControl_0090 ダウンロードリスト読み込み失敗 ダウンロードリストの読み込み
mf_CMainControl_0100 無視リスト読み込み失敗 無視リストの読み込み
mf_CMainControl_0110 ダウンロードリスト書き込み失敗 ダウンロードリストの書き込み
mf_CMainControl_0100 無視リスト書き込み失敗 無視リストの書き込み
mf_CMainControl_1210 初期ノードファイル読み込み失敗 初期ノードファイルの読み込み
mf_CMainControl_1220 初期ノードファイル出力失敗 初期ノードファイルの書き込み
mf_CMainControl_1570 指定されたキャッシュフォルダが見当たりません。生成しますか? 起動時のフォルダ存在確認

動作ログ以外に気づくこと (キー種別)

CMainControl::mf_CMainControl_0490関数に書かれているメッセージは動作ログではないんですが、とても重要な手がかりです。

ここでは、キー種別を元にした switch 分岐が行われています。この部分を読むと、この関連づけが分かります。

キー種別 メッセージ 推測
KEYTYPE00 仮想フォルダ キャッシュを持たないキー
KEYTYPE01 部分キャッシュまたは受可キャッシュ 部分キャッシュを持つキー
KEYTYPE02 UPフォルダ内 UPフォルダに実体のあるキー
KEYTYPE03 完全キャッシュ 完全なキャッシュを持つキー

このキー種別が定義されている部分を検索してみると、CKey.h で列挙型 enumKeyType として定義されていました。キーの種別は様々な処理に関わってくるので、この4種類は覚えておいた方が良さそうですね。

動作ログ以外に気づくこと (BBSの表示)

CMainControl::mf_CMainControl_1340 あたりも眺めていると BBS の HTML 出力だと言うことが推測できます。当面、BBS 関係にはあまり目を向けませんが、そのうちひつようになることもあるでしょう。同様に、CMainControl::mf_CMainControl_1350,1360 あたりも BBS の投稿結果のようです。

動作ログ以外に気づくこと (システム情報)

最後に見つけておくべきは、CMainControl::mf_CMainControl_0550 に含まれる沢山のメッセージです。おそらくこれらは、Winny のシステム情報タブに表示する処理のようです。ここには、様々な変数をメッセージと結びつけていますから、それぞれの変数の役割を知ることができます。

これらの変数は、一つのWinnyノード全体に関する情報ですから、それらの変数に対する処理を追うことで、パズルを紐解くことができそうです。

今日はここまで

というわけで、今回はテキストメッセージに注目して、CMainControl.cpp を軽く眺めてみました。次は、ネットワークへの送受信あたりからさらに切り分けていこうかなと思います。