2

そのため、メモリ空間を でマッピングするとMmMapIoSpace、特定のポイントを過ぎると、データが書き込まれたときに破棄されていることに気付きました。エラー、ブレークポイント、さらにはバグチェックもスローされませんでした。すべてが正常に機能し、悪影響はありませんでした。

書き込み/読み取りテストを実行することにしました (ドライバーは、意図したサイズの長さのすべてのバイトに 1 を書き込みます)。リーダー (ユーザーランド) モードは、1 が終了した場所を読み取り、報告します。

それが思いついた数字は 3208 で、これは一見素敵な丸数字です (/8=401、/256=12 など)。

これどうしたの?バッファ領域全体をマップできないのはなぜですか?

編集そして64ビットでは2492に落ちます。

4

1 に答える 1

2

私は専門家ではありませんが、ユーザースペースバッファーが物理メモリ内で連続しているという保証がないため、MmMapIoSpaceが要求されていることを実行するためにどのように信頼できるかわかりません。

IoAllocateMdl代わりに、とを使用しMmProbeAndLockPagesてユーザーバッファをロックダウンし、MmGetSystemAddressForMdlSafeそれをシステムアドレス空間にマップする必要があると思います。このプロセスについては、ここで説明します

前に述べたように、マッピングが失敗するポイント(バッファーへの3208/2492バイト)はおそらくページの終わりに過ぎないと思いますが、それは確認するのに十分簡単です:ユーザースペースアプリケーションにレポートを取得するオフセットではなく書き込まれなかった最初のバイトの(仮想)アドレス。それが4096の倍数であるかどうかを確認します。

于 2012-06-15T08:52:18.863 に答える