PcAddAdapterDevice 関数 (portcls.h)
PcAddAdapterDevice 関数は、WDM デバイス スタックにアダプター デバイスを追加します。
構文
PORTCLASSAPI NTSTATUS PcAddAdapterDevice(
[in] PDRIVER_OBJECT DriverObject,
[in] PDEVICE_OBJECT PhysicalDeviceObject,
[in] PCPFNSTARTDEVICE StartDevice,
[in] ULONG MaxObjects,
[in] ULONG DeviceExtensionSize
);
パラメーター
[in] DriverObject
ドライバー オブジェクトへのポインター。 このポインターは、アダプターの AddDevice ハンドラーにパラメーターとして渡されます。 ドライバー オブジェクトは、DRIVER_OBJECT型のシステム構造です。
[in] PhysicalDeviceObject
デバイスの 物理デバイス オブジェクト (PDO)へのポインター。 PortCls は、このポインターを呼び出しパラメーターとしてアダプターの AddDevice ハンドラーに渡します。 PDO は、DEVICE_OBJECT型のシステム構造です。
[in] StartDevice
デバイスを起動するためにオペレーティング システムが呼び出す関数へのポインター。 詳細については、次の 解説 セクションを参照してください。
[in] MaxObjects
PcRegisterSubdeviceへの呼び出しによって登録されるサブデバイスの最大数を指定します。 この数は、アダプター ドライバーがインスタンス化できるミニポート オブジェクトの合計数に上限を設定します。
[in] DeviceExtensionSize
デバイス拡張機能のサイズを指定します。 既定のサイズには 0 を使用します。 ユーザー指定の拡張機能のサイズについては、次の 解説 セクションを参照してください。
戻り値
PcAddAdapterDevice は、呼び出しが成功した場合にSTATUS_SUCCESSを返します。 それ以外の場合は、適切なエラー コードが返されます。
備考
この関数は、オーディオ アダプター ドライバーの AddDevice ハンドラーが実行する必要があるほとんどの作業を実行します。 pcAddAdapterDevice デバイス オブジェクトを作成し、デバイス コンテキストを初期化し、デバイス オブジェクトをデバイス スタックにアタッチします。
アダプター ドライバーは、AddDevice ハンドラーへの呼び出しを受け取ったときに、PcAddAdapterDevice 呼び出します。 アダプター ドライバーは通常、pcInitializeAdapterDriver 呼び出すことによって、AddDevice ハンドラーをインストールしますが、ドライバーは他の方法でもハンドラーをインストールできます。 PcAddAdapterDevice は、AddDevice ハンドラーに渡された PDO の 機能デバイス オブジェクト (FDO) を作成します。
DeviceExtensionSize は通常 0 です。 一部のアダプター ドライバーでは、デバイス拡張機能に追加の領域を予約する必要がある場合があります。その場合は、DeviceExtensionSize PORT_CLASS_DEVICE_EXTENSION_SIZEより大きい (既定のサイズ) を指定する必要があります。 0 より大きく、PORT_CLASS_DEVICE_EXTENSION_SIZE未満の値は無効です。 アダプター ドライバーは、オフセット PORT_CLASS_DEVICE_EXTENSION_SIZE後にデバイス拡張機能の任意の部分を自由に使用できます。 また、オフセット範囲が 16 ~ 31 のバイト (32 ビットのアドレス指定があるシステムではバイトを含む) と、オフセット範囲が 32 ~ 63 のバイトは、64 ビット アドレス指定のシステムでも自由に使用できます。 拡張機能がULONG_PTRの配列と見なされる場合、配列要素 4 ~ 7 はアダプター ドライバーで使用できます。
StartDevice パラメーターは PCPFNSTARTDEVICE 型の関数を指します。この関数は、ヘッダー ファイル portcls.h は次のように定義します。
NTSTATUS
(*PCPFNSTARTDEVICE)(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PRESOURCELIST ResourceList
);
PcAddAdapterDevice とアダプター ドライバーのデバイススタートアップおよび AddDevice ルーチン 詳細については、「スタートアップ シーケンス」を参照してください。
次のコード例は、アダプター ドライバーが DeviceExtensionSize パラメーターを使用して、PortCls がデバイス コンテキストに割り当てるストレージ ブロックの末尾に 64 バイトのデバイス固有の拡張データを追加する方法を示しています。
#define MY_EXTENSION_SIZE 64
NTSTATUS ntstatus = PcAddAdapterDevice(DriverObject, PhysicalDeviceObject,
MyStartDevice, MAX_MINIPORTS,
MY_EXTENSION_SIZE + PORT_CLASS_DEVICE_EXTENSION_SIZE);
上記の PcAddAdapterDevice 呼び出しは、スタートアップ シーケンスの例に似ていますが、PcAddAdapterDevice に渡される最後のパラメーター 0 以外の値です。
アダプター ドライバーは、次のコード フラグメントに示すように、デバイス固有の拡張データにアクセスできます。
PVOID pMyExtensionData = (PVOID)((PCHAR)FunctionalDeviceObject->DeviceExtension +
PORT_CLASS_DEVICE_EXTENSION_SIZE);
Variable FunctionalDeviceObject はオーディオ アダプターの FDO へのポインターであり、pMyExtensionData は拡張データへの一時的なポインターです。 FDO と PCI バス ドライバーに属する PDO を混同しないようにします。 アダプター ドライバーは、PCI バス ドライバーによって所有されているメモリが破損し、システムがクラッシュする可能性があるため、PDO 内のデータを変更しないでください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 2000 以降で使用できます。 |
ターゲット プラットフォーム の | 万国 |
ヘッダー | portcls.h (Portcls.h を含む) |
ライブラリ | Portcls.lib |
IRQL | PASSIVE_LEVEL |
関連項目
AddDevice の
PcRegisterSubdevice の