//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1995.
//
//  File:
//      dscm.idl
//
//  Contents:
//      Definition of private COM interface between ole32.dll
//      and the SCM.
//
//  History:
//
//--------------------------------------------------------------------------
[
  uuid(00000136-0000-0000-C000-000000000046),
  version(0.0),
  pointer_default(unique)
#ifndef RAW
  ,object
#endif
]

interface IDSCM
#ifndef RAW
    : IUnknown
#endif
{
#ifndef DO_NO_IMPORTS
    import "iface.idl";
    import "wtypes.idl";
    import "objidl.idl";
    import "obase.idl";
#endif
    #include "comhndl.h"

    COM_DEFINES(IDSCM)

    //
    // Clsid            - CLSID to activate
    // pServerInfo      - Location/Security info specified by client
    // pwszWinstaDesktop- Client's winsta\desktop
    // ClsContext       - Class context requested
    // ProcessSignature - Client's process reference for rpcss
    // pEnvBlock        - The optional client environment block.
    // EnvBlockSize     - Chars (including 2 trailing nulls) in the env block.
    //
    typedef struct _ACTIVATION_INFO
    {
        GUID            Clsid;
        [string] WCHAR *pwszServerName;
        COAUTHINFO  *   pAuthInfo;
        [string] WCHAR *pwszWinstaDesktop;
        DWORD           ClsContext;
        ULONG64         ProcessSignature;
#ifndef _CHICAGO_
        [size_is(EnvBlockLength)]
        WCHAR *         pEnvBlock;
        DWORD           EnvBlockLength;
#endif //_CHICAGO_
        ULONG           RestrictedSidCount;
        [size_is(RestrictedSidCount)]
        SID_AND_ATTRIBUTES * pRestrictedSids;
    } ACTIVATION_INFO;

    HRESULT SCMGetClassObject(
        COM_HANDLE
        [in] ACTIVATION_INFO *          pActivationInfo,
        [in] IID *                      pIID,

        //
        // OR piggyback of ClientResolveOXID.
        //
        [in] long                       Apartment,
        [out] OXID *                    pOxidServer,
        [out] DUALSTRINGARRAY **        ppServerORBindings,
        [out] OXID_INFO *               pOxidInfo,
        [out] MID *                     pLocalMidOfRemote,

        [out] DWORD *                   pDllServerModel,
        [out,string] WCHAR **           ppwszDllServer,

        // ClassFactory interface data.
        [out] MInterfacePointer **      ppIDClassFactory
        );

    HRESULT SCMCreateInstance(
        COM_HANDLE
        [in] ACTIVATION_INFO *          pActivationInfo,

        [in] DWORD                      Interfaces,
        [in,size_is(Interfaces)] IID *  pIIDs,

        //
        // OR piggyback of ClientResolveOXID.
        //
        [in] long                       Apartment,
        [out] OXID *                    pOxidServer,
        [out] DUALSTRINGARRAY **        ppServerORBindings,

        [out] OXID_INFO *               pOxidInfo,
        [out] MID *                     pLocalMidOfRemote,

        [out] DWORD *                   pDllServerModel,
        [out,string] WCHAR **           ppwszDllServer,

        // Interface data and results.
        [out,size_is(Interfaces)] MInterfacePointer **  ppInterfaceData,
        [out,size_is(Interfaces)] HRESULT *             pResults
        );

    HRESULT SCMGetPersistentInstance(
        COM_HANDLE
        [in] ACTIVATION_INFO *          pActivationInfo,

        [in, string, unique] WCHAR *    pwszPath,
        [in, unique] MInterfacePointer *pIFDStorage,
        [in] DWORD                      FileMode,
#ifdef DFSACTIVATION
        [in] BOOL                       FileWasOpened,
#endif
        [in] DWORD                      Interfaces,
        [in,size_is(Interfaces)] IID *  pIIDs,

        //
        // OR piggyback of ClientResolveOXID.
        //
        [in] long                       Apartment,
        [out] OXID *                    pOxidServer,
        [out] DUALSTRINGARRAY **        ppServerORBindings,

        [out] OXID_INFO *               pOxidInfo,
        [out] MID *                     pLocalMidOfRemote,

        [out] BOOL *                    pFoundInROT,

        [out] DWORD *                   pDllServerModel,
        [out,string] WCHAR **           ppwszDllServer,

        // Interface data and results.
        [out,size_is(Interfaces)] MInterfacePointer **  ppInterfaceData,
        [out,size_is(Interfaces)] HRESULT *             pResults
        );
}
