forked from dtrace4linux/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathctl.c
More file actions
60 lines (52 loc) · 1.29 KB
/
ctl.c
File metadata and controls
60 lines (52 loc) · 1.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include "../include/ctl.h"
char buf[2 * 1024 * 1024];
static void
dump_mem(char *start, char *mem, char *memend)
{ char *cp;
int i;
for (cp = mem; cp < memend; cp += 16) {
printf("%04lx: ", cp - start);
for (i = 0; i < 16 && cp + i < memend; i++) {
printf("%02x ", cp[i] & 0xff);
}
printf("\n");
}
}
int main(int argc, char **argv)
{ int arg_index = 1;
int ret, cmd;
int fd;
ctl_mem_t ctl;
if (argc < 5) {
printf("usage: ctl [rd | wr] pid addr len\n");
exit(1);
}
fd = open("/dev/dtrace_ctl", O_RDWR);
if (fd < 0) {
perror("/dev/dtrace_ctl");
exit(1);
}
if (strcmp(argv[arg_index++], "rd") == 0) {
ctl.c_pid = atoi(argv[arg_index++]);
cmd = CTLIOC_RDMEM;
ctl.c_dst = buf;
ctl.c_src = strtoul(argv[arg_index++], NULL, 0);
} else {
ctl.c_pid = atoi(argv[arg_index++]);
cmd = CTLIOC_WRMEM;
ctl.c_src = buf;
ctl.c_dst = strtoul(argv[arg_index++], NULL, 0);
}
ctl.c_len = atoi(argv[arg_index++]);
printf("pid=%d src=%p dst=%p len=%d\n",
ctl.c_pid, ctl.c_src, ctl.c_dst, ctl.c_len);
if ((ret = ioctl(fd, cmd, &ctl)) < 0) {
perror("ioctl");
exit(1);
}
printf("ret=%d\n", ret);
dump_mem(buf, buf, buf + ret);
}