/*** Autogenerated by WIDL 1.6 from napprotocol.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __napprotocol_h__
#define __napprotocol_h__

/* Forward declarations */

#ifndef __INapSoHConstructor_FWD_DEFINED__
#define __INapSoHConstructor_FWD_DEFINED__
typedef interface INapSoHConstructor INapSoHConstructor;
#endif

#ifndef __INapSoHProcessor_FWD_DEFINED__
#define __INapSoHProcessor_FWD_DEFINED__
typedef interface INapSoHProcessor INapSoHProcessor;
#endif

/* Headers for imported files */

#include <naptypes.h>
#include <unknwn.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
/*****************************************************************************
 * INapSoHTypes interface (v0.0)
 */
#ifndef __INapSoHTypes_INTERFACE_DEFINED__
#define __INapSoHTypes_INTERFACE_DEFINED__

extern RPC_IF_HANDLE INapSoHTypes_v0_0_c_ifspec;
extern RPC_IF_HANDLE INapSoHTypes_v0_0_s_ifspec;
typedef enum tagSoHAttributeType {
    sohAttributeTypeSystemHealthId = 2,
    sohAttributeTypeIpv4FixupServers = 3,
    sohAttributeTypeComplianceResultCodes = 4,
    sohAttributeTypeTimeOfLastUpdate = 5,
    sohAttributeTypeClientId = 6,
    sohAttributeTypeVendorSpecific = 7,
    sohAttributeTypeHealthClass = 8,
    sohAttributeTypeSoftwareVersion = 9,
    sohAttributeTypeProductName = 10,
    sohAttributeTypeHealthClassStatus = 11,
    sohAttributeTypeSoHGenerationTime = 12,
    sohAttributeTypeErrorCodes = 13,
    sohAttributeTypeFailureCategory = 14,
    sohAttributeTypeIpv6FixupServers = 15,
    sohAttributeTypeExtendedIsolationState = 16
} SoHAttributeType;
typedef enum tagHealthClassValue {
    healthClassFirewall = 0,
    healthClassPatchLevel = 1,
    healthClassAntiVirus = 2,
    healthClassCriticalUpdate = 3,
    healthClassReserved = 128
} HealthClassValue;
typedef union tagSoHAttributeValue {
    SystemHealthEntityId idVal;
    struct tagIpv4Addresses {
        UINT16 count;
        Ipv4Address *addresses;
    } v4AddressesVal;
    struct tagIpv6Addresses {
        UINT16 count;
        Ipv6Address *addresses;
    } v6AddressesVal;
    ResultCodes codesVal;
    FILETIME dateTimeVal;
    struct tagVendorSpecific {
        UINT32 vendorId;
        UINT16 size;
        BYTE *vendorSpecificData;
    } vendorSpecificVal;
    UINT8 uint8Val;
    struct tagOctetString {
        UINT16 size;
        BYTE *data;
    } octetStringVal;
} SoHAttributeValue;

#endif  /* __INapSoHTypes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * INapSoHConstructor interface
 */
#ifndef __INapSoHConstructor_INTERFACE_DEFINED__
#define __INapSoHConstructor_INTERFACE_DEFINED__

DEFINE_GUID(IID_INapSoHConstructor, 0x35298344, 0x96a6, 0x45e7, 0x9b,0x6b, 0x62,0xec,0xc6,0xe0,0x99,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("35298344-96a6-45e7-9b6b-62ecc6e09920")
INapSoHConstructor : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        SystemHealthEntityId id,
        WINBOOL isRequest) = 0;

    virtual HRESULT STDMETHODCALLTYPE AppendAttribute(
        SoHAttributeType type,
        const SoHAttributeValue *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSoH(
        SoH **soh) = 0;

    virtual HRESULT STDMETHODCALLTYPE Validate(
        const SoH *soh,
        WINBOOL isRequest) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INapSoHConstructor, 0x35298344, 0x96a6, 0x45e7, 0x9b,0x6b, 0x62,0xec,0xc6,0xe0,0x99,0x20)
