0

Windows プロセス情報にアクセスしようとしているように見える次のコードを含む VB6 アプリケーションがあります。

断続的な無限ループの原因である可能性があると思います-配列を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

どうもありがとう アンドリュー

4

1 に答える 1

3

ループはバッファ パラメータのサイズを 2 倍にし、NtQuerySystemInformationメソッドを再度呼び出しています。ループは成功するための呼び出しに依存し、失敗は ntStatus がSTATUS_FLT_BUFFER_TOO_SMALL (0x801C0001)であることの結果であると想定します。ループを終了するには、いくつかの選択肢があります。

  1. バッファが特定のサイズに達すると終了します。
  2. ntStatus が STATUS_SUCCESS (0x00000000) または STATUS_FLT_BUFFER_TOO_SMALL (0x801C0001) でない場合は終了します

また、Microsoft は、Windows バージョンから Windows バージョンに変更される可能性があるため、NtQuerySystemInformation メソッドを使用しないことをお勧めします。詳細と代替メソッドは、NtQuerySystemInformation 関数にあります。

于 2013-12-12T23:35:42.203 に答える