回答編集履歴

2

コード修正

2020/08/26 08:30

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -94,59 +94,55 @@
94
94
 
95
95
 
96
96
 
97
- typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);
98
-
99
-
100
-
101
- void suspend(DWORD processId)
102
-
103
- {
104
-
105
- HANDLE processHandle = OpenProcess(
106
-
107
- PROCESS_ALL_ACCESS, FALSE, processId);
108
-
109
-
110
-
111
- NtSuspendProcess pfnNtSuspendProcess = (NtSuspendProcess)GetProcAddress(
112
-
113
- GetModuleHandle("ntdll"), "NtSuspendProcess");
114
-
115
-
116
-
117
- printf("pfnSuspend = %p\n", pfnNtSuspendProcess);
118
-
119
- pfnNtSuspendProcess(processHandle);
120
-
121
- CloseHandle(processHandle);
122
-
123
- }
124
-
125
-
126
-
127
- void resume(DWORD processId)
128
-
129
- {
130
-
131
- HANDLE processHandle = OpenProcess(
132
-
133
- PROCESS_ALL_ACCESS, FALSE, processId);
134
-
135
-
136
-
137
- NtSuspendProcess pfnNtResumeProcess = (NtSuspendProcess)GetProcAddress(
138
-
139
- GetModuleHandle("ntdll"), "NtResumeProcess");
140
-
141
- printf("pfnResume = %p\n", pfnNtResumeProcess);
142
-
143
-
144
-
145
- pfnNtResumeProcess(processHandle);
146
-
147
- CloseHandle(processHandle);
148
-
149
- }
97
+ typedef LONG (NTAPI *Func)(HANDLE ProcessHandle);
98
+
99
+
100
+
101
+ Func suspendF, resumeF;
102
+
103
+
104
+
105
+ void getFunc(DWORD processId)
106
+
107
+ {
108
+
109
+ HANDLE h = GetModuleHandle("ntdll");
110
+
111
+ suspendF = (Func)GetProcAddress(h, "NtSuspendProcess");
112
+
113
+ resumeF = (Func)GetProcAddress(h, "NtResumeProcess");
114
+
115
+ }
116
+
117
+
118
+
119
+ void suspend(DWORD pid)
120
+
121
+ {
122
+
123
+ HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
124
+
125
+ suspendF(h);
126
+
127
+ CloseHandle(h);
128
+
129
+ }
130
+
131
+
132
+
133
+ void resume(DWORD pid)
134
+
135
+ {
136
+
137
+ HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
138
+
139
+ resumeF(h);
140
+
141
+ CloseHandle(h);
142
+
143
+ }
144
+
145
+
150
146
 
151
147
 
152
148
 
@@ -156,19 +152,17 @@
156
152
 
157
153
  int pid = 0, n;
158
154
 
159
- while (printf("pid or 0 or 1: "), scanf("%d", &n) ==1) {
155
+ while (printf("pid or 0 or 1: "), scanf("%d", &n) == 1) {
160
-
156
+
161
- if (n == 0)
157
+ if (pid == 0) {
158
+
162
-
159
+ pid = n; getFunc(pid); suspend(pid);
160
+
161
+ }
162
+
163
- suspend(pid);
163
+ else if (n == 0) suspend(pid);
164
-
164
+
165
- else if (n == 1)
165
+ else if (n == 1) resume(pid);
166
-
167
- resume(pid);
168
-
169
- else
170
-
171
- suspend(pid = n);
172
166
 
173
167
  }
174
168
 
@@ -219,3 +213,9 @@
219
213
  別のコマンドプロンプトで最初のプログラムを実行することで
220
214
 
221
215
  プロセスの一時停止、再開ができます。
216
+
217
+
218
+
219
+ **追記2**
220
+
221
+ デバッグ中のコードを貼り付けてしまったので、書き直しました。

1

windows版のコードを追加

2020/08/26 08:30

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -79,3 +79,143 @@
79
79
  ある端末でこのプログラムを実行し、他の端末で、
80
80
 
81
81
  先ほどのプログラムを実行してみてください。
82
+
83
+
84
+
85
+ **追記**
86
+
87
+ Windows でのやり方を調べてみました。
88
+
89
+ ```C++
90
+
91
+ #include <stdio.h>
92
+
93
+ #include <windows.h>
94
+
95
+
96
+
97
+ typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);
98
+
99
+
100
+
101
+ void suspend(DWORD processId)
102
+
103
+ {
104
+
105
+ HANDLE processHandle = OpenProcess(
106
+
107
+ PROCESS_ALL_ACCESS, FALSE, processId);
108
+
109
+
110
+
111
+ NtSuspendProcess pfnNtSuspendProcess = (NtSuspendProcess)GetProcAddress(
112
+
113
+ GetModuleHandle("ntdll"), "NtSuspendProcess");
114
+
115
+
116
+
117
+ printf("pfnSuspend = %p\n", pfnNtSuspendProcess);
118
+
119
+ pfnNtSuspendProcess(processHandle);
120
+
121
+ CloseHandle(processHandle);
122
+
123
+ }
124
+
125
+
126
+
127
+ void resume(DWORD processId)
128
+
129
+ {
130
+
131
+ HANDLE processHandle = OpenProcess(
132
+
133
+ PROCESS_ALL_ACCESS, FALSE, processId);
134
+
135
+
136
+
137
+ NtSuspendProcess pfnNtResumeProcess = (NtSuspendProcess)GetProcAddress(
138
+
139
+ GetModuleHandle("ntdll"), "NtResumeProcess");
140
+
141
+ printf("pfnResume = %p\n", pfnNtResumeProcess);
142
+
143
+
144
+
145
+ pfnNtResumeProcess(processHandle);
146
+
147
+ CloseHandle(processHandle);
148
+
149
+ }
150
+
151
+
152
+
153
+ int main(void)
154
+
155
+ {
156
+
157
+ int pid = 0, n;
158
+
159
+ while (printf("pid or 0 or 1: "), scanf("%d", &n) ==1) {
160
+
161
+ if (n == 0)
162
+
163
+ suspend(pid);
164
+
165
+ else if (n == 1)
166
+
167
+ resume(pid);
168
+
169
+ else
170
+
171
+ suspend(pid = n);
172
+
173
+ }
174
+
175
+ }
176
+
177
+ ```
178
+
179
+ pid を入力するとそのプロセスを中断。
180
+
181
+ 後は、1 または 0 を入力すると、再開/中断を繰り返します。
182
+
183
+ プロセスID は tasklistコマンドで取得できます。
184
+
185
+
186
+
187
+ ```C++
188
+
189
+ #include <stdio.h>
190
+
191
+ #include <windows.h>
192
+
193
+
194
+
195
+ int main(void)
196
+
197
+ {
198
+
199
+ DWORD pid = GetCurrentProcessId();
200
+
201
+ printf("pid = %d\n", pid);
202
+
203
+ for (int i = 0; i < 100; i++) {
204
+
205
+ printf("[%d]", i);
206
+
207
+ fflush(stdout);
208
+
209
+ Sleep(1000);
210
+
211
+ }
212
+
213
+ }
214
+
215
+ ```
216
+
217
+ あるコマンドプロンプトでこのプログラムを実行し、
218
+
219
+ 別のコマンドプロンプトで最初のプログラムを実行することで
220
+
221
+ プロセスの一時停止、再開ができます。