/*++

Copyright (c) 1999 Microsoft Corporation


Module Name:

    spd.idl

Abstract:

    IDL file for IPSec WINAPIs.

Author:

    krishnaG    21-September-1999

Environment:

    User Level: Win32

Revision History:

    abhisheV    29-September-1999  Added the structures.
                                   Added the rpc prototypes.

--*/


[
    uuid(12345678-1234-ABCD-EF00-0123456789AB),
    version(1.0),
#ifdef __midl
        ms_union,
#endif // __midl
    endpoint("mscn_np:[\\pipe\\ipsec]"),
    pointer_default(unique)
]


interface winipsec
{

import "import.idl";

typedef [context_handle] void * TRANSPORTFILTER_HANDLE;

typedef [context_handle] void * TUNNELFILTER_HANDLE;

typedef [context_handle] void * MMFILTER_HANDLE;

typedef [context_handle] void * IKENEGOTIATION_HANDLE;

typedef [context_handle] void * IKENOTIFY_HANDLE;

typedef [handle] wchar_t * STRING_HANDLE;


typedef struct _TRANSPORT_FILTER_CONTAINER {

    DWORD dwNumFilters;
    [size_is(dwNumFilters)] PTRANSPORT_FILTER pTransportFilters;

} TRANSPORT_FILTER_CONTAINER, * PTRANSPORT_FILTER_CONTAINER;


typedef struct _TUNNEL_FILTER_CONTAINER {

    DWORD dwNumFilters;
    [size_is(dwNumFilters)] PTUNNEL_FILTER pTunnelFilters;

} TUNNEL_FILTER_CONTAINER, * PTUNNEL_FILTER_CONTAINER;


typedef struct _IPSEC_QM_POLICY_CONTAINER {

   DWORD dwNumPolicies;
   [size_is(dwNumPolicies)] PIPSEC_QM_POLICY pPolicies;

} IPSEC_QM_POLICY_CONTAINER, * PIPSEC_QM_POLICY_CONTAINER;


typedef struct _IPSEC_MM_POLICY_CONTAINER {

   DWORD dwNumPolicies;
   [size_is(dwNumPolicies)] PIPSEC_MM_POLICY pPolicies;

} IPSEC_MM_POLICY_CONTAINER, * PIPSEC_MM_POLICY_CONTAINER;


typedef struct _MM_AUTH_METHODS_CONTAINER {

   DWORD dwNumAuthMethods;
   [size_is(dwNumAuthMethods)] PMM_AUTH_METHODS pMMAuthMethods;

} MM_AUTH_METHODS_CONTAINER, * PMM_AUTH_METHODS_CONTAINER;


typedef struct _MM_FILTER_CONTAINER {

    DWORD dwNumFilters;
    [size_is(dwNumFilters)] PMM_FILTER pMMFilters;

} MM_FILTER_CONTAINER, * PMM_FILTER_CONTAINER;


typedef struct _MM_SA_CONTAINER {

    DWORD dwNumMMSAs;
    [size_is(dwNumMMSAs)] PIPSEC_MM_SA pMMSAs;

} MM_SA_CONTAINER, * PMM_SA_CONTAINER;


typedef struct _IPSEC_STATISTICS_CONTAINER {

    DWORD dwNumIpsecStats;
    [size_is(dwNumIpsecStats)] PIPSEC_STATISTICS pIpsecStatistics;

} IPSEC_STATISTICS_CONTAINER, * PIPSEC_STATISTICS_CONTAINER;


typedef struct _QM_SA_CONTAINER {

    DWORD dwNumQMSAs;
    [size_is(dwNumQMSAs)] PIPSEC_QM_SA pQMSAs;

} QM_SA_CONTAINER, * PQM_SA_CONTAINER;


typedef struct _QM_FILTER_CONTAINER {

    DWORD dwNumFilters;
    [size_is(dwNumFilters)] PIPSEC_QM_FILTER pQMFilters;

} QM_FILTER_CONTAINER, * PQM_FILTER_CONTAINER;


typedef struct _IPSEC_INTERFACE_CONTAINER {

    DWORD dwNumInterfaces;
    [size_is(dwNumInterfaces)] PIPSEC_INTERFACE_INFO pIpsecInterfaces;

} IPSEC_INTERFACE_CONTAINER, * PIPSEC_INTERFACE_CONTAINER;


DWORD
RpcAddTransportFilter(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] DWORD dwFlags,
    [in] PTRANSPORT_FILTER_CONTAINER pFilterContainer,
    [out] TRANSPORTFILTER_HANDLE * phFilter
    );


