ネイキッド関数を使用して、エクスポートされた MFC DLL 関数をフックしました。
ネイキッド関数の定義は次のとおりです。
__declspec(ネイキッド)
static void __cdecl GenericHook(void* __this,class CScrollViewAccess* objParam1, class CRect& objParam2,unsigned int iParam1, unsigned long iParam2, char* szParam1,
void* vParam1、クラス CFont* objParam3、クラス CFont* objParam4、
クラス CBrush* objParam5)
{ /*関数本体の開始*/
__asm プッシュアド; /* レジスタの格納にも使用される最初の「引数」 */
__asm プッシュ ecx; /* ebp+8 が最初の「引数」を参照するようにパディング */
/* 標準のプロローグを設定します */
__asm プッシュ ebp;
__asm mov ebp、esp;
__asm サブ esp、__LOCAL_SIZE;
if(flg == false)
{
//RECT* rct = reinterpret_cast(&objParam2);
hInst = LoadLibrary("C:\\Sample.dll"); /// MFC DLL
funcPTR = (CMYCLASS_)(((int)hInst)+((int)0x00001032));
funcPTR(__this,objParam2);
/* 通常のエピローグ */
__asm mov esp、ebp;
__asm pop ebp;
__asm pop ecx; /* クリアパディング */
__asm ポップパッド; /* 最初の「引数」をクリア */
__asm jmp [トランポリン];
}
/*関数本体終了*/
Mfc dll には次の機能があります。
void CMyClass::returnRect (クラス CRect & objParam)
{
int 幅 = objParam.Width();
int 高さ = objParam.Height();
CPoint pt = objParam.TopLeft();
ファイル * fp;
char szEnter[6] = {13,0,10,0,0,0};
fp = fopen("c:\\LogFolder\\log.txt","ab+");
fprintf(fp,"幅: %d 高さ: %d X 座標: %d Y 座標: %d\n%s",width,height,pt.x,pt.y,szEnter);
fclose(fp);
}
CRect& パラメータを MFC DLL に渡した後、ログに記録された値が間違っています。
参照オブジェクトを処理するには?