次の方法で共有


仮想メモリと物理メモリ

エンジンには、ターゲットの仮想メモリと物理メモリを読み書きするためのメソッドが多数用意されています。

仮想メモリ

ターゲットの仮想メモリ内の場所を指定する場合は、ターゲットの仮想アドレス空間が使用されます。 ユーザー モード デバッグでは、これは現在のプロセスの仮想アドレス空間です。 カーネル モード デバッグでは、これは暗黙的なプロセスの仮想アドレス空間です。 「現在のプロセスと暗黙的なプロセス」の詳細については、スレッドとプロセス を参照してください。

(ターゲットの) 仮想メモリは 、ReadVirtual を使用して読み取り、 WriteVirtual を使用して書き込むことができます。

ターゲットのメモリ内のポインターは、便利なメソッド ReadPointersVirtualWritePointersVirtual を使用して読み取りおよび書き込みが可能です。 これらのメソッドは、エンジンで使用される 64 ビット ポインターとターゲットで使用されるネイティブ ポインターの間で自動的に変換されます。 これらのメソッドは、後続の要求に使用されるポインター (文字列へのポインターなど) を含むメモリを要求する場合に便利です。

SearchVirtual メソッドと SearchVirtual2 メソッドを使用して、ターゲットの仮想メモリでバイト パターンを検索できます。

FillVirtual メソッドを使用すると、バイトのパターンを複数回ターゲットの仮想メモリにコピーできます。

ターゲットの仮想メモリは、 ReadVirtualUncached メソッドと WriteVirtualUncached メソッドを使用してデバッガー エンジンの仮想メモリ キャッシュをバイパスする方法で読み書きすることもできます。 これらのキャッシュされていないバージョンは、キャッシュを汚染または無効化することなく、メモリ マップされたデバイス領域など、本質的に揮発性の仮想メモリを読み取る場合に役立ちます。 キャッシュされていないメモリ アクセスは、キャッシュされていないアクセスのパフォーマンスがキャッシュアクセスよりも大幅に低くなる可能性があるため、必要な状況でのみ使用する必要があります。

エンジンには、ターゲットの仮想メモリから文字列を読み取る便利なメソッドがいくつか用意されています。 ターゲットからマルチバイト文字列を読み取る場合は、 ReadMultiByteStringVirtualReadMultiByteStringVirtualWide を使用します。 ターゲットから Unicode 文字列を読み取る場合は、 ReadUnicodeStringVirtualReadUnicodeStringVirtualWide を使用します。

メモリの場所に関する情報を検索するには、 GetOffsetInformation を使用します。 ターゲット内のすべての仮想アドレス空間に有効なメモリが含まれているわけではありません。 リージョン内の有効なメモリを検索するには、 GetValidRegionVirtual を使用します。 ターゲット内の有効なメモリを手動で検索する場合、 メソッド GetNextDifferentlyValidOffsetVirtual は、有効性が変更される可能性がある次の場所を検索します。

物理メモリ

物理メモリには、カーネル モード デバッグでのみ直接アクセスできます。

ターゲット上の物理メモリは 、ReadPhysicalReadPhysical2 を使用して読み取ることができ、 WritePhysicalWritePhysical2 を使用して書き込まれます。

FillPhysical メソッドを使用すると、バイトのパターンを複数回ターゲットの物理メモリにコピーできます。

ターゲットの仮想アドレス空間内のアドレスは、 VirtualToPhysical メソッドを使用して、ターゲット上の物理アドレスに変換できます。 仮想アドレスを物理アドレスに変換するために使用されるシステムのページング構造は、 GetVirtualTranslationPhysicalOffsets を使用して見つけることができます。

イベント

ターゲットの仮想メモリまたは物理メモリが変更されると、 IDebugEventCallbacks::ChangeDebuggeeState コールバック メソッドが呼び出されます。