Lyn
조회 수 27199 추천 수 0 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
#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");
}


sc1.png


Wait계열 함수가 몇종류 더 있는데 그것도 그냥 각자 처리해 주면 간단...


?

List of Articles
번호 제목 글쓴이 날짜 조회 수
» 특정 Thread가 Wait계열 함수에 의해 Block 중인지 확인하기 file Lyn 2012.06.28 27199
36 [작성중] C++ 에서 Fiber 를 이용한 Coroutine 사용하기 file Lyn 2012.04.03 24609
35 [작성중] v8 스크립트 연동 file Lyn 2012.03.10 25125
34 [작성중] 알려진 포트 Lyn 2012.02.20 24621
33 C++11 lambda 간단사용법과 성능비교. 4 file Lyn 2012.01.30 32244
32 Boost 빌드 방법 1 Lyn 2012.01.14 31513
31 DLLMain에서 하지 말아야 할것. Lyn 2012.01.12 25014
30 새해다 ... Lyn 2012.01.01 28074
29 Trac, Mantis, Redmine + SVN 소스 한글 깨짐 Lyn 2011.12.20 29726
28 MultiMedia Timer 의 Timer 해상도의 비밀 file Lyn 2011.12.14 28099
27 Intel Cilk plus And SampleCode - Parallel Programming file Lyn 2011.11.23 27878
26 Visaul Studio Exception 발생시 해결방법 1 file Lyn 2011.11.10 28221
25 [Boost 살펴보기] 9. noncopyable Lyn 2011.09.15 27425
24 Mysql 툴 Lyn 2011.03.31 37437
23 [개인자료] 프로그램 만들때 무조건 해야하는것.. Lyn 2011.01.26 37117
22 사용중인 FireFox 플러그인. Lyn 2010.05.18 42335
21 Google C++ Coding Style - 번역중 Lyn 2010.03.28 39269
20 Boost 에서 자기 자신의 shared_ptr 리턴하기 file Lyn 2010.03.02 37742
19 [잡설] 앱스토어의 유행. 프로그래머에겐 과연? Lyn 2010.02.19 34305
18 [잡설]델파이 / C++ Builder 하는 사람들의 문제점. Lyn 2010.02.07 39620
Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8