次の方法で共有


IO_CSQ_ACQUIRE_LOCK コールバック関数 (wdm.h)

CsqAcquireLock ルーチンは、ドライバー実装のキャンセル セーフ IRP キューのロックを取得するためにシステムによって使用されます。

構文

IO_CSQ_ACQUIRE_LOCK IoCsqAcquireLock;

void IoCsqAcquireLock(
  [in]  PIO_CSQ Csq,
  [out] PKIRQL Irql
)
{...}

パラメーター

[in] Csq

キャンセル セーフ IRP キューの IO_CSQ 構造体へのポインター。

[out] Irql

CsqAcquireLock ルーチンが現在の IRQL の格納に使用できる変数へのポインター。 ロックを解除すると、システムは格納された値 CsqReleaseLock を渡します。

戻り値

なし

解説

ドライバーは、キューのIO_CSQ構造を初期化するときに、キャンセル セーフ IRP キューの CsqAcquireLock ルーチンを指定します。 ドライバーは、IO_CSQを初期化するときに、IoCsqInitialize または IoCsqInitializeExCsqAcquireLock パラメーターとしてルーチン指定します。 詳細については、「 Cancel-Safe IRP Queues」を参照してください。

システムは、挿入またはキューから IRP を削除する前に、ドライバーの IRP キューのロックを取得するには、このルーチンを呼び出します。 システムは CsqReleaseLock ルーチンを呼び出してロックを解放します。

ドライバーがスピン ロックを使用してキューのロックを実装する場合は、スピン ロックを解放するときに、現在の IRQL を格納する必要があります。 システムは、ドライバーが現在の IRQL を格納するために使用できる IRQL 変数へのポインターを渡します。 システムは、ロックを解除すると、格納された値を Irql パラメーターとして CsqReleaseLock に渡します。 それ以外の場合、ドライバーは Irql パラメーターを無視できます。 スピン ロックの詳細については、「 スピン ロック」を参照してください。

ドライバーは、任意のロック メカニズムを使用して、ミューテックスなどのキューをロックできます。 ミューテックスの詳細については、「 Mutex オブジェクト」を参照してください。

CsqAcquireLock コールバック ルーチンを定義するには、まず、定義するコールバック ルーチンの種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバーのコールバック関数の種類のセットが用意されています。 コールバック関数の種類を使用して関数を宣言すると、ドライバー、静的ドライバー検証ツール (SDV)、およびその他の検証ツールのコード分析でエラーが検出され、Windows オペレーティング システム用のドライバーを記述するための要件になります。

たとえば、 という名前MyCsqAcquireLockの CsqAcquireLock コールバック ルーチンを定義するには、次のコード例に示すように、IO_CSQ_ACQUIRE_LOCK型を使用します。

IO_CSQ_ACQUIRE_LOCK MyCsqAcquireLock;

次に、コールバック ルーチンを次のように実装します。

_Use_decl_annotations_
VOID 
 MyCsqAcquireLock(
    PIO_CSQ  Csq,
    PKIRQL  Irql
    )
  {
      // Function body
  }

IO_CSQ_ACQUIRE_LOCK関数の種類は、Wdm.h ヘッダー ファイルで定義されます。 コード分析ツールを実行するときにエラーをより正確に識別するには、必ず注釈を _Use_decl_annotations_ 関数定義に追加してください。 注釈を _Use_decl_annotations_ 使用すると、ヘッダー ファイル内のIO_CSQ_ACQUIRE_LOCK関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「 WDM ドライバーの関数ロール型を使用して関数を宣言する」を参照してください。 の詳細 _Use_decl_annotations_については、「 関数の動作に注釈を付ける」を参照してください。

要件

要件
対象プラットフォーム デスクトップ
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
IRQL 「解説」を参照してください。

こちらもご覧ください

CsqCompleteCanceledIrp

CsqInsertIrp

CsqInsertIrpEx

CsqPeekNextIrp

CsqReleaseLock

CsqRemoveIrp

IO_CSQ

IoCsqInitialize

IoCsqInitializeEx

IoCsqInsertIrp

IoCsqInsertIrpEx

IoCsqRemoveIrp

IoCsqRemoveNextIrp