커널에서 스레드의 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/
'Kernel mode' 카테고리의 다른 글
Device Class GUIDs for Most Common Types of Hardware (0) | 2017.08.02 |
---|---|
Windows 10 RS2 - 1394 커널 디버깅 지원 제거 (0) | 2016.09.22 |
[펌] Windbg 메모리 추척 (0) | 2015.11.20 |
핸들 테이블 - Top, MIddle, Sub Count (1) | 2014.12.10 |
PspLoadImageNotifyRoutine Maximum (0) | 2014.10.08 |