win32-process 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -0
- data/lib/win32/process/constants.rb +1 -3
- data/lib/win32/process/functions.rb +38 -38
- data/lib/win32/process/helper.rb +2 -2
- data/lib/win32/process/structs.rb +9 -16
- data/lib/win32/process/version.rb +6 -0
- data/lib/win32/process.rb +115 -114
- data/lib/win32-process.rb +1 -1
- data/test/test_win32_process.rb +82 -82
- data/test/test_win32_process_kill.rb +36 -31
- data/win32-process.gemspec +5 -5
- metadata +8 -8
- data/README.md +0 -74
data/lib/win32/process.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require_relative
|
2
|
-
require_relative
|
3
|
-
require_relative
|
4
|
-
require_relative
|
1
|
+
require_relative "process/functions"
|
2
|
+
require_relative "process/constants"
|
3
|
+
require_relative "process/structs"
|
4
|
+
require_relative "process/helper"
|
5
5
|
|
6
6
|
module Process
|
7
7
|
include Process::Constants
|
@@ -10,7 +10,7 @@ module Process
|
|
10
10
|
extend Process::Constants
|
11
11
|
|
12
12
|
# The version of the win32-process library.
|
13
|
-
WIN32_PROCESS_VERSION =
|
13
|
+
WIN32_PROCESS_VERSION = "1.0.0"
|
14
14
|
|
15
15
|
# Disable popups. This mostly affects the Process.kill method.
|
16
16
|
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX)
|
@@ -95,9 +95,10 @@ module Process
|
|
95
95
|
# 32768 => Process::ABOVE_NORMAL_PRIORITY_CLASS
|
96
96
|
#
|
97
97
|
def getpriority(kind, int)
|
98
|
-
raise TypeError, kind unless kind.is_a?(
|
99
|
-
raise TypeError, int unless int.is_a?(
|
100
|
-
|
98
|
+
raise TypeError, kind unless kind.is_a?(Integer) # Match spec
|
99
|
+
raise TypeError, int unless int.is_a?(Integer) # Match spec
|
100
|
+
|
101
|
+
int = Process.pid if int == 0 # Match spec
|
101
102
|
|
102
103
|
handle = OpenProcess(PROCESS_QUERY_INFORMATION, 0, int)
|
103
104
|
|
@@ -139,6 +140,7 @@ module Process
|
|
139
140
|
raise TypeError unless kind.is_a?(Integer) # Match spec
|
140
141
|
raise TypeError unless int.is_a?(Integer) # Match spec
|
141
142
|
raise TypeError unless int_priority.is_a?(Integer) # Match spec
|
143
|
+
|
142
144
|
int = Process.pid if int == 0 # Match spec
|
143
145
|
|
144
146
|
handle = OpenProcess(PROCESS_SET_INFORMATION, 0 , int)
|
@@ -155,7 +157,7 @@ module Process
|
|
155
157
|
CloseHandle(handle)
|
156
158
|
end
|
157
159
|
|
158
|
-
|
160
|
+
0 # Match the spec
|
159
161
|
end
|
160
162
|
|
161
163
|
remove_method :uid
|
@@ -193,7 +195,7 @@ module Process
|
|
193
195
|
raise SystemCallError, FFI.errno, "GetTokenInformation"
|
194
196
|
end
|
195
197
|
|
196
|
-
string_sid = tuser[FFI.type_size(:pointer)*2, (rlength.read_ulong - FFI.type_size(:pointer)*2)]
|
198
|
+
string_sid = tuser[FFI.type_size(:pointer) * 2, (rlength.read_ulong - FFI.type_size(:pointer) * 2)]
|
197
199
|
|
198
200
|
if sid
|
199
201
|
string_sid
|
@@ -204,7 +206,7 @@ module Process
|
|
204
206
|
raise SystemCallError, FFI.errno, "ConvertSidToStringSid"
|
205
207
|
end
|
206
208
|
|
207
|
-
psid.read_pointer.read_string.split(
|
209
|
+
psid.read_pointer.read_string.split("-").last.to_i
|
208
210
|
end
|
209
211
|
end
|
210
212
|
|
@@ -244,7 +246,7 @@ module Process
|
|
244
246
|
#
|
245
247
|
def getrlimit(resource)
|
246
248
|
if resource == RLIMIT_FSIZE
|
247
|
-
if volume_type ==
|
249
|
+
if volume_type == "NTFS"
|
248
250
|
return ((1024**4) * 4) - (1024 * 64) # ~ 4TB
|
249
251
|
else
|
250
252
|
return (1024**3) * 4 # 4 GB
|
@@ -259,7 +261,7 @@ module Process
|
|
259
261
|
handle = OpenJobObjectA(JOB_OBJECT_QUERY, 1, @win32_process_job_name)
|
260
262
|
raise SystemCallError, FFI.errno, "OpenJobObject" if handle == 0
|
261
263
|
else
|
262
|
-
@win32_process_job_name =
|
264
|
+
@win32_process_job_name = "ruby_" + Process.pid.to_s
|
263
265
|
handle = CreateJobObjectA(nil, @win32_process_job_name)
|
264
266
|
raise SystemCallError, FFI.errno, "CreateJobObject" if handle == 0
|
265
267
|
end
|
@@ -304,7 +306,7 @@ module Process
|
|
304
306
|
end
|
305
307
|
|
306
308
|
ensure
|
307
|
-
at_exit{ CloseHandle(handle) if handle }
|
309
|
+
at_exit { CloseHandle(handle) if handle }
|
308
310
|
end
|
309
311
|
|
310
312
|
[val, val]
|
@@ -350,7 +352,7 @@ module Process
|
|
350
352
|
handle = OpenJobObjectA(JOB_OBJECT_SET_ATTRIBUTES, 1, @win32_process_job_name)
|
351
353
|
raise SystemCallError, FFI.errno, "OpenJobObject" if handle == 0
|
352
354
|
else
|
353
|
-
@win32_process_job_name =
|
355
|
+
@win32_process_job_name = "ruby_" + Process.pid.to_s
|
354
356
|
handle = CreateJobObjectA(nil, @win32_process_job_name)
|
355
357
|
raise SystemCallError, FFI.errno, "CreateJobObject" if handle == 0
|
356
358
|
end
|
@@ -384,7 +386,7 @@ module Process
|
|
384
386
|
raise SystemCallError, FFI.errno, "SetInformationJobObject"
|
385
387
|
end
|
386
388
|
ensure
|
387
|
-
at_exit{ CloseHandle(handle) if handle }
|
389
|
+
at_exit { CloseHandle(handle) if handle }
|
388
390
|
end
|
389
391
|
end
|
390
392
|
|
@@ -468,79 +470,81 @@ module Process
|
|
468
470
|
# Process.spawn method instead of Process.create where possible.
|
469
471
|
#
|
470
472
|
def create(args)
|
471
|
-
unless args.
|
472
|
-
raise TypeError,
|
473
|
+
unless args.is_a?(Hash)
|
474
|
+
raise TypeError, "hash keyword arguments expected"
|
473
475
|
end
|
474
476
|
|
475
|
-
valid_keys = %w
|
477
|
+
valid_keys = %w{
|
476
478
|
app_name command_line inherit creation_flags cwd environment
|
477
479
|
startup_info thread_inherit process_inherit close_handles with_logon
|
478
480
|
domain password
|
479
|
-
|
481
|
+
}
|
480
482
|
|
481
|
-
valid_si_keys = %w
|
483
|
+
valid_si_keys = %w{
|
482
484
|
startf_flags desktop title x y x_size y_size x_count_chars
|
483
485
|
y_count_chars fill_attribute sw_flags stdin stdout stderr
|
484
|
-
|
486
|
+
}
|
485
487
|
|
486
488
|
# Set default values
|
487
489
|
hash = {
|
488
|
-
|
489
|
-
|
490
|
-
|
490
|
+
"app_name" => nil,
|
491
|
+
"creation_flags" => 0,
|
492
|
+
"close_handles" => true,
|
491
493
|
}
|
492
494
|
|
493
495
|
# Validate the keys, and convert symbols and case to lowercase strings.
|
494
|
-
args.each{ |key, val|
|
496
|
+
args.each { |key, val|
|
495
497
|
key = key.to_s.downcase
|
496
498
|
unless valid_keys.include?(key)
|
497
499
|
raise ArgumentError, "invalid key '#{key}'"
|
498
500
|
end
|
501
|
+
|
499
502
|
hash[key] = val
|
500
503
|
}
|
501
504
|
|
502
505
|
si_hash = {}
|
503
506
|
|
504
507
|
# If the startup_info key is present, validate its subkeys
|
505
|
-
if hash[
|
506
|
-
hash[
|
508
|
+
if hash["startup_info"]
|
509
|
+
hash["startup_info"].each { |key, val|
|
507
510
|
key = key.to_s.downcase
|
508
511
|
unless valid_si_keys.include?(key)
|
509
512
|
raise ArgumentError, "invalid startup_info key '#{key}'"
|
510
513
|
end
|
514
|
+
|
511
515
|
si_hash[key] = val
|
512
516
|
}
|
513
517
|
end
|
514
518
|
|
515
519
|
# The +command_line+ key is mandatory unless the +app_name+ key
|
516
520
|
# is specified.
|
517
|
-
unless hash[
|
518
|
-
if hash[
|
519
|
-
hash[
|
520
|
-
hash[
|
521
|
+
unless hash["command_line"]
|
522
|
+
if hash["app_name"]
|
523
|
+
hash["command_line"] = hash["app_name"]
|
524
|
+
hash["app_name"] = nil
|
521
525
|
else
|
522
|
-
raise ArgumentError,
|
526
|
+
raise ArgumentError, "command_line or app_name must be specified"
|
523
527
|
end
|
524
528
|
end
|
525
529
|
|
526
530
|
env = nil
|
527
531
|
|
528
532
|
# The env string should be passed as a string of ';' separated paths.
|
529
|
-
if hash[
|
530
|
-
env = hash[
|
533
|
+
if hash["environment"]
|
534
|
+
env = hash["environment"]
|
531
535
|
|
532
536
|
unless env.respond_to?(:join)
|
533
|
-
env = hash[
|
537
|
+
env = hash["environment"].split(File::PATH_SEPARATOR)
|
534
538
|
end
|
535
539
|
|
536
|
-
env = env.map{ |e| e + 0.chr }.join(
|
537
|
-
env.to_wide_string! if hash[
|
540
|
+
env = env.map { |e| e + 0.chr }.join("") + 0.chr
|
541
|
+
env.to_wide_string! if hash["with_logon"]
|
538
542
|
end
|
539
543
|
|
540
544
|
# Process SECURITY_ATTRIBUTE structure
|
541
545
|
process_security = nil
|
542
546
|
|
543
|
-
if hash[
|
547
|
+
if hash["process_inherit"]
|
544
548
|
process_security = SECURITY_ATTRIBUTES.new
|
545
549
|
process_security[:nLength] = 12
|
546
550
|
process_security[:bInheritHandle] = 1
|
@@ -549,7 +553,7 @@ module Process
|
|
549
553
|
# Thread SECURITY_ATTRIBUTE structure
|
550
554
|
thread_security = nil
|
551
555
|
|
552
|
-
if hash[
|
556
|
+
if hash["thread_inherit"]
|
553
557
|
thread_security = SECURITY_ATTRIBUTES.new
|
554
558
|
thread_security[:nLength] = 12
|
555
559
|
thread_security[:bInheritHandle] = 1
|
@@ -560,7 +564,7 @@ module Process
|
|
560
564
|
# will not work on JRuby because of the way it handles internal file
|
561
565
|
# descriptors.
|
562
566
|
#
|
563
|
-
|
567
|
+
%w{stdin stdout stderr}.each { |io|
|
564
568
|
if si_hash[io]
|
565
569
|
if si_hash[io].respond_to?(:fileno)
|
566
570
|
handle = get_osfhandle(si_hash[io].fileno)
|
@@ -591,9 +595,9 @@ module Process
|
|
591
595
|
raise SystemCallError.new("SetHandleInformation", FFI.errno) unless bool
|
592
596
|
|
593
597
|
si_hash[io] = handle
|
594
|
-
si_hash[
|
595
|
-
si_hash[
|
596
|
-
hash[
|
598
|
+
si_hash["startf_flags"] ||= 0
|
599
|
+
si_hash["startf_flags"] |= STARTF_USESTDHANDLES
|
600
|
+
hash["inherit"] = true
|
597
601
|
end
|
598
602
|
}
|
599
603
|
|
@@ -602,53 +606,53 @@ module Process
|
|
602
606
|
|
603
607
|
unless si_hash.empty?
|
604
608
|
startinfo[:cb] = startinfo.size
|
605
|
-
startinfo[:lpDesktop] = si_hash[
|
606
|
-
startinfo[:lpTitle] = si_hash[
|
607
|
-
startinfo[:dwX] = si_hash[
|
608
|
-
startinfo[:dwY] = si_hash[
|
609
|
-
startinfo[:dwXSize] = si_hash[
|
610
|
-
startinfo[:dwYSize] = si_hash[
|
611
|
-
startinfo[:dwXCountChars] = si_hash[
|
612
|
-
startinfo[:dwYCountChars] = si_hash[
|
613
|
-
startinfo[:dwFillAttribute] = si_hash[
|
614
|
-
startinfo[:dwFlags] = si_hash[
|
615
|
-
startinfo[:wShowWindow] = si_hash[
|
609
|
+
startinfo[:lpDesktop] = si_hash["desktop"] if si_hash["desktop"]
|
610
|
+
startinfo[:lpTitle] = si_hash["title"] if si_hash["title"]
|
611
|
+
startinfo[:dwX] = si_hash["x"] if si_hash["x"]
|
612
|
+
startinfo[:dwY] = si_hash["y"] if si_hash["y"]
|
613
|
+
startinfo[:dwXSize] = si_hash["x_size"] if si_hash["x_size"]
|
614
|
+
startinfo[:dwYSize] = si_hash["y_size"] if si_hash["y_size"]
|
615
|
+
startinfo[:dwXCountChars] = si_hash["x_count_chars"] if si_hash["x_count_chars"]
|
616
|
+
startinfo[:dwYCountChars] = si_hash["y_count_chars"] if si_hash["y_count_chars"]
|
617
|
+
startinfo[:dwFillAttribute] = si_hash["fill_attribute"] if si_hash["fill_attribute"]
|
618
|
+
startinfo[:dwFlags] = si_hash["startf_flags"] if si_hash["startf_flags"]
|
619
|
+
startinfo[:wShowWindow] = si_hash["sw_flags"] if si_hash["sw_flags"]
|
616
620
|
startinfo[:cbReserved2] = 0
|
617
|
-
startinfo[:hStdInput] = si_hash[
|
618
|
-
startinfo[:hStdOutput] = si_hash[
|
619
|
-
startinfo[:hStdError] = si_hash[
|
621
|
+
startinfo[:hStdInput] = si_hash["stdin"] if si_hash["stdin"]
|
622
|
+
startinfo[:hStdOutput] = si_hash["stdout"] if si_hash["stdout"]
|
623
|
+
startinfo[:hStdError] = si_hash["stderr"] if si_hash["stderr"]
|
620
624
|
end
|
621
625
|
|
622
626
|
app = nil
|
623
627
|
cmd = nil
|
624
628
|
|
625
629
|
# Convert strings to wide character strings if present
|
626
|
-
if hash[
|
627
|
-
app = hash[
|
630
|
+
if hash["app_name"]
|
631
|
+
app = hash["app_name"].to_wide_string
|
628
632
|
end
|
629
633
|
|
630
|
-
if hash[
|
631
|
-
cmd = hash[
|
634
|
+
if hash["command_line"]
|
635
|
+
cmd = hash["command_line"].to_wide_string
|
632
636
|
end
|
633
637
|
|
634
|
-
if hash[
|
635
|
-
cwd = hash[
|
638
|
+
if hash["cwd"]
|
639
|
+
cwd = hash["cwd"].to_wide_string
|
636
640
|
end
|
637
641
|
|
638
|
-
if hash[
|
639
|
-
logon = hash[
|
642
|
+
if hash["with_logon"]
|
643
|
+
logon = hash["with_logon"].to_wide_string
|
640
644
|
|
641
|
-
if hash[
|
642
|
-
passwd = hash[
|
645
|
+
if hash["password"]
|
646
|
+
passwd = hash["password"].to_wide_string
|
643
647
|
else
|
644
|
-
raise ArgumentError,
|
648
|
+
raise ArgumentError, "password must be specified if with_logon is used"
|
645
649
|
end
|
646
650
|
|
647
|
-
if hash[
|
648
|
-
domain = hash[
|
651
|
+
if hash["domain"]
|
652
|
+
domain = hash["domain"].to_wide_string
|
649
653
|
end
|
650
654
|
|
651
|
-
hash[
|
655
|
+
hash["creation_flags"] |= CREATE_UNICODE_ENVIRONMENT
|
652
656
|
|
653
657
|
bool = CreateProcessWithLogonW(
|
654
658
|
logon, # User
|
@@ -657,7 +661,7 @@ module Process
|
|
657
661
|
LOGON_WITH_PROFILE, # Logon flags
|
658
662
|
app, # App name
|
659
663
|
cmd, # Command line
|
660
|
-
hash[
|
664
|
+
hash["creation_flags"], # Creation flags
|
661
665
|
env, # Environment
|
662
666
|
cwd, # Working directory
|
663
667
|
startinfo, # Startup Info
|
@@ -668,7 +672,7 @@ module Process
|
|
668
672
|
raise SystemCallError.new("CreateProcessWithLogonW", FFI.errno)
|
669
673
|
end
|
670
674
|
else
|
671
|
-
inherit = hash[
|
675
|
+
inherit = hash["inherit"] ? 1 : 0
|
672
676
|
|
673
677
|
bool = CreateProcessW(
|
674
678
|
app, # App name
|
@@ -676,7 +680,7 @@ module Process
|
|
676
680
|
process_security, # Process attributes
|
677
681
|
thread_security, # Thread attributes
|
678
682
|
inherit, # Inherit handles?
|
679
|
-
hash[
|
683
|
+
hash["creation_flags"], # Creation flags
|
680
684
|
env, # Environment
|
681
685
|
cwd, # Working directory
|
682
686
|
startinfo, # Startup Info
|
@@ -690,7 +694,7 @@ module Process
|
|
690
694
|
|
691
695
|
# Automatically close the process and thread handles in the
|
692
696
|
# PROCESS_INFORMATION struct unless explicitly told not to.
|
693
|
-
if hash[
|
697
|
+
if hash["close_handles"]
|
694
698
|
CloseHandle(procinfo[:hProcess])
|
695
699
|
CloseHandle(procinfo[:hThread])
|
696
700
|
end
|
@@ -760,8 +764,8 @@ module Process
|
|
760
764
|
# Older versions of JRuby did not include KILL, so we've made an explicit exception
|
761
765
|
# for that here, too.
|
762
766
|
if signal.is_a?(String) || signal.is_a?(Symbol)
|
763
|
-
signal = signal.to_s.sub(
|
764
|
-
unless Signal.list.keys.include?(signal) ||
|
767
|
+
signal = signal.to_s.sub("SIG", "")
|
768
|
+
unless Signal.list.keys.include?(signal) || %w{KILL BRK}.include?(signal)
|
765
769
|
raise ArgumentError, "unsupported name '#{signal}'"
|
766
770
|
end
|
767
771
|
end
|
@@ -771,32 +775,33 @@ module Process
|
|
771
775
|
hash = pids.pop
|
772
776
|
opts = {}
|
773
777
|
|
774
|
-
valid = %w
|
778
|
+
valid = %w{exit_proc dll_module wait_time}
|
775
779
|
|
776
|
-
hash.each{ |k,v|
|
780
|
+
hash.each { |k, v|
|
777
781
|
k = k.to_s.downcase
|
778
782
|
unless valid.include?(k)
|
779
783
|
raise ArgumentError, "invalid option '#{k}'"
|
780
784
|
end
|
785
|
+
|
781
786
|
opts[k] = v
|
782
787
|
}
|
783
788
|
|
784
|
-
exit_proc = opts[
|
785
|
-
dll_module = opts[
|
786
|
-
wait_time = opts[
|
789
|
+
exit_proc = opts["exit_proc"] || "ExitProcess"
|
790
|
+
dll_module = opts["dll_module"] || "kernel32"
|
791
|
+
wait_time = opts["wait_time"] || 5
|
787
792
|
else
|
788
793
|
wait_time = 5
|
789
|
-
exit_proc =
|
790
|
-
dll_module =
|
794
|
+
exit_proc = "ExitProcess"
|
795
|
+
dll_module = "kernel32"
|
791
796
|
end
|
792
797
|
|
793
798
|
count = 0
|
794
799
|
|
795
|
-
pids.each{ |pid|
|
800
|
+
pids.each { |pid|
|
796
801
|
raise TypeError unless pid.is_a?(Numeric) # Match spec, pid must be a number
|
797
802
|
raise SystemCallError.new(22) if pid < 0 # Match spec, EINVAL if pid less than zero
|
798
803
|
|
799
|
-
sigint = [Signal.list[
|
804
|
+
sigint = [Signal.list["INT"], "INT", "SIGINT", :INT, :SIGINT, 2]
|
800
805
|
|
801
806
|
# Match the spec
|
802
807
|
if pid == 0 && !sigint.include?(signal)
|
@@ -829,19 +834,19 @@ module Process
|
|
829
834
|
raise SystemCallError.new(3) # ESRCH
|
830
835
|
end
|
831
836
|
end
|
832
|
-
when Signal.list[
|
837
|
+
when Signal.list["INT"], "INT", "SIGINT", :INT, :SIGINT, 2
|
833
838
|
if GenerateConsoleCtrlEvent(CTRL_C_EVENT, pid)
|
834
839
|
count += 1
|
835
840
|
else
|
836
841
|
raise SystemCallError.new("GenerateConsoleCtrlEvent", FFI.errno)
|
837
842
|
end
|
838
|
-
when Signal.list[
|
843
|
+
when Signal.list["BRK"], "BRK", "SIGBRK", :BRK, :SIGBRK, 3
|
839
844
|
if GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, pid)
|
840
845
|
count += 1
|
841
846
|
else
|
842
847
|
raise SystemCallError.new("GenerateConsoleCtrlEvent", FFI.errno)
|
843
848
|
end
|
844
|
-
when Signal.list[
|
849
|
+
when Signal.list["KILL"], "KILL", "SIGKILL", :KILL, :SIGKILL, 9
|
845
850
|
if TerminateProcess(handle, pid)
|
846
851
|
count += 1
|
847
852
|
else
|
@@ -944,15 +949,15 @@ module Process
|
|
944
949
|
# # Show pids of all running processes
|
945
950
|
# p Process.snapshot(:process).keys
|
946
951
|
#
|
947
|
-
def snapshot(info_type =
|
952
|
+
def snapshot(info_type = "thread")
|
948
953
|
case info_type.to_s.downcase
|
949
|
-
when
|
954
|
+
when "thread"
|
950
955
|
flag = TH32CS_SNAPTHREAD
|
951
|
-
when
|
956
|
+
when "heap"
|
952
957
|
flag = TH32CS_SNAPHEAPLIST
|
953
|
-
when
|
958
|
+
when "module"
|
954
959
|
flag = TH32CS_SNAPMODULE
|
955
|
-
when
|
960
|
+
when "process"
|
956
961
|
flag = TH32CS_SNAPPROCESS
|
957
962
|
else
|
958
963
|
raise ArgumentError, "info_type '#{info_type}' unsupported"
|
@@ -962,17 +967,17 @@ module Process
|
|
962
967
|
handle = CreateToolhelp32Snapshot(flag, Process.pid)
|
963
968
|
|
964
969
|
if handle == INVALID_HANDLE_VALUE
|
965
|
-
raise SystemCallError.new(
|
970
|
+
raise SystemCallError.new("CreateToolhelp32Snapshot", FFI.errno)
|
966
971
|
end
|
967
972
|
|
968
973
|
case info_type.to_s.downcase
|
969
|
-
when
|
974
|
+
when "thread"
|
970
975
|
array = get_thread_info(handle)
|
971
|
-
when
|
976
|
+
when "heap"
|
972
977
|
array = get_heap_info(handle)
|
973
|
-
when
|
978
|
+
when "module"
|
974
979
|
array = get_module_info(handle)
|
975
|
-
when
|
980
|
+
when "process"
|
976
981
|
array = get_process_info(handle)
|
977
982
|
end
|
978
983
|
|
@@ -998,7 +1003,7 @@ module Process
|
|
998
1003
|
lpte = THREADENTRY32.new
|
999
1004
|
lpte[:dwSize] = lpte.size
|
1000
1005
|
|
1001
|
-
hash = Hash.new{ |h,k| h[k] = [] }
|
1006
|
+
hash = Hash.new { |h, k| h[k] = [] }
|
1002
1007
|
|
1003
1008
|
if Thread32First(handle, lpte)
|
1004
1009
|
hash[lpte[:th32OwnerProcessID]] << ThreadSnapInfo.new(lpte[:th32ThreadID], lpte[:th32OwnerProcessID], lpte[:tpBasePri])
|
@@ -1006,20 +1011,18 @@ module Process
|
|
1006
1011
|
if FFI.errno == ERROR_NO_MORE_FILES
|
1007
1012
|
return hash
|
1008
1013
|
else
|
1009
|
-
raise SystemCallError.new(
|
1014
|
+
raise SystemCallError.new("Thread32First", FFI.errno)
|
1010
1015
|
end
|
1011
1016
|
end
|
1012
1017
|
|
1013
|
-
while Thread32Next(handle, lpte)
|
1014
|
-
hash[lpte[:th32OwnerProcessID]] << ThreadSnapInfo.new(lpte[:th32ThreadID], lpte[:th32OwnerProcessID], lpte[:tpBasePri])
|
1015
|
-
end
|
1018
|
+
hash[lpte[:th32OwnerProcessID]] << ThreadSnapInfo.new(lpte[:th32ThreadID], lpte[:th32OwnerProcessID], lpte[:tpBasePri]) while Thread32Next(handle, lpte)
|
1016
1019
|
|
1017
1020
|
hash
|
1018
1021
|
end
|
1019
1022
|
|
1020
1023
|
# Return heap info for Process.snapshot
|
1021
1024
|
def get_heap_info(handle)
|
1022
|
-
hash = Hash.new{ |h,k| h[k] = [] }
|
1025
|
+
hash = Hash.new { |h, k| h[k] = [] }
|
1023
1026
|
|
1024
1027
|
hl = HEAPLIST32.new
|
1025
1028
|
hl[:dwSize] = hl.size
|
@@ -1035,13 +1038,11 @@ module Process
|
|
1035
1038
|
if FFI.errno == ERROR_NO_MORE_FILES
|
1036
1039
|
break
|
1037
1040
|
else
|
1038
|
-
raise SystemCallError.new(
|
1041
|
+
raise SystemCallError.new("Heap32First", FFI.errno)
|
1039
1042
|
end
|
1040
1043
|
end
|
1041
1044
|
|
1042
|
-
while Heap32Next(he)
|
1043
|
-
hash[he[:th32ProcessID]] << HeapSnapInfo.new(he[:dwAddress], he[:dwBlockSize], he[:dwFlags], he[:th32ProcessID], he[:th32HeapID])
|
1044
|
-
end
|
1045
|
+
hash[he[:th32ProcessID]] << HeapSnapInfo.new(he[:dwAddress], he[:dwBlockSize], he[:dwFlags], he[:th32ProcessID], he[:th32HeapID]) while Heap32Next(he)
|
1045
1046
|
end
|
1046
1047
|
end
|
1047
1048
|
|
@@ -1050,7 +1051,7 @@ module Process
|
|
1050
1051
|
|
1051
1052
|
# Return module info for Process.snapshot
|
1052
1053
|
def get_module_info(handle)
|
1053
|
-
hash = Hash.new{ |h,k| h[k] = [] }
|
1054
|
+
hash = Hash.new { |h, k| h[k] = [] }
|
1054
1055
|
|
1055
1056
|
me = MODULEENTRY32.new
|
1056
1057
|
me[:dwSize] = me.size
|
@@ -1068,7 +1069,7 @@ module Process
|
|
1068
1069
|
if FFI.errno == ERROR_NO_MORE_FILES
|
1069
1070
|
return hash
|
1070
1071
|
else
|
1071
|
-
raise SystemCallError.new(
|
1072
|
+
raise SystemCallError.new("Module32First", FFI.errno)
|
1072
1073
|
end
|
1073
1074
|
end
|
1074
1075
|
|
@@ -1088,7 +1089,7 @@ module Process
|
|
1088
1089
|
|
1089
1090
|
# Return process info for Process.snapshot
|
1090
1091
|
def get_process_info(handle)
|
1091
|
-
hash = Hash.new{ |h,k| h[k] = [] }
|
1092
|
+
hash = Hash.new { |h, k| h[k] = [] }
|
1092
1093
|
|
1093
1094
|
pe = PROCESSENTRY32.new
|
1094
1095
|
pe[:dwSize] = pe.size
|
@@ -1106,7 +1107,7 @@ module Process
|
|
1106
1107
|
if FFI.errno == ERROR_NO_MORE_FILES
|
1107
1108
|
return hash
|
1108
1109
|
else
|
1109
|
-
raise SystemCallError.new(
|
1110
|
+
raise SystemCallError.new("Process32First", FFI.errno)
|
1110
1111
|
end
|
1111
1112
|
end
|
1112
1113
|
|
data/lib/win32-process.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "win32/process"
|