2013-12-12 41 views
0

我有具有以下代碼peice的,似乎是試圖訪問Windows進程信息循環NtQuerySystemInformation調用在VB6

我認爲這可能是一個間歇無限循環的事業VB6應用 - REDIM明一個數組並咀嚼所有的記憶。

有沒有人知道下面這段代碼是用來做什麼的,如果他們能夠幫助捕捉長時間循環的場景,並且bytBuf會變得太長(你能推薦一個max陣列尺寸爲bytBuf?)

Do 

    ReDim bytBuf(nSize) 

    ntStatus = NtQuerySystemInformation(SystemHandleInformation, VarPtr(bytBuf(0)), nSize, 0&) 

    If (Not NT_SUCCESS(ntStatus)) Then 
    If (ntStatus <> STATUS_INFO_LENGTH_MISMATCH) Then 
     Erase bytBuf 
     Exit Function 
    End If 
    'If it always ends up here, it will loop endlessly! How do I stop it?! 
    Else 
    Exit Do 
    End If 

    nSize = nSize * 2 
    ReDim bytBuf(nSize) 

Loop 

非常感謝 安德魯

回答

3

環路被加倍緩衝參數的大小,並再次調用NtQuerySystemInformation方法。該循環取決於調用成功,並假定失敗是由於ntStatus爲STATUS_FLT_BUFFER_TOO_SMALL(0x801C0001)您有幾個退出循環的選擇。

  1. 退出,如果緩衝區達到一定的大小。
  2. 退出,如果NTSTATUS不是STATUS_SUCCESS(00000000)或STATUS_FLT_BUFFER_TOO_SMALL(0x801C0001)

而且微軟建議不使用NtQuerySystemInformation方法,因爲它可能會與Windows版本更改爲Windows版本。詳情和替代方法可在NtQuerySystemInformation function

+0

謝謝Jac。它試圖讓文件處理程序殺死任何進程鎖定文件 - 我無法找到任何替代SystemHandleInformation參數。儘管我已經對緩衝區6e進行了限制。謝謝你的幫助! –