Windows 핵심 프로 그래 밍 학습 노트 (13) - 스 레 드 컨 텍스트
전재 출처 를 밝 혀 주 십시오: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 );
위의 코드 는 아침 에 원 격 스 레 드 에 접근 하 는 것 이 규정 에 어 긋 날 수 있 습 니 다. 시스템 은 사용자 에 게 이상 한 메시지 상 자 를 표시 한 다음 에 원 격 프로 세 스 를 종료 합 니 다. (주의, 원 격 프로 세 스 입 니 다) 우리 가 계속 정상적으로 실행 하 는 동시에 다른 프로 세 스 를 붕괴 시 킬 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Exception in thread main java.lang. NoClassDefFoundError 오류 해결 방법즉,/home/hadoop/jarfile) 시스템은 Hello World 패키지 아래의class라는 클래스 파일을 실행하고 있다고 오인하여 시스템의 CLASSPATH 아래 (일반적으로 현재 디렉터리를 포함) Hell...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.