/*** Autogenerated by WIDL 6.3 from include/napsystemhealthvalidator.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

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

#ifndef __napsystemhealthvalidator_h__
#define __napsystemhealthvalidator_h__

/* Forward declarations */

#ifndef __INapSystemHealthValidator_FWD_DEFINED__
#define __INapSystemHealthValidator_FWD_DEFINED__
typedef interface INapSystemHealthValidator INapSystemHealthValidator;
#ifdef __cplusplus
interface INapSystemHealthValidator;
#endif /* __cplusplus */
#endif

#ifndef __AsyncINapSystemHealthValidator_FWD_DEFINED__
#define __AsyncINapSystemHealthValidator_FWD_DEFINED__
typedef interface AsyncINapSystemHealthValidator AsyncINapSystemHealthValidator;
#ifdef __cplusplus
interface AsyncINapSystemHealthValidator;
#endif /* __cplusplus */
#endif

#ifndef __INapServerCallback_FWD_DEFINED__
#define __INapServerCallback_FWD_DEFINED__
typedef interface INapServerCallback INapServerCallback;
#ifdef __cplusplus
interface INapServerCallback;
#endif /* __cplusplus */
#endif

#ifndef __INapSystemHealthValidationRequest_FWD_DEFINED__
#define __INapSystemHealthValidationRequest_FWD_DEFINED__
typedef interface INapSystemHealthValidationRequest INapSystemHealthValidationRequest;
#ifdef __cplusplus
interface INapSystemHealthValidationRequest;
#endif /* __cplusplus */
#endif

#ifndef __INapSystemHealthValidationRequest2_FWD_DEFINED__
#define __INapSystemHealthValidationRequest2_FWD_DEFINED__
typedef interface INapSystemHealthValidationRequest2 INapSystemHealthValidationRequest2;
#ifdef __cplusplus
interface INapSystemHealthValidationRequest2;
#endif /* __cplusplus */
#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)
#ifndef __INapServerCallback_FWD_DEFINED__
#define __INapServerCallback_FWD_DEFINED__
typedef interface INapServerCallback INapServerCallback;
#ifdef __cplusplus
interface INapServerCallback;
#endif /* __cplusplus */
#endif

#ifndef __INapSystemHealthValidator_FWD_DEFINED__
#define __INapSystemHealthValidator_FWD_DEFINED__
typedef interface INapSystemHealthValidator INapSystemHealthValidator;
#ifdef __cplusplus
interface INapSystemHealthValidator;
#endif /* __cplusplus */
#endif

#ifndef __INapSystemHealthValidationRequest_FWD_DEFINED__
#define __INapSystemHealthValidationRequest_FWD_DEFINED__
typedef interface INapSystemHealthValidationRequest INapSystemHealthValidationRequest;
#ifdef __cplusplus
interface INapSystemHealthValidationRequest;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * INapSystemHealthValidator interface
 */
#ifndef __INapSystemHealthValidator_INTERFACE_DEFINED__
#define __INapSystemHealthValidator_INTERFACE_DEFINED__

DEFINE_GUID(IID_INapSystemHealthValidator, 0xef43d87c, 0x5b6d, 0x4820, 0x86,0x20, 0x86,0x89,0x07,0xfe,0x07,0xd3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ef43d87c-5b6d-4820-8620-868907fe07d3")
INapSystemHealthValidator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Validate(
        INapSystemHealthValidationRequest *request,
        UINT32 hintTimeOutInMsec,
        INapServerCallback *callback) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INapSystemHealthValidator, 0xef43d87c, 0x5b6d, 0x4820, 0x86,0x20, 0x86,0x89,0x07,0xfe,0x07,0xd3)
#endif
#else
typedef struct INapSystemHealthValidatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** INapSystemHealthValidator methods ***/
    HRESULT (STDMETHODCALLTYPE *Validate)(
        INapSystemHealthValidator *This,
        INapSystemHealthValidationRequest *request,
        UINT32 hintTimeOutInMsec,
        INapServerCallback *callback);

    END_INTERFACE
} INapSystemHealthValidatorVtbl;

