(57)【要約】【課題】  汎用ＵＳＢドライバを提供するための技術を開示すること。【解決手段】  より詳細には、汎用ＵＳＢのデバイスドライバのアーキテクチャを説明し、このアーキテクチャは、汎用のカーネルモードのドライバにアクセスする、ユーザモードのＵＳＢライブラリを通じた開発を可能にする。説明する実施態様では、方法は、装置のプラグインのイベントに応答して、カーネルモードの汎用デバイスドライバをロードすることを含む。ユーザのソフトウェアコンポーネントは、汎用デバイスドライバと通信する汎用のユーザモードのライブラリ（例えば、ダイナミックリンクライブラリ（ＤＬＬ））によって提供されたルーチンを利用することによって、装置にアクセスする。【選択図】  図１
2005317019.tif 000002
【特許請求の範囲】
【請求項１】
装置のプラグインのイベントに応答して、カーネルモードの汎用デバイスドライバをロードするステップと、
ユーザのソフトウェアコンポーネントが、前記汎用デバイスドライバと結合して通信可能な、汎用のユーザモードのライブラリによって提供された複数のルーチンを利用することによって、前記装置にアクセスするステップと
を備え、分離した汎用デバイスドライバは、プラグインされた装置毎に、または前記装置によってサポートされる機能毎にロードされることを特徴とする方法。
【請求項２】
前記複数のルーチンは、アプリケーションプログラミングインターフェース（ＡＰＩ）として実装されることを特徴とする請求項１に記載の方法。
【請求項３】
前記装置は、ユニバーサルシリアルバス（ＵＳＢ）デバイスであることを特徴とする請求項１に記載の方法。
【請求項４】
前記プラグインのイベントは、プラグアンドプレイ（ＰＮＰ）のモジュールによって検出されることを特徴とする請求項１に記載の方法。
【請求項５】
前記プラグインされた装置に対応して、抽出されたデバイスＩＤに対応するデバイスドライバをロードするステップをさらに備え、前記抽出されたデバイスＩＤは前記プラグインされたデバイスに対応し、前記汎用デバイスドライバは、前記ロードされたデバイスドライバと前記ユーザのソフトウェアコンポーネントとの間の通信を容易にすることを特徴とする請求項１に記載の方法。
【請求項６】
前記デバイスＩＤは、データ通信バスを通じて前記プラグインされた装置に結合されたコアスタックによって抽出されることを特徴とする請求項５に記載の方法。
【請求項７】
プラグインのイベントに応答してデバイスＩＤを抽出するステップと、
前記抽出されたデバイスＩＤに対応するデバイスドライバをロードするステップと、
汎用デバイスドライバをロードして、前記ロードされたデバイスドライバとユーザのソフトウェアコンポーネントとの間の通信を容易にするステップと
を備えたことを特徴とする方法。
【請求項８】
個々の汎用デバイスドライバは、デバイスＩＤ毎に、または、前記デバイスＩＤに対応する装置によってサポートされた機能毎にロードされることを特徴とする請求項７に記載の方法。
【請求項９】
前記デバイスＩＤによって、ユニバーサルシリアルバス（ＵＳＢ）デバイスが識別されることを特徴とする請求項７に記載の方法。
【請求項１０】
前記抽出するステップは、コアスタックによって実行されることを特徴とする請求項７に記載の方法。
【請求項１１】
前記抽出するステップは、コアスタックによって実行され、および前記コアスタックが、データ通信バスに結合して複数の装置と通信することを特徴とする請求項７に記載の方法。
【請求項１２】
前記抽出するステップは、コアスタックによって実行され、少なくとも１つのユーザのソフトウェアコンポーネントは、前記コアスタックに結合されたハブを通じて複数の装置と通信することを特徴とする請求項７に記載の方法。
【請求項１３】
前記汎用デバイスドライバは、カーネルモードでロードされることを特徴とする請求項７に記載の方法。
【請求項１４】
前記ユーザのソフトウェアコンポーネントは、ユーザモードで常駐することを特徴とする請求項７に記載の方法。
【請求項１５】
前記プラグインのイベントは、プラグアンドプレイ（ＰＮＰ）のモジュールによって検出されることを特徴とする請求項７に記載の方法。
【請求項１６】
前記プラグインのイベントは、プラグアンドプレイ（ＰＮＰ）のモジュールによって検出され、および前記ＰＮＰモジュールは、前記抽出されたデバイスＩＤを前記デバイスドライバと突き合わせることを特徴とする請求項７に記載の方法。
【請求項１７】
前記抽出されたデバイスＩＤに対応する一意のＩＤを登録するステップをさらに備えたことを特徴とする請求項７に記載の方法。
【請求項１８】
前記抽出されたデバイスＩＤに対応する装置にアクセスするステップをさらに備えたことを特徴とする請求項７に記載の方法。
【請求項１９】
前記ユーザのソフトウェアコンポーネントが、汎用のユーザモードのライブラリを通じて前記汎用デバイスドライバと通信するステップをさらに備えたことを特徴とする請求項７に記載の方法。
【請求項２０】
前記ユーザのソフトウェアコンポーネントが、前記装置ＩＤに対応する装置との通信を容易にするための複数のルーチンを含む、汎用のユーザモードのライブラリを通じて前記汎用デバイスドライバと通信するステップをさらに備えたことを特徴とする請求項７に記載の方法。
【請求項２１】
前記ルーチンは、アプリケーションプログラミングインターフェース（ＡＰＩ）として実装されることを特徴とする請求項２０に記載の方法。
【請求項２２】
コンピューティング装置と、
前記コンピューティング装置に結合された装置と
を備え、カーネルモードの汎用デバイスドライバが、前記装置を前記コンピューティング装置に結合することに応答してロードされ、ユーザのソフトウェアコンポーネントが、前記汎用デバイスドライバと結合して通信可能な汎用のユーザモードのライブラリにより提供された複数のルーチンを利用することによって前記装置にアクセスし、および個々の汎用デバイスドライバが、装置毎に、または前記装置によってサポートされる機能毎にロードされることを特徴とする装置。
【請求項２３】
前記複数のルーチンは、アプリケーションプログラミングインターフェース（ＡＰＩ）として実装されることを特徴とする請求項２２に記載の装置。
【請求項２４】
前記装置は、ユニバーサルシリアルバス（ＵＳＢ）デバイスであることを特徴とする請求項２２に記載の装置。
【請求項２５】
命令を格納する１つまたは複数のコンピュータ読取可能な媒体であって、実行されると、前記動作命令は、マシンに、
装置のプラグインのイベントに応答して、カーネルモードの汎用デバイスドライバをロードする動作と、
ユーザのソフトウェアコンポーネントが、前記汎用デバイスドライバと結合して通信可能な汎用のユーザモードのライブラリによって提供された複数のルーチンを利用することによって前記装置にアクセスする動作と
を備え、個々の汎用デバイスドライバは、プラグインされた装置毎に、または前記装置によってサポートされる機能毎にロードされることを特徴とする１つまたは複数のコンピュータ読取可能な媒体。
【請求項２６】
前記複数のルーチンは、アプリケーションプログラミングインターフェース（ＡＰＩ）として実装されることを特徴とする請求項２５に記載の１つまたは複数のコンピュータ読取可能な媒体。
【請求項２７】
前記装置は、ユニバーサルシリアルバス（ＵＳＢ）デバイスであることを特徴とする請求項２５に記載の１つまたは複数のコンピュータ読取可能な媒体。
【請求項２８】
前記プラグインのイベントは、プラグアンドプレイ（ＰＮＰ）のモジュールによって検出されることを特徴とする請求項２５に記載の１つまたは複数のコンピュータ読取可能な媒体。
【請求項２９】
前記プラグインされた装置に対応して、抽出されたデバイスＩＤに対応するデバイスドライバをロードする動作をさらに備え、前記汎用デバイスドライバは、前記ロードされたデバイスドライバと前記ユーザのソフトウェアコンポーネントとの間の通信を容易にすることを特徴とする請求項２５に記載の１つまたは複数のコンピュータ読取可能な媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般には、デジタル通信に関し、より詳細には、汎用ユニバーサルシリアルバス（ＵＳＢ）ドライバに関する。
【背景技術】
【０００２】
本特許文献の開示の一部は、著作権保護を受ける材料を含む。著作権所有者は、本特許文献または本特許開示のいかなる者による複製に対しても、それが特許商標庁の特許ファイルまたは記録において現れるときには、異議を唱えないが、そうでない場合、何であれすべての著作権を留保する。（著作権）Ｍｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎ。著作権所有。
【０００３】
コンピュータがより一般的になるにつれて、単一のコンピュータシステムに組み込まれる機能の数は増え続けている。機能追加を、外部装置をコンピュータシステムに接続することによって提供することが多い。また、外部装置はコンピュータシステムと通信して、機能追加を提供する。
【０００４】
ユニバーサルシリアルバス（ＵＳＢ）は、外部装置をコンピュータシステムに接続するための標準的な通信チャネルとなっている。ＵＳＢは、いくつかの装置を同じコンピュータシステムに同時に接続することを可能にするが、比較的高い帯域幅を提供する。例えば、最新の一般に入手可能なバージョンのＵＳＢ（例えば、ＵＳＢ２．０）は、最大４８０Ｍｂｐｓ（メガビット毎秒）まで転送することができる。
【０００５】
ＵＳＢデバイスを提供するベンダは一般に、これらの装置にアクセスすることを可能にするためのデバイスドライバを提供することが求められる。一般に、デバイスドライバは、プログラム、および、コンピュータシステムが装置にアクセスすること（例えば、データを装置から読み取ること、データを装置に書き込むこと、コマンドを装置に送信すること、および、状態データを装置から受信すること）を可能にするデータのセットである。
【０００６】
現在、大部分のＵＳＢデバイスのベンダは、それらの装置用のカーネルモードのデバイスドライバを提供することが求められる。一般に、カーネルはオペレーティングシステム（ＯＳ）の中心部であり、ＯＳの実行中にアクティブなまま存続し、コンピュータシステムをコントロールする。例えば、カーネルは、必要なサービス（メモリおよびプロセス管理など）をコンピュータシステムに提供する。結果として、カーネルモードのドライバは、最小の誤動作（またはバグ）の場合に復旧不可能なシステム全体のクラッシュを容易に引き起こす可能性がある。加えて、ＵＳＢドライバをカーネルモードで実装するには、カーネルモードのドライバをテストするために必要な余分のハードウェアまたはソフトウェアに加えて、複雑なカーネルモードのドライバのプログラミングへの時間およびエネルギーの投資が必要となる。さらに、ＯＳのアップグレード時に、互換性のない、または旧式のカーネルモードのデバイスドライバがクラッシュを引き起こし、システムのアップグレードの成功を妨げる場合がある。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
汎用ＵＳＢドライバを提供するための技術を開示する。より詳細には、汎用ＵＳＢデバイスドライバのアーキテクチャを説明し、このアーキテクチャは、汎用カーネルモードのドライバと通信する、ユーザモードのＵＳＢライブラリを通じた開発を可能にする。
【課題を解決するための手段】
【０００８】
説明する実施態様では、方法は、装置のプラグインのイベントに応答して、カーネルモードの汎用デバイスドライバをロードすることを含む。ユーザのソフトウェアコンポーネントは、汎用デバイスドライバと通信する汎用的なユーザモードのライブラリ（例えば、ダイナミックリンクライブラリ（ＤＬＬ））によって提供されたルーチンを利用することによって、装置にアクセスする。
【０００９】
もう１つの実施態様では、分離した汎用デバイスドライバは、プラグインされた装置毎に、または装置によってサポートされた機能毎にロードされる。
【００１０】
いくつかの実施態様では、製造品がコンピュータプログラム製品として提供される。コンピュータプログラム製品の１つの実施態様は、コンピュータシステムによって読取可能であり、コンピュータプログラムをエンコードする、コンピュータプログラム記憶媒体を提供する。コンピュータプログラム製品のもう１つの実施態様は、コンピューティングシステムにより搬送波において組み立てられ、コンピュータプログラムをエンコードする、コンピュータのデータ信号において提供することができる。
【００１１】
また、コンピュータプログラム製品は、コンピュータ処理をコンピュータシステム上で実行するためのコンピュータプログラムをエンコードする。コンピュータ処理は、装置のプラグインのイベント（プラグアンドプレイのモジュールによって検出することができる）に応答して、カーネルモードの汎用デバイスドライバをロードする。ユーザのソフトウェアコンポーネントは、汎用的なユーザモードのライブラリ（例えば、ダイナミックリンクライブラリ（ＤＬＬ））によって提供されたルーチンを利用することによって、装置にアクセスする。
【００１２】
他の実施態様もまた、本明細書で説明および列挙する。
【００１３】
詳細な説明を、添付の図面を参照して説明する。図面では、参照符号の一番左の数字は、その参照符号が最初に現れる図を識別する。異なる図における同じ参照符号の使用は、類似または等しい項目を指示する。
【発明を実施するための最良の形態】
【００１４】
以下の開示は、汎用デバイスドライバのアーキテクチャを提供するための技術を説明する。より具体的には、汎用ＵＳＢドライバを提供するための技術を開示する。より詳細には、アーキテクチャは、汎用のカーネルモードドライバにアクセスするユーザモードのＵＳＢライブラリを利用する。アーキテクチャは、部分的には、デバイスドライバの開発時間を短縮し、エンドユーザの体験を改善し（例えば、通常のオペレーション中であるか、アップグレード処理中であるかにかかわらず、システム全体のクラッシュを制限することによる）、テストおよびデバッグを集中させる。アーキテクチャをまた、入出力（Ｉ／Ｏ）処理、セキュリティおよび電源管理を改善するために利用することもでき、これをさらに本明細書で論じる。また、本明細書で説明する技術を、ソフトウェア、ファームウェア、ハードウェアおよび／またはそれらの組合せとして実装することができる。
【００１５】
（汎用ドライバの概観）
図１は、汎用デバイスドライバのための例示的システム１００を例示する。本明細書の図１および２における矢印の方向は、一実施態様によるデータの流れの方向を指示する。システム１００には、カーネルモード環境１０２およびユーザモード環境１０４が含まれる。カーネルモード環境１０２にはＵＳＢのコアスタック１０６が含まれ、ＵＳＢのコアスタック１０６はＯＳの一部である場合があり、ＵＳＢデバイスとの通信をハードウェアレベルで可能にする。ＵＳＢのコアスタック１０６はハブ機能を促進することができ、これをさらに、図２を参照して説明する。ＵＳＢのコアスタック１０６は、汎用ＵＳＢドライバ１０８に結合される。汎用ＵＳＢドライバ１０８はＵＳＢデバイスのＩ／Ｏを管理し、より一般には、ＵＳＢデバイスをユーザモード環境１０４に接続する。
【００１６】
ユーザモード環境１０４には、汎用ＵＳＢのユーザモードのライブラリ１１０およびユーザのソフトウェアコンポーネント１１２が含まれる。したがって、ユーザのソフトウェアコンポーネント１１２は、一実施態様ではユーザモードのソフトウェアコンポーネントである。汎用ＵＳＢのユーザモードのライブラリ１１０はルーチン（またはアプリケーションプログラミングインターフェース（ＡＰＩ））を提供し、ＡＰＩをＵＳＢユーザのソフトウェアコンポーネント１１２によって利用して、ＵＳＢデバイスと通信するか、あるいはＵＳＢデバイスをコントロールすることができる。一実施態様では、汎用ＵＳＢのユーザモードのライブラリ１１０はＤＬＬである。したがって、ＵＳＢユーザのソフトウェアコンポーネント１１２は、ルーチンをカーネルモードではなくユーザモードで呼び出すことによって、ＵＳＢデバイスをユーザモード環境１０４から管理することができる。いくつかの例示的ＡＰＩを、以下で同一見出しの下でさらに論じる。
【００１７】
このような実施態様は、システム全体のクラッシュを減らすために想定され、理由は、ＵＳＢユーザのソフトウェアコンポーネント１１２（または、汎用ＵＳＢのユーザモードのライブラリ１１０によって提供されたルーチン）がクラッシュする場合、カーネルのオペレーションは影響を受けないままであるからである。加えて、このようなシステム（１００）は、デバイスドライバの開発時間を短縮し、テストおよびデバッグを集中させる（部分的には、ただ１つのコンピュータシステムのみが、ＵＳＢインターフェースをテストするために必要とされ、すなわち、ユーザモードのソフトウェアコンポーネントがクラッシュするときでさえ、システムは作動可能のままであるからである）。
【００１８】
一実施態様では、ＵＳＢのコアスタック１０６と汎用ＵＳＢドライバ１０８との間の通信インターフェースに対応するデータは、ＵＳＢユーザのソフトウェアコンポーネント１１２と汎用ＵＳＢのユーザモードのライブラリ１１０との間のインターフェースに関する情報も同様に、開発者に公開され、またはそうでない場合は公に入手可能である。一実施態様では、汎用ＵＳＢドライバ１０８と汎用ＵＳＢのユーザモードのライブラリ１１０との間のインターフェースに関する情報を、公開する必要はない。
【００１９】
（複数の装置のための汎用ドライバ）
図２は、複数の装置のための汎用デバイスドライバが複数の場合の、例示的システム２００を例示する。システム２００には、カーネルモード環境１０２、ユーザモード環境１０４、ＵＳＢのコアスタック１０６、汎用ＵＳＢのユーザモードのライブラリ１１０、および、ＵＳＢユーザのソフトウェアコンポーネント１１２が含まれる。
【００２０】
システム２００には、データを通信するためのＵＳＢバス２０２が含まれる（以下に、図６を参照してさらに論じる）。しかし、ＵＳＢバスは一例であり、他のタイプのデータ通信バス（有線または無線通信バス、例えば、ブルートゥース、ｓｍａｌｌ  ｃｏｍｐｕｔｅｒ  ｓｙｓｔｅｍ  ｉｎｔｅｒｆａｃｅ（ＳＣＳＩ）など）を、システム２００において利用することができる。
【００２１】
図２に例示するように、ＵＳＢバス２０２はＵＳＢのコアスタック１０６に結合される（図１に関して説明したように）。ＵＳＢのコアスタック１０６は、次に、ＵＳＢハブ２０６との通信を容易にするために、物理デバイスオブジェクト（ＰＤＯ）に結合される。ＵＳＢハブ２０６は、複数のＵＳＢデバイスがカーネルモード環境１０２内で処理されることを可能にする。したがって、汎用ＵＳＢドライバ（１０８）を、カーネルモード環境１０２とユーザモード環境１０４との間で結合することができることが想定される。
【００２２】
図２に例示するように、複数のＰＤＯを、様々なドライバ（例えば、汎用ＵＳＢドライバ１０８およびＵＳＢ複合ドライバ（ＵＳＢ  ｃｏｍｐｏｓｉｔｅ  ｄｒｉｖｅｒ）２０８）との通信を容易にするために利用することができる。ユーザ環境１０４は、各汎用ＵＳＢドライバ（１０８）と、グローバル一意識別子（ＧＵＩＤ）２１０によって発見および／または識別された機能を通じて通信することができる。各ＧＵＩＤ２１０は、ＵＳＢインターフェース／機能を一意に識別する。１つの例示的実施態様では、ワシントン州レドモンドのＭｉｃｒｏｓｏｆｔ  Ｃｏｒｐｏｒａｔｉｏｎを通じて入手可能なＷｉｎｄｏｗｓ（登録商標）ＯＳなど、ＯＳレジストリファイルおよび／またはドライバファイル（例えば、情報ファイル（ＩＮＦ））内のＧＵＩＤキーのためのフォーマットは、以下の通りである。
【００２３】
HKR,,DeviceInterfaceGUID,,"{058815B2-9805-47d3-B7D5-ABC464D3CA06}"
したがって、各ＧＵＩＤ２１０は、対応する装置によってサポートされた機能を識別し、これらの機能を、ＵＳＢのユーザモードのソフトウェアコンポーネント１１２によって利用することができる。例えば、ユーザモードのソフトウェアコンポーネントは、それらの重要なＧＵＩＤを接続するいかなるドライバをも検索して、所望の機能性をサポートする装置を発見するようになる。ＵＳＢのユーザモードのソフトウェアコンポーネント１１２は次いでＵＳＢデバイスと、図１を参照して説明したように汎用ＵＳＢのユーザモードのライブラリ１１０を通じて通信することができる。
【００２４】
複数のＵＳＢハブ（２０６）を利用して、複数のＵＳＢデバイス、または、単一のＵＳＢデバイス内に組み込まれた機能との通信を可能にすることができることが想定される。例えば、ＵＳＢハブ（２０６）を利用して、キーストロークボタンまたは統合されたポインティングデバイス（例えば、ジョイスティックおよびまたはタッチパッド）に加えて、マルチメディアのコマンドボタンを有するキーボード内の異なる機能へのアクセスを可能にすることができる。
【００２５】
（汎用デバイスドライバの操作）
図３は、汎用デバイスドライバを利用するための例示的方法３００を例示する。プラグアンドプレイ（ＰＮＰ）モジュール（例えば、ＯＳ内に常駐する）によって検出することができる、プラグインのイベントが発生すると（３０２）、コアスタック（例えば、図１および２の１０６）は、プラグインされた装置に対応するデバイスＩＤを抽出する。抽出されたデバイスＩＤは、ＰＮＰモジュールによって提供または検出され（３０６）、ＰＮＰモジュールは、抽出されたデバイスＩＤを汎用ドライバ（例えば、図２の１０８）と突き合わせる（３０８）。
【００２６】
突き合わせた汎用ドライバ（例えば、図１および２の１０８）がロードされて（３１０）、ステージ３１０のロードされたデバイスドライバとユーザのソフトウェアコンポーネント（例えば、図１および２の１１２）との間の通信を促進する。ステージ３１２で、一意のＩＤが登録される（図２の２１０を参照して説明したものなど）。最後に、プラグインされた装置に、ユーザのソフトウェアコンポーネントによって、汎用デバイスドライバを通じてアクセスすることができる（３１４）。
【００２７】
一実施態様では、ＰＮＰモジュールが、別のデバイスＩＤではなく、抽出されたデバイスＩＤを汎用デバイスドライバと突き合わせる（例えば、汎用デバイスドライバが、プラグインされた装置と互換性がある場合）ことが想定される。これは、いかなる追加のドライバをロードする必要性をも除く。したがって、一実施態様では、カーネルモードの汎用デバイスドライバは、装置のプラグインイベントに応答してロードされ、ユーザのソフトウェアコンポーネントは、汎用のユーザモードのライブラリによって提供されたルーチンを利用することによって、装置にアクセスする。汎用のユーザモードのライブラリを、汎用デバイスドライバに結合して通信可能にする。ルーチンをＡＰＩとして実装することができる（これを以下で、「例示的ＡＰＩ」という見出しの下でさらに説明する）。さらに、分離した汎用デバイスドライバを、プラグインされた装置（または、装置によってサポートされた機能）毎にロードすることができる。
【００２８】
（汎用デバイスドライバにおけるＩ／Ｏ処理）
図４は、汎用デバイスドライバにおけるＩ／Ｏを処理するための例示的方法４００を例示する。一実施態様では、方法４００では、ユーザのソフトウェアコンポーネント（例えば、図１および２の１１２）は、少数のルーチンをコールすることによって、ハードウェア特定のＩ／Ｏ処理を汎用デバイスドライバ（例えば、図１および２の１０８）に任せることを可能にする。例えば、ユーザのソフトウェアコンポーネントは単に、汎用ＵＳＢのユーザモードのライブラリ（例えば、図１の１１０）を通じて提供された初期化、読み取り／書き込み、およびコマンドの解放を発行し、特定のデータ長の処理（ｃｏｎｓｉｄｅｒａｔｉｏｎ）、データの断片化、および／またはデータの再アセンブリを汎用デバイスドライバに任せることができる。
【００２９】
例えば、初期化は汎用ＵＳＢのデバイスドライバの状態およびビヘイビア（ｂｅｈａｖｉｏｒ）をデフォルトにリセットし、さらなる操作を処理するために汎用ＵＳＢデバイスドライバを準備することができる。読み取りは、対応する装置上の特定のエンドポイントからデータを読み取ることができ、書き込みは、対応する装置上の特定のエンドポイントにデータを書き込むことができる。解放は、初期化により開始されたセッション中に要求されたすべてのリソースをクリーンアップすることができる。
【００３０】
データ長の処理に関して、ＵＳＢ入力（すなわち、装置から、図５を参照して論じるホストまたはコンピューティングシステムへのデータ）のエンドポイントは、０バイトからそのエンドポイントの指定された最大パケットサイズまでのいかなるサイズでも一度に転送することができるので、ホストシステム上のソフトウェアによって、転送内のパケット毎にこの最大サイズまでを受信するように準備する必要がある（ただし、転送が複数のパケットで構成される場合）。ユーザモードのソフトウェアコンポーネント（例えば、図１および２の１１２）は、転送がこの最大パケットサイズの倍数ではない、転送を要求する場合、汎用ＵＳＢのデバイスドライバは、自動的にこの転送のサイズを調整することができる。したがって、ユーザのソフトウェアコンポーネントが、装置からすべての可能なデータ転送サイズを処理するために不十分な長さを有するデータ転送を要求する場合、データ転送の長さを増大する。これは、クライアントの（クライアントは、ユーザモードのソフトウェアコンポーネントである）バッファを少なくとも２つに分離した転送に分割することによって、実施することができる（これはまた「セグメンテーション」とも呼ばれる）。第１の転送サイズは、クライアントの要求した転送サイズよりも小さい、最大パケットサイズ（以下で「ＭａｘＰａｃｋｅｔ」）の最大倍数にすることができる。この第１の転送のためのバッファは、クライアントのバッファの第１のＮ＊ＭａｘＰａｃｋｅｔ（ただし、この値は、この第１の下位転送のサイズである）であるので、メモリコピーを必要としない。第２の転送は、ＭａｘＰａｃｋｅｔバイトである。この第２の転送のためのバッファは、一実施態様では新たに割り振られたバッファである。両方の転送が完了した後、第２の転送からのデータは、クライアントバッファを埋めるか、あるいはショートパケットに到達するまで、クライアントのバッファに戻すようにコピーされる。いずれかのデータが、コピーの後に第２の転送から残される場合、そのエンドポイントのためのパイプのポリシーに基づいて、このデータを次の転送要求のために保存しても保存しなくてもよい。第１の転送内にショートパケットがある場合、第２の転送は決して発行されない場合があることも想定される。
【００３１】
また、ＵＳＢホストコントローラは、ＵＳＢのコアスタック（例えば、図１および２の１０６）と共に、特定のサイズまでの転送バッファのみを処理する場合が多い。このサイズは、異なるホストコントローラの実装によって異なる場合がある。汎用ＵＳＢのデバイスドライバはこれらのサイズ制限を考慮に入れ、クライアントの転送要求がこの制限を越える場合、転送は２つ以上の転送に分割され、すべての転送はこの制限以下である。一実施態様では、これを実装するために必要とされるバッファコピーはなく、理由は、各下位転送のバッファが単にクライアントの元のバッファの一部であるからである。
【００３２】
図４に例示するように、方法４００はステージ４０２では、例えば、装置にアクセスするために利用されるデータ構造体を定義することによって、初期化する。初期化ステージは、ポリシー設定をデフォルト値にリセットすることができる（以下で、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅなど、例示的ＡＰＩを参照してさらに説明する）。初期化ステージは、一実施態様では、汎用のユーザモードのライブラリ（例えば、図１および２の１１０に関連付けられたＤＬＬ）が実行することを可能にする。
【００３３】
方法４００はパイプのポリシーを定義し（４０４）、パイプのポリシーは、汎用デバイスドライバのビヘイビアを定義することができ、ビヘイビアには例えば、タイムアウト、パケットの終了、エラーからの自動復旧、パケットの終了のガイドライン、ショートパケットの処理、転送されるべきデータの量を予想するために実際のデータに先立ってヘッダを読み取るために使用されるなどの部分的読み取り、重要ではない余分なデータの廃棄、および／または生データの処理（ユーザのソフトウェアコンポーネントが適切なデータ処理を保証中であることを指示する）が含まれ、これを以下で、ＷｉｎＵｓｂ＿ＳｅｔＰｉｐｅＰｏｌｉｃｙなど、例示的ＡＰＩを参照してさらに説明する。一実施態様では、各エンドポイントは、個別に構成可能である汎用ＵＳＢドライバにおいてパイプを有することができる。
【００３４】
これらの例示的なパイプのビヘイビアの設定のいくつかを以下で、様々な実施態様によってさらに説明する。
【００３５】
・  タイムアウト−このパイプのポリシーを特定のエンドポイントについて設定することができ、結果として、そのエンドポイントに関して、指定された合計時間内で完了しないいかなる転送をキャンセルする。
【００３６】
・  パケットの終了のガイダンス−いくつかのＵＳＢデバイスのプロトコルでは、ホストコンピューティングシステムが（ホストから装置への）出力転送の終了時に、ショートパケット（エンドポイントで指定された、しきい値の最大パケットサイズより小さいパケット）によりマークを付けることを必要とする。クライアントの転送がその最大パケットサイズの倍数である場合、ゼロの長さのパケットが送信される。これは、ユーザのソフトウェアコンポーネント（またはクライアント）に対して自動的に行うことができ、クライアントが最大パケットサイズについて、または、転送がこのサイズの倍数であるかどうかを心配する必要がないようにする。
【００３７】
・  エラーからの自動復旧−特定のエンドポイント上の特定の転送のためにＵＳＢバス上に転送エラーがある場合、自動復旧メカニズムを使用可能にして、エラー状態をクリアするように試みることができ、さらなる転送が発行されることが可能になるようにする。また、エラー状態が復旧不可能である場合がある（すなわち、さらなる転送は発生しないようになる）ことも想定される。
【００３８】
・  ショートパケットの処理−一般に、ショートパケットがＵＳＢデバイス上の特定のエンドポイントから受信される場合、転送は、ＵＳＢのコアスタック（例えば、図１および２の１０６）によって完了される。ユーザのソフトウェアコンポーネントは、転送の完了を引き起こすように意図しないこともあれば、むしろ、指定されたバイト数が受信されるまで、装置からの読み取りを続けるようになることもある。一実施態様では、ショートパケットを、このようなイベントを無視してデータを読み取り続けるように汎用ＵＳＢのデバイスドライバを構成することによって、処理することができる。この処理を、最後に受信されたバイトの１バイト過ぎ示すバッファを用いて、早まって完了された転送を再発行することによって実装することができる。
【００３９】
・  部分的読み取り−いくつかのデバイスプロトコルには転送の開始でヘッダが含まれ、ヘッダは、サイズ情報、転送の型などを含む、データについての情報を含む。いくつかのクライアントは、転送の残りを処理する方法を決定する前に、このヘッダのみを読み取ることを望む場合がある。このようなシナリオに対処するために、クライアントは対応するパイプ（転送がターゲットとされるパイプ）のためのビヘイビアを設定して、クライアントがヘッダのみを読み取ることを可能にすることができ、次いで、汎用ＵＳＢのデバイスドライバは、そのパケット内のヘッダの後に受信された、いかなる追加のデータをも保存して、この追加のデータがクライアントの後続の転送の開始に追加されるようにすることができる。
【００４０】
・  余分なデータの廃棄−装置が、パケット内でクライアントが要求したよりも多いデータを送信する場合、クライアントは、エンドポイントのための汎用ＵＳＢのデバイスドライバのビヘイビアを、その余分なデータを廃棄するように、あるいはその余分なデータが後続の転送の開始に追加されるように、構成することができる。
【００４１】
・  生データ−いくつかのクライアントは、汎用ＵＳＢのデバイスドライバの自動的なビヘイビアの訂正を迂回するために、例えば特定の装置の特徴に関して性能を改善するために、クライアント自体で転送制限を管理する方がよい。これらのクライアントは、特定のエンドポイントに関する汎用ＵＳＢのデバイスドライバのビヘイビアを構成することができ、クライアントのビヘイビアを訂正するのではなく、その代わりに正しいクライアントのビヘイビアを要求するようにする。したがって、この手法は、すべて正しいビヘイビアのクライアント要求がコアのＵＳＢスタックに直接渡されることを可能にする。
【００４２】
一実施態様では、ユーザのソフトウェアコンポーネントは次いで、先入れ先出し（ＦＩＦＯ）のバッファのポリシーを定義することができ（４０６）（例えば、特定のパイプ（エンドポイント）のため）、装置からＦＩＦＯを埋め始めることができ（４０８）、これを以下で、ＷｉｎＵｓｂ＿ＳｅｔＦｉｆｏＰｏｌｉｃｙおよびＷｉｎＵｓｂ＿ＳｔａｒｔＦｉｆｏなど、例示的ＡＰＩを参照してさらに説明する。次いで、ＦＩＦＯを読み取ることができる（例えば、後述のＷｉｎＵｓｂ＿ＲｅａｄＦｉｆｏ  ＡＰＩをコールすることによる）。一実施態様では、１つのＦＩＦＯがパイプ毎に提供される。また、ＷｉｎＵｓｂ＿ＲｅａｄＰｉｐｅを使用することによってデータを読み取ることができることも、想定される。したがって、ＦＩＦＯはデータを読み取るために必要とされない。しかし、ＦＩＦＯを、任意の時間でデータを生成することができる、あるいは例えば、常にデータをストリームする、特定のクラスの装置のために使用することができる。
【００４３】
次いでステージ４１０で、パイプが読み取られ、あるいは書き込まれる。また、以下で詳述するように、他のＡＰＩがＩ／Ｏ処理のために使用可能であり、これらの他のＡＰＩは、ユーザのソフトウェアコンポーネントがＩ／Ｏ関数をより細かく制御することを可能にする。例えば、一実施態様では、装置が、クライアントバッファにとって大きすぎるパケットにより応答する場合、データは次の転送の開始で追加される（このオプションを、例えば、Ａｌｌｏｗ＿Ｐａｒｔｉａｌ＿Ｒｅａｄｓによって使用可能にする場合）。
【００４４】
（例示的ＡＰＩ）
１つまたは複数の例示的ＡＰＩを以下で例示し、これらのＡＰＩをＭｉｃｒｏｓｏｆｔのＷｉｎｄｏｗｓ（登録商標）環境内で利用して、図１および２を参照して説明したルーチンを提供することができる。例えば、ルーチン（例えば、図１および２の汎用ＵＳＢのユーザモードのライブラリ１１０の中にある）は、以下の動作（以下でさらに説明する）をサポートすることができる。
【００４５】
・  ＵＳＢ記述子の装置、構成、インターフェースおよび文字列について問い合わせること、
・  ＧＵＩＤのデバイスインターフェースのクラスに関連付けられたＵＳＢのデバイスインターフェースを列挙し、ベンダにより供給されたコールバックのルーチンを用いて、これらのインターフェースをフィルタリングすること、
・  ＵＳＢデバイスのいくつかのインターフェースを選択的に起動状態にし、他のインターフェースを使用しない状態のままにすること、
・  標準のコントロール転送の要求を生成すること、および／または
・  コントロール、バルク、割り込み、および等時性のデータを伝送すること。
【００４６】
後述の例示的ＡＰＩは、それらがＭｉｃｒｏｓｏｆｔのＷｉｎｄｏｗｓ（登録商標）ＯＳに関する汎用ＵＳＢのデバイスドライバに対応することを示すために、「ＷｉｎＵＳＢ」によって始められる。他の名前付け規則が利用される場合があることは想定される。また、各ＡＰＩのためのサンプルのコール、パラメータ、および戻り値を以下で強調する。
【００４７】
（１．ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅ）
ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅの関数は、ＷｉｎＵｓｂのデータ構造体を初期化する。この関数がコールされる場合、ポリシー設定はデフォルト値にリセットされることに留意されたい。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_Initialize(
IN HANDLE DeviceHandle,
OUT PWINUSB_INTERFACE_HANDLE InterfaceHandle
);
【００４８】
（パラメータ）
（ＤｅｖｉｃｅＨａｎｄｌｅ）
ファイルを作成するためのルーチン（例えば、ＣｒｅａｔｅＦｉｌｅ）によって戻された装置へのハンドル。ＷｉｎＵｓｂはオーバーラップされたＩ／Ｏを使用して、フラッグ（例えば、ＦＩＬＥ＿ＦＬＡＧ＿ＯＶＥＲＬＡＰＰＥＤ）がＣｒｅａｔｅＦｉｌｅコールにおいて指定されるべきであるようにする。
【００４９】
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、他のすべてのＷｉｎＵＳＢのＡＰＩ関数コールのために使用することができる、インターフェースのハンドルである。これは、ＷｉｎＵＳＢによって生成される不透明なハンドル（ｏｐａｑｕｅ  ｈａｎｄｌｅ）である。
【００５０】
（戻り値）
この関数は、成功した場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【００５１】
（２．ＷｉｎＵｓｂ＿Ｆｒｅｅ）
ＷｉｎＵｓｂ＿Ｆｒｅｅの関数は、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって割り振られたすべてのリソースを解放する。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_Free(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle
);
【００５２】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【００５３】
（戻り値）
この関数は、成功した場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【００５４】
（３．ＷｉｎＵｓｂ＿ＱｕｅｒｙＡｌｔｅｒｎａｔｅＩｎｔｅｒｆａｃｅ）
ＷｉｎＵｓｂ＿ＱｕｅｒｙＡｌｔｅｒｎａｔｅＩｎｔｅｒｆａｃｅの関数は、特定のインターフェースのハンドルのための第１の代替のインターフェースの記述子を戻す。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_QueryAlternateInterface(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR AlternateInterfaceNumber,
OUT PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor
);
【００５５】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【００５６】
（ＡｌｔｅｒｎａｔｅＩｎｔｅｒｆａｃｅＮｕｍｂｅｒ）
これは、戻すべき代替のインターフェースを指示する値である。０の値は、第１の代替のインターフェースを指示し、１の値は、第２の代替のインターフェースを指示する、などとなる。
【００５７】
（ＵｓｂＡｌｔＩｎｔｅｒｆａｃｅＤｅｓｃｒｉｐｔｏｒ）
コール側によって割り振られたＵＳＢ＿ＩＮＴＥＲＦＡＣＥ＿ＤＥＳＣＲＩＰＴＯＲの構造体へのポインタ。
【００５８】
（戻り値）
この関数は、成功し、構造体をポピュレート（ｐｏｐｕｌａｔｅ）した場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【００５９】
（４．ＷｉｎＵｓｂ＿ＱｕｅｒｙＤｅｖｉｃｅｉｎｆｏｒｍａｔｉｏｎ）
ＷｉｎＵｓｂ＿ＱｕｅｒｙＤｅｖｉｃｅｉｎｆｏｒｍａｔｉｏｎの関数は、ＷＩＮＵＳＢインターフェースに関連付けられる物理デバイスについての情報を戻す。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_QueryDeviceInformation(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN ULONG InformationType,
IN OUT PULONG BufferLength,
OUT PVOID Buffer
);
【００６０】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【００６１】
（ＩｎｆｏｒｍａｔｉｏｎＴｙｐｅ）
これは、どのインターフェースの情報の値を検索するべきであるかを指定する値である。
【００６２】
（ＢｕｆｆｅｒＬｅｎｇｔｈ）
これは、バイト単位のＢｕｆｆｅｒの長さ、すなわち、読み取るべき最大のバイト数である。このパラメータを、Ｂｕｆｆｅｒにコピーされた実際のバイトの数に設定することができる。
【００６３】
（Ｂｕｆｆｅｒ）
これは、要求された値を受信する、コール側によって割り振られたバッファである。
【００６４】
（戻り値）
この関数は、成功し、構造をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【００６５】
（注記）
以下のリストは、可能性のあるＩｎｆｏｒｍａｔｉｏｎＴｙｐｅの値を説明する。
【００６６】
（ＤＥＶＩＣＥ＿ＳＰＥＥＤ（０ｘ０１））
この要求は、以下の値のうち１つを、装置の速度に基づいて戻すようになる。
ＬｏｗＳｐｅｅｄ（０ｘ０１）
ＦｕｌｌＳｐｅｅｄ（０ｘ０２）
ＨｉｇｈＳｐｅｅｄ（０ｘ０３）
【００６７】
（ＰＨＹＳＩＣＡＬ＿ＤＥＶＩＣＥ＿ＩＤ（０ｘ０２））
この値は、装置の物理デバイスの識別子を含む。
【００６８】
（５．ＷｉｎＵｓｂ＿ＧｅｔＤｅｓｃｒｉｐｔｏｒ）
ＷｉｎＵｓｂ＿ＧｅｔＤｅｓｃｒｉｐｔｏｒの関数は、要求された記述子を戻す。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_GetDescriptor(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR DescriptorType,
IN UCHAR Index,
IN USHORT LanguageID,
OUT PUCHAR Buffer,
IN ULONG BufferLength,
OUT PULONG LengthTransferred
);
【００６９】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【００７０】
（ＤｅｓｃｒｉｐｔｏｒＴｙｐｅ）
これは、戻すべき記述子のタイプを指定する値である。標準の値については、非特許文献１のＵＳＢ仕様を参照することができる。
【００７１】
（Ｉｎｄｅｘ）
これは記述子インデックスであり、非特許文献１のＵＳＢ仕様において文書化されている。
【００７２】
（ＬａｎｇｕａｇｅＩＤ）
要求された記述子が文字列の記述子である場合、これは言語の識別子を指定する値である。
【００７３】
（Ｂｕｆｆｅｒ）
これは、要求された記述子を受信する、コール側によって割り振られたバッファである。
【００７４】
（ＢｕｆｆｅｒＬｅｎｇｔｈ）
これは、バイト単位のＢｕｆｆｅｒの長さ、すなわち、読み取るべき最大のバイト数である。
【００７５】
（ＬｅｎｇｔｈＴｒａｎｓｆｅｒｒｅｄ）
これは、Ｂｕｆｆｅｒにコピーされた実際のバイトの数を受信する。
【００７６】
（戻り値）
この関数は、成功し、構造をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【００７７】
【非特許文献１】http://www.usb.orgで入手可能であるＵＳＢ仕様  （６．ＷｉｎＵｓｂ＿ＳｅｔＣｕｒｒｅｎｔＡｌｔｅｒｎａｔｅＩｎｔｅｒｆａｃｅ）  ＷｉｎＵｓｂ＿ＳｅｔＣｕｒｒｅｎｔＡｌｔｅｒｎａｔｅＩｎｔｅｒｆａｃｅの関数は、インターフェースのための指定された代替のインターフェースの設定を選択する。このＡＰＩをコールするための例示的メソッドは以下の通りである。  BOOL_stdcall  WinUsb_SetCurrentAlternateInterface(   IN WINUSB_INTERFACE_HANDLE InterfaceHandle,   IN UCHAR InterfaceNumber   );
【００７８】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【００７９】
（ＩｎｔｅｒｆａｃｅＮｕｍｂｅｒ）
これは、ＰＵＳＢ＿ＩＮＴＥＲＦＡＣＥ＿ＤＥＳＣＲＩＰＴＯＲの構造体のｂＩｎｔｅｒｆａｃｅＮｕｍｂｅｒメンバに含まれた値であり、ＷｉｎＵｓｂ＿ＱｕｅｒｙＡｌｔｅｒｎａｔｅＩｎｔｅｒｆａｃｅによってポピュレートされたものである。
【００８０】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【００８１】
（７．ＷｉｎＵｓｂ＿ＧｅｔＣｕｒｒｅｎｔＡｌｔｅｒｎａｔｅＩｎｔｅｒｆａｃｅ）
ＷｉｎＵｓｂ＿ＧｅｔＣｕｒｒｅｎｔＡｌｔｅｒｎａｔｅＩｎｔｅｒｆａｃｅ関数は、インターフェースのための現在の代替のインターフェースの設定を得る。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_GetCurrentAlternateInterface(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
OUT PUCHAR InterfaceNumber
);
【００８２】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅから戻されたインターフェースのハンドルである。
【００８３】
（ＩｎｔｅｒｆａｃｅＮｕｍｂｅｒ）
これは、現在選択された代替のインターフェースを受信するようになる、ＵＣＨＡＲへのポインタである。
【００８４】
（戻り値）
この関数は、関数が成功し、構造体をポピュレートする場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒへのコールによって検索することができる。
【００８５】
（８．ＷｉｎＵｓｂ＿ＱｕｅｒｙＰｉｐｅ）
ＷｉｎＵｓｂ＿ＱｕｅｒｙＰｉｐｅの関数は、インターフェースに関連付けられる、指定されたパイプについてのパイプの情報を戻す。デフォルトのコントロールのパイプは戻されない場合があることに留意されたい。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_QueryPipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR AlternateInterfaceNumber,
IN UCHAR PipeIndex,
OUT PWINUSB_PIPE_INFORMATION PipeInformation
);
【００８６】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【００８７】
（ＡｌｔｅｒｎａｔｅＩｎｔｅｒｆａｃｅＮｕｍｂｅｒ）
これは、情報が戻されるべき先の代替のインターフェースを指定する値である。
【００８８】
（ＰｉｐｅＩｎｄｅｘ）
これは、情報が戻されるべき先のパイプを指定する値である。この値は、一実施態様では、ＰｉｐｅＩｄと同じではない。そうではなく、この値は、インターフェースのリストにおけるパイプを表現する。０の値は第１のパイプを示し、１の値は第２のパイプを示す、などとなる。この値は、インターフェースの記述子におけるｂＮｕｍＥｎｄｐｏｉｎｔｓより小さくなるべきである。
【００８９】
（ＰｉｐｅＩｎｆｏｒｍａｔｉｏｎ）
これは、コール側によって割り振られたＷＩＮＵＳＢ＿ＰＩＰＥ＿ＩＮＦＯＲＭＡＴＩＯＮの構造体へのポインタである。
【００９０】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【００９１】
（注記）
ＷＩＮＵＳＢ＿ＰＩＰＥ＿ＩＮＦＯＲＭＡＴＩＯＮの構造体の定義を、以下のようにすることができる。
typedef struct_WINUSB_PIPE_INFORMATION {
USBD_PIPE_TYPE PipeType;
UCHAR      PipeId;
USHORT     MaximumPacketSize;
UCHAR      Interval;
} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION;
【００９２】
ＰｉｐｅＩｄのメンバは、ＵＳＢの８ビット（１６進）のエンドポイントアドレスであり、このアドレスは７ビットアドレスおよび符号ビット（ｄｉｒｅｃｔｉｏｎ  ｂｉｔ）からなる。
【００９３】
（９．ＷｉｎＵｓｂ＿ＳｅｔＰｉｐｅＰｏｌｉｃｙ）
ＷｉｎＵｓｂ＿ＳｅｔＰｉｐｅＰｏｌｉｃｙの関数は、特定のパイプ（エンドポイント）のポリシーを設定する。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_SetPipePolicy(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN ULONG PolicyType,
IN ULONG ValueLength,
IN ULONG_PTR Value
);
【００９４】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【００９５】
（ＰｉｐｅＩＤ）
これは、パイプのポリシーを設定するためのパイプに属するパイプの識別子である。
【００９６】
（ＰｏｌｉｃｙＴｙｐｅ）
これは、変更するべきポリシーパラメータを指定する値である。
【００９７】
（ＶａｌｕｅＬｅｎｇｔｈ）
これは、Ｖａｌｕｅが指すバッファの、バイト単位の長さであり、あるいは、Ｖａｌｕｅがバッファを指さない場合、ゼロである。
【００９８】
（Ｖａｌｕｅ）
ＰｏｌｉｃｙＴｙｐｅによって指定されるポリシーのパラメータのための新しい値。
【００９９】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１００】
（注記）
以下のリストは、可能性のあるＰｏｌｉｃｙＴｙｐｅ値を説明する。
【０１０１】
（ＳＨＯＲＴ＿ＰＡＣＫＥＴ＿ＴＥＲＭＩＮＡＴＥ（０ｘ０１））
ＶａｌｕｅがＴＲＵＥである（ゼロではない）場合、エンドポイントのための最大パケットサイズの倍数であるあらゆるＷＲＩＴＥ（ＯＵＴ）要求は、ゼロの長さのパケットにより終了される。デフォルトはＦＡＬＳＥである。
【０１０２】
（ＡＵＴＯ＿ＣＬＥＡＲ＿ＳＴＡＬＬ（０ｘ０２））
ＶａｌｕｅがＴＲＵＥである（ゼロではない）場合、停止のＰＩＤは無視されるようになり、先入れ先出し（ＦＩＦＯ）のバッファリングが使用中でない限り、エラーが戻されるようになる。この場合、しかし、パイプは停止されないようになり、データは流れ続けるようになる。このパラメータはＣＯＮＴＲＯＬのパイプに影響を及ぼさない。ホストが自動的に装置の停止状態をクリアすることに留意されたい。デフォルトはＦＡＬＳＥである。
【０１０３】
（ＰＩＰＥ＿ＴＲＡＮＳＦＥＲ＿ＴＩＭＥＯＵＴ（０ｘ０３））
Ｖａｌｕｅは、転送が後にキャンセルされるべきである、ミリ秒単位の合計時間である。ゼロの値は、無限大の合計時間を示す。デフォルトは無限大の合計時間である。
【０１０４】
（ＩＧＮＯＲＥ＿ＳＨＯＲＴ＿ＰＡＣＫＥＴＳ（０ｘ０４））
ＶａｌｕｅがＴＲＵＥである（ゼロではない）場合、読み取り操作は、ショートパケットを受信する場合、完了しないようになる。その代わりに、この操作は、指定されたバイト数が読み取られる場合のみ完了するようになる。ＶａｌｕｅがＦＡＬＳＥである場合、読み取り操作は、指定されたバイト数が読み取られるか、あるいはショートパケットを受信する場合、完了するようになる。デフォルトはＦＡＬＳＥである。
【０１０５】
（ＡＬＬＯＷ＿ＰＡＲＴＩＡＬ＿ＲＥＡＤＳ（０ｘ０５））
ＶａｌｕｅがＦＡＬＳＥ（ゼロ）である場合、読み取り要求は、装置が要求されたよりも多くのデータを戻す場合、失敗するようになる。ＶａｌｕｅがＴＲＵＥである場合、余分なデータが保存され、この余分なデータは、次に来る読み取り要求のためのデータの開始で戻される。デフォルトはＴＲＵＥである。
【０１０６】
（ＡＵＴＯ＿ＦＬＵＳＨ（０ｘ０６））
ＶａｌｕｅがＦＡＬＳＥ（ゼロ）であり、装置が要求されたよりも多くのデータを戻す場合、残りのデータは廃棄されるようになる。ＶａｌｕｅがＴＲＵＥである場合、ビヘイビアは、ＡＬＬＯＷ＿ＰＡＲＴＩＡＬ＿ＲＥＡＤＳの値によって決まる。データは保存され、次いで次に来る読み取り要求のためのデータの開始で戻されるようになるか、あるいは、要求は失敗するようになる。デフォルトはＦＡＬＳＥである。
【０１０７】
（Ｒａｗ＿ＩＯ（０ｘ０７））
これは、ユーザのソフトウェアコンポーネント（図１〜２の１１２など）が適切なデータ処理を保証することを可能にする。ユーザのソフトウェアコンポーネントによって提供されたデータが不適切なフォーマットである場合、データはフラッシュ（ｆｌｕｓｈ）される場合がある。
【０１０８】
（１０．ＷｉｎＵｓｂ＿ＧｅｔＰｉｐｅＰｏｌｉｃｙ）
ＷｉｎＵｓｂ＿ＧｅｔＰｉｐｅＰｏｌｉｃｙの関数は、特定のパイプ（エンドポイント）のポリシーを得る。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_GetPipePolicy(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN ULONG PolicyType,
IN OUT PULONG ValueLength,
OUT PVOID Value
);
【０１０９】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１１０】
（ＰｉｐｅＩＤ）
これは、パイプのポリシーを得るためのパイプに属するパイプの識別子である。
【０１１１】
（ＰｏｌｉｃｙＴｙｐｅ）
これは、得るべきポリシーのパラメータを指定する値である。
【０１１２】
（ＶａｌｕｅＬｅｎｇｔｈ）
これは、Ｖａｌｕｅが指すバッファの長さへのポインタである。出力で、このパラメータは、Ｖａｌｕｅのバッファにコピーされたデータの長さを受信する。
【０１１３】
（Ｖａｌｕｅ）
これは、指定されたパイプのポリシーを受信するバッファへのポインタである。
【０１１４】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１１５】
（１１．ＷｉｎＵｓｂ＿ＳｅｔＦｉｆｏＰｏｌｉｃｙ）
ＷｉｎＵｓｂ＿ＳｅｔＦｉｆｏＰｏｌｉｃｙの関数は、特定のパイプ（エンドポイント）のポリシーを設定する。このＡＰＩをコールするための例示的メソッドは以下の通りである。
B00L_stdcall
WinUsb_SetFifoPolicy(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN ULONG PolicyType,
IN ULONG ValueLength,
IN ULONG_PTR Value
) ;
【０１１６】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１１７】
（ＰｉｐｅＩＤ）
これは、パイプのポリシーを設定するためのパイプに属するパイプの識別子である。
【０１１８】
（ＰｏｌｉｃｙＴｙｐｅ）
これは、変更するべきポリシーのパラメータを指定する値である。
【０１１９】
（ＶａｌｕｅＬｅｎｇｔｈ）
これは、Ｖａｌｕｅが指すバッファのバイト単位の長さであり、あるいは、Ｖａｌｕｅがバッファを指さない場合、ゼロである。
【０１２０】
（Ｖａｌｕｅ）
これは、ＰｏｌｉｃｙＴｙｐｅによって指定されるポリシーのパラメータのための新しい値である。
【０１２１】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１２２】
（注記）
以下のリストは、可能性のあるＰｏｌｉｃｙＴｙｐｅの値を説明する。
【０１２３】
（ＦＩＦＯ＿ＳＩＺＥ（０ｘ０１））
Ｖａｌｕｅは、ＦＩＦＯの入力バッファの、バイト単位のサイズである。デフォルト値は１６×ＭａｘＰａｃｋｅｔＳｉｚｅである。この制限に到達する場合、データは失われるようになる。
【０１２４】
（ＮＯＴＩＦＩＣＡＴＩＯＮ＿ＴＨＲＥＳＨＯＬＤ（０ｘ０３））
Ｖａｌｕｅは、コールバックの関数がコールされる前にＦＩＦＯのバッファ内に存在するべきであるバイト数である。ＩＧＮＯＲＥ＿ＳＨＯＲＴ＿ＰＡＣＫＥＴＳがＦＡＬＳＥであり、ショートパケットを受信する場合、いずれにしてもコールバックの関数がコールされるようになる。
【０１２５】
（１２．ＷｉｎＵｓｂ＿ＧｅｔＦｉｆｏＰｏｌｉｃｙ）
ＷｉｎＵｓｂ＿ＧｅｔＦｉｆｏＰｏｌｉｃｙの関数は、特定のパイプ（エンドポイント）のポリシーを得る。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_GetFifoPolicy(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN ULONG PolicyType,
IN OUT PULONG ValueLength,
OUT PVOID Value
) ;
【０１２６】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１２７】
（ＰｉｐｅＩＤ）
これは、パイプのポリシーを得るためのパイプに属するパイプの識別子である。
【０１２８】
（ＰｏｌｉｃｙＴｙｐｅ）
これは、得るべきポリシーのパラメータを指定する値である。
【０１２９】
（ＶａｌｕｅＬｅｎｇｔｈ）
これは、Ｖａｌｕｅが指すバッファの長さへのポインタである。出力で、このパラメータは、Ｖａｌｕｅバッファにコピーされたデータの長さを受信する。
【０１３０】
（Ｖａｌｕｅ）
これは、指定されたＦＩＦＯのポリシーのパラメータを受信するバッファへのポインタである。
【０１３１】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１３２】
（１３．ＷｉｎＵｓｂ＿ＳｔａｒｔＦｉｆｏ）
ＷｉｎＵｓｂ＿ＳｔａｒｔＦｉｆｏの関数は、データを装置からＦＩＦＯのバッファに読み込む自動的な読み込みのメカニズムを起動する。データがこのバッファに追加されるとき、ＦｉｆｏＤａｔａＮｏｔｉｆｉｃａｔｉｏｎの関数がコールされ、この関数は、クライアントにデータの存在を通知する。クライアントは次いで、データをＦＩＦＯのバッファから読み取るための要求を発行することができる。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_StartFifo(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN PWINUSB_NOTIFICATION_CALLBACK FifoDataNotification,
IN PVOID FifoDataNotificationContext
);
【０１３３】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１３４】
（ＰｉｐｅＩＤ）
これは、影響を及ぼすべきパイプに属するパイプの識別子である。
【０１３５】
（ＦｉｆｏＤａｔａＮｏｔｉｆｉｃａｔｉｏｎ）
これは、通知のしきい値に到達する場合にコールされるべき、オプションのコールバックの関数である。
【０１３６】
（ＦｉｆｏＤａｔａＮｏｔｉｆｉｃａｔｉｏｎＣｏｎｔｅｘｔ）
これは、ＦｉｆｏＤａｔａＮｏｔｉｆｉｃａｔｉｏｎのコールバックの関数に渡されるべき、オプションのコンテキストである。
【０１３７】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１３８】
（注記）
ＰＷＩＮＵＳＢ＿ＮＯＴＩＦＩＣＡＴＩＯＮ＿ＣＡＬＬＢＡＣＫの型宣言は、以下の通りである。
typedef
VOID
(*PWINUSB_NOTIFICATION_CALLBACK)(
WINUSB_INTERFACE_HANDLE InterfaceHandle,
UCHAR PipeID,
ULONG NotificationType,
PVOID NotificationParameter,
PVOID Context
);
【０１３９】
ＮｏｔｉｆｉｃａｔｉｏｎＴｙｐｅのメンバに対する１つの可能な値は、ＦｉｆｏＤａｔａＡｖａｉｌａｂｌｅ（０ｘ０１）である。この値は、ＦＩＦＯのバッファが、ＮＯＴＩＦＩＣＡＴＩＯＮ＿ＴＨＲＥＳＨＯＬＤバイトのＲｅａｄＦｉｆｏの要求が即時に完了するために十分なデータを含むことを、指示する。したがって、ＮｏｔｉｆｉｃａｔｉｏｎＰａｒａｍｅｔｅｒのメンバを無視することができる。
【０１４０】
（１４．ＷｉｎＵｓｂ＿ＳｔｏｐＦｉｆｏ）
ＷｉｎＵｓｂ＿ＳｔｏｐＦｉｆｏの関数は、自動的な読み込みのメカニズムを停止させる。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_StopFifo(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID
);
【０１４１】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１４２】
（ＰｉｐｅＩＤ）
これは、影響を及ぼすべきパイプに属するパイプの識別子である。
【０１４３】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１４４】
（１５．ＷｉｎＵｓｂ＿ＲｅａｄＦｉｆｏ）
ＷｉｎＵｓｂ＿ＲｅａｄＦｉｆｏの関数は、データをパイプのＦＩＦＯのバッファから読み取る。ＵＳＢのパケットサイズは、読み取り要求のための転送を考慮に入れないことに留意されたい。装置が、クライアントのバッファに対して大きすぎるパケットにより応答する場合、ＡＬＬＯＷ＿ＰＡＲＴＩＡＬ＿ＲＥＡＤＳがＴＲＵＥである場合は、データは次の転送の開始で追加される。ＡＬＬＯＷ＿ＰＡＲＴＩＡＬ＿ＲＥＡＤＳがＦＡＬＳＥである場合、読み取り要求は失敗するようになる。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_ReadFifo(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
OUT PUCHAR Buffer,
IN ULONG BufferLength,
OUT PULONG LengthTransferred,
IN LPOVERLAPPED Overlapped
);
【０１４５】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１４６】
（ＰｉｐｅＩＤ）
これは、バッファから読み取るべきパイプの識別子である。
【０１４７】
（Ｂｕｆｆｅｒ）
これは、データを読み込むべき、コール側によって割り振られたバッファである。
【０１４８】
（ＢｕｆｆｅｒＬｅｎｇｔｈ）
これは、バイト単位のＢｕｆｆｅｒの長さ、すなわち、読み取るべき最大のバイト数である。
【０１４９】
（ＬｅｎｇｔｈＴｒａｎｓｆｅｒｒｅｄ）
これは、Ｂｕｆｆｅｒにコピーされた実際のバイト数を受信する、ＵＬＯＮＧへのポインタである。
【０１５０】
（Ｏｖｅｒｌａｐｐｅｄ）
これは、ＯＶＥＲＬＡＰＰＥＤの構造体へのオプションのポインタであり、非同期の操作のために使用される。このパラメータが指定される場合、この関数は即時に戻るようになり、操作が完了するとき、イベントを信号で伝える。
【０１５１】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１５２】
（１６．ＷｉｎＵｓｂ＿ＲｅａｄＰｉｐｅ）
ＷｉｎＵｓｂ＿ＲｅａｄＰｉｐｅの関数は、データをパイプから読み取る。ＵＳＢのパケットサイズは、読み取り要求のための転送を考慮に入れないことに留意されたい。装置が、クライアントバッファに対して大きすぎるパケットにより応答する場合、ＡＬＬＯＷ＿ＰＡＲＴＩＡＬ＿ＲＥＡＤＳがＴＲＵＥである場合は、データは次の転送の開始で追加される。ＡＬＬＯＷ＿ＰＡＲＴＩＡＬ＿ＲＥＡＤＳがＦＡＬＳＥである場合、読み取り要求は失敗するようになる。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_ReadPipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN PUCHAR Buffer,
IN ULONG BufferLength,
OUT PULONG LengthTransferred,
IN LPOVERLAPPED Overlapped
);
【０１５３】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１５４】
（ＰｉｐｅＩＤ）
これは、パイプから読み取るべきパイプの識別子である。
【０１５５】
（Ｂｕｆｆｅｒ）
これは、データを読み込むべき、コール側によって割り振られたバッファである。
【０１５６】
（ＢｕｆｆｅｒＬｅｎｇｔｈ）
これは、バイト単位のＢｕｆｆｅｒの長さ、すなわち、読み取るべき最大のバイト数である。
【０１５７】
（ＬｅｎｇｔｈＴｒａｎｓｆｅｒｒｅｄ）
これは、Ｂｕｆｆｅｒにコピーされた実際のバイト数を受信する、ＵＬＯＮＧへのポインタである。
【０１５８】
（Ｏｖｅｒｌａｐｐｅｄ）
これは、ＯＶＥＲＬＡＰＰＥＤの構造体へのオプションのポインタであり、非同期の操作のために使用される。このパラメータが指定される場合、この関数は即時に戻るようになり、操作が完了するとき、イベントを信号で伝える。
【０１５９】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１６０】
（１７．ＷｉｎＵｓｂ＿ＷｒｉｔｅＰｉｐｅ）
ＷｉｎＵｓｂ＿ＷｒｉｔｅＰｉｐｅの関数は、データをパイプに書き込む。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_WritePipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN PUCHAR Buffer,
IN ULONG BufferLength,
OUT PULONG LengthTransferred,
IN LPOVERLAPPED Overlapped
);
【０１６１】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１６２】
（ＰｉｐｅＩＤ）
これは、書き込むべきパイプの識別子である。
【０１６３】
（Ｂｕｆｆｅｒ）
これは、書き込むべきデータを含む、コール側によって割り振られたバッファである。
【０１６４】
（ＢｕｆｆｅｒＬｅｎｇｔｈ）
これは、書き込むべきバイト数である。
【０１６５】
（ＬｅｎｇｔｈＴｒａｎｓｆｅｒｒｅｄ）
これは、パイプに書き込まれた実際のバイト数を受信する、ＵＬＯＮＧへのポインタである。
【０１６６】
（Ｏｖｅｒｌａｐｐｅｄ）
これは、ＯＶＥＲＬＡＰＰＥＤの構造体へのオプションのポインタであり、非同期の操作のために使用される。このパラメータが指定される場合、この関数は戻るようになり、操作が完了するとき、イベントを信号で伝える。
【０１６７】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１６８】
（１８．ＷｉｎＵｓｂ＿ＣｏｎｔｒｏｌＴｒａｎｓｆｅｒ）
ＷｉｎＵｓｂ＿ＣｏｎｔｒｏｌＴｒａｎｓｆｅｒの関数は、データを、デフォルトのコントロールのエンドポイントを介して送信する。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_ControlTransfer(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN WINUSB_SETUP_PACKET SetupPacket,
IN PUCHAR Buffer,
IN ULONG BufferLength,
OUT PULONG LengthTransferred,
IN LPOVERLAPPED Overlapped
);
【０１６９】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１７０】
（ＳｅｔｕｐＰａｃｋｅｔ）
これは、８バイトのセットアップのパケットである。
【０１７１】
（Ｂｕｆｆｅｒ）
これは、転送するべきデータを含む、コール側によって割り振られたバッファである。
【０１７２】
（ＢｕｆｆｅｒＬｅｎｇｔｈ）
これは、転送するべきバイト数であり、セットアップのパケットを含まない。
【０１７３】
（ＬｅｎｇｔｈＴｒａｎｓｆｅｒｒｅｄ）
これは、転送された実際のバイト数を受信する、ＵＬＯＮＧへのポインタである。
【０１７４】
（Ｏｖｅｒｌａｐｐｅｄ）
これは、ＯＶＥＲＬＡＰＰＥＤの構造体へのオプションのポインタであり、非同期の操作のために使用される。このパラメータが指定される場合、この関数は即時に戻るようになり、操作が完了するとき、イベントを信号で伝える。
【０１７５】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１７６】
（注記）
ＷＩＮＵＳＢ＿ＳＥＴＵＰ＿ＰＡＣＫＥＴの構造体宣言は、以下の通りである。
typedef struct_WINUSB_SETUP_PACKET {
UCHAR RequestType;
UCHAR Request;
USHORT Value;
USHORT Index;
USHORT Length;
} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET;
【０１７７】
（１９．ＷｉｎＵｓｂ＿ＲｅｓｅｔＰｉｐｅ）
ＷｉｎＵｓｂ＿ＲｅｓｅｔＰｉｐｅの関数は、データのトグルをリセットし、パイプ上の停止状態をクリアする。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_ResetPipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID
);
【０１７８】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１７９】
（ＰｉｐｅＩＤ）
これは、コントロールのパイプの識別子である。
【０１８０】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１８１】
（２０．ＷｉｎＵｓｂ＿ＡｂｏｒｔＰｉｐｅ）
ＷｉｎＵｓｂ＿ＡｂｏｒｔＰｉｐｅの関数は、パイプに対して保留中の転送をすべてアボートする。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_AbortPipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID
);
【０１８２】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１８３】
（ＰｉｐｅＩＤ）
これは、コントロールのパイプの識別子である。
【０１８４】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１８５】
（２１．ＷｉｎＵｓｂ＿ＦｌｕｓｈＰｉｐｅ）
ＷｉｎＵｓｂ＿ＦｌｕｓｈＰｉｐｅの関数は、クライアントが要求したよりも多くのデータを装置が戻す結果として、保存されたいかなるデータをも廃棄する。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_FlushPipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID
);
【０１８６】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０１８７】
（ＰｉｐｅＩＤ）
これは、コントロールのパイプの識別子である。
【０１８８】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０１８９】
（電源管理）
図５は、汎用デバイスドライバにおける電源管理を提供するための例示的方法５００を例示する。一実施態様では、方法５００は、コンピューティングシステム（図６を参照して説明するものなど）が、装置（図１〜４を参照して説明したものなど）をコンピューティングシステムに接続する間に、低電力状態に入ることを可能にする。
【０１９０】
電源管理のポリシーは、接続された装置について、例えば汎用ＵＳＢのユーザモードのライブラリ（例えば、図１の１１０）を通じて定義される（５０２）。電源のポリシーには、自動休止を許可するかどうか、装置が自動復帰可能かどうか、および／または、装置を休止するために、最小の遅延のしきい値を設定するかどうかについての項目（ｐｒｏｖｉｓｉｏｎ）が含まれる場合がある（ＷｉｎＵｓｂ＿ＳｅｔＩｎｔｅｒｆａｃｅＰｏｗｅｒＰｏｌｉｃｙなど、例示的ＡＰＩを参照してさらに説明する）。
【０１９１】
より具体的には、自動休止は、装置が「アイドル」になっている場合を検出することを含む場合があり、これは場合によっては、指定された合計時間において転送がなかったことを意味し、この時点で汎用ＵＳＢドライバ（例えば、図１および２の１０８）は装置を休止して節電することができる。一実施態様では、汎用ＵＳＢドライバは自動的に、装置が予備の電源を入れる必要がある場合を検出するようになり、適切な時間でそのように行うようになる。
【０１９２】
自動的にコンピューティングシステムを復帰することに関して、クライアント（図１および２の１１２など）は、汎用ＵＳＢのデバイスドライバのビヘイビアを、装置がコンピューティングシステムを低電力状態（例えば、スタンバイまたはハイバネーション）から復帰させることを可能にするように、構成することができる。一実施態様では、汎用ＵＳＢのデバイスドライバは、装置およびコンピューティングシステムをこの機能のために準備するために必要とされた、すべての操作を処理するようになる。
【０１９３】
さらに、遅延のしきい値の周期を設定することができ、クライアント（図１および２の１１２など）が、最後の転送の後から装置を休止する前までに経過するように、汎用ＵＳＢのデバイスドライバが保証する必要のある合計時間を、指定することができるようにする。したがって、遅延のしきい値は、データ転送の後の周期を指定することができ、コンピューティングシステムは、この周期を、データ転送の後から装置が休止モードに入る前までに経過するよう待機する。
【０１９４】
休止モードに入るための条件が満たされた後（例えば、実際には電源のポリシーによって）（５０４）、装置は低電力状態に入る（５０６）。これは、装置が接続されるコンピューティングシステム（上述のように、配線を通じるか無線かにかかわらず）が低電力状態に入ることを可能にする（５０８）。
【０１９５】
方法５００は、本明細書で説明した汎用デバイスドライバによって提供された機能を利用することによって、複数の装置がコンピューティングシステムに接続される状況においても、節電を可能にすることが想定される。すなわち、汎用デバイスドライバの構成がないと、コンピューティングシステムに接続された複数の装置は同時に、あるいは、コンピューティングシステムによって、有効で全体的な節電を可能にするために十分な周期に渡って、それらの休止モードに入ることができない可能性がある。
【０１９６】
様々な実施態様では、以下のリストは、電源管理の状態にわたるビヘイビアを要約する。
【０１９７】
・  すべてのパイプのハンドル、インターフェースのハンドル、ロックおよび代替設定は、電源管理のイベントに渡って保持される。
【０１９８】
・  進行中であるいかなる転送も、低電力状態中に休止され、これらの転送は、システムが動作中であるときに再開される。クライアント（すなわち、ユーザのソフトウェアコンポーネント１１２）がＦＩＦＯのバッファを使用中である場合、そのバッファは、電源管理のコールバック後にリスタートされる。
【０１９９】
・  装置特定の構成がリストアされるべきである場合、クライアント（すなわち、ユーザのソフトウェアコンポーネント１１２）は、システムが動作に戻る場合、そのようにするべきである。これを、ＷＭ＿ＰＯＷＥＲＢＲＯＡＤＣＡＳＴのメッセージから決定することができる。
【０２００】
・  クライアント（すなわち、ユーザのソフトウェアコンポーネント１１２）は、選択的な休止をサポートするために、ＷＩＮＵＳＢ＿ＳｅｔＩｎｔｅｒｆａｃｅＩｄｌｅをコールすることによって、インターフェースがアイドルであることを指示することができる。コール側は、装置がアイドルの間にリモートの復帰のために使用可能にされるべきであると指定することができる。直接的な動作は、このコールによって示唆されない。
【０２０１】
また、以下で詳述するように、電源管理を処理するために他のＡＰＩが使用可能であり、これらのＡＰＩは、ユーザのソフトウェアコンポーネントが電源管理の関数をより細かく制御することを可能にする。
【０２０２】
（１．ＷｉｎＵｓｂ＿ＳｅｔＩｎｔｅｒｆａｃｅＰｏｗｅｒＰｏｌｉｃｙ）
ＷｉｎＵｓｂ＿ＳｅｔＩｎｔｅｒｆａｃｅＰｏｗｅｒＰｏｌｉｃｙの関数は、装置の電源のポリシーを設定する。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_SetInterfacePowerPolicy(
WINUSB_INTERFACE_HANDLE InterfaceHandle,
ULONG PolicyType,
ULONG ValueLength,
ULONG_PTR Value
);
【０２０３】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０２０４】
（ＰｏｌｉｃｙＴｙｐｅ）
これは、変更するべきポリシーのパラメータを指定する値である。
【０２０５】
（ＶａｌｕｅＬｅｎｇｔｈ）
これは、Ｖａｌｕｅが指すバッファのバイト単位の長さであり、あるいは、Ｖａｌｕｅがバッファを指さない場合、ゼロである。
【０２０６】
（Ｖａｌｕｅ）
これは、ＰｏｌｉｃｙＴｙｐｅによって指定されるポリシーのパラメータのための新しい値である。
【０２０７】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０２０８】
（注記）
以下のリストは、可能性のあるＰｏｌｉｃｙＴｙｐｅ値を説明する。
【０２０９】
（ＡＵＴＯ＿ＳＵＳＰＥＮＤ（０ｘ０１））
ＶａｌｕｅがＴＲＵＥである（ゼロではない）場合、装置は、転送が保留中でない場合、休止されるようになる。デフォルトはＴＲＵＥである。
【０２１０】
（ＥＮＡＢＬＥ＿ＷＡＫＥ（０ｘ０２））
装置がＷＡＫＥをサポートする場合、ＶａｌｕｅをＴＲＵＥに設定する。デフォルトはＦＡＬＳＥである。
【０２１１】
（ＳＵＳＰＥＮＤ＿ＤＥＬＡＹ（０ｘ０３））
ＶＡＬＵＥは、いずれかの転送の後から装置を休止することができるようになる前までに、ドライバが待機するべきである、ミリ秒単位の最小の合計時間である。デフォルトは５秒である。
【０２１２】
（２．ＷｉｎＵｓｂ＿ＧｅｔＩｎｆｅｒｆａｃｅＰｏｗｅｒＰｏｌｉｃｙ）
ＷｉｎＵｓｂ＿ＧｅｔＩｎｆｅｒｆａｃｅＰｏｗｅｒＰｏｌｉｃｙの関数は、装置の電源のポリシーを得る。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_GetInterfacePowerPolicy(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN ULONG PolicyType,
IN OUT PULONG ValueLength,
OUT PVOLD Value
);
【０２１３】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０２１４】
（ＰｏｌｉｃｙＴｙｐｅ）
これは、得るべきポリシーのパラメータを指定する値である。
【０２１５】
（ＶａｌｕｅＬｅｎｇｔｈ）
これは、Ｖａｌｕｅが指すバッファの長さへのポインタである。出力で、このパラメータは、Ｖａｌｕｅのバッファにコピーされたデータの長さを受信する。
【０２１６】
（Ｖａｌｕｅ）
これは、指定された電源のポリシーを受信するバッファへのポインタである。
【０２１７】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０２１８】
（３．ＷｉｎＵｓｂ＿ＥｎａｂｌｅＩｎｔｅｒｆａｃｅＩｄｌｅ）
ＷｉｎＵｓｂ＿ＥｎａｂｌｅＩｎｔｅｒｆａｃｅＩｄｌｅの関数は、インターフェースがアイドルであり、オペレーティングシステムが装置の電源を落とすことができること（ＵＳＢの休止）を指示する。これは、ユーザモードのクライアントが選択的な休止をどのようにサポートするかである。パイプの１つへのいかなるアクセス（読み取りまたは書き込み）も、自動的にインターフェースをアイドル状態から引き出し、アイドル状態のクエリが提供されないようにする。この関数をコールすることは、装置が休止されるようになることを保証せず、装置がＵＳＢの休止状態を現在サポートすることができるという提案でしかない。ＦＩＦＯのバッファが実行中である場合、装置が実際に休止されるまで、ＦＩＦＯのバッファは実行し続けるようになる。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_EnableInterfaceIdle(
WINUSB_INTERFACE_HANDLE InterfaceHandle
);
【０２１９】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
これは、ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドルである。
【０２２０】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０２２１】
（４．ＷｉｎＵｓｂ＿ＤｉｓａｂｌｅＩｎｔｅｒｆａｃｅＩｄｌｅ）
ＷｉｎＵｓｂ＿ＤｉｓａｂｌｅＩｎｔｅｒｆａｃｅＩｄｌｅの関数は、装置が休止されることを防止するか、あるいは、装置がすでに休止されている場合、装置を復帰する。このＡＰＩをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_DisableInterfaceIdle(
WINUSB_INTERFACE_HANDLE InterfaceHandle
);
【０２２２】
（パラメータ）
（ＩｎｔｅｒｆａｃｅＨａｎｄｌｅ）
ＷｉｎＵｓｂ＿Ｉｎｉｔｉａｌｉｚｅによって戻されたインターフェースのハンドル。
【０２２３】
（戻り値）
この関数は、成功し、構造体をポピュレートした場合、ＴＲＵＥを戻す。そうでない場合、この関数はＦＡＬＳＥを戻し、エラーログは、ＧｅｔＬａｓｔＥｒｒｏｒをコールすることによって検索することができる。
【０２２４】
（セキュリティ）
一実施態様では、セキュリティは、汎用デバイスドライバ１０８におけるＩｏＲｅｇｉｓｔｅｒＤｅｖｉｃｅＩｎｔｅｒｆａｃｅによって作成された名前付きデバイスオブジェクトを通じて提供される。セキュリティの属性をこのシンボリックリンクについて指定し、それを開くことができるものを制限することができる。
【０２２５】
このような一実施態様では、ただ１つのユーザのソフトウェアコンポーネント（例えば、１１２）は、いずれかの所与の時間に開かれたリンクを有することができ、そのため、ソフトウェアコンポーネントがリンクを開くとき、他のソフトウェアコンポーネントは、そのソフトウェアコンポーネントが実際のハンドルを得ない限り、インターフェースにアクセスすることができない。
【０２２６】
物理デバイスのためのコントロールのパイプを、複数のインターフェースの間で共有することができ（例えば、装置によってサポートされた異なる機能のため）、ユーザのソフトウェアコンポーネントがコントロールのコマンドを別のインターフェースに送信可能にすることができることが想定される。これは一実施態様では、コントロールの転送における所定の制約を必要とする場合がある。加えて、シンボリックリンク上のセキュリティのアクセスを、セキュリティの属性をＰＤＯ（２０４）上に設定することによって、処理することができる。
【０２２７】
（汎用コンピューティング環境）
図６は、本明細書で説明する技術を実装するために使用することができる、汎用コンピュータ環境６００を例示する。例えば、コンピュータ環境６００を利用して、汎用デバイスドライバ（１０８）、汎用のユーザモードのライブラリ（１１０）および／またはユーザのソフトウェアコンポーネント（１１２）を含む、ＯＳを実行することができる。汎用コンピュータ環境６００はコンピューティング環境の一実施例でしかなく、コンピュータおよびネットワークアーキテクチャの使用または機能の範囲についてのいかなる限定をも示唆するように意図されない。汎用コンピュータ環境６００はまた、例示的コンピュータ環境６００において例示した構成要素のいずれか１つまたは組合せに関係する、いかなる依存性または要件をも有するものとして、解釈されるべきではない。
【０２２８】
コンピュータ環境６００には、コンピュータ６０２の形態における汎用コンピューティングデバイスが含まれる。コンピュータ６０２の構成要素には、限定はされないが、１つまたは複数のプロセッサまたは処理装置６０４（オプションで、暗号プロセッサまたはコプロセッサを含む）、システムメモリ６０６、および、プロセッサ６０４を含む様々なシステム構成要素をシステムメモリ６０６に結合するシステムバス６０８を含むことができる。
【０２２９】
システムバス６０８は、いくつかの種類のバス構造のいずれかの１つまたは複数を表現し、これらのバス構造には、メモリバスまたはメモリコントローラ、周辺バス、ａｃｃｅｌｅｒａｔｅｄ  ｇｒａｐｈｉｃｓ  ｐｏｒｔ（ＡＧＰ）、および様々なバスアーキテクチャのいずれかを使用する、プロセッサまたはローカルバスが含まれる。例として、このようなアーキテクチャには、業界標準アーキテクチャ（ＩＳＡ）バス、マイクロチャネルアーキテクチャ（ＭＣＡ）バス、拡張ＩＳＡ（ＥＩＳＡ）バス、Ｖｉｄｅｏ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｓｔａｎｄａｒｄｓ  Ａｓｓｏｃｉａｔｉｏｎ（ＶＥＳＡ）ローカルバス、および、メザニンバスとしても知られるＰｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ（ＰＣＩ）バスが含まれる場合がある。
【０２３０】
コンピュータ６０２には通常、様々なコンピュータ読取可能な媒体が含まれる。このような媒体は、コンピュータ６０２によってアクセス可能であるいかなる使用可能な媒体にすることもでき、揮発性および不揮発性の媒体、取り外し可能および固定の媒体が含まれる。
【０２３１】
システムメモリ６０６には、ランダムアクセスメモリ（ＲＡＭ）６１０など、揮発性メモリの形態、および／または、読み取り専用メモリ（ＲＯＭ）６１２など、不揮発性メモリの形態における、コンピュータ読取可能な媒体が含まれる。基本入出力システム（ＢＩＯＳ）６１４は、起動中など、コンピュータ６０２内の要素の間で情報を転送する助けとなる基本ルーチンを含み、ＲＯＭ６１２に格納される。ＲＡＭ６１０は通常、処理装置６０４によって即時アクセス可能および／または現在操作されるデータおよび／またはプログラムモジュールを含む。
【０２３２】
コンピュータ６０２にはまた、他の取り外し可能／固定、揮発性／不揮発性のコンピュータ記憶媒体が含まれる場合もある。例として、図６は、固定、不揮発性の磁気媒体（図示せず）に対する読み取りおよび書き込みを行うためのハードディスクドライブ６１６、取り外し可能、不揮発性の磁気ディスク６２０（例えば、「フロッピー（登録商標）ディスク」）に対する読み取りおよび書き込みを行うための磁気ディスクドライブ６１８、および、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭまたは他の光媒体など、取り外し可能、不揮発性の光ディスク６２４に対する読み取りおよび／または書き込みを行うための光ディスクドライブ６２２を例示する。ハードディスクドライブ６１６、磁気ディスクドライブ６１８および光ディスクドライブ６２２は、システムバス６０８に、１つまたは複数のデータ媒体のインターフェース６２６によってそれぞれ接続される。代替として、ハードディスクドライブ６１６、磁気ディスクドライブ６１８および光ディスクドライブ６２２を、システムバス６０８に、１つまたは複数のインターフェース（図示せず）によって接続することができる。
【０２３３】
ディスクドライブおよびそれらの関連付けられたコンピュータ読取可能な媒体は、コンピュータ６０２用のコンピュータ読取可能な命令、データ構造、プログラムモジュールおよび他のデータの不揮発性の記憶装置を提供する。この実施例は、ハードディスク６１６、取り外し可能な磁気ディスク６２０、および取り外し可能な光ディスク６２４を例示するが、コンピュータによってアクセス可能であるデータを格納することができる、他の種類のコンピュータ読取可能な媒体もまた、例示的コンピューティングシステムおよび環境を実施するために利用することができ、これらのコンピュータ読取可能な媒体は、磁気カセットもしくは他の磁気記憶装置、フラッシュメモリカード、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）もしくは他の光記憶装置、ランダムアクセスメモリ（ＲＡＭ）、読み取り専用メモリ（ＲＯＭ）、電気的に消去可能なプログラム可能読み取り専用メモリ（ＥＥＰＲＯＭ）などであることを理解されたい。
【０２３４】
いかなる数のプログラムモジュールも、ハードディスク６１６、磁気ディスク６２０、光ディスク６２４、ＲＯＭ６１２および／またはＲＡＭ６１０上で格納することができ、これらのプログラムモジュールには、例として、オペレーティングシステム６２６、１つまたは複数のアプリケーションプログラム６２８、他のプログラムモジュール６３０およびプログラムデータ６３２が含まれる。このようなオペレーティングシステム６２６、１つまたは複数のアプリケーションプログラム６２８、他のプログラムモジュール６３０およびプログラムデータ６３２の各々（または、それらのある組合せ）は、分散ファイルシステムをサポートする常駐の構成要素の全部または一部を実装することができる。
【０２３５】
ユーザはコマンドおよび情報をコンピュータ６０２へ、キーボード６３４およびポインティングデバイス６３６（例えば「マウス」）などの入力装置を介して入力することができる。他の入力装置６３８（特に図示せず）には、マイクロフォン、ジョイスティック、ゲームパッド、衛星放送受信アンテナ、シリアルポート、スキャナおよび／または同種のものが含まれる場合がある。これらおよび他の入力装置は処理装置６０４へ、システムバス６０８に結合される入出力インターフェース６４０を介して接続されるが、パラレルポート、ゲームポートまたはＵＳＢ（図１および２を参照して説明したものなど）など、他のインターフェースおよびバス構造によって接続される場合がある。ＵＳＢポートを利用して、カメラ、携帯情報端末（ＰＤＡ）、ＭＰ３デバイス、ビデオキャプチャデバイス、フラッシュカードリーダーなどをコンピュータ環境６００に接続することができる。
【０２３６】
モニタ６４２または他の種類の表示装置もまたシステムバス６０８に、ビデオアダプタ６４４などのインターフェースを介して接続することができる。モニタ６４２に加えて、他の周辺出力装置には、スピーカ（図示せず）およびプリンタ６４６など、コンピュータ６０２に入出力インターフェース６４０を介して接続することができる構成要素が含まれる場合がある。
【０２３７】
コンピュータ６０２はネットワーク環境において、リモートコンピューティング装置６４８など、１つまたは複数のリモートコンピュータへの論理接続を使用して操作することができる。例として、リモートコンピューティング装置６４８は、パーソナルコンピュータ、ポータブルコンピュータ、サーバ、ルータ、ネットワークコンピュータ、ピアデバイスまたは他の共通ネットワークノード、ゲームコンソールなどにすることができる。リモートコンピューティング装置６４８を、本明細書でコンピュータ６０２に関連して説明した要素および特徴の多数またはすべてを含むことができる、ポータブルコンピュータとして例示する。
【０２３８】
コンピュータ６０２とリモートコンピュータ６４８との間の論理接続を、ローカルエリアネットワーク（ＬＡＮ）６５０および汎用的なワイドエリアネットワーク（ＷＡＮ）６５２として示す。このようなネットワーキング環境は、オフィス、企業全体のコンピュータネットワーク、イントラネットおよびインターネットにおいて一般的である。
【０２３９】
ＬＡＮのネットワーキング環境において実装される場合、コンピュータ６０２はローカルネットワーク６５０に、ネットワークインターフェースまたはアダプタ６５４を介して接続される。ＷＡＮのネットワーキング環境において実装される場合、コンピュータ６０２は通常、モデム６５６、または、ワイドネットワーク６５２を介して通信を確立するための他の手段を含む。モデム６５６は、コンピュータ６０２の内部または外部とすることができ、システムバス６０８に、入出力インターフェース６４０または他の適切なメカニズムを介して接続することができる。例示のネットワーク接続は例示的であり、複数のコンピュータ６０２と６４８との間で通信リンクを確立する他の手段を使用することができることは理解されよう。
【０２４０】
コンピューティング環境６００により例示したものなど、ネットワーク環境では、コンピュータ６０２に関連して示したプログラムモジュールまたはその一部を、リモートメモリ記憶装置に格納することができる。例として、リモートアプリケーションプログラム６５８は、リモートコンピュータ６４８のメモリ装置上に存在する。例示のため、アプリケーションプログラム、および、オペレーティングシステムなどの他の実行可能なプログラムのコンポーネントを本明細書で離散的なブロックとして例示するが、このようなプログラムおよびコンポーネントは様々な時間にコンピューティング装置６０２の異なる記憶装置の構成要素内に存在し、コンピュータのデータプロセッサによって実行されることを理解されたい。
【０２４１】
様々なモジュールおよび技術を本明細書で一般に、１つまたは複数のコンピュータまたは他の装置によって実行される、プログラムモジュールなどのコンピュータ実行可能命令に関連して説明することができる。一般に、プログラムモジュールには、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれ、これらは特定のタスクを実行するか、あるいは特定の抽象データ型を実装する。通常、プログラムモジュールの機能を、様々な実施態様において望まれるように結合または分散することができる。
【０２４２】
これらのモジュールおよび技術の一実施態様を、所定の形態のコンピュータ読取可能な媒体上に格納することができ、あるいはこれを介して送信することができる。コンピュータ読取可能な媒体を、コンピュータによってアクセスすることができるいかなる使用可能な媒体にすることもできる。例として、限定ではなく、コンピュータ読取可能な媒体には、「コンピュータ記憶媒体」および「通信媒体」が含まれる場合がある。
【０２４３】
「コンピュータ記憶媒体」には、揮発性および不揮発性、取り外し可能および固定の媒体が含まれ、これらの媒体は、コンピュータ読取可能な命令、データ構造、プログラムモジュールまたは他のデータなど、情報の格納のためのいずれかの方法または技術において実装される。コンピュータ記憶媒体には、限定はされないが、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリもしくは他のメモリ技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）もしくは他の光記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置もしくは他の磁気記憶装置、または、所望の情報を格納するために使用することができ、コンピュータによってアクセスすることができる他のいかなる媒体もが含まれる。
【０２４４】
「通信媒体」には通常、搬送波もしくは他の伝送メカニズムなどの変調データ信号における、コンピュータ読取可能な命令、データ構造、プログラムモジュールまたは他のデータが含まれる。通信媒体にはまた、いかなる情報配信媒体もが含まれる。「変調データ信号」という用語は、信号における情報をエンコードするような方法でその特性集合の１つまたは複数が設定または変更されている信号を意味する。例として、限定ではなく、通信媒体には、有線ネットワークまたは直接有線接続などの有線媒体、ならびに、音響、無線周波数（ＲＦ）、赤外線、Ｗｉ−Ｆｉ、セルラー、ブルートゥース対応、および他の無線媒体などの無線媒体が含まれる。上記のいずれの組合せもまた、コンピュータ読取可能な媒体の範囲内に含まれる。
【０２４５】
一実施態様では、情報がアクセスされるハードウェア装置（図１および２を参照して説明したものなど）を、汎用コンピュータ環境６００の構成要素（処理装置６０４など）に結合されたいかなる装置にすることもできる。また、ハードウェア装置を、汎用コンピュータ環境６００の周辺装置（マウス６３６、キーボード６３４、プリンタ６４６等など）にすることもできる。
【０２４６】
（結論）
このように、本発明を、構造的特徴および／または方法論的動作に特有の言語で説明したが、付属の特許請求の範囲において定義された本発明は、説明した特定の特徴または動作に必ずしも限定されるとは限らないことを理解されたい。例えば、本明細書で説明した技術を、有線または無線通信チャネル（ブルートゥース、ｓｍａｌｌ  ｃｏｍｐｕｔｅｒ  ｓｙｓｔｅｍ  ｉｎｔｅｒｆａｃｅ（ＳＣＳＩ）など）に適用することができる。したがって、特定の特徴および動作は、主張された本発明を実装する例示的形態として開示される。
【図面の簡単な説明】
【０２４７】
【図１】汎用デバイスドライバのための例示的システムを例示する図である。
【図２】複数の装置のための汎用デバイスドライバの複数の場合の例示的システムを例示する図である。
【図３】汎用デバイスドライバを利用するための例示的方法を例示する図である。
【図４】汎用デバイスドライバにおけるＩ／Ｏ処理を行うための例示的方法を例示する図である。
【図５】汎用デバイスドライバにおける電源管理を提供するための例示的方法を例示する図である。
【図６】本明細書で説明する技術を実装するために使用することができる、汎用のコンピュータ環境を例示する図である。
【図１】
2005317019.tif 000003
【図２】
2005317019.tif 000004
【図３】
2005317019.tif 000005
【図４】
2005317019.tif 000006
【図５】
2005317019.tif 000007
【図６】
2005317019.tif 000008
【外国語明細書】
2005317019000001.pdf