次の方法で共有


StartIo ルーチンの考慮事項

StartIo ルーチンを実装するときは、次の点に注意してください。

  • StartIo ルーチンは、物理デバイスへのアクセス、およびドライバーがデバイス拡張機能で保持する共有状態情報またはリソースへのアクセスを、同じデバイス、メモリの場所、またはリソースにアクセスするドライバーの他のルーチンと同期する必要があります。

    StartIo ルーチンがデバイスまたは状態を ISR と共有する場合は、KeSynchronizeExecution を使用して、ドライバーが提供する SynchCritSection ルーチンを呼び出してデバイスをプログラムするか、共有状態にアクセスする必要があります。 詳細については、「クリティカル セクションの使用 」を参照してください。

    StartIo ルーチンが ISR 以外のルーチンと状態またはリソースを共有する場合は、ドライバーが記憶域を提供するドライバー初期化されたエグゼクティブ スピン ロックで共有状態またはリソースを保護する必要があります。 詳細については、「 スピン ロック」を参照してください。

  • モノリシック非 WDM デバイス ドライバーがコントローラー オブジェクトを設定する場合、その StartIo ルーチンは、コントローラー オブジェクトを使用して、接続されている (類似した) デバイスと共有物理デバイスを介して操作を同期できます。

    詳細については、 コントローラ オブジェクト を参照してください。

  • 密接に結合された上位レベルのドライバーが、基になるデバイス ドライバーに対して大きな DMA 転送要求を事前に割り当てない限り、基になるデバイス ドライバーの StartIo ルーチンは、大きな転送要求を部分転送範囲に分割する必要があり、ドライバーは一連の部分転送デバイス操作を実行する必要があります。 各部分転送は、ハードウェアの機能 (ドライバーのデバイスの機能、または下位 DMA デバイスの場合は、システム DMA コントローラーの機能のうち、厳密な制約がある方) に合わせてサイズを変更する必要があります。

    システムまたはバス マスター DMA の使用の詳細については、「 アダプター オブジェクトと DMA」を参照してください。

  • DMA を使用するドライバーの StartIo ルーチンは、 アダプター オブジェクトを使用して転送を同期する必要があります。

  • StartIo ルーチンは IRQL = DISPATCH_LEVEL で実行され、呼び出すことができるサポート ルーチンのセットが制限されます。

    たとえば、 StartIo ルーチンは、ページング可能なメモリにアクセスしたり割り当てたりすることもできず、ディスパッチャー オブジェクトがシグナル状態に設定されるのを待つことはできません。 一方、 StartIo ルーチンは、 KeAcquireSpinLockAtDpcLevelKeReleaseSpinLockFromDpcLevel を使用して、ドライバー割り当てエグゼクティブ スピン ロックを取得および解放できます。これは、 KeAcquireSpinLockKeReleaseSpinLock よりも高速に実行されます。

    詳細については、「 ハードウェア優先度スピン ロック の管理」を参照してください。

  • ドライバーが取り消し可能な状態で IRP を保持している場合、 その StartIo ルーチンは、デバイスでその要求の処理を開始する前に、入力 IRP が既に取り消されているかどうかを確認する必要があります。 詳細については、「 IRP の取り消し」を参照してください。