[
    uuid(12b81e99-f207-4a4c-85d3-77b42f76fd14),
    version(1.0),
    pointer_default(unique)
]

interface ISeclogon
{
    typedef struct _SECL_STRING { 
        unsigned long  ccLength;
        unsigned long  ccSize; 
        [size_is(ccSize), length_is(ccLength)] 
        wchar_t       *pwsz; 
    } SECL_STRING, *PSECL_STRING; 

    typedef struct _SECL_BLOB { 
        unsigned long  cb;
        [size_is(cb)]
        unsigned char *pb;
    } SECL_BLOB, *PSECL_BLOB; 

    typedef struct _SECL_SLI {
        SECL_STRING     ssUsername;
        SECL_STRING     ssDomain;
        SECL_STRING     ssPassword;
        SECL_STRING     ssApplicationName;
        SECL_STRING     ssCommandLine;
        SECL_STRING     ssCurrentDirectory;
        SECL_STRING     ssTitle; 
        SECL_STRING     ssDesktop;

        SECL_BLOB       sbEnvironment;

        unsigned long   ulProcessId;
        unsigned long   ulLogonIdLowPart;
        signed   long   lLogonIdHighPart;
        unsigned long   ulLogonFlags;
        unsigned long   ulCreationFlags;
        
        // Private, used by seclogon:
        unsigned    long  ulSeclogonFlags;  
        unsigned __int64  hWinsta;  // Handle to the client's windowstation
        unsigned __int64  hDesk;    // Handle to the client's desktop
    } SECL_SLI, *PSECL_SLI;

    typedef struct _SECL_SLRI {
        unsigned __int64   hProcess; 
        unsigned __int64   hThread; 
        unsigned long      ulProcessId; 
        unsigned long      ulThreadId; 
        unsigned long      ulErrorCode;
    } SECL_SLRI, *PSECL_SLRI;


    void SeclCreateProcessWithLogonW
        ([in]       handle_t    hRPCBinding, 
         [in, ref]  SECL_SLI   *psli, 
         [out, ref] SECL_SLRI  *pslri); 

};

cpp_quote("#define wszSeclogonSharedProcEndpointName L\"SECLOGON\"")
cpp_quote("#define wszSvcName                        L\"seclogon\"")

cpp_quote("#define SECLOGON_CALLER_SPECIFIED_DESKTOP   0x00000001")