Kernel mode2017. 10. 20. 15:59

커널에서 스레드의 context 정보를 가져오기 위하여 PsGetContextThread 함수를 이용한 적이 있었다.

32bit에서는 문제가 없었으나 64bit에서는 자기 자신, 즉 현재 스레드의 context를 얻으려고 할 경우 문제가 생겼다.

XP와 VISTA에서는 BSOD가 발생하고 그 이후의 OS들은 STATUS_UNSUCCESSFUL이 리턴되었다.


 - XP      : Bugcheck 0x7F UNEXCEPTED_KERNEL_MODE_TRAP

 - VISTA : Bugcheck 0x1E KMODE_EXCEPTION_NOT_HANDLED

 - Later  : 0xC0000001 STATUS_UNSUCCESSFULE



한동안 삽질을 하다가 원인은 파악하지 못한채, _ETHREAD에 있는 _KTRAP_FRAME 값을 가져와 사용하였다.

_KTRAP_FRAME은 인터럽트가 발생했을 때, 현재 레지스터 정보를 저장해 놓는 곳으로 필요한 레지스터 정보를 확인 할 수 있었다.


 



최근에 관련 코드를 수정 할 일이 있어보다가 RtlCaptureContext(Debug Register 정보는 가져오지 않음)라는 함수가 있다는 것과

해당 원인에 대한 내용이 있어 정리해 놓는다.


http://jpassing.com/2008/03/12/walking-the-stack-of-the-current-thread/



Posted by hswang