質問するログイン新規登録

回答編集履歴

2

コード修正

2020/08/26 08:30

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -46,44 +46,41 @@
46
46
  #include <stdio.h>
47
47
  #include <windows.h>
48
48
 
49
- typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);
49
+ typedef LONG (NTAPI *Func)(HANDLE ProcessHandle);
50
50
 
51
+ Func suspendF, resumeF;
52
+
51
- void suspend(DWORD processId)
53
+ void getFunc(DWORD processId)
52
54
  {
53
- HANDLE processHandle = OpenProcess(
55
+ HANDLE h = GetModuleHandle("ntdll");
54
- PROCESS_ALL_ACCESS, FALSE, processId);
56
+ suspendF = (Func)GetProcAddress(h, "NtSuspendProcess");
57
+ resumeF = (Func)GetProcAddress(h, "NtResumeProcess");
58
+ }
55
59
 
56
- NtSuspendProcess pfnNtSuspendProcess = (NtSuspendProcess)GetProcAddress(
57
- GetModuleHandle("ntdll"), "NtSuspendProcess");
58
-
59
- printf("pfnSuspend = %p\n", pfnNtSuspendProcess);
60
- pfnNtSuspendProcess(processHandle);
60
+ void suspend(DWORD pid)
61
+ {
62
+ HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
63
+ suspendF(h);
61
- CloseHandle(processHandle);
64
+ CloseHandle(h);
62
65
  }
63
66
 
64
- void resume(DWORD processId)
67
+ void resume(DWORD pid)
65
68
  {
66
- HANDLE processHandle = OpenProcess(
67
- PROCESS_ALL_ACCESS, FALSE, processId);
69
+ HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
70
+ resumeF(h);
71
+ CloseHandle(h);
72
+ }
68
73
 
69
- NtSuspendProcess pfnNtResumeProcess = (NtSuspendProcess)GetProcAddress(
70
- GetModuleHandle("ntdll"), "NtResumeProcess");
71
- printf("pfnResume = %p\n", pfnNtResumeProcess);
72
74
 
73
- pfnNtResumeProcess(processHandle);
74
- CloseHandle(processHandle);
75
- }
76
-
77
75
  int main(void)
78
76
  {
79
77
  int pid = 0, n;
80
- while (printf("pid or 0 or 1: "), scanf("%d", &n) ==1) {
78
+ while (printf("pid or 0 or 1: "), scanf("%d", &n) == 1) {
81
- if (n == 0)
79
+ if (pid == 0) {
80
+ pid = n; getFunc(pid); suspend(pid);
81
+ }
82
- suspend(pid);
82
+ else if (n == 0) suspend(pid);
83
- else if (n == 1)
83
+ else if (n == 1) resume(pid);
84
- resume(pid);
85
- else
86
- suspend(pid = n);
87
84
  }
88
85
  }
89
86
  ```
@@ -108,4 +105,7 @@
108
105
  ```
109
106
  あるコマンドプロンプトでこのプログラムを実行し、
110
107
  別のコマンドプロンプトで最初のプログラムを実行することで
111
- プロセスの一時停止、再開ができます。
108
+ プロセスの一時停止、再開ができます。
109
+
110
+ **追記2**
111
+ デバッグ中のコードを貼り付けてしまったので、書き直しました。

1

windows版のコードを追加

2020/08/26 08:30

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -38,4 +38,74 @@
38
38
  }
39
39
  ```
40
40
  ある端末でこのプログラムを実行し、他の端末で、
41
- 先ほどのプログラムを実行してみてください。
41
+ 先ほどのプログラムを実行してみてください。
42
+
43
+ **追記**
44
+ Windows でのやり方を調べてみました。
45
+ ```C++
46
+ #include <stdio.h>
47
+ #include <windows.h>
48
+
49
+ typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);
50
+
51
+ void suspend(DWORD processId)
52
+ {
53
+ HANDLE processHandle = OpenProcess(
54
+ PROCESS_ALL_ACCESS, FALSE, processId);
55
+
56
+ NtSuspendProcess pfnNtSuspendProcess = (NtSuspendProcess)GetProcAddress(
57
+ GetModuleHandle("ntdll"), "NtSuspendProcess");
58
+
59
+ printf("pfnSuspend = %p\n", pfnNtSuspendProcess);
60
+ pfnNtSuspendProcess(processHandle);
61
+ CloseHandle(processHandle);
62
+ }
63
+
64
+ void resume(DWORD processId)
65
+ {
66
+ HANDLE processHandle = OpenProcess(
67
+ PROCESS_ALL_ACCESS, FALSE, processId);
68
+
69
+ NtSuspendProcess pfnNtResumeProcess = (NtSuspendProcess)GetProcAddress(
70
+ GetModuleHandle("ntdll"), "NtResumeProcess");
71
+ printf("pfnResume = %p\n", pfnNtResumeProcess);
72
+
73
+ pfnNtResumeProcess(processHandle);
74
+ CloseHandle(processHandle);
75
+ }
76
+
77
+ int main(void)
78
+ {
79
+ int pid = 0, n;
80
+ while (printf("pid or 0 or 1: "), scanf("%d", &n) ==1) {
81
+ if (n == 0)
82
+ suspend(pid);
83
+ else if (n == 1)
84
+ resume(pid);
85
+ else
86
+ suspend(pid = n);
87
+ }
88
+ }
89
+ ```
90
+ pid を入力するとそのプロセスを中断。
91
+ 後は、1 または 0 を入力すると、再開/中断を繰り返します。
92
+ プロセスID は tasklistコマンドで取得できます。
93
+
94
+ ```C++
95
+ #include <stdio.h>
96
+ #include <windows.h>
97
+
98
+ int main(void)
99
+ {
100
+ DWORD pid = GetCurrentProcessId();
101
+ printf("pid = %d\n", pid);
102
+ for (int i = 0; i < 100; i++) {
103
+ printf("[%d]", i);
104
+ fflush(stdout);
105
+ Sleep(1000);
106
+ }
107
+ }
108
+ ```
109
+ あるコマンドプロンプトでこのプログラムを実行し、
110
+ 別のコマンドプロンプトで最初のプログラムを実行することで
111
+ プロセスの一時停止、再開ができます。