次の方法で共有


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の場合、これは、システムがこの転送操作に割り当てたマップ レジスタを表す呼び出し元から提供される不透明な値です。 ドライバーは、この値を FlushAdapterBuffersFreeMapRegisters、および MapTransfer 渡します。

ControllerControlの場合、これは使用されません。

[in] Context

AllocateAdapterChannelへの以前の呼び出しで指定された、ドライバー定義コンテキスト情報への呼び出し元指定ポインター。

戻り値

ルーチンは、IO_ALLOCATION_ACTION 列挙体によって定義された値のいずれかを返す必要があります。 バス マスター デバイスのドライバーは、DeallocateObject または DeallocateObjectKeepRegistersを返します。システム DMA を使用するドライバーは、KeepObject 返します。

備考

特定のデバイス オブジェクトの AdapterControl ルーチンを登録するには、ドライバーが IoGetDmaAdapter 呼び出してアダプター オブジェクトを取得してから、AllocateAdapterChannel 呼び出してアダプターの使用を要求し、AdapterControl ルーチンのアドレスを指定する必要があります。 アダプターが解放されると、システムは AdapterControl ルーチンを呼び出します。

AdapterControlStartIo ルーチンによって登録されている場合、Irp パラメーターは、StartIo ルーチンによって現在処理されている IRP を指す必要があります。 それ以外の場合、ドライバーは、AllocateAdapterChannelを呼び出す前に、デバイス オブジェクト構造体の CurrentIrp メンバーを設定する必要があります。

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 オペレーティング システムのドライバーを記述するための要件になります。

たとえば、MyAdapterControlという名前の AdapterControl コールバック ルーチンを定義するには、次のコード例に示すように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