圖 3 各種掛鉤
在模塊 OLE32.dll 和 mscoree.dll 的 LoadLibrary 掛鉤函數中,總是首先進行 Win32 LoadLibrary 調用。這將確保模塊請求被加載,并且可用來向來自這些模塊的 LoadLibrary 和 GetProcAddress 調用安裝其他掛鉤。這里,需要解決的最重要的問題是確保在承載 .NET 組件的進程內部足夠早地產生掛鉤。
當 .NET 異常引發并且被 CCW 捕獲時,將調用自定義的 SetErrorInfo 函數。然后,可以通過查詢 _Exception 接口從該函數中提取 .NET 接口指針,如下所示:
HRESULT __stdcall SetErrorInfoWithExceptionLogging(
DWORD dwReserved, IErrorInfo *pErrInfo)
{
CComQIPtr<_Exception> spException(pErrInfo);
if (spException)
{
// Perform work with .NET exception interface
}
}
圖 4 中顯示了對各種掛鉤函數的調用。
在將函數掛鉤以后,它們將一直保持掛鉤狀態,直到進程終止。如果在 DLL 已經卸載之后,進程內部引發了錯誤,則這可能導致訪問沖突,因為 SetErrorInfo 掛鉤仍然指向該 DLL 中定義的函數,而該 DLL 在卸載后將指向無效地址。為了解決該問題,DllCanUnloadNow 函數返回 S_FALSE 以防止 DLL 卸載。替代方法是重置原始的掛鉤函數指針。無論您選擇哪一種方法都可以。
文章來源于領測軟件測試網 http://www.kjueaiud.com/