출 : http://lunapiece.net/Article/879327
#include <windows.h>
#include <cstdio>
#include <cstdlib>
bool
isThreadWaiting(
HANDLE
ThreadHandle)
{
bool
Result =
false
;
SuspendThread(ThreadHandle);
CONTEXT ThreadContext;
ThreadContext.ContextFlags = CONTEXT_CONTROL;
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"
);
}
'MS > C++' 카테고리의 다른 글
curl - setopt 종류 (0) | 2013.03.18 |
---|---|
CTreeCtrl (0) | 2013.03.11 |
보호된 프로세스로 설정하기 (0) | 2013.02.14 |
멀티바이트 --> 유니코드 (매크로) (0) | 2012.11.20 |
boost library 설치 방법 (0) | 2012.08.10 |
OpenMP (0) | 2012.07.23 |
ms에서 dirent.h파일 사용 하기 (0) | 2012.06.08 |
SetThreadAffinityMask : 멀티 쓰레드 프로그래밍 기본 (0) | 2012.05.23 |
ActiveX 제작시 Visat/Win7에서 주의해야 할 사항 (0) | 2011.11.18 |
gsoap (0) | 2011.11.08 |