Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I call a Win32 API from the Visual Studio Immediate Window?

I'm debugging a C++ Win32 application and I'd like to call an arbitrary Win32 API from the context of that process, as though the program had run this line of code:

DestroyWindow(0x00021c0e);

But entering that into the Immediate Window gives:

CXX0017: Error: symbol "DestroyWindow" not found

Edit: Using the full name of the function, {,,user32.dll}_NtUserDestroyWindow@4, I can get the Immediate Window to understand which function I mean and display the function's address:

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

but when I try to call it, this happens:

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

Is it even possible to call a C function from the Immediate Window like this, or am I barking up the wrong tree?

like image 561
RichieHindle Avatar asked Aug 21 '09 13:08

RichieHindle


People also ask

What is the use of immediate window in Visual Studio?

Use the Immediate window to debug and evaluate expressions, execute statements, and print variable values. The Immediate window evaluates expressions by building and using the currently selected project.

Is there an immediate window in Visual Studio code?

There is no Immediate Window unlike Visual Studio in VSCode. But you can still execute Javascript in VSCode. Open the JavaScript file in VSCode, then use shortcut Ctrl + Alt + N , the code will run and the output will be shown in the Output Window.

How do I get Call Stack window in Visual Studio?

To open the Call Stack window in Visual Studio, from the Debug menu, choose Windows>Call Stack. To set the local context to a particular row in the stack trace display, select and hold (or double click) the first column of the row.

What is the Call Stack in Visual Studio?

Applies to: Visual Studio Visual Studio for Mac Visual Studio Code. By using the Call Stack window, you can view the function or procedure calls that are currently on the stack. The Call Stack window shows the order in which methods and functions are getting called.


1 Answers

Once you have the function address (as you've done in the updated question), you can try casting it to a function pointer and calling it:

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

The first part of that casts the address to BOOL (*)(HWND), which is a pointer to a function taking an HWND parameter and returning BOOL. Then, the function pointer is dereferenced and called. Make sure to get the parameters correct, otherwise bad things will happen. On 64-bit systems, and HWND might be 64 bits, so you might not be able to get away with passing the parameter as an int.

Edit: See the comments for the full story.

like image 148
Adam Rosenfield Avatar answered Sep 25 '22 17:09

Adam Rosenfield