aboutsummaryrefslogtreecommitdiff
path: root/agent/src/os/win32/Message.hpp
blob: 9f79d3b6f493c8c1f4eac7ad24beb637f02e6575 (plain)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * Copyright 2000-2001 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 *
 */

#ifndef _MESSAGE_
#define _MESSAGE_

// These are the commands sent from the server to the child processes
// over the child processes' stdin pipes. A subset of the commands
// understood by the overall system, these require responses from the
// child process. Having a data structure rather than sending text
// simplifies parsing on the child side. The child replies by sending
// back fully-formatted replies which are copied by the server process
// to the clients' sockets.

struct PeekArg {
  DWORD address;
  DWORD numBytes;
};

// NOTE: when sending a PokeArg to the child process, we handle the
// buffer specially
struct PokeArg {
  DWORD address;
  DWORD numBytes;
  void* data;
};

// Used for continueevent
struct BoolArg {
  bool val;
};

// Used for duphandle, closehandle, and getcontext
struct HandleArg {
  HANDLE handle;
};

// Used for setcontext
const int NUM_REGS_IN_CONTEXT = 22;
struct SetContextArg {
  HANDLE handle;
  DWORD  Eax;
  DWORD  Ebx;
  DWORD  Ecx;
  DWORD  Edx;
  DWORD  Esi;
  DWORD  Edi;
  DWORD  Ebp;
  DWORD  Esp;
  DWORD  Eip;
  DWORD  Ds;
  DWORD  Es;
  DWORD  Fs;
  DWORD  Gs;
  DWORD  Cs;
  DWORD  Ss;
  DWORD  EFlags;
  DWORD  Dr0;
  DWORD  Dr1;
  DWORD  Dr2;
  DWORD  Dr3;
  DWORD  Dr6;
  DWORD  Dr7;
};

// Used for selectorentry
struct SelectorEntryArg {
  HANDLE handle;
  DWORD  selector;
};

struct Message {
  typedef enum {
    ATTACH,
    DETACH,
    LIBINFO,
    PEEK,
    POKE,
    THREADLIST,
    DUPHANDLE,
    CLOSEHANDLE,
    GETCONTEXT,
    SETCONTEXT,
    SELECTORENTRY,
    SUSPEND,
    RESUME,
    POLLEVENT,
    CONTINUEEVENT
  } Type;

  Type type;
  union {
    PeekArg          peekArg;
    PokeArg          pokeArg;
    BoolArg          boolArg;
    HandleArg        handleArg;
    SetContextArg    setContextArg;
    SelectorEntryArg selectorArg;
  };
};

#endif  // #defined _MESSAGE_