Soft Ware/Windows Driver

디스패처 오브젝트 !!

달려가보자 2012. 2. 18. 18:10

디스패처 오브젝트의 기본적인 속성은 Signaled 와 Non-Signaled 상태 중 하나를 가진다

Signaled 상태는 디스패처 오브젝트가 보호 하고 있는 데이터를 사용하는 스레드가 하나도 없으며

코드 의 임계 영역에 있는 디른 스레드 역시 하나도 없는 상태를 말한다.

Non - Signaled 상태는 디스패처 오브젝트가 보호 하고 있는 데이터를 사용하고 , 코드 임계 영역에서

실행되고 있는 스레드가 있다는것을 말한다.


또한 드라이버는 디스패처 오브젝트를 사용하기 위해서는 페이징이 불가능한 영역에 오브젝트 변수를

선언해야 한다고 하네요 ㅎㅎ

하나의 스레드가 공유된 데이터를 사용할 필요가 있다면 KeWaitforSingleObject() 함수 와

KeWaitForMultipleObject(), KeWaitForMutexObject()
와 같은 대기 함수를 사용하여

디스패처 오브젝트가
Signaled 상태가 될때 까지 기다린다.

여기서 주의사항은 스레드에 제어를 넘겨주기전에 대기 상태에 있는 오브젝트의 상태를

Non - Signaled 로 변경해야 된다 .

데이터를 다 사용해서 반납할 경우에는 KeReleaseMutex(), KeSetEvent() 와 같은 함수를

호출 하여 디스패처 오브젝트의 상태를 Non - Signaled로 변경
해야 된다 .

※ 여기서 임의의 스레드 컨텍스트에서 실행되는 드라이버 디스패처 함수들은 디스패처 오브젝트가

Signaled 될때까지 기다리지 않는다 라는 점을 유의 해야 한다 !!!..