AddDevice ルーチンの記述に関するガイドライン
AddDevice ルーチンを記述するときは、以下の設計ガイドラインを考慮してください。
サービスを提供する必要のないデバイスに対して AddDevice ルーチンが呼び出されたとフィルター ドライバーが判断した場合、フィルター ドライバーは、STATUS_SUCCESS を返して、デバイスの残りのデバイス スタックの読み込みを許可する必要があります。 フィルター ドライバーは、デバイス オブジェクトを作成したり、デバイス スタックにアタッチしたりしません。フィルター ドライバーは、成功を返すにすぎず、残りのドライバーのスタックへの追加を許可します。
ドライバーは通常、デバイス オブジェクトのデバイス拡張機能で、カーネル定義オブジェクトおよび使用するエグゼクティブ スピン ロック用のストレージを提供する必要があります。 さらに、ドライバーは、I/O マネージャーまたはその他のシステム コンポーネントから取得した特定のオブジェクトへのポインターのストレージを提供する必要があります。
長期的な I/O バッファーやルックアサイド リストなど、ドライバーのニーズに合わせて追加のシステム領域メモリを割り当てることができます。 その場合、AddDevice ルーチンは以下のルーチンを呼び出すことができます。
ページまたは非ページ システム領域メモリの ExAllocatePoolWithTag
ページまたは非ページ ルックアサイド リストを初期化する ExInitializePagedLookasideList または ExInitializeNPagedLookasideList
ドライバーにデバイス専用スレッドがある場合、またはカーネル定義ディスパッチャー オブジェクトを待機している場合、AddDevice ルーチンはカーネル ディスパッチャー オブジェクトを初期化する可能性があります。
ドライバーがエグゼクティブ スピン ロックを使用するか、割り込みスピン ロックのストレージを提供する場合、AddDevice ルーチンはこれらのスピン ロックを初期化する可能性があります。 詳しくは、「スピン ロック」をご覧ください。
IoCreateDevice を呼び出すとき、ファイルを開くセキュリティを強化します。
IoCreateDevice の呼び出しで FILE_DEVICE_SECURE_OPEN 特性を指定します。 この特性は、Windows NT 4.0 SP5 以降でサポートされています。 開いているすべての要求に対して、デバイス オブジェクトに対してセキュリティ チェックを実行するよう I/O マネージャーに指示します。 FILE_DEVICE_SECURE_OPEN 特性がデバイスのクラス インストーラー INF またはデバイスの INF で設定されておらず、ドライバーがオープン時に独自のセキュリティ チェックを実行しない場合、ベンダーは IoCreateDevice の呼び出しでこの特性を指定する必要があります。 (詳細については「デバイスの名前空間アクセスの制御」を参照してください)。
ドライバーが IoCreateDevice を呼び出すときに FILE_DEVICE_SECURE_OPEN 特性を設定した場合、I/O マネージャーは、デバイス オブジェクトのセキュリティ記述子を、相対オープンまたは末尾のファイル名オープンに適用します。 たとえば、FILE_DEVICE_SECURE_OPEN が \Device\foo に設定されていて、\Device\foo を管理者のみが開くことができる場合、\Device\foo\abc も管理者が開くことができます。 ただし、I/O マネージャーを使用すると、通常のユーザーが \Device\foo と \Device\foo\abc を開けなくなります。
デバイスのいずれかのドライバーがこの特性を設定した場合、PnP マネージャーは、デバイスのすべてのデバイス オブジェクトにそれを伝達します。
重要
このトピックで説明する ExAllocatePool DDI は、Windows 10 バージョン 2004 で非推奨となり、ExAllocatePool2 と ExAllocatePool3 に置き換えられました。 詳細については、「非推奨の ExAllocatePool 呼び出しを ExAllocatePool2 および ExAllocatePool3 にアップグレードする」を参照してください。