2011-09-15 7 views
1

Windows7 64 비트에서 다른 프로세스의 EBP 레지스터 값을 가져 오려고합니다.() 반환GetThreadContext는 EBP = 0을 반환합니다.

static CONTEXT threadContext; 
memset(&threadContext, 0, sizeof(CONTEXT)); 
threadContext.ContextFlags = CONTEXT_FULL; 
bool contextOk = GetThreadContext(threadHandle, &threadContext); 

EIP 값이 좋아 보이지만, EBP는 = 0 또한 사용하여 시도 WOW64_GetThreadContext하지만 ... GetLastError 도움이되지 않았다 이것에 대한
나는이 같은 GetThreadContext을 사용하고 있습니다 0 그래서 괜찮을 거에요. 이 스레드를 SuspendThread로 일시 중단하고 스레드를 샘플링 할 때마다 발생하지 않습니다.

어떻게 될 수 있습니까?

+0

"실행중인 스레드에 유효한 컨텍스트를 가져올 수 없습니다. 'GetThreadContext'를 호출하기 전에 스레드를 일시 중단하려면'SuspendThread' 함수를 사용하십시오." MSDN –

+0

네, 저도 그렇게했습니다 :) – Idov

+0

프로세스 (또는 적어도 스레드)가 중단 되었기 때문에 실제 디버거를 연결하여 EBP가 무엇인지 * 볼 수 있습니다. –

답변

2

가능한 원인 중 하나는 조사 할 때 레지스터 값이 실제로 0입니다. 범용 레지스터이므로 프로그램은 원하는 값으로 설정할 수 있습니다.

+0

함수의 시작을 개최하기로되어 있습니까? – Idov

+1

x86에는 EBP 프레임과 FPO 프레임이라는 두 개의 스택 프레임 레이아웃이 있습니다 (본질적으로). EBP 프레임에서 EBP는 이전 EBP를 가리키며 EBP + 4는 반환 주소를 가리키고 EBP + 8은 첫 번째 스택 전달 인수를 가리 킵니다. FPO 프레임에서 EBP는 "프레임 포인터"로 사용되지 않고 대신 범용 레지스터입니다. 그래서, 그것은 실제로 목표 함수에 의존합니다. – snoone

+0

하지만 스레드 컨텍스트를 읽은 프로젝트는 "생략 프레임 포인터"최적화를 사용하지 않습니다. – Idov

관련 문제