다음을 통해 공유


System-Allocated 타이머 개체 삭제

Windows 8.1 ExDeleteTimer 루틴은 ExAllocateTimer 루틴에서 만든 타이머 개체를 삭제합니다. 이 타이머 개체는 드라이버에 대한 멤버가 불투명한 시스템 할당 EX_TIMER 구조체입니다. 타이머 개체를 삭제하기 전에 ExDeleteTimer 는 개체에 대한 추가 타이머 작업을 사용하지 않도록 설정하고 진행 중인 개체에 대해 보류 중인 작업을 취소하거나 완료합니다.

드라이버가 ExDeleteTimer를 호출한 후 이 루틴은 타이머 개체를 안전하게 삭제할 수 있도록 몇 가지 단계를 수행합니다. 먼저 ExDeleteTimer 는 드라이버가 개체를 사용하는 새 타이머 작업을 시작하지 못하도록 타이머 개체를 사용 안 함으로 표시합니다. 타이머 개체를 사용하지 않도록 설정한 후 ExSetTimer 또는 ExCancelTimer 루틴에 대한 호출은 즉시 FALSE 를 반환하고 작업을 수행하지 않습니다. 또한 ExDeleteTimer 에 대한 두 번째 호출은 FALSE 를 반환하고 작업을 수행하지 않습니다.

다음으로 ExDeleteTimer이전 ExDeleteTimer 호출에서 타이머가 여전히 보류 중인지 확인합니다. 타이머 개체를 사용하지 않도록 설정해도 개체가 비활성화되기 전에 설정된 타이머는 취소되지 않습니다. 다음 두 경우 중 하나에서 타이머 개체를 사용하지 않도록 설정한 후에 이전에 설정된 타이머가 만료될 수 있습니다.

  • 타이머는 주기적입니다.
  • 타이머는 원샷(또는 비페리오딕)이며 아직 만료되지 않았습니다.

타이머 개체를 사용하지 않도록 설정한 후에는 주기적 타이머가 두 번 이상 만료되지 않습니다.

드라이버가 ExTimerCallback 콜백 루틴을 구현하는 경우 타이머 개체를 사용하지 않도록 설정한 후 타이머가 만료되더라도 이 루틴에 대한 타이머 매개 변수 는 항상 타이머 개체( EX_TIMER 구조체)에 대한 유효한 포인터가 되도록 보장됩니다.

보류 중인 타이머가 없으면 ExDeleteTimer 는 타이머 개체를 삭제하고 기다리지 않고 반환합니다.

ExDeleteTimer를 호출할 때 타이머가 보류 중인 경우 드라이버가 이 루틴에 제공하는 CancelWait 매개 변수 값이 루틴의 동작을 제어합니다. Cancel 매개 변수는 보류 중인 타이머를 취소할지 여부를 ExDeleteTimer에 알려줍니다. Wait 매개 변수는 타이머 개체가 삭제될 때까지 반환될 때까지 기다릴지 여부를 ExDeleteTimer에 알려줍니다.

CancelFALSE이고(이 경우 WaitFALSE여야 합니다) 타이머가 보류 중인 경우 ExDeleteTimer를 사용하면 타이머 개체가 삭제되기 전에 타이머가 만료됩니다. 이 경우 ExDeleteTimer 는 타이머 개체를 표시하여 보류 중인 타이머가 만료된 후 삭제됨을 나타내고 ExTimerCallback 루틴에 대한 마지막 콜백이 완료됨을 나타냅니다. 그런 다음 ExDeleteTimer는 타이머가 만료되거나 개체가 삭제될 때까지 기다리지 않고 를 반환합니다.

CancelTRUE이면 ExDeleteTimer는 만료되기 전에 보류 중인 타이머를 취소하려고 시도합니다. ExDeleteTimer는 타이머를 성공적으로 취소하면 TRUE 를 반환합니다. ExDeleteTimer 는 타이머를 취소할 수 없는 경우 FALSE 를 반환합니다. 이는 이미 만료되었거나 만료 중인 원샷 타이머의 경우입니다. ExDeleteTimer는 ExDeleteTimer 호출 전에 (원샷 또는 주기적) 타이머가 취소되었 거나 타이머가 설정되지 않은 경우에도 FALSE를 반환합니다.

CancelTRUE이고 WaitFALSE인 경우 ExDeleteTimer는 호출 스레드를 차단하지 않습니다. 타이머 개체를 즉시 삭제할 수 없는 경우 ExDeleteTimer 는 타이머 개체를 표시하여 보류 중인 타이머가 만료된 후 삭제될 것임을 나타내고 타이머가 만료되거나 개체가 삭제될 때까지 기다리지 않고 즉시 반환합니다.

CancelWait모두 TRUE이면 타이머 개체를 즉시 삭제할 수 없는 경우 ExDeleteTimer에서 호출 스레드를 차단합니다. 필요한 경우 ExDeleteTimer 는 타이머가 만료를 완료하고 드라이버 구현 ExTimerCallback 루틴에 대한 콜백이 완료될 때까지 기다립니다. 다음으로, ExDeleteTimer 는 타이머 개체를 삭제하고 드라이버가 이 루틴을 구현하는 경우 ExTimerDeleteCallback 루틴을 호출합니다. 마지막으로 ExDeleteTimer가 반환됩니다.

드라이버는 IRQL = DISPATCH_LEVEL 실행되는 드라이버의 ExTimerCallback 루틴에서 ExDeleteTimer을 호출할 수 있지만 드라이버는 이 호출에서 Wait 매개 변수를 FALSE로 설정해야 합니다.

옵션으로 드라이버는 타이머 개체가 삭제된 후 실행되는 ExTimerDeleteCallback 콜백 루틴을 구현할 수 있습니다. 일반적으로 ExTimerDeleteCallback 루틴은 드라이버가 타이머 개체와 함께 사용하도록 할당된 모든 시스템 리소스를 해제합니다.

ExDeleteTimer 는 타이머 개체가 삭제된 후 드라이버 구현 ExTimerDeleteCallback 루틴이 실행되도록 예약합니다. 이때 이 개체에 대한 포인터가 더 이상 유효하지 않습니다. ExDeleteTimer 호출에서 Wait 매개 변수가 TRUE이면 ExDeleteTimer가 반환되기 전에 ExTimerDeleteCallback 루틴에 대한 콜백이 완료됩니다. WaitFALSE이면 ExTimerDeleteCallback 루틴이ExDeleteTimer가 반환되기 전이나 후에 실행될 수 있습니다.

자세한 내용은 ExXxx타이머 루틴 및 EX_TIMER 개체를 참조하세요.