次の方法で共有


デバイス インターフェイスの使用

デバイス インターフェイスは、カーネル モード コンポーネントとユーザー モード アプリケーションの両方で使用できます。 ユーザー モード コードでは、CfgMgr32 関数 (CM_Get_Device_Interface_List など) または SetupDiXxx 関数 ( SetupDi デバイス インターフェイス関数を参照) を使用して、登録済みの有効なデバイス インターフェイスを確認できます。 その後、ユーザー モード アプリケーションは、CreateFile などの I/O API を使用して、デバイスに I/O を送信するためにデバイスへのハンドルを取得できます。 デバイス インターフェイスの有効化と無効化、およびそれらのアクションへの対応方法について通知を受け取るには、「デバイス インターフェイスの到着とデバイスの削除の通知の登録」を参照してください。

カーネル モード コンポーネントは、特定のデバイスまたはファイル オブジェクトを使用する前に、次の操作を行う必要があります。

  1. 必要なデバイス インターフェイス クラスが登録され、有効になっているかどうかを確認します。

    ドライバーは、デバイス インターフェイスのインスタンスが有効または無効になったときに通知を受け取る PnP マネージャーに登録できます。 登録するには、コンポーネントが IoRegisterPlugPlayNotification を呼び出します。 このルーチンは、ドライバーが指定したコールバックのアドレスを格納します。このコールバックは、デバイス インターフェイス インスタンスのインスタンスが有効または無効になると、指定したデバイス クラスに対して呼び出されます。 コールバック ルーチンは、インターフェイス インスタンスのシンボリック リンクを 表す Unicode 文字列を含む DEVICE_INTERFACE_CHANGE_NOTIFICATION 構造体を受け取ります。 詳細については、 PnP デバイス インターフェイス変更通知 の使用を参照してください。

    ドライバーまたはその他のカーネル モード コンポーネントは、IoGetDeviceInterfaces を呼び出して、特定のデバイス インターフェイス クラスに対して登録されているすべての有効なデバイス インターフェイス インスタンスの一覧を取得することもできます。 返されるリストには、デバイス インターフェイス インスタンスを識別する Unicode シンボリック リンク文字列へのポインターが含まれています。

  2. インターフェイスのインスタンスに対応するデバイスまたはファイル オブジェクトへのポインターを取得します。

    特定のデバイス オブジェクトにアクセスするには、ドライバーは IoGetDeviceObjectPointer を呼び出し、ObjectName パラメーターに必要なインターフェイスの Unicode 文字列を渡す必要があります。 ファイル オブジェクトにアクセスするには、ドライバーは InitializeObjectAttributes を呼び出し、ObjectName パラメーターに Unicode 文字列を渡し、ZwCreateFile の呼び出しで正常に初期化された属性構造体を渡す必要があります。