|
|
1.1 root 1: /*
2: * ptrace goo for reading and writing
3: */
4:
5: #include "defs.h"
6: #include "space.h"
7: #include "ptrace.h"
8:
9: #define min(a, b) (((a) < (b)) ? (a) : (b))
10: extern int errno;
11:
12: ptri(addr, space, buf, size)
13: ADDR addr;
14: int space;
15: register char *buf;
16: int size;
17: {
18: PTWORD w;
19: register char *p, *q;
20: register int n;
21: int rf;
22:
23: switch (space & SPTYPE) {
24: default:
25: case INSTSP:
26: rf = P_RDI;
27: break;
28:
29: case DATASP:
30: rf = P_RDD;
31: break;
32:
33: case UBLKSP:
34: rf = P_RDU;
35: break;
36: }
37: for (p = buf, n = size; n > 0; n--)
38: *p++ = 0;
39: while (size) {
40: errno = 0;
41: w = ptrace(rf, pid, (int *)addr, 0);
42: if (errno) {
43: errflg = "bad trace read";
44: return (0);
45: }
46: p = (char *)&w;
47: for (n = min(size, sizeof(w)); n > 0; size--, n--)
48: *buf++ = *p++;
49: addr += sizeof(w);
50: }
51: return (1);
52: }
53:
54: ptro(addr, space, buf, size)
55: ADDR addr;
56: int space;
57: register char *buf;
58: int size;
59: {
60: PTWORD w;
61: register char *p;
62: register int n;
63: int rf, wf;
64:
65: switch (space & SPTYPE) {
66: default:
67: case INSTSP:
68: rf = P_RDI;
69: wf = P_WRI;
70: break;
71:
72: case DATASP:
73: rf = P_RDD;
74: wf = P_WRD;
75: break;
76:
77: case UBLKSP:
78: rf = P_RDU;
79: wf = P_WRU;
80: break;
81: }
82: while (size) {
83: errno = 0;
84: w = ptrace(rf, pid, (int *)addr, 0);
85: if (errno) {
86: errflg = "bad trace read";
87: return (0);
88: }
89: p = (char *)&w;
90: for (n = min(size, sizeof(w)); n > 0; size--, n--)
91: *p++ = *buf++;
92: errno = 0;
93: ptrace(wf, pid, (int *)addr, w);
94: if (errno) {
95: errflg = "bad trace write";
96: return (0);
97: }
98: p = (char *)&w;
99: for (n = min(size, sizeof(w)); n > 0; size--, n--)
100: *buf++ = *p++;
101: addr += sizeof(w);
102: }
103: return (1);
104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.