2013-04-22 198 views
0

我用ssdt阴影中的NtUserShowWindow函数替换了我自己的函数MyNtUserShowWindow。但在MyNtUserShowWindow函数中,我调用了NtUserInternalGetWindowText函数来尝试获取窗口标题,但它始终返回0(表示失败)。 我不知道为什么?为什么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 

    } 

    ...... 
} 

回答

0

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

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

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

+0

谢谢。我正常操作窗口。纠正缓冲区大小后,仍然失败。顺便说一下,我认为NtUserShowWindow或NtUserIntenalGetWindowText函数是在PASSIVE级别运行的,所以不需要在内核模式下创建内存,这些地址在同一个进程中。是吗? – 2013-05-06 13:59:03

相关问题