【问题标题】:Hook FindWindow挂钩查找窗口
【发布时间】:2012-01-21 17:37:49
【问题描述】:

我正在尝试使用 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;
}

并且字符串没有损坏。一切正常...为什么我不能检查或直接访问这两个参数?

【问题讨论】:

  • 那将是一个杀手锏。您必须发送 WM_SETTEXT 消息。

标签: c++ winapi hook detours


【解决方案1】:

查看FindWindow 的文档。

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

【讨论】:

  • 噢噢噢!我是白痴!... 花了大约 5 个小时... =))) 我忘记了 NULL :( 现在一切正常!谢谢!感谢所有试图帮助我的人 =)
【解决方案2】:

您得到的异常是EXCEPTION_ACCESS_VIOLATION (0xC0000005)。查看 a1 指向的内容。第一个猜测是 a1[0] 是在做 NULL 指针解引用吗?我会在调试器中运行它并检查调用堆栈以查看错误指针的来源。

你是如何设置 Detours 的?这可能是错误绕道的表现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2018-04-08
    • 2013-06-07
    • 2012-12-25
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多