summaryrefslogblamecommitdiffstats
path: root/private/ole32/dbgexts/dipid.h
blob: 3bdba1c06b8b9338a9c7cf454422f19732cc8aaa (plain) (tree)










































































































                                                                               
//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1995
//
//  File:       dipid.h
//
//  Contents:   Contains structure definitons for the significant OXID and
//              IPID structures which the ntsd extensions need to access.
//              These ole classes cannot be accessed more cleanly because
//              typically the members of interest are protected.
//
//              WARNING.  IF THE REFERENCED OLE CLASSES CHANGE, THEN THESE
//              DEFINITIONS MUST CHANGE!
//
//  History:    08-11-95 BruceMa    Created
//
//--------------------------------------------------------------------------



typedef GUID OXID;


struct IPID
{
    WORD  offset;     // These are reversed because of little-endian
    WORD  page;       // These are reversed because of little-endian
    DWORD pid;
    DWORD tid;
    DWORD seq;
};


struct  STRINGARRAY
{
    unsigned long size;
    unsigned short awszStringArray[1];
};



struct SOXIDEntry
{
    struct SOXIDEntry  *pPrev;	    // previous entry on inuse list
    struct SOXIDEntry  *pNext;	    // next entry on free/inuse list
    DWORD		dwPid;	    // process id of server
    DWORD		dwTid;	    // thread id of server
    OXID		oxid;	    // object exporter identifier
    STRINGARRAY        *psa;	    // ptr to server obj exp string arrary
    DWORD		dwFlags;    // state flags
    handle_t		hServer;    // rpc binding handle of server
    void               *pRU;        // proxy for Remote Unknown
    IPID		ipidRundown;// IPID of IRundown and Remote Unknown
    LONG		cRefs;	    // count of IPIDs using this OXIDEntry
};




typedef enum tagOXIDFLAGS
{
    OXIDF_REGISTERED	= 1,	    // oxid is registered with Resolver
    OXIDF_MACHINE_LOCAL = 2,	    // oxid is local to this machine
    OXIDF_STOPPED	= 4,	    // thread can no longer receive calls
    OXIDF_PENDINGRELEASE= 8	    // oxid entry is already being released
} OXIDFLAGS;


#define OXIDTBL_PAGESIZE	4096


// Forward reference
struct SRpcChannelBuffer;


struct SIPIDEntry
{
    IPID		ipid;	    // interface pointer identifier
    IID 		iid;	    // interface iid
    SRpcChannelBuffer  *pChnl;	    // channel pointer
    IUnknown	       *pStub;	    // proxy or stub pointer
    void	       *pv;	    // real interface pointer
    SOXIDEntry	       *pOXIDEntry; // ptr to OXIDEntry in OXID Table
    DWORD		dwFlags;    // flags (see IPIDFLAGS)
    ULONG		cStrongRefs;// strong reference count
    ULONG		cWeakRefs;  // weak reference count
    LONG		iNextOID;   // next entry in this table for same object
};



typedef enum tagIPIDFLAGS
{
    IPIDF_CONNECTING   = 1,	    // ipid is being connected
    IPIDF_DISCONNECTED = 2,	    // ipid is disconnected
    IPIDF_SERVERENTRY  = 4,	    // SERVER IPID vs CLIENT IPID
    IPIDF_NOPING       = 8,	    // dont need to ping the server or release
    IPIDF_VACANT       = 128	    // entry is vacant (ie available to reuse)
} IPIDFLAGS;


#define IPIDTBL_PAGESIZE	4096
#define IPIDTBL_PAGESHIFT	16
#define IPIDTBL_PAGEMASK	0x0000ffff

#define IPIDsPerPage            (IPIDTBL_PAGESIZE / sizeof(SIPIDEntry))