ユーザー モードと共有しないセクションとビューを作成するドライバーは、セクションとビューを操作するときに次のプロトコルを使用する必要があります。
ドライバーは、セクション オブジェクトへのハンドルを開くときにカーネル ハンドルを使用する必要があります。 ドライバーは、システム プロセスでハンドルを作成するか、ハンドルのOBJ_KERNEL_HANDLE属性を指定することによって、ハンドルがカーネル ハンドルであることを確認できます。 詳細については、「オブジェクト ハンドル」を参照してください。
ビューは、システム スレッドからのみマップする必要があります。 (それ以外の場合、ビューはコンテキストが作成されたプロセスからアクセスできます)。ドライバーは、マッピング操作を実行するシステム ワーカー スレッドを使用して、ビューがシステム プロセスからマップされていることを確認できます。 詳細については、「 システム ワーカー スレッド と ドライバー スレッド コンテキスト」を参照してください。
ビューをユーザー モード プロセスと共有するドライバーは、セクションとビューを操作するときに次のプロトコルを使用する必要があります。
ドライバーは、ユーザー モード プロセスではなく、セクション オブジェクトを作成し、ビューをマップする必要があります。
前述のように、ドライバーは、セクション オブジェクトへのハンドルを開くときにカーネル ハンドルを使用する必要があります。 ドライバーは、システム プロセスでハンドルを作成するか、ハンドルのOBJ_KERNEL_HANDLE属性を指定することによって、ハンドルがカーネル ハンドルであることを確認できます。 詳細については、「オブジェクト ハンドル」を参照してください。
ビューは、ビューを共有するプロセスのスレッド コンテキストでマップされます。 最上位レベルのドライバーは、ディスパッチ ルーチン ( DispatchDeviceControl など) でマッピング操作を実行することで、ビューが現在のプロセス コンテキストでマップされていることを保証できます。 下位レベルのドライバーのディスパッチ ルーチンは任意のスレッド コンテキストで実行されるため、ディスパッチ ルーチンでビューを安全にマップすることはできません。 詳細については、「 ドライバー スレッド コンテキスト」を参照してください。
ドライバー内のビューへのすべてのメモリ アクセスは、 try-except ブロックで保護する必要があります。 悪意のあるユーザー モード アプリケーションは、ビューのマップを解除したり、ビューの保護状態を変更したりする可能性があります。 保護されていない限り、どちらの場合も try-except ブロックによってシステムはクラッシュします。 詳細については、「例外の処理」を参照してください。
ドライバーは、必要に応じてビューの内容も検証する必要があります。 ドライバー ライターは、信頼されたユーザー モード コンポーネントのみがビューにアクセスできることを想定できません。
ユーザー モード アプリケーションとセクション オブジェクトを共有する必要があるドライバー (独自のビューを作成できる必要があります) は、次のプロトコルを使用する必要があります。
ドライバーは、ユーザー モード プロセスではなく、セクション オブジェクトを作成する必要があります。 ドライバーは、ユーザー モードから渡されたハンドルを使用しないでください。
ハンドルをユーザー モードに渡す前に、ドライバーは ObReferenceObjectByHandle を呼び出してセクション オブジェクトへの参照を取得する必要があります。 これにより、悪意のあるアプリケーションがハンドルを閉じてセクション オブジェクトを削除できなくなります。 オブジェクト参照は、ドライバーのデバイス拡張機能に格納する必要があります。
ドライバーは、セクション オブジェクトを使用しなくなった後、オブジェクト参照を解放する ObDereferenceObject を呼び出す必要があります。
Microsoft Windows Server 2003 Service Pack 1 (SP1) 以降のバージョンを実行するシステムでは、カーネル モード ドライバーのみが \Device\PhysicalMemory を開くことができます。 ただし、ドライバーは、ユーザー アプリケーションにハンドルを渡すことができます。 セキュリティの問題を回避するには、ドライバーが信頼するユーザー アプリケーションにのみ、\Device\PhysicalMemory へのアクセス権を付与する必要があります。