【问题标题】:looping NtQuerySystemInformation call in VB6在 VB6 中循环调用 NtQuerySystemInformation
【发布时间】:2013-12-12 16:36:15
【问题描述】:

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

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

有没有人知道以下代码的用途,以及他们是否可以帮助捕获它循环很长时间并且 bytBuf 大小增长过多的场景(您可以推荐一个最大数组byteBuf 的大小?)

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

非常感谢 安德鲁

【问题讨论】:

    标签: vb6 ntdll


    【解决方案1】:

    循环将缓冲区参数的大小加倍并再次调用 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 function找到。

    【讨论】:

    • 谢谢杰克。它试图让文件处理程序终止任何进程锁定文件 - 我找不到 SystemHandleInformation 参数的任何替代方案。不过,我已经对缓冲区六进行了限制。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2011-03-23
    • 1970-01-01
    相关资源
    最近更新 更多