如果迷你埠驅動程式支援 MSI-X,並且會針對每個 MSI-X 訊息變更中斷親和性,或移除訊息中斷資源,那麼驅動程式必須註冊一個資源需求篩選函式。
NDIS 在收到網路介面卡(NIC)的 IRP_MN_FILTER_RESOURCE_REQUIREMENTS I/O 要求封包(IRP)之後,會呼叫 MiniportFilterResourceRequirements 函式。 NDIS 會在裝置堆疊中底層功能驅動程式完成 IRP 後,呼叫 MiniportFilterResourceRequirements。
NDIS 將在 MiniportAddDevice 函數傳回 NDIS_STATUS_SUCCESS 之後,呼叫 MiniportFilterResourceRequirements。 NDIS 可以隨時呼叫 MiniportFilterResourceRequirements,然後再呼叫 MiniportRemoveDevice。 NDIS 可能會在迷你端口正在運行時呼叫 MiniportFilterResourceRequirements。 雖然迷你埠可能會修改資源清單,如下所示,但迷你埠不應該立即嘗試使用新的資源。 NDIS 最終會停止,並使用新的資源重新初始化迷你埠;只有這樣,迷你埠才會嘗試使用新的資源。
IRP_MN_FILTER_RESOURCE_REQUIREMENTS 提供資源清單做為 Irp-IoStatus.Information的 > 結構。 清單中的資源會由 IO_RESOURCE_DESCRIPTOR 結構描述。
迷你埠驅動程式可以修改每個描述 MSI-X 訊息的 CmResourceTypeInterrupt 類型資源的中斷親和性原則。 如果親和性原則要求將特定的處理器集作為目標,迷你埠驅動程式也會在 IO_RESOURCE_DESCRIPTOR 結構中的 Interrupt.TargetedProcessors 設定 KAFFINITY 遮罩。
迷你埠驅動程式可以移除訊息中斷資源 CmResourceTypeInterrupt 類型的所有資源。 然後,驅動程式可以在 MiniportInitializeEx 函式中註冊基於線的中斷。 如果迷你埠驅動程式未移除這些訊息中斷資源,如果驅動程序嘗試在miniportInitializeEx 中註冊以線路為基礎的中斷,作系統將會失敗。
NDIS 6.1 或更新版本的迷你埠驅動程式可以將訊息中斷資源新增至資源清單。 例如,在具有八個 CPU 的電腦上,如果 NIC 可以產生四個 MSI-X 訊息,而作業系統啟用這四個訊息中斷,則作業系統會在裝置的 MSI-X 配置空間中初始化四個訊息數據表專案,並將四個訊息中斷資源放在資源清單中。 在此情況下,由於迷你埠驅動程式需要更多訊息中斷資源,因此可以將四個訊息中斷資源配置給資源清單,並將每個 MSI-X 訊息的親和性設定為 CPU。 如果作系統可以提供更多訊息中斷資源,迷你埠配接器會在啟動時接收八個訊息中斷資源。 在此情況下,訊息有 0 到 7 的數位。
清單中每個訊息中斷資源會被指派一個與清單顯示順序相符的訊息編號。 例如,清單中的第一個訊息中斷資源會指派給訊息 0、第二個訊息被指派給訊息 1 等等。
若要在運行時間將 MSI-X 數據表專案指派給 CPU,迷你埠驅動程式可以呼叫 NdisMConfigMSIXTableEntry 函式,此函式會將數據表項目對應至已將親和性設定為 CPU 的 MSI-X 訊息。 如需有關 MSI-X 表項目配置操作的詳細資訊,請參閱 變更 MSI-X 表項目 CPU 親和性。
若要為新的資源需求清單配置記憶體,請使用 NdisAllocateMemoryWithTagPriority 函式。 您可以使用 NdisFreeMemory 函式釋放舊資源需求清單的記憶體。
迷你埠驅動程式不應該修改其他資源,例如 CmResourceTypeMemory 和 CmResourceTypePort 資源。 迷你埠驅動程式應避免將新的資源新增至資源清單。 不過,NDIS 6.1 和更新版本的迷你埠驅動程式可以新增更多訊息中斷資源。 如果迷你埠驅動程式新增更多訊息中斷資源,則不得從 MiniportStartDevice 函式中移除它們。
如需新增和移除資源的詳細資訊,請參閱 IRP_MN_FILTER_RESOURCE_REQUIREMENTS。