小编hig*_*aki的帖子

GetWindowText如何在没有系统调用的情况下获取另一个进程拥有的窗口的名称来读取该进程的内存?

我想弄清楚GetWindowText背后的系统调用是什么.我写了一个简单的程序,用不同进程中的窗口句柄调用GetWindowText.

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(0,"Attach debugger and set bp","on GetWindowTextA",0);

    HWND winmine = FindWindow(NULL,"Minesweeper");

    if(winmine != NULL)
    {
        char buf[255] = "";
        GetWindowTextA(winmine, buf, 254);
        MessageBox(0,buf,"Found",0);
    }
    else
    {
        MessageBox(0,"?","Found nothing",0);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我附加了一个调试器并逐步执行GetWindowTextA调用,手动单步执行除这些API调用之外的所有操作(按顺序):

  • GetWindowThreadProcessId(在GetWindowLong中)
  • InterlockedIncrement
  • WCSToMBEx(基本上是WideCharToMultiByte)
  • InterlockedDecrement

这些API调用似乎都不能读取不属于调用进程的内存中的字符串.我使用了一个usermode调试器,所以我当然没有在没有意识到的情况下踩到内核模式.这意味着GetWindowText获取窗口名称而不执行上下文切换.这似乎暗示存在的每个窗口的文本都可以在没有上下文切换的情况下访问..并且这不可能是正确的,因为Windows无法为系统上的每个窗口/控件保留文本的副本单一过程.

我读过这篇文章.它提到窗口名称存储在引用"一个特殊的地方",但没有解释如何在没有系统调用/上下文切换的情况下从不同的进程访问这个"特殊地方".

所以我正在寻找关于如何做到这一点的任何解释.非常感谢您提供的任何信息.

windows winapi system-calls

7
推荐指数
1
解决办法
1360
查看次数

标签 统计

system-calls ×1

winapi ×1

windows ×1