//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (c) Microsoft Corporation. All rights reserved. // // File: obase.idl // // Synopsis: this file contain the base definitions for object // interface references. // //+------------------------------------------------------------------------- [ uuid(99fcfe60-5260-101b-bbcb-00aa0021347a), pointer_default(unique) ] interface ObjectRpcBaseTypes { #ifndef DO_NO_IMPORTS import "wtypes.idl"; #endif //////////////////////////////////////////////////////////// // // Identifier Definitions // //////////////////////////////////////////////////////////// typedef unsigned hyper ID; typedef ID MID; // Machine Identifier typedef ID OXID; // Object Exporter Identifier typedef ID OID; // Object Identifer typedef ID SETID; // Ping Set Identifier typedef GUID IPID; // Interface Pointer Identifier typedef GUID CID; // Causality Identifier typedef REFGUID REFIPID; //////////////////////////////////////////////////////////// // // Definitions of Location Elements // //////////////////////////////////////////////////////////// typedef DWORD APTID; typedef DWORD PROCID; typedef DWORD CTXTID; ////////////////////////////////////////////////////////////////// // // ORPC Call Packet Format // ////////////////////////////////////////////////////////////////// // 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 (DCOM95 build 1120 and beyond) // - OLEAUT32 added two new types to the SAFEARRAY, but SAFEARRAY // previously included the "default" keyword, which prevented // downevel NDR engines from correctly handling any extensions. // Machines with version >=5.3 don't use "default" and will // gracefully handle future extensions to SAFEARRAY. // COM_MINOR_VERSION = 4 (NT5.0 1779, NT4 SP4, DCOM95 2328, and beyond) // - 1) Fix for incorrect marshal/unmarshal of array of interface // pointers by NDR. Wire representation is corrected. // - 2) Fix wire representation of a conformant struct embedded in a // complex struct. // Both fixes kick in when DCOM version is >= 5.4 or the call // is raw RPC. See NT BUG# 80139. // COM_MINOR_VERSION = 5 (Unused) // - Not used because we do not want matching major and // minor versions // COM_MINOR_VERSION = 6 (NT5.0 and beyond). // - Added EXTENDED_OBJREF which is an extensible form of OBJREF // useful for carrying additional data along with STDOBJREF // old constants (for convenience) const unsigned short COM_MINOR_VERSION_1 = 1; // current version const unsigned short COM_MAJOR_VERSION = 5; const unsigned short COM_MINOR_VERSION = 6; // Component Object Model version number typedef struct tagCOMVERSION { unsigned short MajorVersion; // Major version number unsigned short MinorVersion; // Minor version number } COMVERSION; // enumeration of additional information present in the call packet. // Should be an enum but DCE IDL does not support sparse enumerators. const unsigned long ORPCF_NULL = 0; // no additional info in packet const unsigned long ORPCF_LOCAL = 1; // call is local to this machine const unsigned long ORPCF_RESERVED1 = 2; // reserved for local use const unsigned long ORPCF_RESERVED2 = 4; // reserved for local use const unsigned long ORPCF_RESERVED3 = 8; // reserved for local use const unsigned long ORPCF_RESERVED4 = 16; // reserved for local use // Extension to implicit parameters. typedef struct tagORPC_EXTENT { GUID id; // Extension identifier. unsigned long size; // Extension size. [size_is((size+7)&~7)] byte data[]; // Extension data. } ORPC_EXTENT; // Array of extensions. typedef struct tagORPC_EXTENT_ARRAY { unsigned long size; // Num extents. unsigned long reserved; // Must be zero. [size_is((size+1)&~1,), unique] ORPC_EXTENT **extent; // extents } ORPC_EXTENT_ARRAY; // implicit 'this' pointer which is the first [in] parameter on // every ORPC call. typedef struct tagORPCTHIS { COMVERSION version; // COM version number unsigned long flags; // ORPCF flags for presence of other data unsigned long reserved1; // set to zero CID 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 struct tagORPCTHAT { unsigned long flags; // ORPCF flags for presence of other data // Extensions. [unique] ORPC_EXTENT_ARRAY *extensions; } ORPCTHAT; ////////////////////////////////////////////////////////////////// // // Marshaled COM Interface Wire Format // ////////////////////////////////////////////////////////////////// // DUALSTRINGARRAYS are the return type for arrays of network addresses, // arrays of endpoints and arrays of both used in many ORPC interfaces const unsigned short NCADG_IP_UDP = 0x08; const unsigned short NCACN_IP_TCP = 0x07; const unsigned short NCADG_IPX = 0x0E; const unsigned short NCACN_SPX = 0x0C; const unsigned short NCACN_NB_NB = 0x12; const unsigned short NCACN_NB_IPX = 0x0D; const unsigned short NCACN_DNET_NSP = 0x04; const unsigned short NCALRPC = 0x10; // const unsigned short MSWMSG = 0x01; // note: not a real tower id. // This is the return type for arrays of string bindings or protseqs // used by many ORPC interfaces. // Not used for DCOM: // ncacn_np // ncacn_nb_tcp // ncacn_nb_ipx // ncacn_nb_xns // ncacn_at_dsp // ncadg_at_ddp // ncacn_vns_spp typedef struct tagSTRINGBINDING { unsigned short wTowerId; // Cannot be zero. unsigned short aNetworkAddr; // Zero terminated. } STRINGBINDING; const unsigned short COM_C_AUTHZ_NONE = 0xffff; typedef struct tagSECURITYBINDING { unsigned short wAuthnSvc; // Cannot be zero. unsigned short wAuthzSvc; // Must not be zero. unsigned short aPrincName; // Zero terminated. } SECURITYBINDING; typedef struct tagDUALSTRINGARRAY { unsigned short wNumEntries; // Number of entries in array. unsigned short wSecurityOffset; // Offset of security info. // The array contains two parts, a set of STRINGBINDINGs // and a set of SECURITYBINDINGs. Each set is terminated by an // extra zero. The shortest array contains four zeros. [size_is(wNumEntries)] unsigned short aStringArray[]; } DUALSTRINGARRAY; // signature value for OBJREF (object reference, actually the // marshaled form of a COM interface). const unsigned long OBJREF_SIGNATURE = 0x574f454d; // 'MEOW' // flag values for OBJREF const unsigned long OBJREF_STANDARD = 0x1; // standard marshaled objref const unsigned long OBJREF_HANDLER = 0x2; // handler marshaled objref const unsigned long OBJREF_CUSTOM = 0x4; // custom marshaled objref const unsigned long OBJREF_EXTENDED = 0x8; // Extended standard objref // 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. const unsigned long SORF_OXRES1 = 0x1; // reserved for exporter const unsigned long SORF_OXRES2 = 0x20; // reserved for exporter const unsigned long SORF_OXRES3 = 0x40; // reserved for exporter const unsigned long SORF_OXRES4 = 0x80; // reserved for exporter const unsigned long SORF_OXRES5 = 0x100;// reserved for exporter const unsigned long SORF_OXRES6 = 0x200;// reserved for exporter const unsigned long SORF_OXRES7 = 0x400;// reserved for exporter const unsigned long SORF_OXRES8 = 0x800;// reserved for exporter const unsigned long SORF_NULL = 0x0; // convenient for initializing SORF const unsigned long SORF_NOPING = 0x1000;// Pinging is not required // standard object reference typedef struct tagSTDOBJREF { unsigned long flags; // STDOBJREF flags (see above) unsigned long cPublicRefs; // count of references passed OXID oxid; // oxid of server with this oid OID oid; // oid of object with this ipid IPID ipid; // ipid of Interface } STDOBJREF; // data item typedef struct tagDATAELEMENT { GUID dataID; // id of data unsigned long cbSize; // size of data unsigned long cbRounded; // rounded size [size_is((cbSize+7)&~7)] BYTE Data[]; // data } DATAELEMENT; // Objref data typedef struct tagOBJREFDATA { unsigned long nElms; // number of elements [size_is(nElms+1-(nElms & 1),), unique] DATAELEMENT **ppElmArray; // elements } OBJREFDATA; // OBJREF is the format of a marshaled interface pointer. typedef struct tagOBJREF { unsigned long signature; // must be OBJREF_SIGNATURE unsigned long flags; // OBJREF flags (see above) GUID iid; // interface identifier [switch_is(flags), switch_type(unsigned long)] union { [case(OBJREF_STANDARD)] struct { STDOBJREF std; // standard objref DUALSTRINGARRAY saResAddr; // resolver address } u_standard; [case(OBJREF_HANDLER)] struct { STDOBJREF std; // standard objref CLSID clsid; // Clsid of handler code DUALSTRINGARRAY saResAddr; // resolver address } u_handler; [case(OBJREF_CUSTOM)] struct { CLSID clsid; // Clsid of unmarshaling code unsigned long cbExtension;// size of extension data unsigned long size; // size of data that follows [size_is(size), ref] byte *pData; // extension + class specific data } u_custom; [case(OBJREF_EXTENDED)] struct { STDOBJREF std; // standard objref [unique] OBJREFDATA *pORData; // objref data DUALSTRINGARRAY saResAddr; // resolver address } u_extended; } u_objref; } OBJREF; // wire representation of a marshalled interface pointer typedef struct tagMInterfacePointer { ULONG ulCntData; // size of data [size_is(ulCntData)] BYTE abData[]; // data (OBJREF) } MInterfacePointer; typedef [unique] MInterfacePointer * PMInterfacePointer; ////////////////////////////////////////////////////////////////// // // OXID Resolution // ////////////////////////////////////////////////////////////////// // OXID Resolver information associated with each OXID. typedef struct tagOXID_INFO { DWORD dwTid; // thread id of object exporter DWORD dwPid; // process id of object exporter DWORD dwAuthnHint; // authentication hint COMVERSION version; // COM Version of server IPID ipidRemUnknown; // IRemUnknown IPID for object exporter DWORD dwFlags; // miscellaneous flags [unique] DUALSTRINGARRAY *psa; // protocol and security info } OXID_INFO; ////////////////////////////////////////////////////////////////// // // Static Marshaler // ////////////////////////////////////////////////////////////////// // custom extensions typedef struct tagSTCMSHL_EXTENSION { ULONG cbSize; // size, in bytes, of entire extension GUID type; // type of extension BYTE data[1]; // extension data } STCMSHL_EXTENSION; typedef struct tagSTCMSHL_EXTENSION_ARRAY { ULONG cbSize; // size, in bytes, of entire extension ULONG cElems; // count of extension records; STCMSHL_EXTENSION data[1]; // extension records; } STCMSHL_EXTENSION_ARRAY; } ////////////////////////////////////////////////////////////////// // // Generic blob definition, with 8 byte aligned buffer // ////////////////////////////////////////////////////////////////// typedef struct tagOpaqueData { GUID guid; unsigned long dataLength; unsigned long reserved1; unsigned long reserved2; [size_is((dataLength+7)&~7)] BYTE *data; } OpaqueData;