/*** Autogenerated by WIDL 9.18 from include/iwscapi.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 __iwscapi_h__
#define __iwscapi_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IWscProduct_FWD_DEFINED__
#define __IWscProduct_FWD_DEFINED__
typedef interface IWscProduct IWscProduct;
#ifdef __cplusplus
interface IWscProduct;
#endif /* __cplusplus */
#endif

#ifndef __IWscProduct2_FWD_DEFINED__
#define __IWscProduct2_FWD_DEFINED__
typedef interface IWscProduct2 IWscProduct2;
#ifdef __cplusplus
interface IWscProduct2;
#endif /* __cplusplus */
#endif

#ifndef __IWscProduct3_FWD_DEFINED__
#define __IWscProduct3_FWD_DEFINED__
typedef interface IWscProduct3 IWscProduct3;
#ifdef __cplusplus
interface IWscProduct3;
#endif /* __cplusplus */
#endif

#ifndef __IWSCProductList_FWD_DEFINED__
#define __IWSCProductList_FWD_DEFINED__
typedef interface IWSCProductList IWSCProductList;
#ifdef __cplusplus
interface IWSCProductList;
#endif /* __cplusplus */
#endif

#ifndef __IWSCDefaultProduct_FWD_DEFINED__
#define __IWSCDefaultProduct_FWD_DEFINED__
typedef interface IWSCDefaultProduct IWSCDefaultProduct;
#ifdef __cplusplus
interface IWSCDefaultProduct;
#endif /* __cplusplus */
#endif

#ifndef __WSCProductList_FWD_DEFINED__
#define __WSCProductList_FWD_DEFINED__
#ifdef __cplusplus
typedef class WSCProductList WSCProductList;
#else
typedef struct WSCProductList WSCProductList;
#endif /* defined __cplusplus */
#endif /* defined __WSCProductList_FWD_DEFINED__ */

#ifndef __WSCDefaultProduct_FWD_DEFINED__
#define __WSCDefaultProduct_FWD_DEFINED__
#ifdef __cplusplus
typedef class WSCDefaultProduct WSCDefaultProduct;
#else
typedef struct WSCDefaultProduct WSCDefaultProduct;
#endif /* defined __cplusplus */
#endif /* defined __WSCDefaultProduct_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum WSC_SECURITY_PRODUCT_SUBSTATUS {
    WSC_SECURITY_PRODUCT_SUBSTATUS_NOT_SET = 0,
    WSC_SECURITY_PRODUCT_SUBSTATUS_NO_ACTION = 1,
    WSC_SECURITY_PRODUCT_SUBSTATUS_ACTION_RECOMMENDED = 2,
    WSC_SECURITY_PRODUCT_SUBSTATUS_ACTION_NEEDED = 3
} WSC_SECURITY_PRODUCT_SUBSTATUS;
typedef enum WSC_SECURITY_PRODUCT_STATE {
    WSC_SECURITY_PRODUCT_STATE_ON = 0,
    WSC_SECURITY_PRODUCT_STATE_OFF = 1,
    WSC_SECURITY_PRODUCT_STATE_SNOOZED = 2,
    WSC_SECURITY_PRODUCT_STATE_EXPIRED = 3
} WSC_SECURITY_PRODUCT_STATE;
typedef enum _SECURITY_PRODUCT_TYPE {
    SECURITY_PRODUCT_TYPE_ANTIVIRUS = 0,
    SECURITY_PRODUCT_TYPE_FIREWALL = 1,
    SECURITY_PRODUCT_TYPE_ANTISPYWARE = 2
} SECURITY_PRODUCT_TYPE;
typedef enum _WSC_SECURITY_SIGNATURE_STATUS {
    WSC_SECURITY_PRODUCT_OUT_OF_DATE = 0,
    WSC_SECURITY_PRODUCT_UP_TO_DATE = 1
} WSC_SECURITY_SIGNATURE_STATUS;
/*****************************************************************************
 * IWscProduct interface
 */
