Merry Christmas
출처:http://support.microsoft.com/kb/175030/ko

프로세스 목록을 만드는 첫 번째 단계는 EnumProcesses()를 호출하는 것입니다. 다음과 같이 선언합니다.
BOOL EnumProcesses( DWORD *lpidProcess, DWORD cb, DWORD *cbNeeded );
				
EnumProcesses()는 DWORD 배열에 대한 포인터(lpidProcess), 배열의 크기(cb) 및 반환된 데이터의 길이를 받는 DWORD에 대한 포인터(cbNeeded)를 매개 변수로 사용합니다. DWORD 배열은 현재 실행 중인 프로세스에 대한 프로세스 ID의 배열로 채워집니다. cbNeeded 매개 변수는 사용되는 배열의 크기를 반환합니다. nReturned = cbNeeded / sizeof(DWORD)는 얼마나 많은 프로세스 ID가 반환되었는지 계산합니다.

참고: 이 문서에서는 반환된 DWORD "cbNeeded"라고 지정하지만 실제로 어느 정도 크기의 배열이 전달되어야 하는지 확인할 방법은 없습니다. EnumProcesses()cb 매개 변수에 전달된 배열 값보다 큰 cbNeeded 값을 반환하지 않습니다. 따라서 EnumProcesses() 함수를 성공적으로 사용하는 유일한 방법은 DWORD 배열을 할당하고, 반환 시 cbNeededcb와 같으면 더 큰 배열을 할당하여 cbNeededcb보다 작아질 때까지 다시 시도하는 것입니다.

이제 시스템의 각 프로세스 ID가 포함된 배열이 만들어집니다. 프로세스 이름을 아는 것이 목적이라면 먼저 핸들을 얻어야 합니다. 프로세스 ID에서 핸들을 얻으려면 OpenProcess()를 사용하십시오.

핸들을 얻은 후에는 프로세스의 첫 번째 모듈을 얻어야 합니다. 프로세스의 첫 번째 모듈을 얻으려면 다음 매개 변수를 사용하여 EnumProcessModules() API를 호출하십시오.
EnumProcessModules( hProcess, &hModule, sizeof(hModule), &cbReturned );
				
이 함수는 hModule 변수에 프로세스의 첫 번째 모듈에 대한 핸들을 저장합니다. 실제로 프로세스에는 이름이 없지만 프로세스의 첫 번째 모듈이 프로세스의 실행 파일이 됩니다. 이제 반환된 모듈 핸들(hModule)을 GetModuleFileNameEx() 또는 GetModuleBaseName() API에서 사용하여 전체 파일 경로 이름이나 프로세스 실행 파일의 간단한 모듈 이름을 얻을 수 있습니다. 두 함수 모두 프로세스에 대한 핸들, 모듈에 대한 핸들, 이름을 반환하는 버퍼 포인터와 버퍼 크기를 매개 변수로 사용합니다.

EnumProcesses() API를 통해 반환된 각 프로세스 ID에 대해 이 단계를 반복하면 Windows NT의 프로세스 목록이 만들어집니다.
: