2012-11-16 3 views
0

자식 프로세스의 PID를 가져 오는 방법이 있습니까? 내 말은, CreateProcess를 사용하여 cmd 프롬프트를 열면 반환 된 ProcessInformation 구조에서 가져올 수 있기 때문에 PID를 알 수 있습니다. 그러나이 명령 프롬프트에서 열었던 프로세스의 PID도 얻을 수 있습니까?하위 프로세스의 PID를 가져 오는 방법은 무엇입니까?

감사합니다.

+0

그래서 실제로는 PID를 아이로부터, 그러나 ** grand ** - 아이들로부터는 원하지 않습니다. – alk

+0

@alk : 네, exactaly 그것이 내가 원하는 것입니다. – kampi

답변

1

당신은 다음 Process32First 메소드를 호출합니다 TH32CS_SNAPPROCESS 값을 통과하는 CreateToolhelp32Snapshot 기능을 사용할 수 있습니다, 그리고 마지막으로 당신은 반환 된 컬렉션을 반복해야 cmd.exe를의 PID에 대해 th32ParentProcessID 필드의 값을 비교합니다. 또 다른 옵션은 ParentProcessId 속성을 사용하여 Win32_Process WMI 클래스를 사용하여 결과를 필터링하는 것입니다.

+0

이 appraoch 확실히 통계 목적으로 작동합니다. 어떤 종류의 IPC에 대해 반환 된 PID를 사용하는 것은 안전하지 않습니다. PID가오고 갈아서 아마도 재사용되었을 것입니다. – alk

0

CreateJobObject을 사용하여 작업을 만들고 SetInformationJobObject을 사용하여 I/O 완료 포트와 작업을 연결하십시오. 자세한 내용은 JOBOBJECT_ASSOCIATE_COMPLETION_PORT을 참조하십시오. CREATE_SUSPENDED으로 프로세스를 생성하고 AssignProcessToJobObject을 사용하여 새 프로세스를 작업의 일부로 만드십시오.

프로세스 ID가 표시 될 때까지 새로운 손자 프로세스가 이미 종료되어 해당 프로세스를 다시 사용할 수 있음을 기억하십시오. OpenProcess을 사용하여 손자 프로세스에 대한 핸들을 가져 오는 경우 오류를 올바르게 처리하고 핸들을 성공적으로 열면 IsProcessInJob으로 호출하여 핸들이 실제로 손자 프로세스 중 하나를 가리키고 있는지 확인하십시오.

프로세스는 Windows 8/2012 이전에 중첩 될 수 없으므로 하위 프로세스를 만들 때 CREATE_BREAKAWAY_FROM_JOB 플래그를 사용해야 할 수도 있습니다.

+0

또 다른 방법은 PsSetCreateProcessNotifyRoutine을 사용하여 커널 모드 코드를 작성하여 실시간으로 모든 프로세스 생성을 모니터링하는 것입니다. 이는 드라이버 서명 요구 사항으로 인해 Vista 이상에서 더 많은 문제가 발생하지만 XP에서는 유용한 대안이 될 수 있습니다. –

관련 문제