Kernel 为什么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;

我已经用自己的函数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

    }

    ......
}

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

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


您正在查看的窗口也可能属于不同的进程,并且正在管理自己的窗口文本,例如编辑控件。您可能想了解一下GetWindowText(通过扩展假定此未记录的方法)返回不同内容的时间解释。

谢谢。我用正常的窗口操作。更正缓冲区大小后,仍然失败。顺便说一下,我认为NtUserShowWindow或ntUserIntentenalgeTwinDowtext函数是在被动级别运行的,因此不需要在内核模式下创建内存,这些地址处于相同的过程中。它是?