2012-01-21 78 views
2

我想使用Detours 3.0来挂钩FindWindowA和FindWindowW。这两个函数成功挂钩,我可以看到请求的类和窗口标题。但是,当我尝试访问任何字有些像Hook 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; 
} 

而且字符串没有损坏。所有的工作......为什么不能检查或直接访问这两个参数?

+1

这将是一个杀手捅。您必须发送WM_SETTEXT消息。 –

+0

WM_SETTEXT? o_O – user922871

回答

1

检查文档是否为FindWindow

两个字符串参数都可以是NULL(意思是不关心),而类名可以是一个原子。试图在这些情况下解除引用字符串将导致访问冲突(例外代码-1073741819 = 0xC0000005)。

+0

Ohhhhh! im idiot!...花了大概5个小时对此... =)))我忘了NULL :(现在所有工作正常!谢谢! 并感谢所有谁试图帮助我=) – user922871

0

你得到的例外是EXCEPTION_ACCESS_VIOLATION(0xC0000005)。看看a1指向什么。首先猜测是a1 [0]是否在做一个NULL指针解引用?我会在调试器中运行它,并检查调用堆栈以查看坏指针来自哪里。

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