2013-08-28 2 views
1

스레드 ID의 파일 경로를 가져 오려고합니다. 나는 이것이이스레드 ID의 GetModuleFileNameEx?

NtOpenThread(@hProc, THREAD_ALL_ACCESS, @ObjAttr, @ClientID) ; 
     pBuf := AllocMem(MAX_PATH); 
     GetModuleFileNameEx(hProc, 0, pBuf, MAX_PATH); 

가 수행하는 방법을 어떤 생각을하지 않는 work..but 것으로 기대했다?

+0

네이티브 API를 사용해야하는 이유는 무엇입니까? Win32가 왜 당신에게 적합하지 않습니까? 그리고 스레드에는 파일 이름이 없습니다. –

답변

6

GetModuleFileNameEx에는 코드가 작동하지 않는 이유를 설명하는 스레드 핸들이 아닌 프로세스 핸들이 필요합니다. 프로세스 핸들을 얻는 두 가지 주요 방법이 있습니다. 첫 번째는 CreateProcess에서 가져온 것이지만, 프로세스를 시작하지 않는 한 좋지 않습니다. 그렇게하는 경우, 처음에는 GetModuleFileNameEx가 필요하지 않습니다.

프로세스 핸들을 얻는 두 번째 방법은 OpenProcess에서 가져온 것입니다. 프로세스 ID가 필요합니다. 스레드 핸들을 사용하는 GetProcessIdOfThread를 사용하여 스레드의 프로세스 ID를 가져올 수 있습니다. NtOpenThread를 쓰레드 ID에서 쓰레드 핸들을 얻는 방법은 이미 알고 있습니다. 보통은 OpenThread라고합니다.

Windows 버전이 GetProcessIdOfThread를 지원하지 않으면 Thread32First 및 Thread32Next를 사용하여 다른 경로로 이동할 수 있습니다. CreateToolhelp32Snapshot을 호출 한 다음 스레드 목록을 살펴보십시오. th32ThreadID가 관심있는 스레드 ID와 같은 항목을 찾습니다. 찾으면 th32OwnerProcessID는 해당 프로세스 ID를 보유합니다. OpenProcess를 호출하고 위와 같이 진행합니다.

스레드 또는 프로세스를 열 때 ALL_ACCESS 권한을 요청할 필요가 없으며이를 시도하면 프로그램이 실패 할 수 있습니다. 작업을 수행하는 데 필요한 최소 권한 만 요청하십시오. 모든 액세스를 요청하는 것은 필요한 것을 모르는 경우 게으른 방법이지만 프로그램에 이미 관리자 권한이있는 경우에만 작동합니다. 대신, 실제로 필요한 사용 권한을 파악하는 데 시간을 투자하십시오.