DWORD
RpcDeleteTransportFilter(
    [in, out] TRANSPORTFILTER_HANDLE * phFilter
    );


DWORD
RpcEnumTransportFilters(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] DWORD dwLevel,
    [in] GUID gGenericFilterID,
    [in, out] PTRANSPORT_FILTER_CONTAINER * ppFilterContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwResumeHandle
    );


DWORD
RpcSetTransportFilter(
    [in] TRANSPORTFILTER_HANDLE hFilter,
    [in] PTRANSPORT_FILTER_CONTAINER pFilterContainer
    );


DWORD
RpcGetTransportFilter(
    [in] TRANSPORTFILTER_HANDLE hFilter,
    [in, out] PTRANSPORT_FILTER_CONTAINER * ppFilterContainer
    );


DWORD
RpcAddQMPolicy(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] DWORD dwFlags,
    [in] PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer
    );


DWORD
RpcDeleteQMPolicy(
    [in, string, unique] STRING_HANDLE pServerName,
    [in, string, unique] LPWSTR pszPolicyName
    );


DWORD
RpcEnumQMPolicies(
    [in, string, unique] STRING_HANDLE pServerName,
    [in, out] PIPSEC_QM_POLICY_CONTAINER * ppQMPolicyContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwResumeHandle
    );


DWORD
RpcSetQMPolicy(
    [in, string, unique] STRING_HANDLE pServerName,
    [in, string, unique] LPWSTR pszPolicyName,
    [in] PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer
    );


DWORD
RpcGetQMPolicy(
    [in, string, unique] STRING_HANDLE pServerName,
    [in, string, unique] LPWSTR pszPolicyName,
    [in, out] PIPSEC_QM_POLICY_CONTAINER * ppQMPolicyContainer
    );


DWORD
RpcAddMMPolicy(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] DWORD dwFlags,
    [in] PIPSEC_MM_POLICY_CONTAINER pMMPolicyContainer
    );


DWORD
RpcDeleteMMPolicy(
    [in, string, unique] STRING_HANDLE pServerName,
    [in, string, unique] LPWSTR pszPolicyName
    );


DWORD
RpcEnumMMPolicies(
    [in, string, unique] STRING_HANDLE pServerName,
    [in, out] PIPSEC_MM_POLICY_CONTAINER * ppMMPolicyContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwResumeHandle
    );


DWORD
RpcSetMMPolicy(
    [in, string, unique] STRING_HANDLE pServerName,
    [in, string, unique] LPWSTR pszPolicyName,
    [in] PIPSEC_MM_POLICY_CONTAINER pMMPolicyContainer
    );


DWORD
RpcGetMMPolicy(
    [in, string, unique] STRING_HANDLE pServerName,
    [in, string, unique] LPWSTR pszPolicyName,
    [in, out] PIPSEC_MM_POLICY_CONTAINER * ppMMPolicyContainer
    );


DWORD
RpcAddMMFilter(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] DWORD dwFlags,
    [in] PMM_FILTER_CONTAINER pMMFilterContainer,
    [out] MMFILTER_HANDLE * phMMFilter
    );


DWORD
RpcDeleteMMFilter(
    [in, out] MMFILTER_HANDLE * phMMFilter
    );


DWORD
RpcEnumMMFilters(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] DWORD dwLevel,
    [in] GUID gGenericFilterID,
    [in, out] PMM_FILTER_CONTAINER * ppMMFilterContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwResumeHandle
    );


DWORD
RpcSetMMFilter(
    [in] MMFILTER_HANDLE hMMFilter,
    [in] PMM_FILTER_CONTAINER pMMFilterContainer
    );


DWORD
RpcGetMMFilter(
    [in] MMFILTER_HANDLE hMMFilter,
    [in, out] PMM_FILTER_CONTAINER * ppMMFilterContainer
    );


