2012-01-21 10 views
2

私はDetours 3.0を使用してFindWindowAとFindWindowWをフックしようとしています。この2つの関数は正常にフックし、要求されたクラスとウィンドウのタイトルを見ることができます。私はフックFindWindow

if (lpWindowName[0] == buf) 

またはそのような何かのように任意の単語いくつかにアクセスしようとすると、しかし:

wcscpy(buf, lpWindowName); 
memcpy(buf, lpWindowName, sizeof(lpWindowName)); 

私はエラー(フック・プログラムでexeption)を取得します。私は、この文字列へのアクセスを持ってカントが、私はそれは私が...何も理解していない、間違ったエラーコードを持っていけない

​​

http://s017.radikal.ru/i421/1201/73/54fa9046a46c.png使用読み取ることができます。私はこのコードを使用します:

int filter(DWORD code, struct _EXCEPTION_POINTERS *ep) { 

    char buf[MAX_PATH] = {0}; 
    sprintf(buf,"Exception code: %d", code); 
    MessageBox(NULL,buf,"Error",MB_OK); 
    return EXCEPTION_EXECUTE_HANDLER; 
} 

HWND __stdcall Mine_FindWindowW(LPCWSTR a0, 
    LPCWSTR a1) 
{ 
    __try 
    { 
    if (a1[0] == L'a') 
     return NULL; 
    } 
    __except(filter(GetExceptionCode(), GetExceptionInformation())){ 
    } 
    HWND rv = 0; 
    __try { 
     rv = Real_FindWindowW(a0, a1); 
    } __finally { 
    }; 
    return rv; 
} 

そして文字列は壊れません。すべての仕事...なぜ私はこれらの2つのパラメータをチェックしたり直接アクセスしたりできないのですか?

+1

それはキラーポケだろう。 WM_SETTEXTメッセージを送信する必要があります。 –

+0

WM_SETTEXT? o_O – user922871

答えて

1

FindWindowのドキュメントを確認してください。

いずれの文字列パラメータもNULL(気にしないでください)で、クラス名はアトムにすることができます。いずれかの場合に文字列の参照を解除しようとすると、アクセス違反が発生します(例外コード-1073741819 = 0xC0000005)。

+0

オハイオ州!イムばか!...これに約5時間を費やす... =)))私はNULLを忘れていた:(今はすべて正常に動作します!ありがとう!) そして私を助けることを試みるすべての人に感謝します。 – user922871

0

例外は、EXCEPTION_ACCESS_VIOLATION(0xC0000005)です。 a1が指していることを見てください。最初の推測はa1です[0]はNULLポインタ逆参照をしていますか?私はデバッガでこれを実行し、コールスタックをチェックして、悪いポインタがどこから来ているのかを確認します。

どのように迂回路を設定していますか?これは間違った迂回路の兆候である可能性があります。