钩子FindWindow

时间:2012-01-21 17:37:50

标签: c++ winapi hook detours

我正在尝试使用Detours 3.0挂钩FindWindowA和FindWindowW。这两个函数成功挂钩,我可以看到请求的类和窗口标题。但是当我尝试访问任何类似

的单词时
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 个答案:

答案 0 :(得分:1)

查看FindWindow的文档。

字符串参数可以是NULL(意思是不关心),类名可以是原子。在任何一种情况下尝试取消引用字符串都将导致访问冲突(例外代码-1073741819 = 0xC0000005)。

答案 1 :(得分:0)

您获得的异常是EXCEPTION_ACCESS_VIOLATION(0xC0000005)。看看a1指向的是什么。首先猜测是a1 [0]正在做一个NULL指针取消引用?我会在调试器中运行它并检查调用堆栈以查看坏指针的来源。

你是如何设置Detours的?这可能是绕道不正确的表现。