programing

EnumProcesses() 대 CreateTool help32Snapshot()

megabox 2023. 11. 5. 11:08
반응형

EnumProcesses() 대 CreateTool help32Snapshot()

활성 프로세스와 로드된 모듈을 모두 열거하기 위한 두 Win32 API 함수 EnumProcesses()CreateToolhelp32Snapshot() 사이에 차이점이 있는지 궁금합니다.혹은 어떤 것이 다른 것보다 더 나은지, 그리고 그 이유는.

다음은 몇 가지 기능에서 얻은 결과입니다.

  • EnumProcesses: 16msec, 207프로세스
  • CreateTool help32스냅샷: 141msec(16msec), 207개 프로세스
  • WTSE 수프로세스: 16msec, 207프로세스
  • WTS 수프로세스Ex(WTS_CURRENT_SESSION): 16msec, 98프로세스
  • WTSE 수프로세스Ex(WTS_ANY_SESSION): 16msec, 207프로세스

컴퓨터가 UAC가 활성화된 상태에서 Windows 8을 실행하고 있으며, 사용자가 상승하지 않았습니다(예: 시스템 프로세스에 액세스할 수 없음).주 프로세스는 32비트, 기계는 64비트이므로 주변에 많은 64비트 프로세스가 있습니다.시스템의 경우 세션 0, 현재 콘솔 사용자의 경우 세션 1, 다른 패스트 스위치 사용자의 경우 세션 2가 있습니다.총 207개의 프로세스(의사 "시스템" 프로세스를 포함하여 모두 32비트와 64비트) - 207 또한 프로세스 탐색기에 의해 확인됩니다.이 207개의 프로세스 중 23개의 프로세스는 세션 2에 대한 것이고 98개의 프로세스는 세션 1에 대한 것이고 나머지 프로세스는 세션 0에 대한 것입니다.

결과는 10회의 단일 함수 호출 주기에 대한 것입니다.각 런에서 100% 재현성이 있습니다.

CreateToolhelp32Snapshot의 주요 결과는 CreateToolhelp32Snapshot 자체에 대한 호출이며, 두 번째 결과(괄호 안)는 First/Next로 주기됩니다.

저는 사람들이 "모든 프로세스 열거"(PID 획득)와 "프로세스/exe 이름 가져오기"를 혼동한다고 생각합니다.첫 번째 것("enumerate")은 x32/x64 교차 비트에 전혀 문제가 없습니다.그러나 후자("get name")는 문제가 있습니다. 모든 메서드가 x32/x64에서 작동하는 것은 아닙니다.

CreateToolhelp32Snapshot()은 섹션 개체를 생성하고 모든 정보를 복사하기 때문에 약간의 오버헤드가 있을 수 있지만 EnumProcesses()/EnumProcessModules()는 사용자가 제공하는 버퍼에서 직접 작동하는 반면 CreateToolhelp32Snapshot()은 섹션 개체를 생성하고 모든 정보를 복사하기 때문에 약간의 오버헤드가 있을 수 있습니다.그러나 실제 성능에서는 그 차이는 무시할 수 있을 것입니다.

EnumProcesses()를 사용하기 더 간단한 API이기 때문에 약간 선호하지만, CreateToolhelp32Snapshot()은 필요한 경우 더 많은 정보를 반환합니다.EnumProcesses()의 유일한 단점은 충분히 큰 버퍼를 할당하지 않았을 수 있기 때문에 루프에서 해당 버퍼를 호출해야 한다는 것입니다. CreateToolhelp32Snapshot()이 버퍼 관리를 대신 수행합니다.실제로 저는 1024개의 프로세서 ID나 모듈 핸들을 수용할 수 있을 정도로 큰 버퍼를 스택에 할당할 뿐입니다. 지금까지 이 두 가지 제한 중 어느 것도 거의 도달하지 못한 시스템을 발견하지 못했습니다.물론 얼마 전까지만 해도 MAX_PATH에 대해서도 같은 말을 했었지만 지금은 문제에 부딪히고 있습니다...

정확히 기억은 나지 않지만 CreateToolhelp32Snapshot()과는 달리 EnumProcesses()는 두 가지 또는 두 가지 모두의 제한 중 하나인 1을 가지고 있습니다.x64 OS의 32비트 프로세스에서 호출되는 경우 64비트 프로세스를 열거하지 않습니다. 2. Vista 및 Win7의 상승된 프로세스를 열거하지 않습니다.

CreateTool help32Snapshot FTW.EnumProcesses는 적어도 Win XP의 svchost.exe의 모든 인스턴스와 같은 모든 시스템 프로세스를 열거하지는 않습니다.

IMO의 핵심적인 차이점은 권한 요구사항에 있습니다.제가 본 적이 있는 사건은EnumProcesses()실패하겠지만,CreateToolhelp32Snapshot()완벽하게 잘 달렸습니다.

그래서 한 번은 시스템에서 특정 프로세스를 감지하고 적절하게 반응할 수 있는 코드를 작성해야 했습니다.사용해서 썼어요.EnumProcesses()제 기계에서는 잘 작동했지만 테스터들의 기계에서는 잘 작동하지 않았습니다.지금 막 다시 썼어요.CreateToolhelp32Snapshot()문제가 있다는 얘기는 이제 들어본 적이 없어요

언급URL : https://stackoverflow.com/questions/4021307/enumprocesses-vs-createtoolhelp32snapshot

반응형