interface INapSystemHealthValidator {
    CONST_VTBL INapSystemHealthValidatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INapSystemHealthValidator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INapSystemHealthValidator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INapSystemHealthValidator_Release(This) (This)->lpVtbl->Release(This)
/*** INapSystemHealthValidator methods ***/
#define INapSystemHealthValidator_Validate(This,request,hintTimeOutInMsec,callback) (This)->lpVtbl->Validate(This,request,hintTimeOutInMsec,callback)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INapSystemHealthValidator_QueryInterface(INapSystemHealthValidator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INapSystemHealthValidator_AddRef(INapSystemHealthValidator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INapSystemHealthValidator_Release(INapSystemHealthValidator* This) {
    return This->lpVtbl->Release(This);
}
/*** INapSystemHealthValidator methods ***/
static FORCEINLINE HRESULT INapSystemHealthValidator_Validate(INapSystemHealthValidator* This,INapSystemHealthValidationRequest *request,UINT32 hintTimeOutInMsec,INapServerCallback *callback) {
    return This->lpVtbl->Validate(This,request,hintTimeOutInMsec,callback);
}
#endif
#endif

#endif


#endif  /* __INapSystemHealthValidator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * AsyncINapSystemHealthValidator interface
 */
#ifndef __AsyncINapSystemHealthValidator_INTERFACE_DEFINED__
#define __AsyncINapSystemHealthValidator_INTERFACE_DEFINED__

DEFINE_GUID(IID_AsyncINapSystemHealthValidator, 0x2516031a, 0xa391, 0x454d, 0xb5,0x3d, 0xc5,0xdc,0x84,0xc7,0xf2,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2516031a-a391-454d-b53d-c5dc84c7f2db")
AsyncINapSystemHealthValidator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Begin_Validate(
        INapSystemHealthValidationRequest *request,
        UINT32 hintTimeOutInMsec,
        INapServerCallback *callback) = 0;

    virtual HRESULT STDMETHODCALLTYPE Finish_Validate(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AsyncINapSystemHealthValidator, 0x2516031a, 0xa391, 0x454d, 0xb5,0x3d, 0xc5,0xdc,0x84,0xc7,0xf2,0xdb)
#endif
#else
typedef struct AsyncINapSystemHealthValidatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** AsyncINapSystemHealthValidator methods ***/
    HRESULT (STDMETHODCALLTYPE *Begin_Validate)(
        AsyncINapSystemHealthValidator *This,
        INapSystemHealthValidationRequest *request,
        UINT32 hintTimeOutInMsec,
        INapServerCallback *callback);

    HRESULT (STDMETHODCALLTYPE *Finish_Validate)(
        AsyncINapSystemHealthValidator *This);

    END_INTERFACE
} AsyncINapSystemHealthValidatorVtbl;

interface AsyncINapSystemHealthValidator {
    CONST_VTBL AsyncINapSystemHealthValidatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define AsyncINapSystemHealthValidator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncINapSystemHealthValidator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncINapSystemHealthValidator_Release(This) (This)->lpVtbl->Release(This)
/*** AsyncINapSystemHealthValidator methods ***/
#define AsyncINapSystemHealthValidator_Begin_Validate(This,request,hintTimeOutInMsec,callback) (This)->lpVtbl->Begin_Validate(This,request,hintTimeOutInMsec,callback)
#define AsyncINapSystemHealthValidator_Finish_Validate(This) (This)->lpVtbl->Finish_Validate(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT AsyncINapSystemHealthValidator_QueryInterface(AsyncINapSystemHealthValidator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG AsyncINapSystemHealthValidator_AddRef(AsyncINapSystemHealthValidator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG AsyncINapSystemHealthValidator_Release(AsyncINapSystemHealthValidator* This) {
    return This->lpVtbl->Release(This);
}
/*** AsyncINapSystemHealthValidator methods ***/
static FORCEINLINE HRESULT AsyncINapSystemHealthValidator_Begin_Validate(AsyncINapSystemHealthValidator* This,INapSystemHealthValidationRequest *request,UINT32 hintTimeOutInMsec,INapServerCallback *callback) {
    return This->lpVtbl->Begin_Validate(This,request,hintTimeOutInMsec,callback);
}
static FORCEINLINE HRESULT AsyncINapSystemHealthValidator_Finish_Validate(AsyncINapSystemHealthValidator* This) {
    return This->lpVtbl->Finish_Validate(This);
}
#endif
#endif

#endif


#endif  /* __AsyncINapSystemHealthValidator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * INapServerCallback interface
 */
#ifndef __INapServerCallback_INTERFACE_DEFINED__
#define __INapServerCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_INapServerCallback, 0x09c20568, 0xf30c, 0x489b, 0xae,0x9c, 0x49,0x30,0xad,0x7f,0x16,0x5f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("09c20568-f30c-489b-ae9c-4930ad7f165f")
INapServerCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnComplete(
        INapSystemHealthValidationRequest *request,
        HRESULT errorCode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INapServerCallback, 0x09c20568, 0xf30c, 0x489b, 0xae,0x9c, 0x49,0x30,0xad,0x7f,0x16,0x5f)
