kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

MS11-025でMFCにどんな変更が加えられたか

全然訓練されていないですが、そういえばMS11-025の変更点確認やらなきゃなぁと思ってソースのdiffを取ってみました。でも手元の環境はほとんどdiff取る前に自動更新しちゃった…orz。職場でざっとdiffとって記憶だけで書いてますので、間違ったらごめん。

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。