일단 APC_LEVEL이라고, PASSIVE_LEVEL과 DISPATCH_LEVEL 사이에 존재하는
상수값 2의 APC가 존재한다.
그렇다면 APC란게 정확하게 무엇인지 알아보자!!@!
APC( Asynchronous Procedure Call )
APC는 스레드를 위한 제어 흐름에 영향을 미칠 수 있는 방법으로, 특정 스레드를 목표로 해야한다.
모든 디바이스 컨텍스트는 실행이 될때 어느 스레드에서 실행이 될지 모른다, 스레드가 생성하고
그 디바이스를 사용하기 때문에, 임의의 스레드( Arbitrary Thread )에서 실행이 된다.
하지만 APC는 일반적으로 프로세서에서 실행되는 임의의 스레드 컨텍스트에서 실행되는 DPC와 반대되는
개념이다.
APC에 직접 명령을 전달하는 스레드가 소프트웨어 인터럽트를 통해 차단되면 APC_LEVEL IRQL에서
차단된 스레드 컨텍스트가 활성화되어 실행된다.
APC는 커널 모드나 유저 모드에서 전달될 수 있고, 커널 모드는 일반적인 형태의 APC와 특별한 형태의
APC로 나눌 수 있다. 일반적인 형태의 APC는 커널 모드 드라이버에서 KeEnterCriticalRegion() 함수를
호출해서 실행이 되지 못하도록 조절할 수 있지만, 특별한 형식의 APC는 차단하지 못한다.
리소스 오브젝트를 다루다 보면 APC에 관한 정보가 나온다. 이때 APC를 보게 되면, 리소스 오브젝트와
관련된 함수들은 DISPATCH_LEVEL 이나 이보다 낮은 IRQL에서만 사용해야 한다.
리소스 오브젝트는 리소스를 획득했다 하더라도, 일반적인 형태의 APC는 실행될 수 있기때문에, 이를
차단하기 위해 KeEnterCriticalRegion() 함수를 호출하고, 오브젝트 사용 완료 시 다시 KeLeaveCriticalRegion()
함수를 호출하여 APC가 동작하도록 처리한다. Windows 2000은 스레드 수행을 동기화하거나 공유하는 객체
에 대한 액세스를 보호하기 위해 Fast Mutex와 인터락을 제공한다.
Filemon에서 예제코드를 보면 리소스 오브젝트를 사용할때 커널 APC에 전달하는 코드가 있다.
- VOID FilemonUpdateFilters( VOID )
- {
- KeEnterCriticalRegion();
- ExAcquireResourceExclusiveLite( &FilterResource, TRUE );
- ...
- ExReleaseResourceLite( &FilterResource );
- KeLeaveCriticalRegion();
- }
오브젝트에 관한 용어가 나왔는데 다음에 동기화를 알아볼때 각종 오브젝트들을 알아보자,