バックグラウンド
Dynamic-Link Library Best Practicesを読み、 DllMainでできることとできないことを理解しました。
ここで、多くのプロジェクトを含む Visual Studio 2013 ソリューションがあるとします。各プロジェクトは、異なるバイナリ/lib ファイルを生成します。
すべてのプロジェクトで使用される lib ファイルを生成するユーティリティ プロジェクトがあるとします。
ここで、このユーティリティ プロジェクトは、たとえば、上記のリンクに基づくLoadLibrary 関数を呼び出すいくつかの汎用関数を定義する場合があります。 DllMain 内から次のタスクを実行しない
質問
関数のスコープ内で呼び出されているため、特定の API を使用できないことを「知っている」汎用関数を実装するにはどうすればよい
DllMain
ですか?Windowsローダーロックにアクセスして、特定の呼び出しを無効にしたり、ロックされている場合は関数のアルゴリズムを変更したりすることはできますか?
例
プロジェクトユーティリティ
wstring GetUserName() // just an example!
{
// do something including LoadLibrary call
}
プロジェクトA
BOOL WINAPI DllMain(
_In_ HINSTANCE hinstDLL,
_In_ DWORD fdwReason,
_In_ LPVOID lpvReserved
)
{
// calls Utility - GetUserName()
}
プロジェクトB
int _tmain(int argc, _TCHAR* argv[])
{
// calls Utility - GetUserName()
}
関数の呼び出しGetUserName()
は ではまったく問題ありませんがProject B
、 では禁止されています。Project A
そのような場合を回避するように、mu ソリューションをスマートにしたいと考えています。
理論的アプローチ
wstring GetUserName() // just an example!
{
if( IsLoaderLocked() )
// do something excluding LoadLibrary call
else
// do something including LoadLibrary call
}
if( IsLoaderLocked() )
もちろん、これは実際のコードではありません。「危険な」API を呼び出す前に評価したい条件の例です。