在VB6中循环NtQuerySystemInformation调用

时间:2013-12-12 16:36:15

标签: vb6 ntdll

我有一个VB6应用程序,其中包含以下代码,似乎试图访问Windows进程信息

我认为这可能是间歇性无限循环的原因 - REDIM-ming一个数组并扼杀所有内存。

有没有人知道下面的代码是什么,以及它们是否可以帮助捕获它循环很长时间并且bytBuf增加太多的场景(并且你能推荐一个最大数组吗?) 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

非常感谢 安德鲁

1 个答案:

答案 0 :(得分:3)

循环使缓冲区参数的大小加倍并再次调用 NtQuerySystemInformation 方法。循环取决于成功调用,并假设ntStatus STATUS_FLT_BUFFER_TOO_SMALL(0x801C0001)导致失败。退出循环有几种选择。

  1. 如果缓冲区达到一定大小则退出。
  2. 如果ntStatus不是STATUS_SUCCESS(0x00000000)或STATUS_FLT_BUFFER_TOO_SMALL(0x801C0001),则
  3. 退出
  4. Microsoft建议不要使用NtQuerySystemInformation方法,因为它可能会从Windows版本更改为Windows版本。可以在NtQuerySystemInformation function

    找到详细信息和替代方法