Hi Park,

I cannot thank you enough for all the efforts ...

Wish you the very best !

-- Shanko

"Park Heesob" <phasis / kornet.net> wrote in message
news:ak7i7j$fsq$1 / news1.kornet.net...
>
> Hi,
>
> "Shashank Date" <ADATE / kc.rr.com> wrote in message
> news:q1599.19624$Hf.636502 / twister.kc.rr.com...
> > Hi Park,
> >
> > > If you use command "ping 10.0.0.0 -n 90 -w 1000 > NUL",
> > > it creates two processes  'cmd.exe' and 'ping.exe'.
> > > I can get pid of 'cmd.exe', but not pid of 'ping.exe'.
> >
> > If you download pstools from:
> >
> > http://www.sysinternals.com/ntw2k/freeware/pstools.shtml
> >
> > and run "pslist -t" it shows you the process tree.
> > (There is also a Win2K ResourceKit utility "ptree" which I believe does
> the
> > same thing).
> >
> > Which tells me that there is Windows API which exposes the parent-child
> > relationship of processes.
> > May be that is what is needed to finish it off.
> >
> > > If you can find pid of 'ping.exe', there's no problem.
> > > It's your chance to finish this program perfectly.
> >
> > Assuming I get hold of the pid for "ping", I guess, I will have to
replace
> > the following line of your modification:
> >
> > hProcess = OpenProcess.Call(0x100001, 1 , f.pid)
> >
^^^^
> > with:
> >
> > hProcess = OpenProcess.Call(0x100001, 1 , ping_pid)
> >
> > Right ?
> >
> > I will try ... but I am not as comfortable with Windows API as you are
> ...so
> > I might call for help again ;-)
> >
> Thanks for your information.
> Here is my final version.
>
>
#===========================================================================
> =====
> require 'Win32API'
>
> OpenProcess = Win32API.new("kernel32","OpenProcess",['L','L','L'],'L')
> TerminateProcess =
Win32API.new("kernel32","TerminateProcess",['L','L'],'L')
> WaitForSingleObject =
> Win32API.new("kernel32","WaitForSingleObject",['L','L'],'L')
> RegCloseKey = Win32API.new("advapi32","RegCloseKey",['L'],'L')
> RegOpenKeyEx =
> Win32API.new("advapi32","RegOpenKeyEx",['L','P','L','L','P'],'L')
> RegQueryValueEx =
> Win32API.new("advapi32","RegQueryValueEx",['L','P','L','P','P','P'],'L')
>
> INITIAL_SIZE        = 51200
> EXTEND_SIZE         = 25600
> REGKEY_PERF         = "software\\microsoft\\windows
> nt\\currentversion\\perflib\\009"
> REGSUBKEY_COUNTERS  = "Counters"
> KEY_READ     =  0x20019;
> ERROR_MORE_DATA     = 234
> HKEY_LOCAL_MACHINE  = 0x80000002
> HKEY_PERFORMANCE_DATA = 0x80000004
>
> # return hash key : parent pids, value : array of  child pids
> def getpids()
>
>  result = Hash.new
>
>  hKeyNames = "\0"*4
>  rc = RegOpenKeyEx.Call(
> HKEY_LOCAL_MACHINE,REGKEY_PERF,0,KEY_READ,hKeyNames)
>  hKeyNames = hKeyNames.unpack('L')[0]
>  dwSize = "\0"*4
>  rc = RegQueryValueEx.Call( hKeyNames,REGSUBKEY_COUNTERS,0,0,0,dwSize)
>  dwSize2 = dwSize.unpack('L')[0]
>  buf = "\0" * dwSize2
>  rc = RegQueryValueEx.Call( hKeyNames,REGSUBKEY_COUNTERS,0,0,buf,dwSize)
>
>  buf2 = Hash[*buf.split("\0")]
>
>  proidx =  buf2.index("Process").to_i
>  pididx = buf2.index("ID Process").to_i
>  ppididx = buf2.index("Creating Process ID").to_i
>
>  buf = "\0" * INITIAL_SIZE
>  szSubKey = proidx.to_s
>  dwSize = [INITIAL_SIZE]
>
>  while true
>   dwSize2 = dwSize.pack('L')
>   rc = RegQueryValueEx.Call(
HKEY_PERFORMANCE_DATA,szSubKey,0,0,buf,dwSize2)
>
>   break if rc==0
>
>   if rc == ERROR_MORE_DATA
>    dwSize[0] += EXTEND_SIZE;
>    buf = "\0" * dwSize[0]
>   else
>    exit
>   end
>  end
>
>  pObj = buf[buf[24,4].unpack('L')[0] .. -1]
>
>  pCounterDef = pObj[pObj[8,4].unpack('L')[0] .. -1]
>  numCounters = pObj[32,4].unpack('L')[0]
>
>  for i in 0 .. numCounters
>   counterNameTitleIndex = pCounterDef[4,4].unpack('L')[0]
>   if counterNameTitleIndex == pididx
>    pidcounter = pCounterDef[36,4].unpack('L')[0]
>   end
>   if counterNameTitleIndex == ppididx
>    ppidcounter = pCounterDef[36,4].unpack('L')[0]
>   end
>   pCounterDef = pCounterDef[40..-1]
>  end
>
>  dwNumTasks = pObj[40,4].unpack('L')[0]
>
>  pInst = pObj[pObj[4,4].unpack('L')[0] .. -1]
>
>  for i in 0 .. dwNumTasks
>   pCounter = pInst[pInst[0,4].unpack('L')[0] .. -1]
>   pid = pCounter[pidcounter,4].unpack('L')[0]
>   ppid = pCounter[ppidcounter,4].unpack('L')[0]
>
>   if ppid>0
>     if result[ppid] == nil
>    result[ppid] = [pid]
>     else
>      result[ppid].push(pid)
>     end
>   end
>
>   pInst = pCounter[pCounter[0,4].unpack('L')[0] .. -1]
>  end
>
>  RegCloseKey.Call( hKeyNames )
>  RegCloseKey.Call( HKEY_PERFORMANCE_DATA )
>  result
>
> end
>
>
>  puts 'Start: ' + `echo %TIME%`
>  cmds = [
>          "ping 10.0.0.0 -n 30 -w 1000 >NUL",
>          "ping 10.0.0.0 -n 60 -w 1000 >NUL",
>          "ping 10.0.0.0 -n 90 -w 1000 >NUL"
>         ]
>
>  out = []
>  threads = []
>
>  for c in cmds
>      threads << Thread.new(c) { |myCmd|
>          puts "#{myCmd}"
>          f = IO.popen(myCmd)
>     hProcess = OpenProcess.Call(0x00100001, 0 ,f.pid)
>     Thread.current['pid'] = f.pid
>     Thread.current['hProcess'] = hProcess
>     while true
>       a = WaitForSingleObject.Call( hProcess, 0 );
>            break if a==0
>          end
>      }
>  end
>
>  puts threads.length.to_s + ' threads running'
>
>  begin
>      i = 0
>      threads.each { |t| i += 1 if t.stop? }
>      puts `echo %TIME%`
>      b = File.exists?("C:junkj0.txt")
>      puts i.to_s + ':' + File.mtime("C:junkj0.txt").to_s if $DEBUG and b
>      $stdout.flush
>  end until (i == threads.length) || (not b)
>
>  pids = getpids
>
>  puts 'Mid: ' + `echo %TIME%`
>  threads.each { |t|
>     if t.alive?
>       pids[t['pid']].each {|pid|
> TerminateProcess.Call(OpenProcess.Call(0x00100001, 0 ,pid),0) }
>       TerminateProcess.Call(t['hProcess'],0)
>     end
>
>  }
>
>  puts 'Stop: ' + `echo %TIME%`
>  puts out if $DEBUG
> #=================================================================
>
>
> Park Heesob
>
>