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

SynchCritSection ルーチンは、ドライバーの InterruptService ルーチンと共有されているハードウェア リソースまたはドライバー データにアクセスするために使用されます。

構文

KSYNCHRONIZE_ROUTINE KsynchronizeRoutine;

BOOLEAN KsynchronizeRoutine(
  [in] PVOID SynchronizeContext
)
{...}

パラメーター

[in] SynchronizeContext

呼び出し元が指定したコンテキスト情報。 ドライバーによる KeSynchronizeExecution の呼び出しによって指定されます。

戻り値

ルーチンの操作が成功した場合、ルーチンは TRUE を返す必要があります。それ以外の場合は、 FALSE を返す必要があります。 (このルーチンの成功と失敗はドライバーによって定義されます)。指定した戻り値は、 KeSynchronizeExecution の戻り値になります。

注釈

ドライバーは SynchCritSection ルーチンを使用して、 InterruptService ルーチン (ISR) によってアクセスできるハードウェア リソースまたはドライバー データにアクセスする必要があります。

システムは、ドライバーが KeSynchronizeExecution を呼び出すときに、ドライバーの SynchCritSection ルーチンを呼び出します。 ドライバーは 、KeSynchronizeExecution を呼び出すときに、 SynchCritSection ルーチンのアドレス、ルーチンのコンテキスト情報、および割り込みオブジェクト ポインターを指定します。 KeSynchronizeExecution ルーチンは、割り込みオブジェクトのスピン ロックを取得し、SynchCritSection ルーチンを呼び出します。

ドライバーの SynchCritSection ルーチンは、関連付けられている ISR と同じ IRQL で実行されます。 具体的には、SynchronizeIrql パラメーターで IoConnectInterrupt に指定されているように、システム割り当て DIRQL で実行されます。 (DIRQL 値が大きい他のデバイスでは、 SynchCritSection ルーチンが中断される可能性があります)。

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

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

KSYNCHRONIZE_ROUTINE MySynchCritSection;

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

_Use_decl_annotations_
BOOLEAN
  MySynchCritSection(
    PVOID  SynchronizeContext
    )
  {
      // Function body
  }

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

要件

要件
対象プラットフォーム デスクトップ
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
IRQL DIRQL で呼び出されます (「解説」セクションを参照)。