次の方法で共有


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 のキャンセル」を参照してください。