//[ ITest_itf
//+-------------------------------------------------------------------
//
//  Interface:  ITest (ib)
//
//  Purpose:    Interface for manipulating performance
//
//  History:    5-Oct-93        AlexMit         Created
//
//  Notes:
//
//--------------------------------------------------------------------

import "unknwn.idl";

#ifdef NEVER
[
  uuid(fc693210-cbeb-11d0-9b61-00c04fc3398c)
]
pipe_interface long ILongPipe;
#else
[
  object,
  uuid(fc693210-cbeb-11d0-9b61-00c04fc3398c),
  pointer_default(unique)
]

interface ILongPipe : IUnknown
{
    HRESULT Alloc  ( [in] ULONG bsize, [out] LONG **pbuf, [out] ULONG *bcount );
    HRESULT Push   ( [in] LONG *buf, [in] ULONG ecount );
    HRESULT Pull   ( [in] LONG *buf, [in] ULONG esize, [out] ULONG *ecount );
}
#endif

[
  object,
  uuid(60000300-76d7-11cf-9af1-0020af6e72f4),
  pointer_default(unique)
]

interface ITest : IUnknown
{
    import "objidl.idl";
    import "accctrl.h";

    typedef struct
    {
      DWORD process;
      DWORD thread;
      DWORD sequence;
    } SAptId;

    typedef struct
    {
      UCHAR Value[6];
    } HACKHACKHACK_SID_IDENTIFIER_AUTHORITY;

    typedef struct
    {
      UCHAR Revision;
      UCHAR SubAuthorityCount;
      HACKHACKHACK_SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
#ifdef MIDL_PASS
      [size_is(SubAuthorityCount)] ULONG SubAuthority[*];
#else // MIDL_PASS
      ULONG SubAuthority[ANYSIZE_ARRAY];
#endif // MIDL_PASS
    } HACKSID;

    typedef [string]             wchar_t       *STRING;
    typedef [string]             wchar_t       *KEEP_STRING;
    typedef [transmit_as(DWORD)] DWORD          transmit_crash;
    typedef                      PACTRL_ACCESSW PACTRL_ACCESSW_ALLOCATE;

