次の方法で共有


メモリ セクションの管理

ドライバーは、ZwCreateSection 関数を呼び出してセクション オブジェクトを作成できます。この関数からは、作成したセクション オブジェクトへのハンドルが返されます。 FileHandle パラメーターを使用してバッキング ファイルを指定します。セクションをファイルにバックアップしない場合は NULL を指定します。 ZwOpenSection を使用して、セクション オブジェクトへの別のハンドルを開くことができます。

セクション オブジェクトに属するデータに、現在のプロセスのアドレス空間でアクセスできるようにするには、そのセクションのビューをマッピングする必要があります。 ドライバーでは、ZwMapViewOfSection ルーチンを使用して現在のプロセスのアドレス空間にセクションのビューをマッピングできます。 SectionOffset パラメーターで、セクションの中でビューの開始位置となるバイト オフセットを指定し、ViewSize パラメーターで、マッピングするバイト数を指定します。

Protect パラメーターで、ビューに対して実行できる操作を指定します。 読み取り専用ビューにするには PAGE_READONLY、読み取り/書き込みビューにするには PAGE_READWRITE、コピー オン ライト ビューにするには PAGE_WRITECOPY をそれぞれ指定します。

ビューに物理メモリを割り当てるには仮想メモリ範囲にアクセスする必要があります。 メモリ範囲に初めてアクセスするとページ フォールトが発生しますが、つづいてそのメモリの場所を保持するページが割り当てられます。 ファイルにセクションをバックアップしていれば、そのファイルから目的のページに該当する内容が読み取られ、メモリにコピーされます。 (未使用のセクション オブジェクトとビューでは、ブックキーピングの目的で何らかのページ プールと非ページ プールが使用されます)。

ビューを使用しなくなったドライバーは、ZwUnmapViewOfSection を呼び出し、そのビューのマッピングを解除します。 セクション オブジェクトを使用しなくなったドライバーは、ZwClose を使用してそのセクション ハンドルを閉じます。 目的のビューをマッピングした後、つづいてマッピングするビューが他になければ、直ちにセクション ハンドルに対して ZwClose を呼び出しても問題ありません。ビュー (およびセクション オブジェクト) は、ビューのマッピングを解除するまで存在しています。 ドライバーからハンドルを閉じることができなくなるリスクを軽減するために、この措置をお勧めします。