仮想メモリと物理メモリ

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

仮想メモリ

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

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

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

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

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

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

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

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

物理メモリ

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

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

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

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

イベント

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