2017-12-16 17 views
1

VirtualAllocによって行われたメモリ割り当てを追跡したいと思います。そのために私はmhookeasyhookを使ってみました。私はVirtualAlloc自分自身を呼び出す限り、両方とも正常に動作します。登録されたフックが呼び出され、実際にはVirtualAllocという関数が呼び出され、メモリは期待通りに返されます。フックされたVirtualAllocは、システムDLLによって呼び出されたときにnullptrを返します

今私の問題は、SFML -windowを開こうとしており、VirtualAllocコールがキャプチャされていますが、メモリは返されません。関数呼び出しはsfml-window-2.dllを通り、そこからを呼び出すCreateAnyContextを呼び出すwglCreateContextを呼び出します。 wglCreateContextはOpengl32.dllにあります。私のユーザスペースコードにはメモリを割り当てる権限がないと思う。私の質問は、なぜ私はそれのためのメモリを割り当てることが許可されていない場合は、システムライブラリ(私が夢中になった)と同じスタブを通過ですか?そして、どうやってこれらの呼び出しに気を配り、それが起こるのを防ぐことができますか?

私の場合は、ウィンドウが開いてからフックVirtualAllocまで待ちます。しかし、これは本当に悪い解決策です。私は任意のプログラムがおそらくメモリを追跡するために私のDLLを注入することを追跡するためです。

EDIT: 私はプログラムメモリを追跡するだけでなく、私の場合はそのためのプログラムの実行があまり遅くなるべきではありませんすべての間、私はまた、記録状態にリセットすることができるようにしたいですゲームになります。したがって、私はVirtualAllocを使い、MEM_WRITE_WATCHフラグを設定し、GetWriteWatchによって返されたページを手動で追跡したいと考えました。私はすでにこのようにリセットできるベクトルを書いていますが、もっと一般的なものにする必要があります。 /EDIT注意する

もう一つは、私があまりにも言った関数内で呼び出されるが、それはメモリが返されHeapAllocでそれを試してみましたこと、です。これが2つのライブラリを試した理由です。 何か助けていただければ幸いです。

+0

UIで表示していますか? wglCreateContextは、グラフィックスデバイスドライバと対話するOpenGL init用です。グラフィックスデバイスドライバがVirtualAllocをフックしておそらく追加の値を渡すこともできますか?私は、CPU時間の驚異的な量であるページフォルトのために1秒以上私に知られていない理由のために必要な200MBのバッファのために返されたメモリが気付いた。これは数年前、私はこれを測定しました。 –

+0

とにかくVirtualAllocをフックする必要はありません。 Windows Performance Toolkit(wpr -start VirtualAlloc)をダウンロードし、ユースケースを実行し、wpr -stop c:\ temp \ VirtualAllocTracing.etlを実行し、WPA(最高のETWビューア)でデータを表示して、漏れを見つけてください。https:// aloiskraus .wordpress.com/2017/12/13/ngen-exe-needing-50-gb-of-memory/ –

+0

@AloisKraus読んでいただきありがとうございます。はい、私はOpenGLのウィンドウを開きます。この関数はフックされていないようですが、私はwglCreateContextから呼び出されたものと同じアドレスに私自身のVirtualAlloc呼び出しを続けました。しかし、私はそれを念頭に置いて再度追跡します。私は自分の投稿でユースケースを更新しました。 – simonides

答えて

0

私はフラグを変更することができませんでした。私の回避策は、呼び出し側が合理的な方法で誰かを知ることができないので、変更されたフラグで割り当てます。失敗した場合は元のフラグで再度割り当てます。

関連する問題