システムによって割り当てられたタイマー オブジェクトの削除
Windows 8.1 以降、ExAllocateTimer ルーチンが作成するタイマー オブジェクトは、ExDeleteTimer ルーチンによって削除されます。 このタイマー オブジェクトは、システムが割り当てる EX_TIMER 構造体で、そのメンバーはドライバーに対して不透明です。 ExDeleteTimer はタイマー オブジェクトを削除する前に、そのオブジェクトでのそれ以降のタイマー操作を無効にし、進行中の可能性があるオブジェクトに対して保留されている操作を取り消すか完了します。
ドライバーが ExDeleteTimer を呼び出すと、このルーチンが、タイマー オブジェクトを安全に削除するためのいくつかの手順を実行します。 ExDeleteTimer はまず、それ以降、オブジェクトを使用するタイマー操作がドライバーによって開始されないように、そのタイマー オブジェクトを無効としてマークします。 タイマー オブジェクトが無効になると、ExSetTimer または ExCancelTimer ルーチンを呼び出しても、すぐに FALSE が返され、操作は実行されません。 また ExDeleteTimer の 2 回目の呼び出しによっても、FALSE が返され、操作は実行されません。
次に、ExDeleteTimer は、以前の ExDeleteTimer の呼び出しでタイマーがまだ保留中かどうかをチェックします。 タイマー オブジェクトを無効にしても、オブジェクトが無効になる前に設定されたタイマーは取り消されません。 次の 2 つのケースのいずれかでは、タイマー オブジェクトを無効にする前に設定されたタイマーが、無効化後に期限切れになる可能性があります。
- 周期的タイマーの場合。
- タイマーが 1 回限り (つまり非周期的) であるが、まだ期限が切れていない場合。
周期的タイマーは、タイマー オブジェクトの無効化後、複数回期限切れになることはありません。
ドライバーが ExTimerCallback コールバック ルーチンを実装している場合、タイマー オブジェクトが無効化された後にタイマーが期限切れになったとしても、このルーチンの Timer パラメーターは、常にタイマー オブジェクト (EX_TIMER 構造体) への有効なポインターであることが保証されます。
タイマーが保留中でない場合、ExDeleteTimer はタイマー オブジェクトを削除し、待機せずに戻ります。
ExDeleteTimer が呼び出されたときにタイマーが保留中の場合、ドライバーがこのルーチンに提供する Cancel パラメーターと Wait パラメーターの値によって、ルーチンの動作が制御されます。 Cancel パラメーターは、保留中のタイマーを取り消すかどうかを ExDeleteTimer に指示します。 Wait パラメーターは、タイマー オブジェクトが削除されるまで戻らずに待機するかどうかを ExDeleteTimer に指示します。
Cancel が FALSE (したがって Wait も FALSE) であって、タイマーが保留中の場合、ExDeleteTimer はタイマー オブジェクトが削除される前にタイマーを有効期限切れにします。 この場合、ExDeleteTimer はタイマー オブジェクトをマークして、保留中のタイマーの有効期限が切れた後 (また、ExTimerCallback ルーチンへの最後のコールバックは終了した後)、削除する必要があることを示します。 その後、タイマーの有効期限切れまたはオブジェクトの削除を待たずに、ExDeleteTimer が返されます。
Cancel が TRUE の場合、ExDeleteTimer は、保留中のタイマーが期限切れになる前に、そのタイマーのキャンセルを試みます。 ExDeleteTimer は、タイマーを 正常にキャンセルした場合、TRUE を返します。 ExDeleteTimer は、タイマーをキャンセルできない場合 (既に期限切れになっているか、期限切れの処理中のワンショット タイマーの場合)、FALSE を返します。 ExDeleteTimer を呼び出す前に (ワンショットまたは周期的) タイマーがキャンセルされた場合、またはタイマーがまったく設定されていない場合も、ExDeleteTimer は FALSE を返します。
Cancel が TRUE で Wait が FALSE の場合、ExDeleteTimer は呼び出し元のスレッドをブロックしません。 タイマー オブジェクトをすぐに削除できない場合、ExDeleteTimer はタイマー オブジェクトをマークして、保留中のタイマーの有効期限が切れた後に削除する必要があることを示し、タイマーの期限切れまたはオブジェクトの削除を待たずに直ちに戻ります。
Cancel と Wait の両方が TRUE であって、タイマー オブジェクトをすぐに削除できない場合、ExDeleteTimer は呼び出し元のスレッドをブロックします。 ExDeleteTimer は、必要に応じて、タイマーの有効期限が切れるとともに、ドライバーが実装する ExTimerCallback ルーチンへのコールバックが完了するまで待機します。 次に、ExDeleteTimer はタイマー オブジェクトを削除し、ドライバーが ExTimerDeleteCallback ルーチンを実装している場合は、このルーチンを呼び出します。 最後に、ExDeleteTimer が返されます。
ドライバーは、IRQL = DISPATCH_LEVEL で実行されるドライバーの ExTimerCallback ルーチンから ExDeleteTimer を呼び出すことができますが、この呼び出しの Wait パラメーターを FALSE に設定する必要があります。
必要に応じて、ドライバーは、タイマー オブジェクトが 削除された後に実行される ExTimerDeleteCallback コールバック ルーチンを実装できます。 通常、ExTimerDeleteCallback ルーチンは、タイマー オブジェクトで使用するためにドライバーが割り当てたシステム リソースを解放します。
ExDeleteTimer は、ドライバー実装の ExTimerDeleteCallback ルーチンが、タイマー オブジェクトが削除された後で実行されるようにスケジュールします。この時点でこのオブジェクトへのポインターが無効になります。 ExDeleteTimer 呼び出しの Wait パラメーターが TRUE の場合、ExDeleteTimer が戻る前に ExTimerDeleteCallback ルーチンへのコールバックが終了します。 Wait が FALSE の場合、ExTimerDeleteCallback ルーチンは、ExDeleteTimer が戻る前または戻った後に実行できます。
詳細については、「 ExXxxTimer ルーチンと EX_TIMER オブジェクト」を参照してください。