Lyn
조회 수 27415 추천 수 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계열 함수가 몇종류 더 있는데 그것도 그냥 각자 처리해 주면 간단...


?

  1. [작성중] 윈도우 32bit, 64bit 프로그래밍시 주의할점

    Date2012.07.16 ByLyn Views27804
    Read More
  2. 특정 Thread가 Wait계열 함수에 의해 Block 중인지 확인하기

    Date2012.06.28 ByLyn Views27415
    Read More
  3. [작성중] C++ 에서 Fiber 를 이용한 Coroutine 사용하기

    Date2012.04.03 ByLyn Views24936
    Read More
  4. [작성중] v8 스크립트 연동

    Date2012.03.10 ByLyn Views25286
    Read More
  5. [작성중] 알려진 포트

    Date2012.02.20 ByLyn Views24763
    Read More
  6. C++11 lambda 간단사용법과 성능비교.

    Date2012.01.30 ByLyn Views32679
    Read More
  7. Boost 빌드 방법

    Date2012.01.14 ByLyn Views31806
    Read More
  8. DLLMain에서 하지 말아야 할것.

    Date2012.01.12 ByLyn Views25209
    Read More
  9. 새해다 ...

    Date2012.01.01 ByLyn Views28242
    Read More
  10. Trac, Mantis, Redmine + SVN 소스 한글 깨짐

    Date2011.12.20 ByLyn Views29915
    Read More
  11. MultiMedia Timer 의 Timer 해상도의 비밀

    Date2011.12.14 ByLyn Views28301
    Read More
  12. Intel Cilk plus And SampleCode - Parallel Programming

    Date2011.11.23 ByLyn Views28024
    Read More
  13. Visaul Studio Exception 발생시 해결방법

    Date2011.11.10 ByLyn Views28395
    Read More
  14. [Boost 살펴보기] 9. noncopyable

    Date2011.09.15 ByLyn Views27589
    Read More
  15. Mysql 툴

    Date2011.03.31 ByLyn Views37587
    Read More
  16. [개인자료] 프로그램 만들때 무조건 해야하는것..

    Date2011.01.26 ByLyn Views37272
    Read More
  17. 사용중인 FireFox 플러그인.

    Date2010.05.18 ByLyn Views42522
    Read More
  18. Google C++ Coding Style - 번역중

    Date2010.03.28 ByLyn Views39435
    Read More
  19. Boost 에서 자기 자신의 shared_ptr 리턴하기

    Date2010.03.02 ByLyn Views37993
    Read More
  20. [잡설] 앱스토어의 유행. 프로그래머에겐 과연?

    Date2010.02.19 ByLyn Views34472
    Read More
Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8