циклический вызов NtQuerySystemInformation в VB6

У меня есть приложение 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

Большое спасибо Андрей


person Andrew Humphries    schedule 12.12.2013    source источник


Ответы (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

person jac    schedule 12.12.2013
comment
Спасибо, Жак. Он пытается заставить обработчики файлов уничтожать любые процессы, блокирующие файл - я не могу найти никаких альтернатив параметру SystemHandleInformation. Однако я установил ограничение на буфер sixe. Спасибо за вашу помощь! - person Andrew Humphries; 13.12.2013