afxglobals.cpp(Visual Studio 2010のMFC) ///////////////////////////////////////////////////////////////////////////// // DLL Load Helper inline HMODULE AfxLoadSystemLibraryUsingFullPath(_In_z_ const WCHAR *pszLibrary) { WCHAR wszLoadPath[MAX_PATH+1]; if (::GetSystemDirectoryW(wszLoadPath, _countof(wszLoadPath)) == 0) { return NULL; } if (wszLoadPath[wcslen(wszLoadPath)-1] != L'\\') { if (wcscat_s(wszLoadPath, _countof(wszLoadPath), L"\\") != 0) { return NULL; } } if (wcscat_s(wszLoadPath, _countof(wszLoadPath), pszLibrary) != 0) { return NULL; } return(::AfxCtxLoadLibraryW(wszLoadPath)); }
DLLハイジャックを防止するためにOS組み込み系のDLLは基本的にこの関数経由で呼び出されて、システムフォルダにあるDLLを古パスで呼び出すという形になるんですね。
//こうMFCのソースに書かれているので
m_hinstDwmapiDLL = AfxLoadSystemLibraryUsingFullPath(L"dwmapi.dll");//AfxLoadSystemLibraryUsingFullPathがSystemフォルダを補うのでc:\windows\system32\dwmapi.dllを呼び出すことになると。
ほかにもどこかのメンバ関数をデフォルトFALSEで呼び出していたのがTRUEになっていました。うーん、どこだったかな。まだアップデートしていない環境もあるんだけど、それはまた。ほかにも
- afxribbonbar.cpp
- afxvisualmanageroffice2007.cpp
- afxvisualmanagerwindows7.cpp
- appcore.cpp
- ctlmodul.cpp
あたりが更新されています。ほかのところはこの修正ではないように見えますが…時間なくて見てませんorz。