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 > >