    HRESULT align                  ( [in] unsigned char x[17] );
    HRESULT by_the_way             ( [in] DWORD );
    HRESULT call_canceled          ( [in] long recurse, [in] long cancel,
                                     [in] ITest *callback );
    HRESULT call_dead              ();
    HRESULT call_me_back           ( [in] ITest *callback );
    HRESULT call_next              ();
    HRESULT callback               ();
    HRESULT cancel                 ();
    HRESULT cancel_now             ();
    HRESULT cancel_pending_call    ( [out] DWORD *thread );
    HRESULT cancel_stress          ( [in] ITest *obj );
    HRESULT catch_at_top           ( [in] BOOL catch_me_im_falling,
                                     [in] ITest *callback,
                                     [in] KEEP_STRING binding );
    HRESULT check                  ( [in] SAptId id );
    HRESULT check_hook             ( [in] DWORD cg1, [in] DWORD cn1,
                                     [in] DWORD sg1, [in] DWORD sn1,
                                     [in] DWORD cg2, [in] DWORD cn2,
                                     [in] DWORD sg2, [in] DWORD sn2,
                                     [in] BOOL dh1,  [in] BOOL dh2 );
    HRESULT count                  ();
    HRESULT crash_out              ( [out] transmit_crash *data );
    HRESULT decrypt                ( [in] DWORD  blen,
                                     [in, size_is(blen)] BYTE *buf,
                                     [in] STRING decrypted,
                                     [in] DWORD  klen,
                                     [in, unique, size_is(klen)] BYTE *key,
                                     [in, unique] STRING password );
    HRESULT delegate               ( [in] ITest *obj, [in] SAptId id,
                                     [in] STRING caller );
    HRESULT do_next                ( [in] DWORD );
    HRESULT exit                   ();
    HRESULT forget                 ();
    HRESULT get_advise             ( [out] IAdviseSink **advise );
    HRESULT get_data               ( [in] DWORD isize,
                                     [in, unique, size_is(isize)] char *idata,
                                     [in] DWORD osize,
                                     [out, size_is(,osize)] char **odata );
    HRESULT get_id                 ( [out] SAptId *id );
    HRESULT get_next               ( [out] ITest **obj, [out] SAptId *id );
    HRESULT get_next_slowly        ( [out] ITest **obj, [out] SAptId *id );
    HRESULT get_obj_from_new_apt   ( [out] ITest **obj, [out] SAptId *id );
    HRESULT get_obj_from_this_apt  ( [out] ITest **obj, [out] SAptId *id );
    HRESULT get_string             ( [in] DWORD what, [out] STRING *str );
    HRESULT interface_in           ( [in] ITest *obj );
    HRESULT interrupt              ( [in] ITest *obj, [in] SAptId id, BOOL go );
    HRESULT interrupt_marshal      ( [in] ITest *obj1, [in] ITest *obj2 );
    HRESULT list_out               ( [out] PACTRL_ACCESSW_ALLOCATE *list );
    HRESULT make_acl               ( [in] HACKSID *allow );
    HRESULT neighbor_access        ( [in] ITest *obj );
    HRESULT null                   ();
    HRESULT out                    ( [out] ITest **obj );
    HRESULT perf_access            ( [out] DWORD *grant, [out] DWORD *revoke,
                                     [out] DWORD *set, [out] DWORD *get,
                                     [out] DWORD *generate, [out] DWORD *check,
                                     [out] DWORD *cache );
#ifdef NEVER
    HRESULT pipe_in                ( [in] DWORD num, [in] DWORD block,
                                     [in] ILongPipe *p );
    HRESULT pipe_inout             ( [in] DWORD num, [in] DWORD block,
                                     [in] ILongPipe *pi, [out] ILongPipe *po );
    HRESULT pipe_out               ( [in] DWORD num, [in] DWORD block,
                                     [out] ILongPipe *po );
#endif
    HRESULT pointer                ( [in] DWORD *ptr );
    HRESULT pound                  ();
    HRESULT recurse                ( [in] ITest *callback, [in] ULONG depth );
    HRESULT recurse_delegate       ( [in] ITest *callback, [in] ULONG depth,
                                     [in] STRING Caller );
    HRESULT recurse_disconnect     ( [in] ITest *callback, [in] ULONG depth );
    HRESULT recurse_excp           ( [in] ITest *callback, [in] ULONG depth );
    HRESULT recurse_fatal          ( [in] ITest *callback,
                                     [in] ULONG catch_depth,
                                     [in] ULONG throw_depth,
                                     [in] BOOL  cancel );
    HRESULT register_hook          ( [in] GUID ext, [in] DWORD seq );
    HRESULT recurse_interrupt      ( [in] ITest *callback, [in] ULONG depth );
    HRESULT recurse_secure         ( [in] ITest *callback, [in] ULONG depth,
                                     [in] ULONG imp_depth, [in] STRING Caller );
    HRESULT register_message_filter( BOOL );
    HRESULT register_rpc           ( [in] STRING protseq, [out] STRING *binding );
    HRESULT reinitialize           ( [in] DWORD authn_svc );
    HRESULT reject_next            ();
    HRESULT remember               ( [in] ITest *neighbor, [in] SAptId id );
    HRESULT rest_and_die           ();
    HRESULT retry_next             ();
    HRESULT ring                   ( [in] DWORD length );
    HRESULT secure                 ( [in] SAptId id,
                                     [in] DWORD AuthnLevel, [in] DWORD ImpLevel,
                                     [in] DWORD AuthnSvc, [in] DWORD AuthzSvc,
                                     [in, unique] STRING PrincName,
                                     [in, unique] STRING Caller,
                                     [out] DWORD *QueryAuthnLevel );
    HRESULT security_performance   ( [out] DWORD *get_call,
                                     [out] DWORD *query_client,
                                     [out] DWORD *impersonate,
                                     [out] DWORD *revert );
    HRESULT set_state              ( [in] DWORD flags, [in] DWORD priority );
    HRESULT setup_access           ();
    HRESULT sick                   ( [in] ULONG throw_val );
    HRESULT sleep                  ( [in] ULONG time );
    HRESULT swap_key               ( [in] DWORD clilen,
                                     [in, unique, size_is(clilen)] BYTE *clib,
                                     [out] DWORD *serlen,
                                     [out, size_is(,*serlen)] BYTE **serb );
    HRESULT test                   ( [in] ULONG gronk );
    HRESULT what                   ( [out] DWORD * );
}

[
  object,
  uuid(60000301-76d7-11cf-9af1-0020af6e72f4),
  pointer_default(unique)
]
interface ITestNoneImp : ITest
{
    HRESULT dummy();
}

[
  object,
  uuid(60000302-76d7-11cf-9af1-0020af6e72f4),
  pointer_default(unique)
]
interface ITestConnectImp : ITest
{
    HRESULT dummy();
}

[
  object,
  uuid(60000303-76d7-11cf-9af1-0020af6e72f4),
  pointer_default(unique)
]
interface ITestEncryptImp : ITest
{
    HRESULT dummy();
}

[
  object,
  uuid(60000304-76d7-11cf-9af1-0020af6e72f4),
  pointer_default(unique)
]
interface ITestNoneId : ITest
{
    HRESULT dummy();
}

[
  object,
  uuid(60000305-76d7-11cf-9af1-0020af6e72f4),
  pointer_default(unique)
]
interface ITestConnectId : ITest
{
    HRESULT dummy();
}

[
  object,
  uuid(60000306-76d7-11cf-9af1-0020af6e72f4),
  pointer_default(unique)
]
interface ITestEncryptId : ITest
{
    HRESULT dummy();
}

//]
