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

CsqReleaseLock ルーチンは、CsqAcquireLock を使用して取得されたロックを解放するためにシステムによって使用されます。

構文

IO_CSQ_RELEASE_LOCK IoCsqReleaseLock;

void IoCsqReleaseLock(
  [in] PIO_CSQ Csq,
  [in] KIRQL Irql
)
{...}

パラメーター

[in] Csq

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

[in] Irql

IRQL を指定します。 これは、ロックが取得されたときに CsqAcquireLock によって格納される値です。

戻り値

なし

解説

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

システムはこの関数を呼び出して、 CsqAcquireLock を使用して取得されたロックを解放します。

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

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

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

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

IO_CSQ_RELEASE_LOCK MyCsqReleaseLock;

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

_Use_decl_annotations_
VOID 
 MyCsqReleaseLock(
    PIO_CSQ  Csq,
    KIRQL  Irql
    )
  {
      // Function body
  }

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

要件

要件
対象プラットフォーム デスクトップ
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)

こちらもご覧ください

CsqAcquireLock

CsqCompleteCanceledIrp

CsqInsertIrp

CsqInsertIrpEx

CsqPeekNextIrp

CsqRemoveIrp

IO_CSQ

IoCsqInitialize

IoCsqInitializeEx

IoCsqInsertIrp

IoCsqInsertIrpEx

IoCsqRemoveIrp

IoCsqRemoveNextIrp