共用方式為


KDEFERRED_ROUTINE回呼函式 (wdm.h)

回呼例程會在線程 DPC 的 InterruptService 傳回之後執行動作,

CustomDpc 例程會在傳回 InterruptService 例程之後,完成 I/O 作業的服務。

CustomThreadedDpc 例程會執行線程 DPC 的動作。 當線程 DPC 執行時,系統會執行此例程。

CustomTimerDpc 例程會在定時器對象的時間間隔到期之後執行。

語法

KDEFERRED_ROUTINE KdeferredRoutine;

void KdeferredRoutine(
  [in]           _KDPC *Dpc,
  [in, optional] PVOID DeferredContext,
  [in, optional] PVOID SystemArgument1,
  [in, optional] PVOID SystemArgument2
)
{...}

參數

[in] Dpc

呼叫端提供的 KDPC 結構指標,代表與此回呼例程相關聯的 DPC 物件。

[in, optional] DeferredContext

針對 customDpc ,呼叫端提供的驅動程式定義內容資訊指標,該指標是在先前 呼叫 keInitializeDpc中指定的。

針對 CustomThreadedDpc,指定驅動程式定義的內容資訊。 初始化 DPC 物件時,驅動程式會提供此值做為 DeferredContext 參數,以 KeInitializeThreadedDpc

KDPC 結構的呼叫端提供的指標,代表與此 CustomTimerDpc 例程相關聯的 DPC 物件。

[in, optional] SystemArgument1

呼叫端提供的驅動程式提供的指標,該資訊是在先前呼叫 KeInsertQueueDpc 中指定的。 當驅動程式將 DPC 新增至 DPC 佇列時,會將此值當做 SystemArgument1 參數提供給 KeInsertQueueDpc

若為 CustomTimerDpc,則不會使用此值。

[in, optional] SystemArgument2

指定驅動程式定義的內容資訊。 當驅動程式將 DPC 新增至 DPC 佇列時,會將此值當做 SystemArgument2 參數提供給 KeInsertQueueDpc

若為 CustomTimerDpc,則不會使用此值。

傳回值

沒有

言論

若要建立 DPC 物件並註冊該物件的 CustomDpc 例程,驅動程式必須呼叫 KeInitializeDpc。 (如果您只需要一個 DPC 例程,您可以使用 DpcForIsr 例程和系統配置的 DPC 物件。

若要將 CustomDpc 例程排入佇列,驅動程式的 InterruptService 例程必須呼叫 keInsertQueueDpc

您可以使用一或多個 CustomDpc 例程,而不是或與 DpcForIsr 例程搭配使用。 維護數個內部 IRP 佇列的驅動程式通常會為每個佇列提供 CustomDpc 例程。 每個 CustomDpc 例程通常至少負責下列工作:

  • 完成目前 IRP 所描述的 I/O 作業。

  • 從其中一個驅動程式的 IRP 佇列中清除下一個 IRP。 (使用系統提供的 IRP 佇列與 StartIo 例程呼叫的驅動程式,IoStartNextPacket

  • 在目前的 IRP 中設定 I/O 狀態區塊,並針對已完成的要求呼叫 IoCompleteRequest

CustomDpc 例程也可能重試失敗的作業,或為已分成較小片段的大型 I/O 要求設定下一個傳輸。

如需 CustomDpc 例程的詳細資訊,請參閱 DPC 物件和 DPC

驅動程式會藉由呼叫 KeInitializeThreadedDpc來註冊 DPC 物件的 CustomThreadedDpc。 若要實際將 DPC 新增至 DPC 佇列,以便執行 CustomThreadedDpc 例程,請呼叫 KeInsertQueueDpc

如需使用 CustomThreadedDpc 例程的詳細資訊,請參閱 線程 DPC 簡介

CustomThreadedDpc 例程可以在 IRQL = DISPATCH_LEVEL執行,也可以在即時線程中的 IRQL = PASSIVE_LEVEL執行。

若要建立 DPC 物件並註冊該物件的 CustomTimerDpc 例程,驅動程式必須呼叫 KeInitializeDpc

若要將 CustomTimerDpc 例程排入佇列,驅動程式例程必須呼叫 KeSetTimerKeSetTimerEx,並提供由 keInitializeDpc 所傳回的 DPC 物件指標。 當定時器間隔到期時,系統會呼叫 CustomTimerDpc 例程。

如需 CustomTimerDpc 例程的詳細資訊,請參閱 Timer Objects 和 DPC

例子

若要定義回呼例程,您必須先提供函式宣告,以識別您要定義的回呼例程類型。 Windows 提供一組驅動程式的回呼函式類型。 使用回呼函式類型宣告函式有助於 驅動程式的程式代碼分析靜態驅動程式驗證器 (SDV)和其他驗證工具尋找錯誤,而且是撰寫 Windows作系統驅動程式的需求。

例如,若要定義名為 MyCustomDpcCustomDpc 回呼例程,請使用KDEFERRED_ROUTINE類型,如下列程式代碼範例所示:

KDEFERRED_ROUTINE MyCustomDpc;

然後,實作回呼例程,如下所示:

_Use_decl_annotations_
VOID
  MyCustomDpc(
    struct _KDPC  *Dpc,
    PVOID  DeferredContext,
    PVOID  SystemArgument1,
    PVOID  SystemArgument2
    )
  {
      // Function body
  }

要求

要求 價值
目標平臺 桌面
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
IRQL 在 DISPATCH_LEVEL呼叫。

另請參閱

KeInsertQueueDpc

KeSetTimer

KeSetTimerEx