[
    uuid(621dff68-3c39-4c6c-aae3-e68e2c6503ad),
    version(1.0),
#ifdef __midl
    ms_union,
#endif // __midl
    endpoint("mscn_np:[\\pipe\\wzcsvc]"),
    pointer_default(unique)
]
interface winwzc
{
import "import.idl";

typedef [handle] wchar_t* STRING_HANDLE;

typedef [context_handle] void * WZC_DBLOG_SESSION_HANDLE;


typedef struct _WZC_DB_RECORD_CONTAINER {

    DWORD dwNumRecords;
    [size_is(dwNumRecords)] PWZC_DB_RECORD pWZCRecords;

} WZC_DB_RECORD_CONTAINER, * PWZC_DB_RECORD_CONTAINER;


DWORD
RpcEnumInterfaces(
    [in, string, unique] STRING_HANDLE     pSrvAddr,
    [ref, out]           PINTFS_KEY_TABLE  pIntfsTable);

DWORD
RpcQueryInterface(
    [in, string, unique] STRING_HANDLE pSrvAddr,
    [in]                 DWORD         dwInFlags,
    [ref, in, out]       PINTF_ENTRY   pIntfEntry,
    [unique, in, out]    LPDWORD       pdwOutFlags);

DWORD
RpcSetInterface(
    [in, string, unique] STRING_HANDLE pSrvAddr,
    [in]                 DWORD         dwInFlags,
    [ref, in]            PINTF_ENTRY   pIntfEntry,
    [unique, in, out]    LPDWORD       pdwOutFlags);

DWORD
RpcRefreshInterface(
    [in, string, unique] STRING_HANDLE pSrvAddr,
    [in]                 DWORD         dwInFlags,
    [ref, in]            PINTF_ENTRY   pIntfEntry,
    [unique, in, out]    LPDWORD       pdwOutFlags);

DWORD
RpcQueryContext(
    [in, string, unique] STRING_HANDLE pSrvAddr,
    [in]                 DWORD         dwInFlags,
    [ref, in, out]       PWZC_CONTEXT  pContext,
    [unique, in, out]    LPDWORD       pdwOutFlags);

DWORD
RpcSetContext(
    [in, string, unique] STRING_HANDLE pSrvAddr,
    [in]                 DWORD         dwInFlags,
    [ref, in]            PWZC_CONTEXT  pContext,
    [unique, in, out]    LPDWORD       pdwOutFlags);
	
DWORD
RpcEapolUIResponse (
    [in, string, unique]        STRING_HANDLE           pSrvAddr,
    [in]                        EAPOL_EAP_UI_CONTEXT    EapolUIContext,
    [in]                        EAPOLUI_RESP            EapolUIResp);

DWORD
RpcEapolGetCustomAuthData (
    [in, string, unique]        STRING_HANDLE pSrvAddr,
    [in, string]                PWCHAR        pwszGuid,
    [in]                        DWORD         dwEapTypeId,
    [in]                        RAW_DATA      rdSSID,
    [in, out]                   PRAW_DATA     prdConnInfo);
    
DWORD
RpcEapolSetCustomAuthData (
    [in, string, unique]        STRING_HANDLE pSrvAddr,
    [in, string]                PWCHAR        pwszGuid,
    [in]                        DWORD         dwEapTypeId,
    [in]                        RAW_DATA      rdSSID,
    [in, out]                   PRAW_DATA     prdConnInfo);
    
DWORD
RpcEapolGetInterfaceParams (
    [in, string, unique]        STRING_HANDLE pSrvAddr,
    [in, string]                PWCHAR        pwszGuid,
    [ref, in, out]              PEAPOL_INTF_PARAMS  pIntfParams);
    
DWORD
RpcEapolSetInterfaceParams (
    [in, string, unique]        STRING_HANDLE pSrvAddr,
    [in, string]                PWCHAR        pwszGuid,
    [ref, in, out]              PEAPOL_INTF_PARAMS  pIntfParams);

DWORD
RpcEapolReAuthenticateInterface (
    [in, string, unique]        STRING_HANDLE pSrvAddr,
    [in, string]                PWCHAR        pwszGuid);
    
DWORD
RpcEapolQueryInterfaceState (
    [in, string, unique]        STRING_HANDLE pSrvAddr,
    [in, string]                PWCHAR        pwszGuid,
    [ref, in, out]              PEAPOL_INTF_STATE  pIntfState);

DWORD
RpcOpenWZCDbLogSession(
    [in, string, unique] STRING_HANDLE pServerName,
    [out] WZC_DBLOG_SESSION_HANDLE * phSession
    );

DWORD
RpcCloseWZCDbLogSession(
    [in, out] WZC_DBLOG_SESSION_HANDLE * phSession
    );


DWORD
RpcAddWZCDbLogRecord(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PWZC_DB_RECORD_CONTAINER pRecordContainer
    );


DWORD
RpcEnumWZCDbLogRecords(
    [in] WZC_DBLOG_SESSION_HANDLE hSession,
    [in] PWZC_DB_RECORD_CONTAINER pTemplateRecordContainer,
    [in, out, unique] PBOOL pbEnumFromStart,
    [in] DWORD dwPreferredNumEntries,
    [in, out] PWZC_DB_RECORD_CONTAINER * ppRecordContainer
    );


DWORD
RpcFlushWZCDbLog(
    [in] WZC_DBLOG_SESSION_HANDLE hSession
    );

DWORD
RpcGetWZCDbLogRecord(
    [in] WZC_DBLOG_SESSION_HANDLE hSession,
    [in] PWZC_DB_RECORD_CONTAINER pTemplateRecordContainer,
    [in, out] PWZC_DB_RECORD_CONTAINER * ppRecordContainer
    );    
}

