SPB 接続周辺機器の接続 ID
ドライバーは、単純な周辺機器バス (SPB) 上の周辺機器に I/O 要求を送信する前に、デバイスへの論理接続を開く必要があります。 この接続を介して、ドライバーは、デバイスとの間でデータを転送する読み取りおよび書き込み要求を送信できます。 さらに、ドライバーは、SPB 固有の操作を実行するデバイスに I/O コントロール (IOCTL) 要求を送信できます。
システムの起動時に、プラグ アンド プレイ (PnP) マネージャーは PnP デバイスと非 PnP デバイスの両方をエミュレートします。 SPB への固定接続を持つ PnP 以外の周辺機器の場合、PnP マネージャーは、ハードウェア プラットフォームの ACPI ファームウェアに対してクエリを実行し、デバイスへのアクセス方法を説明する一連の接続パラメーターを取得します。 これらの接続パラメーターは、デバイスが接続されているバスの SPB コントローラーを識別し、コントローラーがデバイスと通信するために必要なバス アドレスやバス クロック周波数などの他の情報を含みます。
PnP マネージャーは、SPB 接続周辺機器の接続パラメーターに、接続 ID と呼ばれる識別子を割り当てます。 PnP マネージャーは、この ID と接続パラメーターを、リソース ハブと呼ばれるシステム データストアに まとめて格納します。 (リソース ハブは、PnP マネージャーが SPB に接続された周辺機器に関する構成情報を格納する内部データストアです)。接続 ID は、ドライバーが明示的に指定する必要がないように、これらのパラメーターをカプセル化します。
SPB 接続周辺機器のドライバーは、ドライバーに割り当てられたハードウェア リソースの一部として、デバイスの接続 ID を受け取ります。 周辺機器のドライバーがシステム関数を呼び出してデバイスへの接続を開くと、ドライバーは接続 ID を提供し、関数がリソース ハブからデバイスの接続パラメーターを取得するのに使用されます。
ドライバー開発者は、ユーザー モード ドライバー フレームワーク (UMDF) またはカーネル モード ドライバー フレームワーク (KMDF) を使用して、SPB に接続された周辺機器のドライバーを構築できます。 フレームワークがドライバーの IPnpCallbackHardware2::OnPrepareHardware メソッドを呼び出すと、UMDF ドライバーはそのリソース (接続 ID を含む) を受け取ります。 KMDF ドライバーは、EvtDevicePrepareHardware コールバック中にハードウェア リソースを受け取ります。
UMDF 周辺機器ドライバーがリソース一覧で接続 ID を受信できるようにするには、ドライバーをインストールする INF ファイルの WDF 固有 の DDInstall セクションに次のディレクティブを含める必要があります。
UmdfDirectHardwareAccess = AllowDirectHardwareAccess このディレクティブの詳細については、「INF ファイルでの WDF ディレクティブ指定」を参照してください。 このディレクティブを使用する INX ファイル (対応する INF ファイルの構築に使用) の例については、SpbAccelerometer ドライバーのサンプルを参照してください。
ドライバーがリソースとして受け取る接続 ID は 64 ビット整数ですが、ドライバーはこの ID を、リソース ハブから接続パラメーターを取得するのに使用できるデバイス パス名に組み込む必要があります。 デバイス パス名を作成するために、ドライバーは Reshub.h ヘッダー ファイルで宣言されている RESOURCE_HUB_CREATE_PATH_FROM_ID 関数を呼び出します。
SPB に接続された周辺機器への論理接続を開くには、UMDF ドライバーは IWDFRemoteTarget::OpenFileByName メソッドを呼び出し、KMDF ドライバーは WdfIoTargetOpen メソッドを呼び出します。 どちらの方法でも、入力パラメーターとしてデバイス パス名が必要です。
接続 ID を使用して SPB 接続周辺機器への論理接続を開く UMDF と KMDF のコード例については、次のトピックを参照してください。
ユーザーモード SPB 周辺機器ドライバーハードウェア リソースカーネルモード SPB 周辺機器ドライバーのユーザーモード アプリケーションは、SPB に接続された周辺機器への論理接続を開くことができず、これらのデバイスに直接 I/O 要求を送信できません。
SPB に接続された周辺機器へのオープン論理接続を一度に保持できるドライバーは 1 つだけです。 別のドライバーが同じデバイスへ 2 つ目の接続を開こうとすると失敗します。