0

我有一个 VB6 应用程序,它具有以下似乎正在尝试访问 Windows 进程信息的代码片段

我认为这可能是间歇性无限循环的原因 - REDIM 数组并咀嚼所有内存。

有没有人知道以下代码的用途,如果他们可以帮助捕捉它循环很长时间并且 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

非常感谢安德鲁

4

1 回答 1

3

循环将缓冲区参数的大小加倍并再次调用NtQuerySystemInformation方法。循环取决于成功的调用,并假设失败是 ntStatus 为STATUS_FLT_BUFFER_TOO_SMALL (0x801C0001)的结果。您有几个选择退出循环。

  1. 如果缓冲区达到一定大小,则退出。
  2. 如果 ntStatus 不是 STATUS_SUCCESS (0x00000000) 或 STATUS_FLT_BUFFER_TOO_SMALL (0x801C0001),则退出

此外,Microsoft 建议不要使用 NtQuerySystemInformation 方法,因为它可能会从 Windows 版本更改为 Windows 版本。详细信息和替代方法可以在NtQuerySystemInformation 函数中找到

于 2013-12-12T23:35:42.203 回答