物理メモリのスナップショット(VMware VMEMファイルなど)を処理するアプリケーションがあります。特に、物理アドレスではなく仮想アドレスによってスナップショットからプロセス/モジュールを読み取ることができます。これには、ページテーブルを介して一度に4KBのモジュールを再構築することが含まれます。これは、StreamのSeek()メソッドへの多くの呼び出しを意味します。
理由はわかりませんが、これらのSeek()の呼び出しは、物事を劇的に妨げます。結果として、私はそれらを回避する方法、または少なくとも、マネージドSeek()実装を回避する方法を探しています。私の最善の推測は、SetFilePointerをPInvokeして直接操作することですが、そのためには、ストリームのIntPtr/SafeFileHandleを取得する必要があります。いくつかの制限があります:
私が使用しているAPIは.NET3.5に制限されているため、残念ながらMemoryMappedFileはオプションではありません。
FileStream(リフレクションでアクセスできるプライベートSafeFileHandleフィールドがすでにある)またはPInvoke CreateFile()を使用して、スナップショットを別の方法で取得することはできません。APIには、スナップショットを排他的にロックするBinaryReaderが含まれています。
もちろん、FileStreamとは異なり、BinaryReaderもその基礎となるStreamもファイルハンドルへの参照を持っていません。しかし、確かに1つは存在する必要がありますか?その場合、どうすれば入手できますか?