問題タブ [virtualalloc]
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.
c++ - VirtualAllocEx 強制的にページを割り当てる
MSDN のドキュメントによると、VirtualAllocEx
仮想アドレスが実際にアクセスされない限り、または実際にアクセスされるまで、実際の物理ページは割り当てられません。
VirtualAllocEx を呼び出した直後に物理アドレスにアクセスする必要がありますが、まだ物理的に割り当てられていない可能性があります。
最初に仮想メモリにアクセスせずに、VirtualAllocEx と一緒に、または VirtualAllocEx の直後に物理ページを割り当てるにはどうすればよいですか?
delphi - VirtualAlloc - 大きなファイルにスペースを割り当てる
現在、Binary Diff を書き直してより大きなファイルをサポートしようとしていますGetMem
。ファイルの読み取りに使用するとファイル サイズが制限され (おそらく)、それぞれ 900 MB のサイズの 2 つのファイルを読み取ることができないからです。
を使用できると考えましたが、VirtualAlloc
残念ながらまだうまくいきませんでした。最初のファイルの割り当ては、見た目からは正常に機能します。2 番目のファイルにメモリを割り当てようとすると、null ポインターが返されます。私はメモリの割り当てにかなり慣れていないので、この質問に既に回答しているスレッドを監督した可能性がある場合はご容赦ください (過去 4 時間、インターネットで解決策を検索しました)。
さて、コードは次のとおりです。
結局のところ、プログラムを使用して、任意のサイズの 2 つの非テキスト ファイルをバイナリで比較し、そこから Binary Diff を作成したいと考えています。
c++ - VirtualAlloc の失敗
VirtualAlloc を使用してメモリ ブロックを予約およびコミットし、そのブロックを拡張しようとしています。残念ながら、要求されたアドレス範囲が空いていると VirtualQuery が言っているにもかかわらず、エラー ERROR_INVALID_ADDRESS で NULL を返しています。これが私のコードです:
最初の割り当ては 0x00000000000d0000 を返します。VirtualQuery を呼び出すと、「info」に次のデータが生成されます。
これは、MEM_FREE 状態にある 0xd1000 から始まる 0xff の使用可能なページがあることを意味すると解釈します。では、0xd1000 でページをコミットしようとすると失敗するのはなぜですか?
Windows 7 を実行していますが、これは 64 ビット ビルドです。
VirtualAlloc に関する StackOverflow の投稿をいくつか読みましたが、これらはすべて、このコードがドキュメントの理解と同じように機能することを暗示しているようです。
c++ - C++は割り当てられたセクションのベースアドレスを取得します
前に明確ではなかったので、質問を書き直します。
で割り当てられたメモリのセクションの絶対ベース アドレスを取得する必要がありますVirtualAllocEx()
。
たとえば、0x20000 バイトを割り当ててアドレス 0x5000000 を取得するとします。
値 0x5015000 を使用してアドレス 0x5000000 を取得する方法が必要です。
VirtualQuery() は、メモリの割り当てられたセクションのベース アドレスではなく、値 0x5015000 が存在するページ アドレスを返します。
したがって、メモリの割り当てられたセクションのベースアドレスを見つけるには、別の方法が必要です。
c++ - VirtualQuery によって返された空き領域で VirtualAlloc を実行できない
Windows アプリケーション内にロードされる DLL のメモリ範囲内で一定量のメモリを割り当てようとしています。
私が行っている方法はVirtualQuery()
、空きとしてマークされ、割り当てを行う必要がある境界内にあるメモリ領域を検索するために使用しています。私が見ているのは、領域がマークされているにもかかわらずMEM_FREE
VirtualAlloc()
、メモリの割り当てに失敗することがあるということです。
コードは次のコードに非常に近いです。
VirtualAlloc()
失敗したらGetLastError()
リターンERROR_INVALID_ADDRESS
(487).
私がこれを回避した方法は、それが十分に大きい場合は、mbi.RegionSize
ページ サイズのステップを使用してスキャンし、必要なメモリを割り当てることができるアドレスを見つけることです。
VirtualQuery
領域全体が解放され、必要なアドレス内に割り当てることができるはずですが、通常、最初のアドレスがVirtualAlloc
失敗すると、最終的に成功するまでいくつかのステップをループする必要があるのはなぜですか。
c# - VirtualAlloc と GetDelegateForFunctionPointer を使用して C# でバイト配列を実行する際のエラー
C# で作成された Windows フォーム プログラムがあります。これは単なるフォームと 1 つのボタンです。ここで達成したいことは、VirtualAlloc とデリゲートを使用して、ハードコーディングされたバイト配列を実行することです。このハードコードされたバイト配列は、wlar.exe インストーラーのバイトに関連しています。うまくいくか試してみたかっただけです。winrar インストーラーを選択する特別な理由はありません。ボタンクリックイベントには、次のコードがあります。
ただし、プログラムを実行してボタンをクリックすると、次のエラー/例外が発生します。
ここで何が間違っていますか?メモリ割り当てに関係しているようです。これを修正するにはどうすればよいですか? よろしくお願いします!
c++ - 異なる開始アドレスを指定すると、`VirtualAllocEx` は同じアドレスを返しますか?
メッセージボックスを表示するように calc.exe を実行しようとしていますが、プログラムを実行するとすぐに calc.exe が常にクラッシュします。そこで、デバッグ メッセージを表示するために、自分のプロセスにコードを挿入しようとしました。そうすることで、「アクセス違反...実行できません...」という例外が表示されpData->msg
ます。その後、私はそれを知り、同じアドレスpThread
を取得しました。pData
これはどのように可能ですか?私は実際lpAddress
にVirtualAllocEx
topPage
とpPage + 128
to を設定して、同じ開始アドレスを取得しませんでした。
winapi - VirtualAlloc からメモリを (一時的に) 解放する方法は?
使用VirtualAlloc
する場合、メモリ管理を簡素化するために次のプロパティを (ab) 使用できます。
仮想アドレスが実際にアクセスされない限り、または実際にアクセスされるまで、実際の物理ページは割り当てられません。
次のコードを実行して、ブロックを割り当てます。
これはすべてうまくいきます。私の構造が 1.000.000 要素に成長した場合、すべてが機能します。
ただし、その後、構造が 1.000 要素に縮小したとします。
RAM を解放して、再度必要になったときに自動的にコミットされるようにするにはどうすればよいですか?
警告
David は、大きな (巨大な) 連続するメモリ ページをコミットすると大きなコストがかかると警告しました。
したがって、配列を小さなブロックに分割し、クラス/レコードを使用して内部を抽象化する方が有利な場合があります。
c - MEM_TOP_DOWN を使用した VirtualAlloc に相当する Linux/POSIX は何ですか?
MEM_TOP_DOWNを使用したVirtualAllocに相当するLinuxまたはPOSIXは何ですか?
python - VirtualAlloc からの Pydbg ダンプ メモリ
http://securityxploded.com/automation-reversing-scripting.php#Pydbgから取得した次のコードを使用しています。
私の質問は、VirtualAlloc が割り当てるメモリをどのように読み取ることができるかということです。read_process_memory を試しましたが、うまくいきませんでした。