win32-process 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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"
|