アプリケーションの作業ディレクトリに存在するものとは異なるバージョンの DLL をロードしたいと考えています。そのためには、LoadLibrary 呼び出しをフックして、アプリケーションが DLL をロードする呼び出しを行ったときに、その DLL の新しいバージョンに透過的に置き換えることができるようにする必要があります。NCodeHook を使用してみましたが、DLL に次のコードがあり、NInjectLib を使用してアプリケーションに挿入しましたが、kernel32.dll のロード中にクラッシュします。これが呼び出しを挿入する正しい方法であるか、または他の代替手段があるかどうか、誰か教えてください。
// CodeHook.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <NCodeHookInstantiation.h>
#include "CodeHook.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif
typedef HMODULE (WINAPI *LoadLibraryFPtr)(LPCTSTR dllName);
#pragma data_seg("SHARED")
LoadLibraryFPtr origFunc = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:SHARED,RWS")
HMODULE WINAPI LoadLibraryHook(LPCTSTR dllName)
{
if (origFunc != NULL)
{
return origFunc(dllName);
}
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
CODEHOOK_API void Initialize (void)
{
NCodeHookIA32 nch;
origFunc = nch.createHookByName("kernel32.dll", "LoadLibrary", LoadLibraryHook);
}
#ifdef _MANAGED
#pragma managed(pop)
#endif