summaryrefslogtreecommitdiff
path: root/librpc/idl/orpc.idl
blob: d023865035d514894d061edd18157548e099702a (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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#include "idl_types.h"

/**
  DCOM interfaces
  http://www.ietf.org/internet-drafts/draft-brown-dcom-v1-spec-04.txt
 */

import "misc.idl";

[
	pointer_default(unique)
]
interface ObjectRpcBaseTypes
{
	/* COM_MINOR_VERSION = 1 (NT4.0, SP1, SP2, DCOM95). */
	/* - Initial Release */
	/* - Must be used when talking to downlevel machines, including */
	/* on Remote Activation calls. */
	/* COM_MINOR_VERSION = 2 (NT4.0 SP3 and beyond). */
	/* - Added ResolveOxid2 to IObjectExporter to retrieve the */
	/* COM version number of the server. Passed to the NDR engine */
	/* to fix fatal endian-ness flaw in the way OLEAUTOMATION marshals */
	/* BSTRS. Previous way used trailing padding, which is not NDR */
	/* compatible. See Bug# 69189. */
	/* COM_MINOR_VERSION = 3 (NT4.0 SP4 and DCOM95 builds 1018 and beyond) */
	/* - OLEAUT32 added two new types to the SAFEARRAY, but SAFEARRAY */
	/* previously included the "default" keyword, which prevented */
	/* downlevel NDR engines from correctly handling any extensions. */
	/* Machines with version >=5.3 don't use "default" and will */
	/* gracefully handle future extensions to SAFEARRAY. */
	/* old constants (for convenience) */

	/* current version */
	const uint16 COM_MAJOR_VERSION = 5;
	const uint16 COM_MINOR_VERSION = 1;

	/* Body Extensions */
	const string dcom_ext_debugging = "f1f19680-4d2a-11ce-a66a-0020af6e72f4";
	const string dcom_ext_extended_error = "f1f19681-4d2a-11ce-a66a-0020af6e72f4";

	/* Component Object Model version number */


	typedef [public] struct 
	{
		uint16 MajorVersion; /* Major version number */
		uint16 MinorVersion; /* Minor version number */
	} COMVERSION;

	/* enumeration of additional information present in the call packet. */
	typedef bitmap {
		ORPCF_NULL = 			0x00, /* no additional info in packet */
		ORPCF_LOCAL = 			0x01, /* call is local to this machine */
		ORPCF_RESERVED1 = 		0x02, /* reserved for local use */
		ORPCF_RESERVED2 = 		0x04, /* reserved for local use */
		ORPCF_RESERVED3 = 		0x08, /* reserved for local use */
		ORPCF_RESERVED4 = 	    0x10  /* reserved for local use */
	} ORPC_FLAGS;

	/* Extension to implicit parameters. */
	typedef [public] struct 
	{ 	
		GUID id; /* Extension identifier. */
		uint32 size; /* Extension size. */
		[size_is(((size+7)&~7))] uint8 data[]; /* Extension data. */
	} 	ORPC_EXTENT;


	/* Array of extensions. */
	typedef struct 
	{
		uint32 size; /* Num extents. */
		uint32 reserved; /* Must be zero. */
		[size_is(((size+1)&~1))] ORPC_EXTENT **extent; /* extents */
	} ORPC_EXTENT_ARRAY;


	/* implicit 'this' pointer which is the first [in] parameter on */
	/* every ORPC call. */
	typedef [public] struct 
	{
		COMVERSION version; /* COM version number */
		uint32 flags; /* ORPCF flags for presence of other data */
		uint32 reserved1; /* set to zero */
		GUID cid; /* causality id of caller */
		/* Extensions. */
		[unique] ORPC_EXTENT_ARRAY *extensions;
	} 	ORPCTHIS;


	/* implicit 'that' pointer which is the first [out] parameter on */
	/* every ORPC call. */
	typedef [public] struct 
	{
		uint32 flags; /* ORPCF flags for presence of other data */
		/* Extensions. */
		[unique] ORPC_EXTENT_ARRAY *extensions;
	} 	ORPCTHAT;


	/* DUALSTRINGARRAYS are the return type for arrays of network addresses, */
	/* arrays of endpoints and arrays of both used in many ORPC interfaces */
	typedef [public,flag(NDR_NOALIGN)] struct 
	{
		uint16 wTowerId; /* Cannot be zero. */
		nstring NetworkAddr; 
	} 	STRINGBINDING;

	typedef [public,nopush,nopull,noprint] struct 
	{
		STRINGBINDING **stringbindings;
	} STRINGARRAY;

	typedef [public,nopush,nopull,noprint] struct 
	{
		STRINGBINDING **stringbindings;
		SECURITYBINDING **securitybindings;
	} DUALSTRINGARRAY;

	const uint16 COM_C_AUTHZ_NONE = 0xffff;
	typedef [public,flag(NDR_NOALIGN)] struct 
	{
		uint16 wAuthnSvc; /* Cannot be zero. */
		uint16 wAuthzSvc;
		nstring PrincName; 
	} 	SECURITYBINDING;

	/* signature value for OBJREF (object reference, actually the */
	/* marshaled form of a COM interface). 
	 * MEOW apparently stands for "Microsoft Extended Object Wireformat"
	 */
	const uint32 OBJREF_SIGNATURE = 0x574f454d; /* 'MEOW' */

	/* flag values for OBJREF */
	typedef enum {
		OBJREF_NULL = 0x0, /* NULL pointer */
		OBJREF_STANDARD = 0x1, /* standard marshaled objref */
		OBJREF_HANDLER = 0x2, /* handler marshaled objref */
		OBJREF_CUSTOM = 0x4 /* custom marshaled objref */
	} OBJREF_FLAGS;

	/* Flag values for a STDOBJREF (standard part of an OBJREF). */
	/* SORF_OXRES1 - SORF_OXRES8 are reserved for the object exporters */
	/* use only, object importers must ignore them and must not enforce MBZ. */
	typedef bitmap {
		SORF_NULL   = 0x0000, /* convenient for initializing SORF */
		SORF_OXRES1 = 0x0001, /* reserved for exporter */
		SORF_OXRES2 = 0x0020, /* reserved for exporter */
		SORF_OXRES3 = 0x0040, /* reserved for exporter */
		SORF_OXRES4 = 0x0080, /* reserved for exporter */
		SORF_OXRES5 = 0x0100, /* reserved for exporter */
		SORF_OXRES6 = 0x0200, /* reserved for exporter */
		SORF_OXRES7 = 0x0400, /* reserved for exporter */
		SORF_OXRES8 = 0x0800, /* reserved for exporter */
		SORF_NOPING = 0x1000  /* Pinging is not required  */
	} STDOBJREF_FLAGS;

	/* standard object reference */
	typedef [public] struct 
	{
		uint32 flags; /* STDOBJREF flags (see above) */
		uint32 cPublicRefs; /* count of references passed */
		hyper oxid; /* oxid of server with this oid */
		hyper oid; /* oid of object with this ipid */
		GUID ipid; /* ipid of interface pointer to this object */
	} 	STDOBJREF;

	typedef struct
	{
		STDOBJREF std; /* standard objref */
		STRINGARRAY saResAddr; /* resolver address */
	} u_standard;

	typedef struct
	{
		STDOBJREF std; /* standard objref */
		GUID clsid; /* Clsid of handler code */
		STRINGARRAY saResAddr; /* resolver address */
	} u_handler;

	typedef struct
	{
		GUID clsid; /* Clsid of unmarshaling code */
		uint32 cbExtension; /* size of extension data */
		uint32 size; /* size of data that follows */
		uint8 pData[size]; /* extension + class specific data */
	} u_custom;

	typedef struct
	{
	} u_null;

	typedef [nodiscriminant] union 
	{
		[case(OBJREF_NULL)] u_null u_null;
		[case(OBJREF_STANDARD)] u_standard u_standard;
		[case(OBJREF_HANDLER)] u_handler u_handler;
		[case(OBJREF_CUSTOM)] u_custom u_custom;
	} OBJREF_Types;

	/* OBJREF is the format of a marshaled interface pointer. */
	typedef [public,flag(NDR_LITTLE_ENDIAN)] struct 
	{
		uint32 signature;
		uint32 flags; /* OBJREF flags (see above) */
		GUID iid; /* interface identifier */
		[switch_is(flags), switch_type(uint32)] OBJREF_Types u_objref;
	} OBJREF;

	/* wire representation of a marshalled interface pointer */
	typedef [public] struct 
	{
		uint32 size;
		[subcontext(4)] OBJREF obj;
	} MInterfacePointer;

	typedef [v1_enum,public] enum 
	{
		COM_OK 				= 0x00000000,
		COM_OUTOFMEMORY 	= 0x80000002,
		COM_INVALIDARG		= 0x80000003,
		COM_NOINTERFACE		= 0x80000004,
		COM_ACCESSDENIED	= 0x80070005,
		COM_INVALID_OXID	= 0x80070776,
		COM_INVALID_OID		= 0x80070777,
		COM_INVALID_SET		= 0x80070778,
		COM_UNEXPECTED		= 0x8000FFFF,
		COM_CLSNOTFOUND		= 0x80040154
	} COMRESULT;
}