added an rpc scanner. This prints messages like this:
[jelmer/samba4-debian.git] / source / librpc / idl / dcerpc.idl
1 #include "idl_types.h"
2
3 /*
4   the base dcerpc packet definitions - not traditionally coded as IDL,
5   but given that pidl can handle it nicely it simplifies things a lot
6   to do it this way
7
8   see http://www.opengroup.org/onlinepubs/9629399/chap12.htm for packet
9   layouts
10 */
11 [] 
12 interface dcerpc
13 {
14         typedef struct {
15                 GUID uuid;
16                 uint16 major_version;
17                 uint16 minor_version;
18         } dcerpc_syntax_id;
19
20         typedef struct {
21                 uint16 context_id;
22                 uint8 num_transfer_syntaxes;
23                 dcerpc_syntax_id abstract_syntax;
24                 dcerpc_syntax_id transfer_syntaxes[num_transfer_syntaxes];
25         } dcerpc_ctx_list;
26
27         typedef struct {
28                 uint16 max_xmit_frag;
29                 uint16 max_recv_frag;
30                 uint32 assoc_group_id;
31                 uint8 num_contexts;
32                 dcerpc_ctx_list ctx_list[num_contexts];
33                 [flag(NDR_ALIGN8)]    DATA_BLOB _pad;
34                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
35         } dcerpc_bind;
36
37
38         const uint8 DCERPC_REQUEST_LENGTH = 24;
39
40         typedef struct {
41                 uint32 alloc_hint;
42                 uint16 context_id;
43                 uint16 opnum;
44                 [flag(NDR_ALIGN8)]    DATA_BLOB _pad;
45                 [flag(NDR_REMAINING)] DATA_BLOB stub_and_verifier;
46         } dcerpc_request;
47
48         typedef struct {
49                 uint16 result;
50                 uint16 reason;
51                 dcerpc_syntax_id syntax;
52         } dcerpc_ack_ctx;
53
54         typedef struct {
55                 uint16 max_xmit_frag;
56                 uint16 max_recv_frag;
57                 uint32 assoc_group_id;
58                 ascstr3 secondary_address;
59                 [flag(NDR_ALIGN4)]    DATA_BLOB _pad1;
60                 uint8 num_results;
61                 dcerpc_ack_ctx ctx_list[num_results];
62                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
63         } dcerpc_bind_ack;
64
65         typedef struct {
66                 uint16 reject_reason;
67                 uint32 num_versions;
68                 uint32 versions[num_versions];
69         } dcerpc_bind_nak;
70
71         const uint8 DCERPC_RESPONSE_LENGTH = 24;
72
73         typedef struct {
74                 uint32 alloc_hint;
75                 uint16 context_id;
76                 uint8 cancel_count;
77                 [flag(NDR_ALIGN8)]    DATA_BLOB _pad;
78                 [flag(NDR_REMAINING)] DATA_BLOB stub_and_verifier;
79         } dcerpc_response;
80
81
82         const int DCERPC_FAULT_OP_RNG_ERROR = 0x1c010002;
83
84         typedef struct {
85                 uint32 alloc_hint;
86                 uint16 context_id;
87                 uint8 cancel_count;
88                 uint32 status;
89         } dcerpc_fault;
90
91
92         const uint8 DCERPC_AUTH_TYPE_NONE    = 0;
93         const uint8 DCERPC_AUTH_TYPE_KRB5    = 1;
94         const uint8 DCERPC_AUTH_TYPE_NTLMSSP = 10;
95         
96         const uint8 DCERPC_AUTH_LEVEL_NONE      = 1;
97         const uint8 DCERPC_AUTH_LEVEL_CONNECT   = 2;
98         const uint8 DCERPC_AUTH_LEVEL_CALL      = 3;
99         const uint8 DCERPC_AUTH_LEVEL_PACKET    = 4;
100         const uint8 DCERPC_AUTH_LEVEL_INTEGRITY = 5;
101         const uint8 DCERPC_AUTH_LEVEL_PRIVACY   = 6;
102
103         typedef [public] struct {
104                 uint8  auth_type; 
105                 uint8  auth_level;
106                 uint8  auth_pad_length;
107                 uint8  auth_reserved;
108                 uint32 auth_context_id;
109                 [flag(NDR_REMAINING)] DATA_BLOB credentials;
110         } dcerpc_auth;
111
112         typedef [public] struct {
113                 uint32 _pad;
114                 [flag(NDR_REMAINING)] DATA_BLOB auth_info;
115         } dcerpc_auth3;
116
117         typedef enum {
118                 DCERPC_PKT_REQUEST     =  0,
119                 DCERPC_PKT_PING        =  1,
120                 DCERPC_PKT_RESPONSE    =  2,
121                 DCERPC_PKT_FAULT       =  3,
122                 DCERPC_PKT_WORKING     =  4,
123                 DCERPC_PKT_NOCALL      =  5,
124                 DCERPC_PKT_REJECT      =  6,
125                 DCERPC_PKT_ACK         =  7,
126                 DCERPC_PKT_CL_CANCEL   =  8,
127                 DCERPC_PKT_FACK        =  9,
128                 DCERPC_PKT_CANCEL_ACK  = 10,
129                 DCERPC_PKT_BIND        = 11,
130                 DCERPC_PKT_BIND_ACK    = 12,
131                 DCERPC_PKT_BIND_NAK    = 13,
132                 DCERPC_PKT_ALTER       = 14,
133                 DCERPC_PKT_ALTER_ACK   = 15,
134                 DCERPC_PKT_AUTH3       = 16,
135                 DCERPC_PKT_SHUTDOWN    = 17,
136                 DCERPC_PKT_CO_CANCEL   = 18,
137                 DCERPC_PKT_ORPHANED    = 19
138         } dcerpc_pkt_type;
139
140         typedef [nodiscriminant] union {
141                 [case(DCERPC_PKT_REQUEST)]   dcerpc_request  request;
142                 [case(DCERPC_PKT_RESPONSE)]  dcerpc_response response;
143                 [case(DCERPC_PKT_BIND)]      dcerpc_bind     bind;
144                 [case(DCERPC_PKT_BIND_ACK)]  dcerpc_bind_ack bind_ack;
145                 [case(DCERPC_PKT_ALTER)]     dcerpc_bind     alter;
146                 [case(DCERPC_PKT_ALTER_ACK)] dcerpc_bind_ack alter_ack;
147                 [case(DCERPC_PKT_FAULT)]     dcerpc_fault    fault;
148                 [case(DCERPC_PKT_AUTH3)]     dcerpc_auth3    auth;
149                 [case(DCERPC_PKT_BIND_NAK)]  dcerpc_bind_nak nak;
150         } dcerpc_payload;
151
152
153         /* pfc_flags values */
154         const uint8 DCERPC_PFC_FLAG_FIRST  = 0x01;
155         const uint8 DCERPC_PFC_FLAG_LAST   = 0x02;
156         const uint8 DCERPC_PFC_FLAG_NOCALL = 0x20;
157
158         /* these offsets are needed by the signing code */
159         const uint8 DCERPC_FRAG_LEN_OFFSET =  8;
160         const uint8 DCERPC_AUTH_LEN_OFFSET = 10;
161
162         typedef [public] struct {
163                 uint8 rpc_vers;         /* RPC version */
164                 uint8 rpc_vers_minor;   /* Minor version */
165                 uint8 ptype;            /* Packet type */
166                 uint8 pfc_flags;        /* Fragmentation flags */
167                 uint8 drep[4];          /* NDR data representation */
168                 uint16 frag_length;     /* Total length of fragment */
169                 uint16 auth_length;     /* authenticator length */
170                 uint32 call_id;         /* Call identifier */
171                 
172                 [switch_is(ptype)] dcerpc_payload u;
173         } dcerpc_packet;
174 }