C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[229] 특정 Thread가 Wait계열 함수로 대기 중인지 확인하기
Lyn [tohnokanna] 25712 읽음    2012-06-27 21:25
원본 http://lunapiece.net/879327
#include < windows.h >
#include < cstdio >
#include < cstdlib >

bool isThreadWaiting(HANDLE ThreadHandle)
{
	bool Result = false;

	SuspendThread(ThreadHandle);
	CONTEXT ThreadContext;
	ThreadContext.ContextFlags = CONTEXT_CONTROL;
	BOOL a = GetThreadContext(ThreadHandle, &ThreadContext);
	INT_PTR* StackPointer = reinterpret_cast< INT_PTR* > ( ThreadContext.Esp);

	HMODULE DLLHandle = LoadLibraryA("Ntdll.dll");
	INT_PTR WaitFunctionPtr = reinterpret_cast< INT_PTR >( GetProcAddress(DLLHandle, "NtWaitForSingleObject")); 
	//WaitForSingleObject의 종착점이 되는 함수가 NtWaitForSingleObject
	
	if ( (*StackPointer >= WaitFunctionPtr)  &&  (*StackPointer <= WaitFunctionPtr + 50) )
	{
		//대충 +50을 해 주는 이유는 실제 복귀주소로 저장된 곳이 NtWaitForSingleObject의 시작주소가 아니라 조금 실행된 뒤이기 때문
		Result = true;		
	}

	FreeLibrary(DLLHandle);
	ResumeThread(ThreadHandle);

	return Result;
}

DWORD PASCAL ThreadFun1(PVOID Param)
{
	WaitForSingleObject(HANDLE(Param), INFINITE);

	return 0;
}

DWORD PASCAL ThreadFun2(PVOID Param)
{
	while(true)
	{
		Sleep(100000);
	}

	return 0;
}
void main()
{	
	HANDLE Event = CreateEvent(nullptr, TRUE, FALSE, nullptr);

	HANDLE Thread1 = CreateThread(nullptr, 0, &ThreadFun1, reinterpret_cast< LPDWORD >(Event), 0, nullptr);
	HANDLE Thread2 = CreateThread(nullptr, 0, &ThreadFun2, nullptr, 0, nullptr);

	Sleep(1000); //Thread 돌 시간좀 주고 ...

	printf("Is Thread1 Waiting? %s\n", isThreadWaiting(Thread1) ? "Yes" : "No");
	printf("Is Thread2 Waiting? %s\n", isThreadWaiting(Thread2) ? "Yes" : "No");

	system("pause");
}



Wait계열 함수가 몇종류 더 있는데 그것도 그냥 각자 처리해 주면 간단...
장성호 [nasilso]   2012-06-28 08:51 X
역공학 엔지니어해도 될듯..
Lyn [tohnokanna]   2012-06-28 10:05 X
리버스 엔지니어 할려면 한 10년은 더 공부해야할듯 ...

+ -

관련 글 리스트
229 특정 Thread가 Wait계열 함수로 대기 중인지 확인하기 Lyn 25712 2012/06/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.