我用自己的函数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
}
......
}
答案 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(以及一个通过扩展假定此未记录的方法)将返回不同内容的时间的解释。