DWORD
RpcMatchMMFilter(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PMM_FILTER_CONTAINER pMMFilterContainer,
    [in] DWORD dwFlags,
    [in, out] PMM_FILTER_CONTAINER * ppMMFilterContainer,
    [in, out] PIPSEC_MM_POLICY_CONTAINER * ppMMPolicyContainer,
    [in, out] PMM_AUTH_METHODS_CONTAINER * ppMMAuthContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwResumeHandle
    );


DWORD
RpcMatchTransportFilter(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PTRANSPORT_FILTER_CONTAINER pTxFilterContainer,
    [in] DWORD dwFlags,
    [in, out] PTRANSPORT_FILTER_CONTAINER * ppTxFilterContainer,
    [in, out] PIPSEC_QM_POLICY_CONTAINER * ppQMPolicyContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwResumeHandle
    );


DWORD
RpcGetQMPolicyByID(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] GUID gQMPolicyID,
    [in, out] PIPSEC_QM_POLICY_CONTAINER * ppQMPolicyContainer
    );


DWORD
RpcGetMMPolicyByID(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] GUID gMMPolicyID,
    [in, out] PIPSEC_MM_POLICY_CONTAINER * ppMMPolicyContainer
    );


DWORD
RpcAddMMAuthMethods(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] DWORD dwFlags,
    [in] PMM_AUTH_METHODS_CONTAINER pMMAuthContainer
    );


DWORD
RpcDeleteMMAuthMethods(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] GUID gMMAuthID
    );


DWORD
RpcEnumMMAuthMethods(
    [in, string, unique] STRING_HANDLE pServerName,
    [in, out] PMM_AUTH_METHODS_CONTAINER * ppMMAuthContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwResumeHandle
    );


DWORD
RpcSetMMAuthMethods(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] GUID gMMAuthID,
    [in] PMM_AUTH_METHODS_CONTAINER pMMAuthContainer
    );


DWORD
RpcGetMMAuthMethods(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] GUID gMMAuthID,
    [in, out] PMM_AUTH_METHODS_CONTAINER * ppMMAuthContainer
    );


DWORD
RpcInitiateIKENegotiation(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PQM_FILTER_CONTAINER pQMFilterContainer,
    [in] DWORD dwClientProcessId,
    [in] ULONG uhClientEvent,
    [in] DWORD dwFlags,
    [in, out, unique] IKENEGOTIATION_HANDLE * phIKENegotiation
    );


DWORD
RpcQueryIKENegotiationStatus(
    [in] IKENEGOTIATION_HANDLE hIKENegotiation,
    [out, ref] SA_NEGOTIATION_STATUS_INFO * pNegotiationStatus
    );


DWORD
RpcCloseIKENegotiationHandle(
    [in, out] IKENEGOTIATION_HANDLE * phIKENegotiation
    );


DWORD
RpcEnumMMSAs(
    [in, string, unique] STRING_HANDLE pServerName, 
    [in] PMM_SA_CONTAINER pMMTemplate,
    [in, out] PMM_SA_CONTAINER * ppMMSAContainer,
    [in, out, unique] LPDWORD pdwNumEntries,
    [in, out, unique] LPDWORD pdwTotalMMsAvailable,
    [in, out, unique] LPDWORD pdwEnumHandle,
    [in] DWORD dwFlags
    );


DWORD
RpcDeleteMMSAs(
    [in, string, unique] STRING_HANDLE pServerName, 
    [in] PMM_SA_CONTAINER pMMTemplate,
    [in] DWORD dwFlags
    );


DWORD
RpcDeleteQMSAs(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PQM_SA_CONTAINER pQMSAContainer,
    [in] DWORD dwFlags
    );


DWORD
RpcQueryIKEStatistics(
    [in, string, unique] STRING_HANDLE pServerName,
    [out, ref] IKE_STATISTICS * pIKEStatistics
    );


DWORD
RpcRegisterIKENotifyClient(
    [in, string, unique] STRING_HANDLE pServerName,    
    [in] DWORD dwClientProcessId,
    [in] ULONG uhClientEvent,
    [in] PQM_SA_CONTAINER pQMSATemplateContainer,
    [out] IKENOTIFY_HANDLE *phNotifyHandle,
    [in] DWORD dwFlags
    );


DWORD RpcQueryNotifyData(
    [in] IKENOTIFY_HANDLE uhNotifyHandle,
    [in,out] PDWORD pdwNumEntries,
    [in,out] PQM_SA_CONTAINER *ppQMSAContainer,
    [in] DWORD dwFlags
    );

    
