MINIPORT_MESSAGE_INTERRUPT回呼函式 (ndis.h)
當 NIC 產生以訊息為基礎的中斷時,NDIS 會呼叫 MiniportMessageInterrupt 函式。
語法
MINIPORT_MESSAGE_INTERRUPT MiniportMessageInterrupt;
BOOLEAN MiniportMessageInterrupt(
[in] NDIS_HANDLE MiniportInterruptContext,
[in] ULONG MessageId,
[out] PBOOLEAN QueueDefaultInterruptDpc,
[out] PULONG TargetProcessors
)
{...}
參數
[in] MiniportInterruptContext
中斷內容信息的區塊句柄。 Miniport 驅動程式在 MiniportInterruptContext 參數中提供此句柄,迷你埠驅動程式傳遞至 NdisMRegisterInterruptEx 函式。
[in] MessageId
訊息訊號中斷 (MSI) 訊息標識碼。 MessageId 是 的索引 內IO_INTERRUPT_MESSAGE_INFO_ENTRY 結構 IO_INTERRUPT_MESSAGE_INFO 結構。 當驅動程式成功向 NdisMRegisterInterruptEx 函式註冊 MSI 時,NDIS 會將指標傳遞給 MessageInfoTable 成員上的相關聯IO_INTERRUPT_MESSAGE_INFO結構。
[out] QueueDefaultInterruptDpc
迷你埠驅動程式在從這個呼叫傳回之前所設定的布爾值變數指標。 迷你埠驅動程式會將此值設定為 TRUE ,表示驅動程式在預設 (目前) CPU 上需要 DPC。 如果設定為 TRUE,NDIS 會忽略 TargetProcessors 參數的值。 如果設定為 FALSE,NDIS 會使用 TargetProcessors 參數的值來排程 DPC。
[out] TargetProcessors
位掩碼,指出 NDIS 應該排程 DPC 的目標處理器。 此位掩碼代表處理器群組0中的前32個處理器。 位掩碼中的每個位都會識別CPU。 如果呼叫端設定位 0,NDIS 會排程 CPU 0 的 DPC。 如果呼叫端設定位 1,NDIS 會排程 CPU 1 的 DPC 等等。
傳回值
如果基礎 NIC 產生中斷,MiniportMessageInterrupt 會傳回 TRUE;否則會傳回 FALSE。
備註
註冊訊息訊號中斷的迷你埠驅動程式 (MSI) 支援 NdisMRegisterInterruptEx 函式必須提供 MiniportMessageInterrupt 函式。
迷你埠驅動程序應該在其 MiniportMessageInterrupt 函式中盡可能少執行工作。 它應該延遲 NIC 產生至 的中斷 I/O 作業 MiniportMessageInterruptDPC 函式。
當 NIC 產生 MSI 時,NDIS 會呼叫迷你埠驅動程式的 MiniportMessageInterrupt 函式。
MiniportMessageInterrupt 會盡可能儲存中斷和延遲大部分 I/O 處理所需的狀態資訊 MiniportMessageInterruptDPC 函式。
如果迷你埠驅動程序針對指定的訊息要求延遲程式呼叫 (DPC) ,迷你埠驅動程式應該停用該訊息的所有進一步中斷,並在所有 DPC 完成之後重新啟用中斷。
迷你埠驅動程序應該將 QueueDefaultInterruptDpc 設定為 TRUE ,以僅排程預設CPU的 DPC。 例如,驅動程式可以執行此動作,例如:
- NIC 產生中斷,以發出傳送作業完成的訊號,或任何其他未在其他 CPU 上執行的要求。
- NIC 產生中斷來訊號接收的數據,而迷你埠驅動程式無法在個別的 DPC 中處理接收的封包。
- 中斷表示已接收的封包,而迷你埠驅動程式可以在個別的 DPC 中處理已接收的封包,但未針對迷你埠驅動程式啟用 接收端調整 (RSS) 。 如需相關資訊,請參閱 OID_GEN_RECEIVE_SCALE_CAPABILITIES 和 OID_GEN_RECEIVE_SCALE_PARAMETERS。
- 迷你埠驅動程式已啟用接收端調整,而迷你埠驅動程式可以在每個接收佇列上產生不同的訊息。
如果 MiniportMessageInterrupt 共用指定訊息的資源,例如 NIC 快取器或狀態變數,以及另一個在較低 IRQL 上執行的 MiniportXxx 函式, 則 MiniportXxx 函式必須呼叫 NdisMSynchronizeWithInterruptEx 函式。 這可確保驅動程式的 MiniportSynchronizeMessageInterrupt 函式會以同步且安全多處理器的方式存取共用資源。
迷你埠驅動程式可以呼叫 NdisMDeregisterInterruptEx 函式來自其 MiniportInitializeEx 或 MiniportHaltEx 函式,以釋放它以 NdisMRegisterInterruptEx 配置的資源。 在 NdisMDeregisterInterruptEx 傳回之後,NDIS 不會呼叫迷你埠驅動程式的 MiniportMessageInterrupt 或 MiniportMessageInterruptDPC 函式。
NDIS 會在 MSI 的 DIRQL 呼叫 MiniportMessageInterrupt ,此 MSI 驅動程式在先前對 NdisMRegisterInterruptEx 的呼叫中註冊。 因此, MiniportMessageInterrupt 必須呼叫 NDIS 函式的子集,例如 NdisRawXxx 或 NdisRead/WriteRegisterXxx 函式,這些函式在任何 IRQL 上都安全呼叫。
例子
若要定義 MiniportMessageInterrupt 函式,您必須先提供函式宣告來識別您要定義的函式類型。 Windows 提供一組驅動程式的函式類型。 使用函式類型宣告函式有助於 驅動程式的程式代碼分析、 靜態驅動程序驗證器 (SDV) ,以及其他驗證工具會尋找錯誤,而且這是撰寫 Windows 操作系統驅動程式的需求。例如,若要定義名為 「 MyMessageInterrupt」 的 MiniportMessageInterrupt 函式,請使用 MINIPORT_MESSAGE_INTERRUPT 類型,如下列程式代碼範例所示:
MINIPORT_MESSAGE_INTERRUPT MyMessageInterrupt;
然後,實作您的函式,如下所示:
_Use_decl_annotations_
BOOLEAN
MyMessageInterrupt(
NDIS_HANDLE MiniportInterruptContext,
ULONG MessageId,
PBOOLEAN QueueDefaultInterruptDpc,
PULONG TargetProcessors
)
{...}
MINIPORT_MESSAGE_INTERRUPT函式類型定義於 Ndis.h 頭檔中。 若要在執行程式代碼分析工具時更精確地識別錯誤,請務必將 Use_decl_annotations 註釋新增至函式定義。 Use_decl_annotations批注可確保使用頭檔中套用至MINIPORT_MESSAGE_INTERRUPT函式類型的批注。 如需函式宣告需求的詳細資訊,請參閱 使用 NDIS 驅動程式的函式角色類型來宣告函式。
如需 Use_decl_annotations的詳細資訊,請參閱 標註函式行為。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | NDIS 6.0 和更新版本支援。 |
目標平台 | Windows |
標頭 | ndis.h (包括 Ndis.h) |
IRQL | 請參閱一節 |
另請參閱
IO_INTERRUPT_MESSAGE_INFO_ENTRYMiniportSynchronizeMessageInterrupt
NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS