为什么NtUserInternalGetWindowText总是在内核模式下返回0

时间:2013-04-22 18:00:04

标签: kernel driver

我用自己的函数MyNtUserShowWindow替换了ssdt shadow中的NtUserShowWindow函数。但是在MyNtUserShowWindow函数中,我调用NtUserInternalGetWindowText函数来尝试获取窗口标题,但它总是返回0(表示失败)。 我不知道为什么?

一些代码打击:

BOOL MyNtUserShowWindow(
    IN HWND hWnd,
    IN int nCmdShow )
{
    LPWSTR buffer = NULL;
    SIZE_T memSize;
    int strLen;
    NTSTATUS status;

    memSize = MAX_PATH + 1;
    if (NT_SUCCESS(ZwAllocateVirtualMemory( ZwCurrentProcess(),
                                            &buffer,
                                            0,
                                            &memSize,
                                            MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN,
                                            PAGE_READWRITE )))
    {
        strLen = NtUserInternalGetWindowText( hWnd, buffer, MAX_PATH );
        KdPrint(( "the get window len is %d, buffer is %S\n", strLen, buffer)); // strLen = 0

    }

    ......
}

1 个答案:

答案 0 :(得分:1)

我怀疑这是答案,但你要分配错误的大小缓冲区。您正在分配MAX_PATH + 1个字节,但告诉NtUserInternalGetWindowText缓冲区是MAX_PATH WCHAR(MAX_PATH * 2个字节)长。除非MAX_PATH为1(它不是),否则可能会导致访问冲突。

如果您正在查看的窗口的标题长度超过MAX_PATH / 2个字符,则会导致该函数失败。

您正在查看的窗口也可能属于不同的进程,并且正在管理它自己的窗口文本 - 例如编辑控件。您可能需要查看http://blogs.msdn.com/b/oldnewthing/archive/2003/08/21/54675.aspx以获取GetWindowText(以及一个通过扩展假定此未记录的方法)将返回不同内容的时间的解释。