2011-09-18 6 views
0

DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS 플래그.
"GetModuleFileNameExA"와 같은 메서드를 사용하려고 할 때 어떤 이유로 "ERROR_INVALID_HANDLE"오류가 발생합니다.
나는 내 프로세스 핸들이 올 것을 알고 있지만 나는 방법과 같이 호출 할 경우에도 발생합니다 예정이다모듈 정보가 DEBUG_PROCESS와 작동하지 않습니다.

GetModuleFileNameExA(processHandle, NULL ,moduleFileName, sizeof(moduleFileName)); 

프로세스의 주요 모듈의 이름을 지정.
MSDN에서 플래그 : PROCESS_VM_READ 및 PROCESS_QUERY_INFORMATION은 프로세스 생성시 필요하지만 DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS와 (과) 도움이되지 않았습니다.
실행중인 프로세스에 프로그램을 연결하면 정상적으로 작동합니다.
무엇이 잘못 되었나요?

+0

반환 값은 무엇이고 GetLastError() 값은 무엇입니까? –

+0

반환 오류 = 0, GetLastError = 6 – Idov

+0

잘못된 핸들입니다. processHandle은 쓰레기입니다. –

답변

1

성공한 경우 CreateProcess에서 반환 한 핸들은 PROCESS_ALL_ACCESS이므로 문제는 아닙니다. 문제는 CreateProcess Windows가 아직 초기화를 수행하지 않아 모듈 목록을 설정하지 않은 직후에 발생하는 문제입니다. 어떤 인터페이스 (Toolhelp, psapi, kernel32)에 상관없이 디버거의 모듈 (심지어 메인 모듈)을 쿼리하려고하면 그 시점에서 실패합니다.

가장 좋은 방법은 CREATE_PROCESS_DEBUG_EVENT을 기다린 다음 쿼리하는 것입니다. 로드 된 DLL의 이름이 필요하면 DLL이로드되고 LOAD_DLL_DEBUG_EVENT이 수신 될 때까지 기다려야합니다. XP에서 마지막으로 확인한 시간은 여기에서 쿼리 할 수 ​​없으므로 다음 번에 디버그 이벤트가 발생할 때까지 기다려야합니다.

네이티브 NT API를 사용하는 것이 도움이 될 수도 있고, Vista 이상에서 수정되었을 수도 있습니다.

호기심 때문에 CreateProcess를 호출 할 때 분명하게 모듈 파일 이름이 필요한 이유는 무엇입니까?

+0

흠 ... 나는 windows7을 사용하고 있으며, 다음 번 디버그 이벤트에서는 그렇지 않지만 나중에 발생한다. 재미있는. 감사 :) – Idov

관련 문제