回答編集履歴
2
コード修正
answer
CHANGED
@@ -46,44 +46,41 @@
|
|
46
46
|
#include <stdio.h>
|
47
47
|
#include <windows.h>
|
48
48
|
|
49
|
-
typedef LONG (NTAPI *
|
49
|
+
typedef LONG (NTAPI *Func)(HANDLE ProcessHandle);
|
50
50
|
|
51
|
+
Func suspendF, resumeF;
|
52
|
+
|
51
|
-
void
|
53
|
+
void getFunc(DWORD processId)
|
52
54
|
{
|
53
|
-
|
55
|
+
HANDLE h = GetModuleHandle("ntdll");
|
54
|
-
|
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
|
-
|
60
|
+
void suspend(DWORD pid)
|
61
|
+
{
|
62
|
+
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
|
63
|
+
suspendF(h);
|
61
|
-
CloseHandle(
|
64
|
+
CloseHandle(h);
|
62
65
|
}
|
63
66
|
|
64
|
-
void resume(DWORD
|
67
|
+
void resume(DWORD pid)
|
65
68
|
{
|
66
|
-
HANDLE processHandle = OpenProcess(
|
67
|
-
|
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 (
|
79
|
+
if (pid == 0) {
|
80
|
+
pid = n; getFunc(pid); suspend(pid);
|
81
|
+
}
|
82
|
-
|
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版のコードを追加
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
|
+
プロセスの一時停止、再開ができます。
|