Share via


MSI-X の事前登録

MSI X の割り込みアフィニティの変更をサポートするため、またはメッセージ割り込みリソースを削除するために、ミニポート ドライバーは、リソース要件フィルター関数を確立する必要があります。 この事前登録手順は、NDIS が MiniportInitializeEx 関数を呼び出す前に発生します。

リソース要件フィルター関数を確立するために、ミニポート ドライバーは MiniportSetOptions 関数を提供する 必要があります。 ミニポート ドライバーが DriverEntry ルーチンから NdisMRegisterMiniportDriver 関数を呼び出すと、ドライバーは、NDIS_MINIPORT_DRIVER_CHARACTERISTICS 構造体で MiniportSetOptions のエントリ ポイントを渡します。 NDIS は、NdisMRegisterMiniportDriver のコンテキストで MiniportSetOptions 関数を呼び出します。

MiniportSetOptions から、ミニポート ドライバーは NdisSetOptionalHandlers 関数を呼び出し、ミニポート ドライバーは NdisSetOptionalHandlers 関数を呼び出し、NDIS_MINIPORT_PNP_CHARACTERISTICS 構造体を指定します。 この構造体は、MiniportAddDevice 関数、MiniportRemoveDevice 関数、MiniportStartDevice 関数、およびMiniportFilterResourceRequirements 関数のエントリ ポイントを定義します。

NDIS は、プラグ アンド プレイ (PnP) マネージャーから add-device (デバイスの追加) 要求を受信すると、ミニポート ドライバーの MiniportAddDevice 関数を呼び出します。 NDIS が MiniportAdapterHandle パラメーターの MiniportAddDevice に渡すハンドルは、NDIS が後で MiniportInitializeEx 関数に渡すハンドルです。

MiniportAddDevice では、ドライバーは、NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES 構造体を初期化し、NdisMSetMiniportAttributes 関数にこの構造体を渡します。 NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES 構造体には、デバイスのミニポート ドライバーが割り当てたコンテキスト領域へのハンドルである、MiniportAddDeviceContext メンバーが含まれています。 NDIS は後で、MiniportRemoveDevice 関数、MiniportFilterResourceRequirements 関数、MiniportStartDevice 関数、および MiniportInitializeEx 関数に、このコンテキスト ハンドルを提供します。 MiniportInitializeEx の場合、コンテキスト ハンドルは、MiniportInitParameters パラメーターが指定する NDIS_MINIPORT_INIT_PARAMETERS 構造体の MiniportAddDeviceContext メンバーで渡されます。

NDIS が MiniportAddDevice を呼び出し、MiniportAddDevice が NDIS_STATUS_SUCCESS を返した後、NDIS は、IRP_MN_FILTER_RESOURCE_REQUIREMENTS I/O 要求パケット (IRP) を受信するたびに、MiniportFilterResourceRequirements 関数を呼び出します。 MiniportFilterResourceRequirements は、各 MSI-X メッセージの割り込みアフィニティを変更したり、メッセージ割り込みリソースを追加したり、ドライバーが MiniportInitializeEx 関数の行ベースの割り込みに登録する場合はメッセージ割り込みリソースを削除したりできます。 割り込みアフィニティ ポリシーの確立の詳細については、「MSI-X リソース フィルター処理」を参照してください。

NDIS が PnP マネージャーから remove-device (デバイスの削除) 要求を受信すると、NDIS はミニポート ドライバーの MiniportRemoveDevice 関数を呼び出します。 MiniportRemoveDevice 関数は、MiniportAddDevice 関数が実行した操作を元に戻す必要があります。