MINIPORT_MESSAGE_INTERRUPT回呼函式 (ndis.h)
NDIS 會在 NIC 產生訊息型中斷時呼叫 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 。
言論
向 NdisMRegisterInterruptEx 函式註冊訊息信號中斷 (MSI) 支援的迷你埠驅動程式必須提供 MiniportMessageInterrupt 函式。
迷你埠驅動程序應該在 MiniportMessageInterrupt 函式中盡可能少地執行工作。 它應該延遲 NIC 對 產生的中斷進行 I/O 作業 MiniportMessageInterruptDPC 函式。
當 NIC 產生 MSI 時,NDIS 會呼叫迷你埠驅動程式的 MiniportMessageInterrupt 函式。
MiniportMessageInterrupt 儲存中斷的必要狀態資訊,並將盡可能多的 I/O 處理延遲至 MiniportMessageInterruptDPC 函式。
如果迷你埠驅動程序針對指定的訊息要求延後過程調用 (DPCs),迷你埠驅動程式應該停用該訊息的所有進一步中斷,並在所有 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,而迷你埠驅動程式在先前呼叫 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 和更新版本支援。 |
目標平臺 | 窗戶 |
標頭 | 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