次の方法で共有


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 で実行されます。 具体的には、ioConnectInterrupt するために、SynchronizeIrql パラメーターで指定されているように、いくつかのシステム割り当て DIRQLで実行されます。 (DIRQL 値が大きい他のデバイスでは、SynchCritSection ルーチンが中断される可能性があります)。

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

たとえば、MySynchCritSectionという名前のコールバック ルーチン SynchCritSection を定義するには、次のコード例に示すように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_の詳細については、「関数の動作 に注釈を付けるを参照してください。

必要条件

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