#ifndef __IWscProduct_INTERFACE_DEFINED__
#define __IWscProduct_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWscProduct, 0x8c38232e, 0x3a45, 0x4a27, 0x92,0xb0, 0x1a,0x16,0xa9,0x75,0xf6,0x69);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8c38232e-3a45-4a27-92b0-1a16a975f669")
IWscProduct : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ProductName(
        BSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ProductState(
        WSC_SECURITY_PRODUCT_STATE *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SignatureStatus(
        WSC_SECURITY_SIGNATURE_STATUS *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RemediationPath(
        BSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ProductStateTimestamp(
        BSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ProductGuid(
        BSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ProductIsDefault(
        WINBOOL *val) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWscProduct, 0x8c38232e, 0x3a45, 0x4a27, 0x92,0xb0, 0x1a,0x16,0xa9,0x75,0xf6,0x69)
#endif
#else
typedef struct IWscProductVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWscProduct *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWscProduct *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWscProduct *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWscProduct *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWscProduct methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProductName)(
        IWscProduct *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductState)(
        IWscProduct *This,
        WSC_SECURITY_PRODUCT_STATE *val);

    HRESULT (STDMETHODCALLTYPE *get_SignatureStatus)(
        IWscProduct *This,
        WSC_SECURITY_SIGNATURE_STATUS *val);

    HRESULT (STDMETHODCALLTYPE *get_RemediationPath)(
        IWscProduct *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductStateTimestamp)(
        IWscProduct *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductGuid)(
        IWscProduct *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductIsDefault)(
        IWscProduct *This,
        WINBOOL *val);

    END_INTERFACE
} IWscProductVtbl;

interface IWscProduct {
    CONST_VTBL IWscProductVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWscProduct_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWscProduct_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWscProduct_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWscProduct_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWscProduct_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWscProduct_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWscProduct_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWscProduct methods ***/
#define IWscProduct_get_ProductName(This,val) (This)->lpVtbl->get_ProductName(This,val)
#define IWscProduct_get_ProductState(This,val) (This)->lpVtbl->get_ProductState(This,val)
#define IWscProduct_get_SignatureStatus(This,val) (This)->lpVtbl->get_SignatureStatus(This,val)
#define IWscProduct_get_RemediationPath(This,val) (This)->lpVtbl->get_RemediationPath(This,val)
#define IWscProduct_get_ProductStateTimestamp(This,val) (This)->lpVtbl->get_ProductStateTimestamp(This,val)
#define IWscProduct_get_ProductGuid(This,val) (This)->lpVtbl->get_ProductGuid(This,val)
#define IWscProduct_get_ProductIsDefault(This,val) (This)->lpVtbl->get_ProductIsDefault(This,val)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWscProduct_QueryInterface(IWscProduct* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWscProduct_AddRef(IWscProduct* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWscProduct_Release(IWscProduct* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWscProduct_GetTypeInfoCount(IWscProduct* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWscProduct_GetTypeInfo(IWscProduct* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWscProduct_GetIDsOfNames(IWscProduct* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IWscProduct_Invoke(IWscProduct* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWscProduct methods ***/
static __WIDL_INLINE HRESULT IWscProduct_get_ProductName(IWscProduct* This,BSTR *val) {
    return This->lpVtbl->get_ProductName(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct_get_ProductState(IWscProduct* This,WSC_SECURITY_PRODUCT_STATE *val) {
    return This->lpVtbl->get_ProductState(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct_get_SignatureStatus(IWscProduct* This,WSC_SECURITY_SIGNATURE_STATUS *val) {
    return This->lpVtbl->get_SignatureStatus(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct_get_RemediationPath(IWscProduct* This,BSTR *val) {
    return This->lpVtbl->get_RemediationPath(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct_get_ProductStateTimestamp(IWscProduct* This,BSTR *val) {
    return This->lpVtbl->get_ProductStateTimestamp(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct_get_ProductGuid(IWscProduct* This,BSTR *val) {
    return This->lpVtbl->get_ProductGuid(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct_get_ProductIsDefault(IWscProduct* This,WINBOOL *val) {
    return This->lpVtbl->get_ProductIsDefault(This,val);
}
#endif
#endif

#endif


#endif  /* __IWscProduct_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWscProduct2 interface
 */
#ifndef __IWscProduct2_INTERFACE_DEFINED__
#define __IWscProduct2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWscProduct2, 0xf896ca54, 0xfe09, 0x4403, 0x86,0xd4, 0x23,0xcb,0x48,0x8d,0x81,0xd8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f896ca54-fe09-4403-86d4-23cb488d81d8")
IWscProduct2 : public IWscProduct
{
    virtual HRESULT STDMETHODCALLTYPE get_AntivirusScanSubstatus(
        WSC_SECURITY_PRODUCT_SUBSTATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AntivirusSettingsSubstatus(
        WSC_SECURITY_PRODUCT_SUBSTATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AntivirusProtectionUpdateSubstatus(
        WSC_SECURITY_PRODUCT_SUBSTATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FirewallDomainProfileSubstatus(
        WSC_SECURITY_PRODUCT_SUBSTATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FirewallPrivateProfileSubstatus(
        WSC_SECURITY_PRODUCT_SUBSTATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FirewallPublicProfileSubstatus(
        WSC_SECURITY_PRODUCT_SUBSTATUS *status) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWscProduct2, 0xf896ca54, 0xfe09, 0x4403, 0x86,0xd4, 0x23,0xcb,0x48,0x8d,0x81,0xd8)
#endif
#else
typedef struct IWscProduct2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWscProduct2 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWscProduct2 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWscProduct2 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWscProduct2 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWscProduct methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProductName)(
        IWscProduct2 *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductState)(
        IWscProduct2 *This,
        WSC_SECURITY_PRODUCT_STATE *val);

    HRESULT (STDMETHODCALLTYPE *get_SignatureStatus)(
        IWscProduct2 *This,
        WSC_SECURITY_SIGNATURE_STATUS *val);

    HRESULT (STDMETHODCALLTYPE *get_RemediationPath)(
        IWscProduct2 *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductStateTimestamp)(
        IWscProduct2 *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductGuid)(
        IWscProduct2 *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductIsDefault)(
        IWscProduct2 *This,
        WINBOOL *val);

    /*** IWscProduct2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AntivirusScanSubstatus)(
        IWscProduct2 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    HRESULT (STDMETHODCALLTYPE *get_AntivirusSettingsSubstatus)(
        IWscProduct2 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    HRESULT (STDMETHODCALLTYPE *get_AntivirusProtectionUpdateSubstatus)(
        IWscProduct2 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    HRESULT (STDMETHODCALLTYPE *get_FirewallDomainProfileSubstatus)(
        IWscProduct2 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    HRESULT (STDMETHODCALLTYPE *get_FirewallPrivateProfileSubstatus)(
        IWscProduct2 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    HRESULT (STDMETHODCALLTYPE *get_FirewallPublicProfileSubstatus)(
        IWscProduct2 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    END_INTERFACE
} IWscProduct2Vtbl;

interface IWscProduct2 {
    CONST_VTBL IWscProduct2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWscProduct2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWscProduct2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWscProduct2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWscProduct2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWscProduct2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWscProduct2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWscProduct2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWscProduct methods ***/
#define IWscProduct2_get_ProductName(This,val) (This)->lpVtbl->get_ProductName(This,val)
#define IWscProduct2_get_ProductState(This,val) (This)->lpVtbl->get_ProductState(This,val)
#define IWscProduct2_get_SignatureStatus(This,val) (This)->lpVtbl->get_SignatureStatus(This,val)
#define IWscProduct2_get_RemediationPath(This,val) (This)->lpVtbl->get_RemediationPath(This,val)
#define IWscProduct2_get_ProductStateTimestamp(This,val) (This)->lpVtbl->get_ProductStateTimestamp(This,val)
#define IWscProduct2_get_ProductGuid(This,val) (This)->lpVtbl->get_ProductGuid(This,val)
#define IWscProduct2_get_ProductIsDefault(This,val) (This)->lpVtbl->get_ProductIsDefault(This,val)
/*** IWscProduct2 methods ***/
#define IWscProduct2_get_AntivirusScanSubstatus(This,status) (This)->lpVtbl->get_AntivirusScanSubstatus(This,status)
#define IWscProduct2_get_AntivirusSettingsSubstatus(This,status) (This)->lpVtbl->get_AntivirusSettingsSubstatus(This,status)
#define IWscProduct2_get_AntivirusProtectionUpdateSubstatus(This,status) (This)->lpVtbl->get_AntivirusProtectionUpdateSubstatus(This,status)
#define IWscProduct2_get_FirewallDomainProfileSubstatus(This,status) (This)->lpVtbl->get_FirewallDomainProfileSubstatus(This,status)
#define IWscProduct2_get_FirewallPrivateProfileSubstatus(This,status) (This)->lpVtbl->get_FirewallPrivateProfileSubstatus(This,status)
#define IWscProduct2_get_FirewallPublicProfileSubstatus(This,status) (This)->lpVtbl->get_FirewallPublicProfileSubstatus(This,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWscProduct2_QueryInterface(IWscProduct2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWscProduct2_AddRef(IWscProduct2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWscProduct2_Release(IWscProduct2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWscProduct2_GetTypeInfoCount(IWscProduct2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWscProduct2_GetTypeInfo(IWscProduct2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWscProduct2_GetIDsOfNames(IWscProduct2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IWscProduct2_Invoke(IWscProduct2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWscProduct methods ***/
static __WIDL_INLINE HRESULT IWscProduct2_get_ProductName(IWscProduct2* This,BSTR *val) {
    return This->lpVtbl->get_ProductName(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_ProductState(IWscProduct2* This,WSC_SECURITY_PRODUCT_STATE *val) {
    return This->lpVtbl->get_ProductState(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_SignatureStatus(IWscProduct2* This,WSC_SECURITY_SIGNATURE_STATUS *val) {
    return This->lpVtbl->get_SignatureStatus(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_RemediationPath(IWscProduct2* This,BSTR *val) {
    return This->lpVtbl->get_RemediationPath(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_ProductStateTimestamp(IWscProduct2* This,BSTR *val) {
    return This->lpVtbl->get_ProductStateTimestamp(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_ProductGuid(IWscProduct2* This,BSTR *val) {
    return This->lpVtbl->get_ProductGuid(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_ProductIsDefault(IWscProduct2* This,WINBOOL *val) {
    return This->lpVtbl->get_ProductIsDefault(This,val);
}
/*** IWscProduct2 methods ***/
static __WIDL_INLINE HRESULT IWscProduct2_get_AntivirusScanSubstatus(IWscProduct2* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_AntivirusScanSubstatus(This,status);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_AntivirusSettingsSubstatus(IWscProduct2* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_AntivirusSettingsSubstatus(This,status);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_AntivirusProtectionUpdateSubstatus(IWscProduct2* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_AntivirusProtectionUpdateSubstatus(This,status);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_FirewallDomainProfileSubstatus(IWscProduct2* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_FirewallDomainProfileSubstatus(This,status);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_FirewallPrivateProfileSubstatus(IWscProduct2* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_FirewallPrivateProfileSubstatus(This,status);
}
static __WIDL_INLINE HRESULT IWscProduct2_get_FirewallPublicProfileSubstatus(IWscProduct2* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_FirewallPublicProfileSubstatus(This,status);
}
#endif
#endif

#endif


#endif  /* __IWscProduct2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWscProduct3 interface
 */
#ifndef __IWscProduct3_INTERFACE_DEFINED__
#define __IWscProduct3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWscProduct3, 0x55536524, 0xd1d1, 0x4726, 0x8c,0x7c, 0x04,0x99,0x6a,0x19,0x04,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("55536524-d1d1-4726-8c7c-04996a1904e7")
IWscProduct3 : public IWscProduct2
{
    virtual HRESULT STDMETHODCALLTYPE get_AntivirusDaysUntilExpired(
        DWORD *days) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWscProduct3, 0x55536524, 0xd1d1, 0x4726, 0x8c,0x7c, 0x04,0x99,0x6a,0x19,0x04,0xe7)
#endif
#else
typedef struct IWscProduct3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWscProduct3 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWscProduct3 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWscProduct3 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWscProduct3 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWscProduct methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProductName)(
        IWscProduct3 *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductState)(
        IWscProduct3 *This,
        WSC_SECURITY_PRODUCT_STATE *val);

    HRESULT (STDMETHODCALLTYPE *get_SignatureStatus)(
        IWscProduct3 *This,
        WSC_SECURITY_SIGNATURE_STATUS *val);

    HRESULT (STDMETHODCALLTYPE *get_RemediationPath)(
        IWscProduct3 *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductStateTimestamp)(
        IWscProduct3 *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductGuid)(
        IWscProduct3 *This,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_ProductIsDefault)(
        IWscProduct3 *This,
        WINBOOL *val);

    /*** IWscProduct2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AntivirusScanSubstatus)(
        IWscProduct3 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    HRESULT (STDMETHODCALLTYPE *get_AntivirusSettingsSubstatus)(
        IWscProduct3 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    HRESULT (STDMETHODCALLTYPE *get_AntivirusProtectionUpdateSubstatus)(
        IWscProduct3 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    HRESULT (STDMETHODCALLTYPE *get_FirewallDomainProfileSubstatus)(
        IWscProduct3 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    HRESULT (STDMETHODCALLTYPE *get_FirewallPrivateProfileSubstatus)(
        IWscProduct3 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    HRESULT (STDMETHODCALLTYPE *get_FirewallPublicProfileSubstatus)(
        IWscProduct3 *This,
        WSC_SECURITY_PRODUCT_SUBSTATUS *status);

    /*** IWscProduct3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AntivirusDaysUntilExpired)(
        IWscProduct3 *This,
        DWORD *days);

    END_INTERFACE
} IWscProduct3Vtbl;

interface IWscProduct3 {
    CONST_VTBL IWscProduct3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWscProduct3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWscProduct3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWscProduct3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWscProduct3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWscProduct3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWscProduct3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWscProduct3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWscProduct methods ***/
#define IWscProduct3_get_ProductName(This,val) (This)->lpVtbl->get_ProductName(This,val)
#define IWscProduct3_get_ProductState(This,val) (This)->lpVtbl->get_ProductState(This,val)
#define IWscProduct3_get_SignatureStatus(This,val) (This)->lpVtbl->get_SignatureStatus(This,val)
#define IWscProduct3_get_RemediationPath(This,val) (This)->lpVtbl->get_RemediationPath(This,val)
#define IWscProduct3_get_ProductStateTimestamp(This,val) (This)->lpVtbl->get_ProductStateTimestamp(This,val)
#define IWscProduct3_get_ProductGuid(This,val) (This)->lpVtbl->get_ProductGuid(This,val)
#define IWscProduct3_get_ProductIsDefault(This,val) (This)->lpVtbl->get_ProductIsDefault(This,val)
/*** IWscProduct2 methods ***/
#define IWscProduct3_get_AntivirusScanSubstatus(This,status) (This)->lpVtbl->get_AntivirusScanSubstatus(This,status)
#define IWscProduct3_get_AntivirusSettingsSubstatus(This,status) (This)->lpVtbl->get_AntivirusSettingsSubstatus(This,status)
#define IWscProduct3_get_AntivirusProtectionUpdateSubstatus(This,status) (This)->lpVtbl->get_AntivirusProtectionUpdateSubstatus(This,status)
#define IWscProduct3_get_FirewallDomainProfileSubstatus(This,status) (This)->lpVtbl->get_FirewallDomainProfileSubstatus(This,status)
#define IWscProduct3_get_FirewallPrivateProfileSubstatus(This,status) (This)->lpVtbl->get_FirewallPrivateProfileSubstatus(This,status)
#define IWscProduct3_get_FirewallPublicProfileSubstatus(This,status) (This)->lpVtbl->get_FirewallPublicProfileSubstatus(This,status)
/*** IWscProduct3 methods ***/
#define IWscProduct3_get_AntivirusDaysUntilExpired(This,days) (This)->lpVtbl->get_AntivirusDaysUntilExpired(This,days)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWscProduct3_QueryInterface(IWscProduct3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWscProduct3_AddRef(IWscProduct3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWscProduct3_Release(IWscProduct3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWscProduct3_GetTypeInfoCount(IWscProduct3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWscProduct3_GetTypeInfo(IWscProduct3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWscProduct3_GetIDsOfNames(IWscProduct3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IWscProduct3_Invoke(IWscProduct3* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWscProduct methods ***/
static __WIDL_INLINE HRESULT IWscProduct3_get_ProductName(IWscProduct3* This,BSTR *val) {
    return This->lpVtbl->get_ProductName(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_ProductState(IWscProduct3* This,WSC_SECURITY_PRODUCT_STATE *val) {
    return This->lpVtbl->get_ProductState(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_SignatureStatus(IWscProduct3* This,WSC_SECURITY_SIGNATURE_STATUS *val) {
    return This->lpVtbl->get_SignatureStatus(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_RemediationPath(IWscProduct3* This,BSTR *val) {
    return This->lpVtbl->get_RemediationPath(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_ProductStateTimestamp(IWscProduct3* This,BSTR *val) {
    return This->lpVtbl->get_ProductStateTimestamp(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_ProductGuid(IWscProduct3* This,BSTR *val) {
    return This->lpVtbl->get_ProductGuid(This,val);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_ProductIsDefault(IWscProduct3* This,WINBOOL *val) {
    return This->lpVtbl->get_ProductIsDefault(This,val);
}
/*** IWscProduct2 methods ***/
static __WIDL_INLINE HRESULT IWscProduct3_get_AntivirusScanSubstatus(IWscProduct3* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_AntivirusScanSubstatus(This,status);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_AntivirusSettingsSubstatus(IWscProduct3* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_AntivirusSettingsSubstatus(This,status);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_AntivirusProtectionUpdateSubstatus(IWscProduct3* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_AntivirusProtectionUpdateSubstatus(This,status);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_FirewallDomainProfileSubstatus(IWscProduct3* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_FirewallDomainProfileSubstatus(This,status);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_FirewallPrivateProfileSubstatus(IWscProduct3* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_FirewallPrivateProfileSubstatus(This,status);
}
static __WIDL_INLINE HRESULT IWscProduct3_get_FirewallPublicProfileSubstatus(IWscProduct3* This,WSC_SECURITY_PRODUCT_SUBSTATUS *status) {
    return This->lpVtbl->get_FirewallPublicProfileSubstatus(This,status);
}
/*** IWscProduct3 methods ***/
static __WIDL_INLINE HRESULT IWscProduct3_get_AntivirusDaysUntilExpired(IWscProduct3* This,DWORD *days) {
    return This->lpVtbl->get_AntivirusDaysUntilExpired(This,days);
}
#endif
#endif

#endif


#endif  /* __IWscProduct3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSCProductList interface
 */
#ifndef __IWSCProductList_INTERFACE_DEFINED__
#define __IWSCProductList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSCProductList, 0x722a338c, 0x6e8e, 0x4e72, 0xac,0x27, 0x14,0x17,0xfb,0x0c,0x81,0xc2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("722a338c-6e8e-4e72-ac27-1417fb0c81c2")
IWSCProductList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        ULONG provider) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        ULONG index,
        IWscProduct **val) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSCProductList, 0x722a338c, 0x6e8e, 0x4e72, 0xac,0x27, 0x14,0x17,0xfb,0x0c,0x81,0xc2)
#endif
#else
typedef struct IWSCProductListVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSCProductList *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSCProductList *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSCProductList *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSCProductList *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSCProductList methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWSCProductList *This,
        ULONG provider);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IWSCProductList *This,
        LONG *val);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IWSCProductList *This,
        ULONG index,
        IWscProduct **val);

    END_INTERFACE
} IWSCProductListVtbl;

interface IWSCProductList {
    CONST_VTBL IWSCProductListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSCProductList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSCProductList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSCProductList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSCProductList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSCProductList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSCProductList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSCProductList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSCProductList methods ***/
#define IWSCProductList_Initialize(This,provider) (This)->lpVtbl->Initialize(This,provider)
#define IWSCProductList_get_Count(This,val) (This)->lpVtbl->get_Count(This,val)
#define IWSCProductList_get_Item(This,index,val) (This)->lpVtbl->get_Item(This,index,val)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWSCProductList_QueryInterface(IWSCProductList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWSCProductList_AddRef(IWSCProductList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWSCProductList_Release(IWSCProductList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWSCProductList_GetTypeInfoCount(IWSCProductList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWSCProductList_GetTypeInfo(IWSCProductList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWSCProductList_GetIDsOfNames(IWSCProductList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IWSCProductList_Invoke(IWSCProductList* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSCProductList methods ***/
static __WIDL_INLINE HRESULT IWSCProductList_Initialize(IWSCProductList* This,ULONG provider) {
    return This->lpVtbl->Initialize(This,provider);
}
static __WIDL_INLINE HRESULT IWSCProductList_get_Count(IWSCProductList* This,LONG *val) {
    return This->lpVtbl->get_Count(This,val);
}
static __WIDL_INLINE HRESULT IWSCProductList_get_Item(IWSCProductList* This,ULONG index,IWscProduct **val) {
    return This->lpVtbl->get_Item(This,index,val);
}
#endif
#endif

#endif


#endif  /* __IWSCProductList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWSCDefaultProduct interface
 */
#ifndef __IWSCDefaultProduct_INTERFACE_DEFINED__
#define __IWSCDefaultProduct_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWSCDefaultProduct, 0x0476d69c, 0xf21a, 0x11e5, 0x9c,0xe9, 0x5e,0x55,0x17,0x50,0x7c,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0476d69c-f21a-11e5-9ce9-5e5517507c66")
IWSCDefaultProduct : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE SetDefaultProduct(
        SECURITY_PRODUCT_TYPE type,
        BSTR guid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWSCDefaultProduct, 0x0476d69c, 0xf21a, 0x11e5, 0x9c,0xe9, 0x5e,0x55,0x17,0x50,0x7c,0x66)
#endif
#else
typedef struct IWSCDefaultProductVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWSCDefaultProduct *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWSCDefaultProduct *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWSCDefaultProduct *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWSCDefaultProduct *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWSCDefaultProduct methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDefaultProduct)(
        IWSCDefaultProduct *This,
        SECURITY_PRODUCT_TYPE type,
        BSTR guid);

    END_INTERFACE
} IWSCDefaultProductVtbl;

interface IWSCDefaultProduct {
    CONST_VTBL IWSCDefaultProductVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWSCDefaultProduct_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWSCDefaultProduct_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWSCDefaultProduct_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWSCDefaultProduct_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWSCDefaultProduct_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWSCDefaultProduct_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWSCDefaultProduct_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWSCDefaultProduct methods ***/
#define IWSCDefaultProduct_SetDefaultProduct(This,type,guid) (This)->lpVtbl->SetDefaultProduct(This,type,guid)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWSCDefaultProduct_QueryInterface(IWSCDefaultProduct* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWSCDefaultProduct_AddRef(IWSCDefaultProduct* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWSCDefaultProduct_Release(IWSCDefaultProduct* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWSCDefaultProduct_GetTypeInfoCount(IWSCDefaultProduct* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWSCDefaultProduct_GetTypeInfo(IWSCDefaultProduct* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWSCDefaultProduct_GetIDsOfNames(IWSCDefaultProduct* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IWSCDefaultProduct_Invoke(IWSCDefaultProduct* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWSCDefaultProduct methods ***/
static __WIDL_INLINE HRESULT IWSCDefaultProduct_SetDefaultProduct(IWSCDefaultProduct* This,SECURITY_PRODUCT_TYPE type,BSTR guid) {
    return This->lpVtbl->SetDefaultProduct(This,type,guid);
}
#endif
#endif

#endif


#endif  /* __IWSCDefaultProduct_INTERFACE_DEFINED__ */

#ifndef __wscAPILib_LIBRARY_DEFINED__
#define __wscAPILib_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_wscAPILib, 0xb52a4496, 0x7753, 0x4f74, 0xbe,0x64, 0xc2,0x07,0x2e,0x30,0x81,0x22);

/*****************************************************************************
 * WSCProductList coclass
 */

DEFINE_GUID(CLSID_WSCProductList, 0x17072f7b, 0x9abe, 0x4a74, 0xa2,0x61, 0x1e,0xb7,0x6b,0x55,0x10,0x7a);

#ifdef __cplusplus
class DECLSPEC_UUID("17072f7b-9abe-4a74-a261-1eb76b55107a") WSCProductList;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WSCProductList, 0x17072f7b, 0x9abe, 0x4a74, 0xa2,0x61, 0x1e,0xb7,0x6b,0x55,0x10,0x7a)
#endif
#endif

/*****************************************************************************
 * WSCDefaultProduct coclass
 */

DEFINE_GUID(CLSID_WSCDefaultProduct, 0x2981a36e, 0xf22d, 0x11e5, 0x9c,0xe9, 0x5e,0x55,0x17,0x50,0x7c,0x66);

#ifdef __cplusplus
class DECLSPEC_UUID("2981a36e-f22d-11e5-9ce9-5e5517507c66") WSCDefaultProduct;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WSCDefaultProduct, 0x2981a36e, 0xf22d, 0x11e5, 0x9c,0xe9, 0x5e,0x55,0x17,0x50,0x7c,0x66)
#endif
#endif

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


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __iwscapi_h__ */