#endif
#else
typedef struct INapServerCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** INapServerCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnComplete)(
        INapServerCallback *This,
        INapSystemHealthValidationRequest *request,
        HRESULT errorCode);

    END_INTERFACE
} INapServerCallbackVtbl;

interface INapServerCallback {
    CONST_VTBL INapServerCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INapServerCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INapServerCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INapServerCallback_Release(This) (This)->lpVtbl->Release(This)
/*** INapServerCallback methods ***/
#define INapServerCallback_OnComplete(This,request,errorCode) (This)->lpVtbl->OnComplete(This,request,errorCode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INapServerCallback_QueryInterface(INapServerCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INapServerCallback_AddRef(INapServerCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INapServerCallback_Release(INapServerCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** INapServerCallback methods ***/
static FORCEINLINE HRESULT INapServerCallback_OnComplete(INapServerCallback* This,INapSystemHealthValidationRequest *request,HRESULT errorCode) {
    return This->lpVtbl->OnComplete(This,request,errorCode);
}
#endif
#endif

#endif


#endif  /* __INapServerCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * INapSystemHealthValidationRequest interface
 */
#ifndef __INapSystemHealthValidationRequest_INTERFACE_DEFINED__
#define __INapSystemHealthValidationRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_INapSystemHealthValidationRequest, 0xadacb3a0, 0xd4f4, 0x4f17, 0x89,0x33, 0x51,0xd6,0x0f,0xcc,0xa6,0x06);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("adacb3a0-d4f4-4f17-8933-51d60fcca606")
INapSystemHealthValidationRequest : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCorrelationId(
        CorrelationId *correlationId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStringCorrelationId(
        StringCorrelationId **correlationId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMachineName(
        CountedString **machineName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSoHRequest(
        SoHRequest **sohRequest,
        WINBOOL *napSystemGenerated) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSoHResponse(
        const SoHResponse *sohResponse) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSoHResponse(
        SoHResponse **sohResponse) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPrivateData(
        const PrivateData *privateData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPrivateData(
        PrivateData **privateData) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INapSystemHealthValidationRequest, 0xadacb3a0, 0xd4f4, 0x4f17, 0x89,0x33, 0x51,0xd6,0x0f,0xcc,0xa6,0x06)
#endif
#else
typedef struct INapSystemHealthValidationRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** INapSystemHealthValidationRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCorrelationId)(
        INapSystemHealthValidationRequest *This,
        CorrelationId *correlationId);

    HRESULT (STDMETHODCALLTYPE *GetStringCorrelationId)(
        INapSystemHealthValidationRequest *This,
        StringCorrelationId **correlationId);

    HRESULT (STDMETHODCALLTYPE *GetMachineName)(
        INapSystemHealthValidationRequest *This,
        CountedString **machineName);

    HRESULT (STDMETHODCALLTYPE *GetSoHRequest)(
        INapSystemHealthValidationRequest *This,
        SoHRequest **sohRequest,
        WINBOOL *napSystemGenerated);

    HRESULT (STDMETHODCALLTYPE *SetSoHResponse)(
        INapSystemHealthValidationRequest *This,
        const SoHResponse *sohResponse);

    HRESULT (STDMETHODCALLTYPE *GetSoHResponse)(
        INapSystemHealthValidationRequest *This,
        SoHResponse **sohResponse);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        INapSystemHealthValidationRequest *This,
        const PrivateData *privateData);

    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        INapSystemHealthValidationRequest *This,
        PrivateData **privateData);

    END_INTERFACE
} INapSystemHealthValidationRequestVtbl;

