mspdbsrv.exe 是 Microsoft 内部用来更新 PDB 文件的实用程序。 编译器通过 RPC 将符号更新发送到 mspdbsrv,然后 mspdbsrv 依次更新 PDB 文件。
我试图了解这些更新的样子。不幸的是,微软没有发布 IDL,所以我不知道 RPC 函数原型,不过,将这些更新作为原始数据来看已经足够有趣了。
mspdbsrv.exe 在这种情况下的默认端点是
\RPC Control\mspdb_10.00.30319.01_rtl_32_00000000000733A0
。但是 mspdbsrv 有一个命令行参数 -endpoint
将其端点设置为不同的端点。然而,编译器可能总是连接到默认端点。这有意义吗?没有 IDL,我如何编写这样的代理 RPC 服务器?
如果有人知道这些 PDB 更新的一些细节,也许有捷径?
我发现mspdbsrv端口名的
00000000000733A0
后缀是什么...(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);
}
}