#endif
#else
typedef struct INapSoHConstructorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INapSoHConstructor* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INapSoHConstructor* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INapSoHConstructor* This);

    /*** INapSoHConstructor methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        INapSoHConstructor* This,
        SystemHealthEntityId id,
        WINBOOL isRequest);

    HRESULT (STDMETHODCALLTYPE *AppendAttribute)(
        INapSoHConstructor* This,
        SoHAttributeType type,
        const SoHAttributeValue *value);

    HRESULT (STDMETHODCALLTYPE *GetSoH)(
        INapSoHConstructor* This,
        SoH **soh);

    HRESULT (STDMETHODCALLTYPE *Validate)(
        INapSoHConstructor* This,
        const SoH *soh,
        WINBOOL isRequest);

    END_INTERFACE
} INapSoHConstructorVtbl;
interface INapSoHConstructor {
    CONST_VTBL INapSoHConstructorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INapSoHConstructor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INapSoHConstructor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INapSoHConstructor_Release(This) (This)->lpVtbl->Release(This)
/*** INapSoHConstructor methods ***/
#define INapSoHConstructor_Initialize(This,id,isRequest) (This)->lpVtbl->Initialize(This,id,isRequest)
#define INapSoHConstructor_AppendAttribute(This,type,value) (This)->lpVtbl->AppendAttribute(This,type,value)
#define INapSoHConstructor_GetSoH(This,soh) (This)->lpVtbl->GetSoH(This,soh)
#define INapSoHConstructor_Validate(This,soh,isRequest) (This)->lpVtbl->Validate(This,soh,isRequest)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INapSoHConstructor_QueryInterface(INapSoHConstructor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INapSoHConstructor_AddRef(INapSoHConstructor* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INapSoHConstructor_Release(INapSoHConstructor* This) {
    return This->lpVtbl->Release(This);
}
/*** INapSoHConstructor methods ***/
static FORCEINLINE HRESULT INapSoHConstructor_Initialize(INapSoHConstructor* This,SystemHealthEntityId id,WINBOOL isRequest) {
    return This->lpVtbl->Initialize(This,id,isRequest);
}
static FORCEINLINE HRESULT INapSoHConstructor_AppendAttribute(INapSoHConstructor* This,SoHAttributeType type,const SoHAttributeValue *value) {
    return This->lpVtbl->AppendAttribute(This,type,value);
}
static FORCEINLINE HRESULT INapSoHConstructor_GetSoH(INapSoHConstructor* This,SoH **soh) {
    return This->lpVtbl->GetSoH(This,soh);
}
static FORCEINLINE HRESULT INapSoHConstructor_Validate(INapSoHConstructor* This,const SoH *soh,WINBOOL isRequest) {
    return This->lpVtbl->Validate(This,soh,isRequest);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE INapSoHConstructor_Initialize_Proxy(
    INapSoHConstructor* This,
    SystemHealthEntityId id,
    WINBOOL isRequest);
void __RPC_STUB INapSoHConstructor_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INapSoHConstructor_AppendAttribute_Proxy(
    INapSoHConstructor* This,
    SoHAttributeType type,
    const SoHAttributeValue *value);
void __RPC_STUB INapSoHConstructor_AppendAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INapSoHConstructor_GetSoH_Proxy(
    INapSoHConstructor* This,
    SoH **soh);
void __RPC_STUB INapSoHConstructor_GetSoH_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INapSoHConstructor_Validate_Proxy(
    INapSoHConstructor* This,
    const SoH *soh,
    WINBOOL isRequest);
void __RPC_STUB INapSoHConstructor_Validate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __INapSoHConstructor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * INapSoHProcessor interface
 */
#ifndef __INapSoHProcessor_INTERFACE_DEFINED__
#define __INapSoHProcessor_INTERFACE_DEFINED__

DEFINE_GUID(IID_INapSoHProcessor, 0xfb2fa8b0, 0x2cd5, 0x457d, 0xab,0xa8, 0x43,0x76,0xf6,0x3e,0xa1,0xc0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fb2fa8b0-2cd5-457d-aba8-4376f63ea1c0")
INapSoHProcessor : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        const SoH *soh,
        WINBOOL isRequest,
        SystemHealthEntityId *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindNextAttribute(
        UINT16 fromLocation,
        SoHAttributeType type,
        UINT16 *attributeLocation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAttribute(
        UINT16 attributeLocation,
        SoHAttributeType *type,
        SoHAttributeValue **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNumberOfAttributes(
        UINT16 *attributeCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INapSoHProcessor, 0xfb2fa8b0, 0x2cd5, 0x457d, 0xab,0xa8, 0x43,0x76,0xf6,0x3e,0xa1,0xc0)
#endif
#else
typedef struct INapSoHProcessorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INapSoHProcessor* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INapSoHProcessor* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INapSoHProcessor* This);

    /*** INapSoHProcessor methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        INapSoHProcessor* This,
        const SoH *soh,
        WINBOOL isRequest,
        SystemHealthEntityId *id);

    HRESULT (STDMETHODCALLTYPE *FindNextAttribute)(
        INapSoHProcessor* This,
        UINT16 fromLocation,
        SoHAttributeType type,
        UINT16 *attributeLocation);

    HRESULT (STDMETHODCALLTYPE *GetAttribute)(
        INapSoHProcessor* This,
        UINT16 attributeLocation,
        SoHAttributeType *type,
        SoHAttributeValue **value);

    HRESULT (STDMETHODCALLTYPE *GetNumberOfAttributes)(
        INapSoHProcessor* This,
        UINT16 *attributeCount);

    END_INTERFACE
} INapSoHProcessorVtbl;
interface INapSoHProcessor {
    CONST_VTBL INapSoHProcessorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INapSoHProcessor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INapSoHProcessor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INapSoHProcessor_Release(This) (This)->lpVtbl->Release(This)
/*** INapSoHProcessor methods ***/
#define INapSoHProcessor_Initialize(This,soh,isRequest,id) (This)->lpVtbl->Initialize(This,soh,isRequest,id)
#define INapSoHProcessor_FindNextAttribute(This,fromLocation,type,attributeLocation) (This)->lpVtbl->FindNextAttribute(This,fromLocation,type,attributeLocation)
#define INapSoHProcessor_GetAttribute(This,attributeLocation,type,value) (This)->lpVtbl->GetAttribute(This,attributeLocation,type,value)
#define INapSoHProcessor_GetNumberOfAttributes(This,attributeCount) (This)->lpVtbl->GetNumberOfAttributes(This,attributeCount)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INapSoHProcessor_QueryInterface(INapSoHProcessor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INapSoHProcessor_AddRef(INapSoHProcessor* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INapSoHProcessor_Release(INapSoHProcessor* This) {
    return This->lpVtbl->Release(This);
}
/*** INapSoHProcessor methods ***/
static FORCEINLINE HRESULT INapSoHProcessor_Initialize(INapSoHProcessor* This,const SoH *soh,WINBOOL isRequest,SystemHealthEntityId *id) {
    return This->lpVtbl->Initialize(This,soh,isRequest,id);
}
static FORCEINLINE HRESULT INapSoHProcessor_FindNextAttribute(INapSoHProcessor* This,UINT16 fromLocation,SoHAttributeType type,UINT16 *attributeLocation) {
    return This->lpVtbl->FindNextAttribute(This,fromLocation,type,attributeLocation);
}
static FORCEINLINE HRESULT INapSoHProcessor_GetAttribute(INapSoHProcessor* This,UINT16 attributeLocation,SoHAttributeType *type,SoHAttributeValue **value) {
    return This->lpVtbl->GetAttribute(This,attributeLocation,type,value);
}
static FORCEINLINE HRESULT INapSoHProcessor_GetNumberOfAttributes(INapSoHProcessor* This,UINT16 *attributeCount) {
    return This->lpVtbl->GetNumberOfAttributes(This,attributeCount);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE INapSoHProcessor_Initialize_Proxy(
    INapSoHProcessor* This,
    const SoH *soh,
    WINBOOL isRequest,
    SystemHealthEntityId *id);
void __RPC_STUB INapSoHProcessor_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INapSoHProcessor_FindNextAttribute_Proxy(
    INapSoHProcessor* This,
    UINT16 fromLocation,
    SoHAttributeType type,
    UINT16 *attributeLocation);
void __RPC_STUB INapSoHProcessor_FindNextAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INapSoHProcessor_GetAttribute_Proxy(
    INapSoHProcessor* This,
    UINT16 attributeLocation,
    SoHAttributeType *type,
    SoHAttributeValue **value);
void __RPC_STUB INapSoHProcessor_GetAttribute_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INapSoHProcessor_GetNumberOfAttributes_Proxy(
    INapSoHProcessor* This,
    UINT16 *attributeCount);
void __RPC_STUB INapSoHProcessor_GetNumberOfAttributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __INapSoHProcessor_INTERFACE_DEFINED__ */

EXTERN_C const CLSID CLSID_NapSoHConstructor;
EXTERN_C const CLSID CLSID_NapSoHProcessor;
#endif
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __napprotocol_h__ */
