PCI デバイス構成領域へのアクセス

周辺機器コンポーネント 相互接続 (PCI) デバイスに対する一部の操作は、デバイスのファンクション ドライバー用に予約されています。 このような操作には、たとえば、バスのデバイス固有の構成空間へのアクセスや、ダイレクト メモリ アクセス (DMA) コントローラーのプログラミングが含まれます。 Microsoft では、次の 2 つの方法で PCI デバイスの構成領域にアクセスするためのシステム サポートを提供しています。

Note

Windows 10 バージョン 2004 以降では、デバイスにセキュア デバイス (SDEV) ACPI テーブルと仮想化ベースのセキュリティが有効になっている場合、PCI デバイス構成領域にアクセスするためのサポートされていない方法に制限が適用されます。 ドライバーまたはプロセスが上記に記載されていないメソッドを使用して PCI デバイス構成領域の読み取りまたは操作を試みると、アクセスがブロックされ、システム バグチェックが発生します。

Windows XP および Windows Server 2003 以降のオペレーティング システムでは、PCI ローカル バス仕様で定義されている構成領域ヘッダーと、機能のリンクされた一覧のすべての機能を排他的に制御できます。 ドライバーは、これらのレジスタの変更を試みてはなりません。

ただし、ドライバーは、BUS_INTERFACE_STANDARDのIRP_MN_WRITE_CONFIG要求または SetBusData メソッドを使用して、ベンダー定義のヘッダーまたは機能リストに属していない構成領域に書き込むことができます。 ドライバーは、BUS_INTERFACE_STANDARDのIRP_MN_READ_CONFIG要求または GetBusData メソッドを使用して、デバイスの機能を読み取ることもできます。 IRP_MN_READ_CONFIGまたはIRP_MN_WRITE_CONFIGを使用するには、ドライバーがPASSIVE_LEVELで実行されている必要があります。 機能の一覧と、ドライバーがクエリを実行できる対応する構造体については、「PCI 構造体」セクションを参照してください。

ドライバーは、BUS_INTERFACE_STANDARDのIRP_MN_READ_CONFIG要求または GetBusData メソッドを使用して、拡張 PCI デバイス構成領域 (つまり、256 バイトを超える構成データ) から読み取ることができます。 同様に、ドライバーは、IRP_MN_WRITE_CONFIG要求または BUS_INTERFACE_STANDARD の SetBusData メソッドを使用して、拡張 PCI デバイス構成領域に書き込むことができます。 デバイスに拡張構成領域がない場合、またはプラットフォームでデバイス上の拡張構成領域のパスが定義されていない場合、読み取り要求は0xFFFFを返し、書き込み要求は無効になります。 操作が成功したかどうかを判断するために、ドライバーは読み取りまたは書き込まれたバイト数を調べることができます。

PCI Express および PCI-X モード 2 では、256 バイトを超える拡張 PCI デバイス構成領域がサポートされます。 ドライバーは、適切なハードウェアと BIOS のサポートでのみ、この構成領域の読み取りと書き込みを行うことができます。 ACPI BIOS 内では、ルート バスには、PNP0A08またはPNP0A03のいずれかの PNP ID が必要です。 PNP ID が PNP0A03 のルート バスの場合、関数 4 の _DSM メソッドは、現在のモードが PCI-X モード 2 であることを示す必要があります。 すべてのブリッジとデバイスは PCI Express であるか、PCI-X モード 2 で動作する必要があります。

さらに、システムは、メモリ マップト構成空間アクセスをサポートする必要があります。 これは、システム BIOS/ファームウェアで MCFG テーブルを定義することです。 Windows Vista および Windows Server 2008 以降のオペレーティング システムでは、メモリ マップされた構成領域へのアクセスが自動的にサポートされます。

警告

HalGetBusDataByOffsetHalSetBusDataByOffset は下位互換性のために提供されていますが、上記の 2 つのメソッドを使用できない場合にのみ使用してください。

関連項目

デバイス構成領域へのアクセス