ExXxxTimer ルーチンと EX_TIMER オブジェクト
Windows 8.1 以降、ExXxxTimer ルーチンの包括的なセットを使用して、タイマーを管理することができます。 これらのルーチンは、EX_TIMER 構造に基づくタイマー オブジェクトを使用します。 ExXxxTimer ルーチンは KeXxxTimer を置き換えるものであり、Windows 2000 以降で使用できます。 Windows 8.1 以降のバージョンの Windows でのみ実行することを目的としたドライバーは、KeXxxTimer ルーチンの代わりに ExXxxTimer ルーチンを使用できます。 Windows 8.1 以降のバージョンの Windows では、引き続き KeXxxTimer ルーチンがサポートされています。
ExXxxTimer ルーチンには、KeXxxTimer ルーチンによって提供されるすべての重要な機能があります。 加えて、ExXxxTimer ルーチンは、タイマーの 2 つの種類、高解像度タイマーとウェイクなしタイマーをサポートします。これらのタイマーは、KeXxxTimer ルーチンでサポートされていません。 高解像度タイマーは、システム クロックの既定の解像度によって精度が制限されているタイマーよりも高い精度で有効期限を指定できるタイマーです。 ウェイクなしタイマーは、プロセッサを低電力状態から不必要にウェイクアップさせるのを回避するタイマーです。 詳細については、次のトピックを参照してください。
Windows 8.1 以降では、以下の ExXxxTimer を使用できます。
ExSetTimer ルーチンは、KeSetTimer ルーチンまたは KeSetTimerEx ルーチンの代わりに使用できます。 ExCancelTimer ルーチンは、KeCancelTimer ルーチンの代わりに使用できます。
ExAllocateTimer ルーチンと ExDeleteTimer ルーチンには、対応する直接の KeXxxTimer はありません。 これら 2 つのルーチンは、タイマー オブジェクトを割り当てて解放します。 このタイマー オブジェクトは、システムが割り当てる EX_TIMER 構造で、そのメンバーはドライバーに対して不透明です。 これに対し、KeXxxTimer ルーチンによって使用されるタイマー オブジェクトは、ドライバーによって割り当てられた KTIMER 構造です。 ドライバーは、このオブジェクトを初期化する KeInitializeTimer または KeInitializeTimerEx ルーチンを呼び出します。 ExAllocateTimer は、割り当てるタイマー オブジェクトを初期化します。 ExDeleteTimer について詳しくは、「システム割り当てタイマー オブジェクトの削除」をご覧ください。
EX_TIMER および KTIMER 構造は待機可能なオブジェクトです。 ドライバーが ExSetTimer、KeSetTimer、または KeSetTimerEx を呼び出してタイマーを設定すると、ドライバーは KeWaitForSingleObject や KeWaitForMultipleObjects などのルーチンを呼び出してタイマーの有効期限が切れるまで待機できます。 タイマー オブジェクトは、タイマーの有効期限が切れると通知を受け取ります。 オプションとして、ドライバーは、タイマーの有効期限が切れた後にオペレーティング システムによって呼び出される、ドライバーによって実装された ExTimerCallback または CustomTimerDpc コールバック ルーチンへのポインターを提供できます。
KeXxxTimer ルーチンには、ExXxxTimer ルーチンによって提供されない 2 つの機能がありますが、これらの機能はほとんどのドライバーには必要ありません。
まず、KeXxxTimer ルーチンによってタイマー オブジェクトとして使用される KTIMER 構造は、ドライバーによって割り当てられます。 ドライバーは、リソースが制約され、メモリ割り当てが失敗する可能性がある状況でも、オブジェクトを使用できるように、このオブジェクトを事前に割り当てることができます。 これに対し、ExAllocateTimer を呼び出してタイマー オブジェクトを割り当てると、リソースに制約のある環境で失敗する可能性があります。 ただし、メモリ割り当てが失敗する環境で動作するよう設計する必要があるドライバーはほとんどなく、ほとんどのドライバーは、タイマー オブジェクトの割り当てと初期化の両方を行う ExAllocateTimer ルーチンの利便性の恩恵を受けます。
次に、タイマー オブジェクトがシグナル状態であるかどうかを示す、KeReadStateTimer ルーチンに相当する ExXxxTimer はありません。 ただし、このルーチンはほとんど使用されません。 必要に応じて、ExXxxTimer ルーチンを使用するドライバーは、ドライバーが ExAllocateTimer ルーチンに提供する ExTimerCallback コールバック ルーチンによって設定されたブール値を読み取ることによって、タイマー オブジェクトがシグナル状態であるかどうかをチェックできます。