我可以从Visual Studio立即窗口调用Win32 API吗?

时间:2009-08-21 13:49:14

标签: c++ c visual-studio debugging winapi

我正在调试一个C ++ Win32应用程序,我想从该进程的上下文中调用一个任意的Win32 API,就像程序运行了这行代码一样:

DestroyWindow(0x00021c0e);

但是进入立即窗口会产生:

CXX0017: Error: symbol "DestroyWindow" not found

编辑:使用函数的全名{,,user32.dll}_NtUserDestroyWindow@4,我可以使用立即窗口来了解我的意思,并显示函数的地址:

{,,user32.dll}_NtUserDestroyWindow@4
0x76600454 _NtUserDestroyWindow@4

但是当我试着打电话时,会发生这种情况:

{,,user32.dll}_NtUserDestroyWindow@4(0x00021c0e);
CXX0004: Error: syntax error

甚至可以像这样从立即窗口调用C函数,还是我咆哮错误的树?

3 个答案:

答案 0 :(得分:5)

一旦你有了函数地址(正如你在更新的问题中所做的那样),你可以尝试将它转换为函数指针并调用它:

(*(BOOL (*)(HWND))0x76600454)((HWND)0x00021c0e)

第一部分将地址强制转换为BOOL (*)(HWND),这是一个指向函数的指针,该函数采用HWND参数并返回BOOL。然后,取消引用并调用函数指针。确保参数正确,否则会发生不好的事情。在64位系统上,HWND可能是64位,因此您可能无法将参数作为int传递。

修改:查看完整报道的评论。

答案 1 :(得分:2)

我认为问题在于C ++ EE在解决DestroyWindow的上下文时遇到了问题。请尝试以下

{,,user32}DestroyWindow(0x00021c0e);

我不确定方法调用语法是否支持这种限定风格(过去只用于转换)。但它值得一试。

编辑您可能需要也可能不需要添加!关闭后}。自从我使用这种语法以来,它已经有一段时间了,而且我经常将它与等效的windbg混淆。

答案 2 :(得分:1)

我想出了一个解决方法,但我仍然希望让立即窗口工作。

解决方法是:

  • 获取函数的地址,如问题
  • 中所示
  • 使用Disassembly窗口转到该地址,并在那里放置断点
  • 对应用程序执行某些操作以使其调用DestroyWindow
  • 将调用堆栈备份到DestroyWindow的调用者,如下所示:

    6D096A9D推ecx
    6D096A9E呼叫dword ptr ds:[6D0BB4B8h]

  • push ecx指令上放置一个断点,并清除DestroyWindow

  • 上的断点
  • 点击继续,再次对应用程序执行某些操作以使其调用该代码
  • 记下ecx
  • 的值
  • 将调试器中ecx的值更改为所需的值,然后跳过push/call
  • 恢复ecx的值并使用Set Next Statement返回push,然后继续

它很长,但它确实有效。它假设您可以随意调用应用程序。