DWORD RpcCloseNotifyHandle(
    [in, out] IKENOTIFY_HANDLE *phHandle
    );


DWORD
RpcQueryIPSecStatistics(
    [in, string, unique] STRING_HANDLE pServerName,
    [in, out] PIPSEC_STATISTICS_CONTAINER * ppIpsecStatsContainer
    );


DWORD
RpcEnumQMSAs(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PQM_SA_CONTAINER pQMSATempContainer,
    [in, out] PQM_SA_CONTAINER * ppQMSAContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwNumTotalQMSAs,
    [in, out, unique] LPDWORD pdwResumeHandle,
    [in] DWORD dwFlags
    );


DWORD
RpcAddTunnelFilter(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] DWORD dwFlags,
    [in] PTUNNEL_FILTER_CONTAINER pFilterContainer,
    [out] TUNNELFILTER_HANDLE * phFilter
    );


DWORD
RpcDeleteTunnelFilter(
    [in, out] TUNNELFILTER_HANDLE * phFilter
    );


DWORD
RpcEnumTunnelFilters(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] DWORD dwLevel,
    [in] GUID gGenericFilterID,
    [in, out] PTUNNEL_FILTER_CONTAINER * ppFilterContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwResumeHandle
    );


DWORD
RpcSetTunnelFilter(
    [in] TUNNELFILTER_HANDLE hFilter,
    [in] PTUNNEL_FILTER_CONTAINER pFilterContainer
    );


DWORD
RpcGetTunnelFilter(
    [in] TUNNELFILTER_HANDLE hFilter,
    [in, out] PTUNNEL_FILTER_CONTAINER * ppFilterContainer
    );


DWORD
RpcMatchTunnelFilter(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PTUNNEL_FILTER_CONTAINER pTnFilterContainer,
    [in] DWORD dwFlags,
    [in, out] PTUNNEL_FILTER_CONTAINER * ppTnFilterContainer,
    [in, out] PIPSEC_QM_POLICY_CONTAINER * ppQMPolicyContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwResumeHandle
    );


DWORD
RpcOpenMMFilterHandle(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PMM_FILTER_CONTAINER pMMFilterContainer,
    [out] MMFILTER_HANDLE * phMMFilter
    );


DWORD
RpcCloseMMFilterHandle(
    [in, out] MMFILTER_HANDLE * phMMFilter
    );


DWORD
RpcOpenTransportFilterHandle(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PTRANSPORT_FILTER_CONTAINER pFilterContainer,
    [out] TRANSPORTFILTER_HANDLE * phFilter
    );


DWORD
RpcCloseTransportFilterHandle(
    [in, out] TRANSPORTFILTER_HANDLE * phFilter
    );


DWORD
RpcOpenTunnelFilterHandle(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PTUNNEL_FILTER_CONTAINER pFilterContainer,
    [out] TUNNELFILTER_HANDLE * phFilter
    );


DWORD
RpcCloseTunnelFilterHandle(
    [in, out] TUNNELFILTER_HANDLE * phFilter
    );


DWORD
RpcEnumIpsecInterfaces(
    [in, string, unique] STRING_HANDLE pServerName,
    [in] PIPSEC_INTERFACE_CONTAINER pIpsecIfTempContainer,
    [in, out] PIPSEC_INTERFACE_CONTAINER * ppIpsecIfContainer,
    [in] DWORD dwPreferredNumEntries,
    [in, out, unique] LPDWORD pdwNumTotalInterfaces,
    [in, out, unique] LPDWORD pdwResumeHandle,
    [in] DWORD dwFlags
    );

DWORD RpcIPSecAddSA(
    [in, string, unique] STRING_HANDLE pServerName,
    [in,out] PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer,
    [in] PQM_FILTER_CONTAINER pQMFilterContainer,
    [in,out] DWORD *uhLarvalContext,
    [in] DWORD dwInboundKeyMatLen,
    [in, size_is(dwInboundKeyMatLen)] BYTE *pInboundKeyMat,
    [in] DWORD dwOutboundKeyMatLen,
    [in, size_is(dwOutboundKeyMatLen)] BYTE *pOutboundKeyMat,
    [in, size_is(sizeof(IKE_COOKIE_PAIR))] BYTE *pContextInfo,
    DWORD dwFlags);
}