Kernel 为什么NtUserInternalGetWindowText在内核模式下总是返回0
我已经用自己的函数MyNtUserShowWindow替换了ssdt shadow中的NtUserShowWindow函数。但在MyNtUserShowWindow函数中,我调用NtUserInternalGetWindowText函数尝试获取窗口标题,但它总是返回0(表示失败)。 我不知道为什么 一些代码:Kernel 为什么NtUserInternalGetWindowText在内核模式下总是返回0,kernel,driver,Kernel,Driver,我已经用自己的函数MyNtUserShowWindow替换了ssdt shadow中的NtUserShowWindow函数。但在MyNtUserShowWindow函数中,我调用NtUserInternalGetWindowText函数尝试获取窗口标题,但它总是返回0(表示失败)。 我不知道为什么 一些代码: BOOL MyNtUserShowWindow( IN HWND hWnd, IN int nCmdShow ) { LPWSTR buffer = NULL;
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
}
......
}
我怀疑这是答案,但您分配了错误大小的缓冲区。您正在分配MAX_PATH+1字节,但告诉NtUserInternalGetWindowText缓冲区的MAX_PATH WCHARs(MAX_PATH*2字节)长。除非MAX_PATH为1(事实并非如此),否则这可能会导致访问冲突 如果正在查看的窗口的标题长度超过MAX_PATH/2个字符,则会导致函数失败
您正在查看的窗口也可能属于不同的进程,并且正在管理自己的窗口文本,例如编辑控件。您可能想了解一下GetWindowText(通过扩展假定此未记录的方法)返回不同内容的时间解释。谢谢。我用正常的窗口操作。更正缓冲区大小后,仍然失败。顺便说一下,我认为NtUserShowWindow或ntUserIntentenalgeTwinDowtext函数是在被动级别运行的,因此不需要在内核模式下创建内存,这些地址处于相同的过程中。它是?