# CStruct Examples
require 'windows/tool_helper'
require 'win32struct'
include Windows::ToolHelper

module Windows
    MAX_PATH = 260
    module ToolHelper        
        class PROCESSENTRY32 < Win32Struct
            DWORD   :dwSize
            DWORD   :cntUsage
            DWORD   :th32ProcessID 
            DWORD   :th32DefaultHeapID
            DWORD   :th32ModuleID 
            DWORD   :cntThreads
            DWORD   :th32ParentProcessID
            LONG    :pcPriClassBase        
            DWORD   :dwFlags
            CHAR    :szExeFile,[MAX_PATH]  
        end
    end        
end

def show_all_processes
    proc_enrty32 = PROCESSENTRY32.new
    proc_enrty32.dwSize = PROCESSENTRY32.__size__
    snap_handle  = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS,0)
    
    if Process32First(snap_handle,proc_enrty32.data)
        show_process proc_enrty32        
        while true
            break if !Process32Next( snap_handle,proc_enrty32.data ) 
            show_process proc_enrty32
        end                
    end
    
end

def show_process proc_enrty32
    printf"%20s 0x%08X\n",proc_enrty32.szExeFile.to_cstr,proc_enrty32.th32ProcessID
end

printf"%20s %s\n","<Process Name>","<PID>"
printf"%20s %s\n","--------------","-----"
show_all_processes