//+-------------------------------------------------------------------------
//
//  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;




