MINIPORT_MESSAGE_INTERRUPT回呼函式 (ndis.h)

當 NIC 產生以訊息為基礎的中斷時,NDIS 會呼叫 MiniportMessageInterrupt 函式。

注意 您必須使用 MINIPORT_MESSAGE_INTERRUPT 類型來宣告函式。 如需詳細資訊,請參閱下列範例一節。
 

語法

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 等等。

注意 NDIS 6.20 和更新版本的驅動程序不應該使用此參數來排程 DPC。 相反地,它們應該將此參數設定為零,並使用 NdisMQueueDpcEx 函式來排程 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
  • 迷你埠驅動程式已啟用接收端調整,而迷你埠驅動程式可以在每個接收佇列上產生不同的訊息。
如果迷你埠驅動程式在個別的 DPC 中處理已接收的封包,迷你埠驅動程式會將 QueueDefaultInterruptDpc 參數設定為 FALSE。 迷你埠驅動程序應該為與每個無空接收佇列相關聯的 CPU 設定 TargetProcessors 位。 NDIS 會在處理器群組0中的每個指示CPU上排程 DPC。

如果 MiniportMessageInterrupt 共用指定訊息的資源,例如 NIC 快取器或狀態變數,以及另一個在較低 IRQL 上執行的 MiniportXxx 函式, 則 MiniportXxx 函式必須呼叫 NdisMSynchronizeWithInterruptEx 函式。 這可確保驅動程式的 MiniportSynchronizeMessageInterrupt 函式會以同步且安全多處理器的方式存取共用資源。

迷你埠驅動程式可以呼叫 NdisMDeregisterInterruptEx 函式來自其 MiniportInitializeExMiniportHaltEx 函式,以釋放它以 NdisMRegisterInterruptEx 配置的資源。 在 NdisMDeregisterInterruptEx 傳回之後,NDIS 不會呼叫迷你埠驅動程式的 MiniportMessageInterrupt 或 MiniportMessageInterruptDPC 函式。

NDIS 會在 MSI 的 DIRQL 呼叫 MiniportMessageInterrupt ,此 MSI 驅動程式在先前對 NdisMRegisterInterruptEx 的呼叫中註冊。 因此, MiniportMessageInterrupt 必須呼叫 NDIS 函式的子集,例如 NdisRawXxxNdisRead/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

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterruptDPC

MiniportSynchronizeMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)