問題タブ [virtualquery]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - メモリ内の文字列を検索する際のパフォーマンスの問題
私は簡単な仕事をする Win32 の下で DLL を開発しています: それは部分文字列のためにホストの仮想メモリをスキャンします。しかし、何らかの理由で、Cheat Engine、ArtMoney、または単一スレッドを使用してスキャンする OllyDbg と比較して、非常に遅くなります。VirtualQuery() で取得した単一のメモリ セクションをスキャンする関数のコードを次に示します。ホスト (.exe アプリケーション) は約 300 ~ 400 MiB のメモリをコミットし、4KiB から 32MiB までのさまざまなサイズで約 170 のメモリ セクションをスキャンする必要があります。MEM_PRIVATE、MEM_COMMIT 領域のみをスキャンし、PAGE_GUARD、PAGE_NOACCESS、PAGE_READONLY はスキャンせず、DLL 自身のメモリをスキップします。
なんらかの理由でパフォーマンスがひどいです。単一の文字列を見つけるのに 10 ~ 12 秒かかります。たとえば、OllyDbg は 2 ~ 3 秒で文字列を見つけます。
MSVS2010を使用しています。
コンパイラ コマンド ライン:
リンカー コマンド ライン:
私は何を間違っていますか?私のアルゴリズムが悪いのでしょうか、それとも他のメモリスキャナが使用するある種の「魔法」がありますか?
c++ - MEMORY_BASIC_INFORMATION32 もう合法じゃない?
Windows API を使用してメモリ情報を照会しようとしています。x86 と x64 の両方を対象にしたいと考えています。MEMORY_BASIC_INFORMATIONに関するドキュメントを読んだところ、ターゲットプロセスの「ビット数」に応じて異なるクエリを実行するには2つ必要であることがわかりました。
しかし、x86 プロセスを照会して MEMORY_BASIC_INFORMATION32 構造体を使用すると、システム エラー コード 24 が表示されます。これは、コマンドの長さが正しくないことを示しています。
しかし、MEMORY_BASIC_INFORMATION64 バージョンを使用すると、呼び出しは x86 プロセスと x64 プロセスの両方で機能します。それはどうした。それは、ドキュメントが私に言っていることを私が理解していることではありません。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa366775(v=vs.85).aspx
したがって、この動作はバージョン間で移植可能です。誰でもこの動作を説明できます。それとも、完全に台無しになっているのは私のシステムだけですか?
これは私が使用するコードです:
よろしくお願いします。