interface INapSystemHealthValidationRequest {
    CONST_VTBL INapSystemHealthValidationRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INapSystemHealthValidationRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INapSystemHealthValidationRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INapSystemHealthValidationRequest_Release(This) (This)->lpVtbl->Release(This)
/*** INapSystemHealthValidationRequest methods ***/
#define INapSystemHealthValidationRequest_GetCorrelationId(This,correlationId) (This)->lpVtbl->GetCorrelationId(This,correlationId)
#define INapSystemHealthValidationRequest_GetStringCorrelationId(This,correlationId) (This)->lpVtbl->GetStringCorrelationId(This,correlationId)
#define INapSystemHealthValidationRequest_GetMachineName(This,machineName) (This)->lpVtbl->GetMachineName(This,machineName)
#define INapSystemHealthValidationRequest_GetSoHRequest(This,sohRequest,napSystemGenerated) (This)->lpVtbl->GetSoHRequest(This,sohRequest,napSystemGenerated)
#define INapSystemHealthValidationRequest_SetSoHResponse(This,sohResponse) (This)->lpVtbl->SetSoHResponse(This,sohResponse)
#define INapSystemHealthValidationRequest_GetSoHResponse(This,sohResponse) (This)->lpVtbl->GetSoHResponse(This,sohResponse)
#define INapSystemHealthValidationRequest_SetPrivateData(This,privateData) (This)->lpVtbl->SetPrivateData(This,privateData)
#define INapSystemHealthValidationRequest_GetPrivateData(This,privateData) (This)->lpVtbl->GetPrivateData(This,privateData)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INapSystemHealthValidationRequest_QueryInterface(INapSystemHealthValidationRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INapSystemHealthValidationRequest_AddRef(INapSystemHealthValidationRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INapSystemHealthValidationRequest_Release(INapSystemHealthValidationRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** INapSystemHealthValidationRequest methods ***/
static FORCEINLINE HRESULT INapSystemHealthValidationRequest_GetCorrelationId(INapSystemHealthValidationRequest* This,CorrelationId *correlationId) {
    return This->lpVtbl->GetCorrelationId(This,correlationId);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest_GetStringCorrelationId(INapSystemHealthValidationRequest* This,StringCorrelationId **correlationId) {
    return This->lpVtbl->GetStringCorrelationId(This,correlationId);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest_GetMachineName(INapSystemHealthValidationRequest* This,CountedString **machineName) {
    return This->lpVtbl->GetMachineName(This,machineName);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest_GetSoHRequest(INapSystemHealthValidationRequest* This,SoHRequest **sohRequest,WINBOOL *napSystemGenerated) {
    return This->lpVtbl->GetSoHRequest(This,sohRequest,napSystemGenerated);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest_SetSoHResponse(INapSystemHealthValidationRequest* This,const SoHResponse *sohResponse) {
    return This->lpVtbl->SetSoHResponse(This,sohResponse);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest_GetSoHResponse(INapSystemHealthValidationRequest* This,SoHResponse **sohResponse) {
    return This->lpVtbl->GetSoHResponse(This,sohResponse);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest_SetPrivateData(INapSystemHealthValidationRequest* This,const PrivateData *privateData) {
    return This->lpVtbl->SetPrivateData(This,privateData);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest_GetPrivateData(INapSystemHealthValidationRequest* This,PrivateData **privateData) {
    return This->lpVtbl->GetPrivateData(This,privateData);
}
#endif
#endif

#endif


#endif  /* __INapSystemHealthValidationRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * INapSystemHealthValidationRequest2 interface
 */
#ifndef __INapSystemHealthValidationRequest2_INTERFACE_DEFINED__
#define __INapSystemHealthValidationRequest2_INTERFACE_DEFINED__

DEFINE_GUID(IID_INapSystemHealthValidationRequest2, 0x91a5d706, 0x0cb4, 0x4a84, 0x83,0x15, 0x93,0x80,0xd4,0x53,0xe3,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("91a5d706-0cb4-4a84-8315-9380d453e385")
INapSystemHealthValidationRequest2 : public INapSystemHealthValidationRequest
{
    virtual HRESULT STDMETHODCALLTYPE GetConfigID(
        UINT32 *configID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INapSystemHealthValidationRequest2, 0x91a5d706, 0x0cb4, 0x4a84, 0x83,0x15, 0x93,0x80,0xd4,0x53,0xe3,0x85)
#endif
#else
typedef struct INapSystemHealthValidationRequest2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** INapSystemHealthValidationRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCorrelationId)(
        INapSystemHealthValidationRequest2 *This,
        CorrelationId *correlationId);

    HRESULT (STDMETHODCALLTYPE *GetStringCorrelationId)(
        INapSystemHealthValidationRequest2 *This,
        StringCorrelationId **correlationId);

    HRESULT (STDMETHODCALLTYPE *GetMachineName)(
        INapSystemHealthValidationRequest2 *This,
        CountedString **machineName);

    HRESULT (STDMETHODCALLTYPE *GetSoHRequest)(
        INapSystemHealthValidationRequest2 *This,
        SoHRequest **sohRequest,
        WINBOOL *napSystemGenerated);

    HRESULT (STDMETHODCALLTYPE *SetSoHResponse)(
        INapSystemHealthValidationRequest2 *This,
        const SoHResponse *sohResponse);

    HRESULT (STDMETHODCALLTYPE *GetSoHResponse)(
        INapSystemHealthValidationRequest2 *This,
        SoHResponse **sohResponse);

    HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
        INapSystemHealthValidationRequest2 *This,
        const PrivateData *privateData);

    HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
        INapSystemHealthValidationRequest2 *This,
        PrivateData **privateData);

    /*** INapSystemHealthValidationRequest2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetConfigID)(
        INapSystemHealthValidationRequest2 *This,
        UINT32 *configID);

    END_INTERFACE
} INapSystemHealthValidationRequest2Vtbl;

interface INapSystemHealthValidationRequest2 {
    CONST_VTBL INapSystemHealthValidationRequest2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INapSystemHealthValidationRequest2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INapSystemHealthValidationRequest2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INapSystemHealthValidationRequest2_Release(This) (This)->lpVtbl->Release(This)
/*** INapSystemHealthValidationRequest methods ***/
#define INapSystemHealthValidationRequest2_GetCorrelationId(This,correlationId) (This)->lpVtbl->GetCorrelationId(This,correlationId)
#define INapSystemHealthValidationRequest2_GetStringCorrelationId(This,correlationId) (This)->lpVtbl->GetStringCorrelationId(This,correlationId)
#define INapSystemHealthValidationRequest2_GetMachineName(This,machineName) (This)->lpVtbl->GetMachineName(This,machineName)
#define INapSystemHealthValidationRequest2_GetSoHRequest(This,sohRequest,napSystemGenerated) (This)->lpVtbl->GetSoHRequest(This,sohRequest,napSystemGenerated)
#define INapSystemHealthValidationRequest2_SetSoHResponse(This,sohResponse) (This)->lpVtbl->SetSoHResponse(This,sohResponse)
#define INapSystemHealthValidationRequest2_GetSoHResponse(This,sohResponse) (This)->lpVtbl->GetSoHResponse(This,sohResponse)
#define INapSystemHealthValidationRequest2_SetPrivateData(This,privateData) (This)->lpVtbl->SetPrivateData(This,privateData)
#define INapSystemHealthValidationRequest2_GetPrivateData(This,privateData) (This)->lpVtbl->GetPrivateData(This,privateData)
/*** INapSystemHealthValidationRequest2 methods ***/
#define INapSystemHealthValidationRequest2_GetConfigID(This,configID) (This)->lpVtbl->GetConfigID(This,configID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INapSystemHealthValidationRequest2_QueryInterface(INapSystemHealthValidationRequest2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INapSystemHealthValidationRequest2_AddRef(INapSystemHealthValidationRequest2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INapSystemHealthValidationRequest2_Release(INapSystemHealthValidationRequest2* This) {
    return This->lpVtbl->Release(This);
}
/*** INapSystemHealthValidationRequest methods ***/
static FORCEINLINE HRESULT INapSystemHealthValidationRequest2_GetCorrelationId(INapSystemHealthValidationRequest2* This,CorrelationId *correlationId) {
    return This->lpVtbl->GetCorrelationId(This,correlationId);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest2_GetStringCorrelationId(INapSystemHealthValidationRequest2* This,StringCorrelationId **correlationId) {
    return This->lpVtbl->GetStringCorrelationId(This,correlationId);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest2_GetMachineName(INapSystemHealthValidationRequest2* This,CountedString **machineName) {
    return This->lpVtbl->GetMachineName(This,machineName);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest2_GetSoHRequest(INapSystemHealthValidationRequest2* This,SoHRequest **sohRequest,WINBOOL *napSystemGenerated) {
    return This->lpVtbl->GetSoHRequest(This,sohRequest,napSystemGenerated);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest2_SetSoHResponse(INapSystemHealthValidationRequest2* This,const SoHResponse *sohResponse) {
    return This->lpVtbl->SetSoHResponse(This,sohResponse);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest2_GetSoHResponse(INapSystemHealthValidationRequest2* This,SoHResponse **sohResponse) {
    return This->lpVtbl->GetSoHResponse(This,sohResponse);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest2_SetPrivateData(INapSystemHealthValidationRequest2* This,const PrivateData *privateData) {
    return This->lpVtbl->SetPrivateData(This,privateData);
}
static FORCEINLINE HRESULT INapSystemHealthValidationRequest2_GetPrivateData(INapSystemHealthValidationRequest2* This,PrivateData **privateData) {
    return This->lpVtbl->GetPrivateData(This,privateData);
}
/*** INapSystemHealthValidationRequest2 methods ***/
static FORCEINLINE HRESULT INapSystemHealthValidationRequest2_GetConfigID(INapSystemHealthValidationRequest2* This,UINT32 *configID) {
    return This->lpVtbl->GetConfigID(This,configID);
}
#endif
#endif

#endif


#endif  /* __INapSystemHealthValidationRequest2_INTERFACE_DEFINED__ */

#endif
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __napsystemhealthvalidator_h__ */
