dbgeng.h からの引用:
// シンボル名は一意ではない可能性があります。特に
// オーバーロードされた関数が存在する場合
// 同じ名前です。GetOffsetByName の場合
// その名前に複数の一致を見つけます
// それらのいずれかを返すことができます。その中で
// その場合は S_FALSE を返します
// そのあいまいさは恣意的に解決されました。
// 呼び出し元は SearchSymbols を使用して
// 必要に応じてすべての一致を検索します
// 別の明確化を実行します。
STDMETHOD(GetOffsetByName)(
これ_
__in PCSTR シンボル、
__out PULONG64 オフセット
) ピュア;
したがって、IDebugSymbols::GetNameByOffset() で名前を取得し (「module!name」のように返されると思います)、IDebugSymbols::GetOffsetByName() (これは、複数のオーバーロードに対して S_FALSE を返すことになっています)、StartSymbolMatch()/EndSymbolMatch() を使用して、この名前ですべての可能性を検索します。ただし、ワンライナーではありません(その点ではあまり役に立ちません...)
別のオプションは、一緒に行くことです
HRESULT
IDebugSymbols3::GetFunctionEntryByOffset(
IN ULONG64 オフセット、
ULONG フラグでは、
OUT OPTIONAL PVOID バッファ、
IN ULONG BufferSize,
OUT OPTIONAL PULONG BufferNeeded
);
// 特定の関数で FPO データを取得するために使用できます。
FPO_DATA fpo;
HRESULT hres=m_Symbols3->GetFunctionEntryByOffset(
addr, // オフセット
0, // フラグ
&fpo, // バッファ
sizeof(fpo), // バッファサイズ
0 // バッファが必要
));
次に、基本的なパラメーター サイズの識別に fpo.cdwParams を使用します (cdwParams=パラメーターのサイズ)