2013-04-22 200 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

相關問題