Windows 핵심 프로 그래 밍 학습 노트 (13) - 스 레 드 컨 텍스트

Drecik 학습 경험 공유
전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/drecik__/article/details/8095311
 
시스템 은 CONTEXT 대상 을 사용 하여 스 레 드 의 상 태 를 기억 합 니 다. 그러면 스 레 드 는 다음 에 CPU 를 받 아 실행 할 수 있 을 때 지난번 정지 에서 계속 할 수 있 습 니 다. WinNT. h 의 헤더 파일 에서 CONTEXT 의 데이터 구 조 를 보 여 주 었 습 니 다. 그러나 주의해 야 할 것 은 구성원 의 구체 적 인 상황 은 Windows 가 어떤 CPU 를 실행 하 는 지 에 달 려 있 습 니 다.다음은 CONTEXT 의 구 조 를 보 여 줍 니 다.
typedef struct _CONTEXT {

	//
	// The flags values within this flag control the contents of
	// a CONTEXT record.
	//
	// If the context record is used as an input parameter, then
	// for each portion of the context record controlled by a flag
	// whose value is set, it is assumed that that portion of the
	// context record contains valid context. If the context record
	// is being used to modify a threads context, then only that
	// portion of the threads context will be modified.
	//
	// If the context record is used as an IN OUT parameter to capture
	// the context of a thread, then only those portions of the thread's
	// context corresponding to set flags will be returned.
	//
	// The context record is never used as an OUT only parameter.
	//

	DWORD ContextFlags;	//   ,              ;

	//
	// This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
	// set in ContextFlags.  Note that CONTEXT_DEBUG_REGISTERS is NOT
	// included in CONTEXT_FULL.
	//

	//   CPU      ;
	DWORD   Dr0;
	DWORD   Dr1;
	DWORD   Dr2;
	DWORD   Dr3;
	DWORD   Dr6;
	DWORD   Dr7;

	//
	// This section is specified/returned if the
	// ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
	//
	//   CPU      ;
	FLOATING_SAVE_AREA FloatSave;

	//
	// This section is specified/returned if the
	// ContextFlags word contians the flag CONTEXT_SEGMENTS.
	//
	//   CPU     ;
	DWORD   SegGs;
	DWORD   SegFs;
	DWORD   SegEs;
	DWORD   SegDs;

	//
	// This section is specified/returned if the
	// ContextFlags word contians the flag CONTEXT_INTEGER.
	//
	//   CPU      ;
	DWORD   Edi;
	DWORD   Esi;
	DWORD   Ebx;
	DWORD   Edx;
	DWORD   Ecx;
	DWORD   Eax;

	//
	// This section is specified/returned if the
	// ContextFlags word contians the flag CONTEXT_CONTROL.
	//
	//   CPU      ;
	DWORD   Ebp;
	DWORD   Eip;
	DWORD   SegCs;              // MUST BE SANITIZED
	DWORD   EFlags;             // MUST BE SANITIZED
	DWORD   Esp;
	DWORD   SegSs;

	//
	// This section is specified/returned if the ContextFlags word
	// contains the flag CONTEXT_EXTENDED_REGISTERS.
	// The format and contexts are processor specific
	//
	//   CPU      ;
	BYTE    ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];

} CONTEXT;
프로그램 은 호출 함수 GetThreadContext 를 통 해 스 레 드 의 컨 텍스트 를 가 져 올 수 있 지만 스 레 드 가 걸 릴 때 호출 해 야 합 니 다. 그렇지 않 으 면 정 보 를 되 돌려 주 는 것 이 일치 하지 않 습 니 다.
BOOL GetThreadContext(
	HANDLE hThread,		//     ;
	LPCONTEXT lpContext	//      ;
	);
이 함 수 를 호출 하기 전에 먼저 CONTEXT 구 조 를 할당 하고 ContextFlags 구성원 들 에 게 표지 에서 가 져 올 레지스터 의 값 을 사용 합 니 다. 여러 가지 다른 코드 를 사용 할 수 있 습 니 다. 예 를 들 어 다음 코드 를 사용 할 수 있 습 니 다.
//   hThread              ;
CONTEXT Context;
Context.ContextFlags = CONTEXT_CONTROL | CONTEXT_FLOATING_POINT;
GetThreadContext( hThread, &Context );

다시 한 번 강조 할 필요 가 있 습 니 다. 획득 한 각 구성원 이 대표 하 는 레지스터 는 CPU 에 의존 합 니 다.
CONTEXT 의 값 을 가 져 올 수 있 고 CONTEXT 의 값 을 설정 할 수 있 습 니 다. SetThreadContext 를 호출 하면 됩 니 다. 호출 하기 전에 스 레 드 를 걸 어야 합 니 다. 그렇지 않 으 면 결 과 를 예측 할 수 없습니다.
BOOL SetThreadContext(
	HANDLE hThread,				//     ;
	CONST LPCONTEXT lpContext	//      ;
	);
우선 CONTEXT 대상 을 배정 해 야 한다.
또한 ContextFlags 멤버 들 에 게 로 고 를 사용 할 때 설정 해 야 할 레지스터 의 값 을 사용 합 니 다. 예 를 들 어 다음 코드 를 사용 할 수 있 습 니 다.
//   hThread   Eip   ;
CONTEXT Context;
Context.ContextFlags = CONTEXT_CONTROL;
GetThreadContext( hThread, &Context );

Context.Eip = 0x00010000;
Context.ContextFlags = CONTEXT_CONTROL;
SetThreadContext( hThread, &Context );
위의 코드 는 아침 에 원 격 스 레 드 에 접근 하 는 것 이 규정 에 어 긋 날 수 있 습 니 다. 시스템 은 사용자 에 게 이상 한 메시지 상 자 를 표시 한 다음 에 원 격 프로 세 스 를 종료 합 니 다. (주의, 원 격 프로 세 스 입 니 다) 우리 가 계속 정상적으로 실행 하 는 동시에 다른 프로 세 스 를 붕괴 시 킬 수 있 습 니 다.

좋은 웹페이지 즐겨찾기