共用方式為


DRIVER_CONTROL回呼函式 (wdm.h)

此例程會啟動 DMA 資料傳輸或資料傳輸作業。

語法

DRIVER_CONTROL DriverControl;

IO_ALLOCATION_ACTION DriverControl(
  [in]      _DEVICE_OBJECT *DeviceObject,
  [in, out] _IRP *Irp,
  [in]      PVOID MapRegisterBase,
  [in]      PVOID Context
)
{...}

參數

[in] DeviceObject

呼叫端提供的 DEVICE_OBJECT結構的指標 。 這是目標裝置的裝置物件,先前是由驅動程式的 AddDevice 例程所建立。

[in, out] Irp

呼叫端提供的 IRP 結構指標。 Irp 等於註冊回呼例程時 DeviceObjectCurrentIrp 成員值。

[in] MapRegisterBase

AdapterControl 的情況下,這是呼叫端提供的不透明值,代表系統為此傳輸作業指派的對應緩存器。 驅動程式會將此值傳遞至 FlushAdapterBuffersFreeMapRegistersMapTransfer

若為 ControllerControl,則不會使用此專案。

[in] Context

呼叫端提供的驅動程式定義內容資訊指標,指定於先前對 AllocateAdapterChannel 的呼叫中。

傳回值

例程必須傳回 IO_ALLOCATION_ACTION 列舉所定義的其中一個值。 總線主機裝置的驅動程式會傳回 DeallocateObjectDeallocateObjectKeepRegisters;使用系統 DMA 的驅動程式會傳回 KeepObject

備註

若要註冊特定裝置物件的 AdapterControl 例程,驅動程式必須呼叫 IoGetDmaAdapter 以取得配接器對象,然後呼叫 AllocateAdapterChannel 以要求使用配接器,並提供 AdapterControl 例程的位址。 當配接器可用時,系統會呼叫 AdapterControl 例程。

如果 StartIo 例程已註冊 AdapterControl,則 Irp 參數保證指向 StartIo 例程目前正在處理的 IRP。 否則,驅動程式必須先設定裝置對象結構的 CurrentIrp 成員,才能呼叫 AllocateAdapterChannel

如需實作 AdapterControl 例程的詳細資訊,請參閱 撰寫 AdapterControl 例程

驅動程式的 ControllerControl 例程會在 IRQL = DISPATCH_LEVEL的任意線程內容中執行。

若要註冊特定裝置物件的 ControllerControl 例程,驅動程式必須呼叫 IoCreateController 以取得控制器對象,然後呼叫 IoAllocateController 要求使用控制器,並提供 ControllerControl 例程的位址。 當控制器是免費的時,系統會呼叫 ControllerControl 例程。

如需實作 ControllerControl 例程的詳細資訊,請參閱 撰寫 ControllerControl 例程。 另請參閱 控制器物件

DRIVER_CONTROL函式類型定義於 Wdm.h 頭檔中。 若要在執行程式代碼分析工具時更精確地識別錯誤,請務必將 _Use_decl_annotations_ 註釋新增至函式定義。 批 _Use_decl_annotations_ 注可確保使用頭檔中套用至DRIVER_CONTROL函式類型的批註。 如需函式宣告需求的詳細資訊,請參閱 使用WDM驅動程式的函式角色類型來宣告函式。 如需 的相關信息 _Use_decl_annotations_,請參閱 標註函式行為

範例

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

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

DRIVER_CONTROL MyAdapterControl;

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

_Use_decl_annotations_
IO_ALLOCATION_ACTION
 MyAdapterControl(
    struct _DEVICE_OBJECT  *DeviceObject,
    struct _IRP  *Irp,
    PVOID  MapRegisterBase,
    PVOID  Context
    )
  {
      // Function body
  }

規格需求

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

另請參閱

AllocateAdapterChannel