mspdbsrv.exe は、PDB ファイルを更新するために Microsoft が内部的に使用するユーティリティです。コンパイラは RPC を介してシンボルの更新を mspdbsrv に送信し、mspdbsrv は PDB ファイルを更新します。
これらの更新がどのように見えるかを理解しようとしています。残念ながら Microsoft は IDL をリリースしていないので、私は RPC 関数のプロトタイプを知りませんが、これらの更新を生データとして見るだけでも十分に興味深いものです。
これが私が考えていたことです:
この場合の mspdbsrv.exe の既定のエンドポイントは です\RPC Control\mspdb_10.00.30319.01_rtl_32_00000000000733A0
。しかし、mspdbsrv には、-endpoint
そのエンドポイントを別のエンドポイントに設定するコマンド ライン引数があります。ただし、コンパイラはおそらく常にデフォルトのエンドポイントに接続しています。mspdbsrv の既定のエンドポイントでリッスンし、別のエンドポイントで mspdbsrv.exe を実行し、ログを記録しながら RPC を透過的に mspdbsrv に渡す
一種の「プロキシ サーバー」を作成できると思います。プロキシは mspdbsrv エンドポイントを公開するため、コンパイラはプロキシに接続されていることを認識しません。
これは理にかなっていますか?IDL を使用せずに、そのようなプロキシ RPC サーバーを作成するにはどうすればよいですか?
これらの PDB の更新に関する詳細を誰かが知っていれば、近道があるのではないでしょうか?
アップデート
00000000000733A0
mspdbsrv ポート名の接尾辞は何ですか...( mspdb_10.00.30319.01_rtl_32_00000000000733A0
)。
これは、現在のユーザーのセキュリティ アクセス トークンです。取得方法の抜粋は次のとおりです。
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken) != 0)
{
TOKEN_STATISTICS tsStats;
DWORD dwOutSize;
if (GetTokenInformation(hToken, TokenStatistics, &tsStats, sizeof(tsStats), &dwOutSize))
{
printf(TEXT("%08x%08x\n"), (UINT)tsStats.AuthenticationId.HighPart, (UINT)tsStats.AuthenticationId.LowPart);
}
}