2

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

if ( lpWindowName[0] == buf ) 

またはそのようなもの:

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

エラー (フックされたプログラムでの例外) が発生します。この文字列にアクセスすることはできませんが、使用して読み取ることができます

MessageBox(NULL,lpWindowName,lpClassName,MB_OK);

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 つのパラメーターを確認したり、直接アクセスしたりできないのはなぜですか?

4

2 に答える 2

1

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

どちらの文字列パラメーターも NULL (つまり、無視する) にすることができ、クラス名はアトムにすることができます。これらのいずれかの場合に文字列を逆参照しようとすると、アクセス違反が発生します (例外コード -1073741819=0xC0000005)。

于 2012-01-21T21:46:31.227 に答える
0

取得している例外はEXCEPTION_ACCESS_VIOLATION(0xC0000005) です。a1 が指しているものを調べます。最初の推測では、a1[0] は NULL ポインターの逆参照を行っていますか? これをデバッガーで実行し、コール スタックをチェックして、不良ポインターがどこから来ているかを確認します。

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

于 2012-01-21T21:55:22.080 に答える