/*** Autogenerated by WIDL 9.5 from include/credentialprovider.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 __credentialprovider_h__
#define __credentialprovider_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 __ICredentialProviderCredential_FWD_DEFINED__
#define __ICredentialProviderCredential_FWD_DEFINED__
typedef interface ICredentialProviderCredential ICredentialProviderCredential;
#ifdef __cplusplus
interface ICredentialProviderCredential;
#endif /* __cplusplus */
#endif

#ifndef __IQueryContinueWithStatus_FWD_DEFINED__
#define __IQueryContinueWithStatus_FWD_DEFINED__
typedef interface IQueryContinueWithStatus IQueryContinueWithStatus;
#ifdef __cplusplus
interface IQueryContinueWithStatus;
#endif /* __cplusplus */
#endif

#ifndef __IConnectableCredentialProviderCredential_FWD_DEFINED__
#define __IConnectableCredentialProviderCredential_FWD_DEFINED__
typedef interface IConnectableCredentialProviderCredential IConnectableCredentialProviderCredential;
#ifdef __cplusplus
interface IConnectableCredentialProviderCredential;
#endif /* __cplusplus */
#endif

#ifndef __ICredentialProviderCredentialEvents_FWD_DEFINED__
#define __ICredentialProviderCredentialEvents_FWD_DEFINED__
typedef interface ICredentialProviderCredentialEvents ICredentialProviderCredentialEvents;
#ifdef __cplusplus
interface ICredentialProviderCredentialEvents;
#endif /* __cplusplus */
#endif

#ifndef __ICredentialProvider_FWD_DEFINED__
#define __ICredentialProvider_FWD_DEFINED__
typedef interface ICredentialProvider ICredentialProvider;
#ifdef __cplusplus
interface ICredentialProvider;
#endif /* __cplusplus */
#endif

#ifndef __ICredentialProviderEvents_FWD_DEFINED__
#define __ICredentialProviderEvents_FWD_DEFINED__
typedef interface ICredentialProviderEvents ICredentialProviderEvents;
#ifdef __cplusplus
interface ICredentialProviderEvents;
#endif /* __cplusplus */
#endif

#ifndef __ICredentialProviderFilter_FWD_DEFINED__
#define __ICredentialProviderFilter_FWD_DEFINED__
typedef interface ICredentialProviderFilter ICredentialProviderFilter;
#ifdef __cplusplus
interface ICredentialProviderFilter;
#endif /* __cplusplus */
#endif

#ifndef __ICredentialProviderCredential2_FWD_DEFINED__
#define __ICredentialProviderCredential2_FWD_DEFINED__
typedef interface ICredentialProviderCredential2 ICredentialProviderCredential2;
#ifdef __cplusplus
interface ICredentialProviderCredential2;
#endif /* __cplusplus */
#endif

#ifndef __ICredentialProviderCredentialWithFieldOptions_FWD_DEFINED__
#define __ICredentialProviderCredentialWithFieldOptions_FWD_DEFINED__
typedef interface ICredentialProviderCredentialWithFieldOptions ICredentialProviderCredentialWithFieldOptions;
#ifdef __cplusplus
interface ICredentialProviderCredentialWithFieldOptions;
#endif /* __cplusplus */
#endif

#ifndef __ICredentialProviderCredentialEvents2_FWD_DEFINED__
#define __ICredentialProviderCredentialEvents2_FWD_DEFINED__
typedef interface ICredentialProviderCredentialEvents2 ICredentialProviderCredentialEvents2;
#ifdef __cplusplus
interface ICredentialProviderCredentialEvents2;
#endif /* __cplusplus */
#endif

#ifndef __ICredentialProviderUser_FWD_DEFINED__
#define __ICredentialProviderUser_FWD_DEFINED__
typedef interface ICredentialProviderUser ICredentialProviderUser;
#ifdef __cplusplus
interface ICredentialProviderUser;
#endif /* __cplusplus */
#endif

#ifndef __ICredentialProviderUserArray_FWD_DEFINED__
#define __ICredentialProviderUserArray_FWD_DEFINED__
typedef interface ICredentialProviderUserArray ICredentialProviderUserArray;
#ifdef __cplusplus
interface ICredentialProviderUserArray;
#endif /* __cplusplus */
#endif

#ifndef __ICredentialProviderSetUserArray_FWD_DEFINED__
#define __ICredentialProviderSetUserArray_FWD_DEFINED__
typedef interface ICredentialProviderSetUserArray ICredentialProviderSetUserArray;
#ifdef __cplusplus
interface ICredentialProviderSetUserArray;
#endif /* __cplusplus */
#endif

#ifndef __PasswordCredentialProvider_FWD_DEFINED__
#define __PasswordCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class PasswordCredentialProvider PasswordCredentialProvider;
#else
typedef struct PasswordCredentialProvider PasswordCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __PasswordCredentialProvider_FWD_DEFINED__ */

#ifndef __V1PasswordCredentialProvider_FWD_DEFINED__
#define __V1PasswordCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class V1PasswordCredentialProvider V1PasswordCredentialProvider;
#else
typedef struct V1PasswordCredentialProvider V1PasswordCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __V1PasswordCredentialProvider_FWD_DEFINED__ */

#ifndef __PINLogonCredentialProvider_FWD_DEFINED__
#define __PINLogonCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class PINLogonCredentialProvider PINLogonCredentialProvider;
#else
typedef struct PINLogonCredentialProvider PINLogonCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __PINLogonCredentialProvider_FWD_DEFINED__ */

#ifndef __NPCredentialProvider_FWD_DEFINED__
#define __NPCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class NPCredentialProvider NPCredentialProvider;
#else
typedef struct NPCredentialProvider NPCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __NPCredentialProvider_FWD_DEFINED__ */

#ifndef __SmartcardCredentialProvider_FWD_DEFINED__
#define __SmartcardCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class SmartcardCredentialProvider SmartcardCredentialProvider;
#else
typedef struct SmartcardCredentialProvider SmartcardCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __SmartcardCredentialProvider_FWD_DEFINED__ */

#ifndef __V1SmartcardCredentialProvider_FWD_DEFINED__
#define __V1SmartcardCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class V1SmartcardCredentialProvider V1SmartcardCredentialProvider;
#else
typedef struct V1SmartcardCredentialProvider V1SmartcardCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __V1SmartcardCredentialProvider_FWD_DEFINED__ */

#ifndef __SmartcardPinProvider_FWD_DEFINED__
#define __SmartcardPinProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class SmartcardPinProvider SmartcardPinProvider;
#else
typedef struct SmartcardPinProvider SmartcardPinProvider;
#endif /* defined __cplusplus */
#endif /* defined __SmartcardPinProvider_FWD_DEFINED__ */

#ifndef __SmartcardReaderSelectionProvider_FWD_DEFINED__
#define __SmartcardReaderSelectionProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class SmartcardReaderSelectionProvider SmartcardReaderSelectionProvider;
#else
typedef struct SmartcardReaderSelectionProvider SmartcardReaderSelectionProvider;
#endif /* defined __cplusplus */
#endif /* defined __SmartcardReaderSelectionProvider_FWD_DEFINED__ */

#ifndef __SmartcardWinRTProvider_FWD_DEFINED__
#define __SmartcardWinRTProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class SmartcardWinRTProvider SmartcardWinRTProvider;
#else
typedef struct SmartcardWinRTProvider SmartcardWinRTProvider;
#endif /* defined __cplusplus */
#endif /* defined __SmartcardWinRTProvider_FWD_DEFINED__ */

#ifndef __GenericCredentialProvider_FWD_DEFINED__
#define __GenericCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class GenericCredentialProvider GenericCredentialProvider;
#else
typedef struct GenericCredentialProvider GenericCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __GenericCredentialProvider_FWD_DEFINED__ */

#ifndef __RASProvider_FWD_DEFINED__
#define __RASProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class RASProvider RASProvider;
#else
typedef struct RASProvider RASProvider;
#endif /* defined __cplusplus */
#endif /* defined __RASProvider_FWD_DEFINED__ */

#ifndef __OnexCredentialProvider_FWD_DEFINED__
#define __OnexCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class OnexCredentialProvider OnexCredentialProvider;
#else
typedef struct OnexCredentialProvider OnexCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __OnexCredentialProvider_FWD_DEFINED__ */

#ifndef __OnexPlapSmartcardCredentialProvider_FWD_DEFINED__
#define __OnexPlapSmartcardCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class OnexPlapSmartcardCredentialProvider OnexPlapSmartcardCredentialProvider;
#else
typedef struct OnexPlapSmartcardCredentialProvider OnexPlapSmartcardCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __OnexPlapSmartcardCredentialProvider_FWD_DEFINED__ */

#ifndef __VaultProvider_FWD_DEFINED__
#define __VaultProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class VaultProvider VaultProvider;
#else
typedef struct VaultProvider VaultProvider;
#endif /* defined __cplusplus */
#endif /* defined __VaultProvider_FWD_DEFINED__ */

#ifndef __WinBioCredentialProvider_FWD_DEFINED__
#define __WinBioCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class WinBioCredentialProvider WinBioCredentialProvider;
#else
typedef struct WinBioCredentialProvider WinBioCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __WinBioCredentialProvider_FWD_DEFINED__ */

#ifndef __V1WinBioCredentialProvider_FWD_DEFINED__
#define __V1WinBioCredentialProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class V1WinBioCredentialProvider V1WinBioCredentialProvider;
#else
typedef struct V1WinBioCredentialProvider V1WinBioCredentialProvider;
#endif /* defined __cplusplus */
#endif /* defined __V1WinBioCredentialProvider_FWD_DEFINED__ */

/* Headers for imported files */

#include <wtypes.h>
#include <shobjidl.h>
#include <propsys.h>
#include <unknwn.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
typedef enum _CREDENTIAL_PROVIDER_USAGE_SCENARIO {
    CPUS_INVALID = 0,
    CPUS_LOGON = 1,
    CPUS_UNLOCK_WORKSTATION = 2,
    CPUS_CHANGE_PASSWORD = 3,
    CPUS_CREDUI = 4,
    CPUS_PLAP = 5
} CREDENTIAL_PROVIDER_USAGE_SCENARIO;
typedef enum _CREDENTIAL_PROVIDER_FIELD_TYPE {
    CPFT_INVALID = 0,
    CPFT_LARGE_TEXT = 1,
    CPFT_SMALL_TEXT = 2,
    CPFT_COMMAND_LINK = 3,
    CPFT_EDIT_TEXT = 4,
    CPFT_PASSWORD_TEXT = 5,
    CPFT_TILE_IMAGE = 6,
    CPFT_CHECKBOX = 7,
    CPFT_COMBOBOX = 8,
    CPFT_SUBMIT_BUTTON = 9
} CREDENTIAL_PROVIDER_FIELD_TYPE;
typedef enum _CREDENTIAL_PROVIDER_FIELD_STATE {
    CPFS_HIDDEN = 0,
    CPFS_DISPLAY_IN_SELECTED_TILE = 1,
    CPFS_DISPLAY_IN_DESELECTED_TILE = 2,
    CPFS_DISPLAY_IN_BOTH = 3
} CREDENTIAL_PROVIDER_FIELD_STATE;
typedef enum _CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE {
    CPFIS_NONE = 0,
    CPFIS_READONLY = 1,
    CPFIS_DISABLED = 2,
    CPFIS_FOCUSED = 3
} CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE;
typedef struct _CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR {
    DWORD dwFieldID;
    CREDENTIAL_PROVIDER_FIELD_TYPE cpft;
    LPWSTR pszLabel;
    GUID guidFieldType;
} CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR;
typedef enum _CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE {
    CPGSR_NO_CREDENTIAL_NOT_FINISHED = 0,
    CPGSR_NO_CREDENTIAL_FINISHED = 1,
    CPGSR_RETURN_CREDENTIAL_FINISHED = 2,
    CPGSR_RETURN_NO_CREDENTIAL_FINISHED = 3
} CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE;
typedef enum _CREDENTIAL_PROVIDER_STATUS_ICON {
    CPSI_NONE = 0,
    CPSI_ERROR = 1,
    CPSI_WARNING = 2,
    CPSI_SUCCESS = 3
} CREDENTIAL_PROVIDER_STATUS_ICON;
typedef struct _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION {
    ULONG ulAuthenticationPackage;
    GUID clsidCredentialProvider;
    ULONG cbSerialization;
    byte *rgbSerialization;
} CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION;
#if (NTDDI_VERSION >= NTDDI_WIN8)
typedef enum CREDENTIAL_PROVIDER_ACCOUNT_OPTIONS {
    CPAO_NONE = 0x0,
    CPAO_EMPTY_LOCAL = 0x1,
    CPAO_EMPTY_CONNECTED = 0x2
} CREDENTIAL_PROVIDER_ACCOUNT_OPTIONS;
DEFINE_ENUM_FLAG_OPERATORS(CREDENTIAL_PROVIDER_ACCOUNT_OPTIONS)
typedef enum CREDENTIAL_PROVIDER_CREDENTIAL_FIELD_OPTIONS {
    CPCFO_NONE = 0x0,
    CPCFO_ENABLE_PASSWORD_REVEAL = 0x1,
    CPCFO_IS_EMAIL_ADDRESS = 0x2,
    CPCFO_ENABLE_TOUCH_KEYBOARD_AUTO_INVOKE = 0x4,
    CPCFO_NUMBERS_ONLY = 0x8,
    CPCFO_SHOW_ENGLISH_KEYBOARD = 0x10
} CREDENTIAL_PROVIDER_CREDENTIAL_FIELD_OPTIONS;
DEFINE_ENUM_FLAG_OPERATORS(CREDENTIAL_PROVIDER_CREDENTIAL_FIELD_OPTIONS)
#endif /* (NTDDI_VERSION >= NTDDI_WIN8) */
#ifdef __WIDL__
typedef LONG NTSTATUS;
#else
#ifndef NTSTATUS
typedef LONG NTSTATUS;
#endif
#endif
#define CREDENTIAL_PROVIDER_NO_DEFAULT ((DWORD)-1)
#ifndef __ICredentialProviderCredentialEvents_FWD_DEFINED__
#define __ICredentialProviderCredentialEvents_FWD_DEFINED__
typedef interface ICredentialProviderCredentialEvents ICredentialProviderCredentialEvents;
#ifdef __cplusplus
interface ICredentialProviderCredentialEvents;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * ICredentialProviderCredential interface
 */
#ifndef __ICredentialProviderCredential_INTERFACE_DEFINED__
#define __ICredentialProviderCredential_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProviderCredential, 0x63913a93, 0x40c1, 0x481a, 0x81,0x8d, 0x40,0x72,0xff,0x8c,0x70,0xcc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("63913a93-40c1-481a-818d-4072ff8c70cc")
ICredentialProviderCredential : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Advise(
        ICredentialProviderCredentialEvents *pcpce) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnAdvise(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSelected(
        WINBOOL *pbAutoLogon) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDeselected(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFieldState(
        DWORD dwFieldID,
        CREDENTIAL_PROVIDER_FIELD_STATE *pcpfs,
        CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE *pcpfis) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStringValue(
        DWORD dwFieldID,
        LPWSTR *ppsz) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBitmapValue(
        DWORD dwFieldID,
        HBITMAP *phbmp) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCheckboxValue(
        DWORD dwFieldID,
        WINBOOL *pbChecked,
        LPWSTR *ppszLabel) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSubmitButtonValue(
        DWORD dwFieldID,
        DWORD *pdwAdjacentTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetComboBoxValueCount(
        DWORD dwFieldID,
        DWORD *pcItems,
        DWORD *pdwSelectedItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetComboBoxValueAt(
        DWORD dwFieldID,
        DWORD dwItem,
        LPWSTR *ppszItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStringValue(
        DWORD dwFieldID,
        LPCWSTR psz) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCheckboxValue(
        DWORD dwFieldID,
        WINBOOL bChecked) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetComboBoxSelectedValue(
        DWORD dwFieldID,
        DWORD dwSelectedItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommandLinkClicked(
        DWORD dwFieldID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSerialization(
        CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr,
        CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs,
        LPWSTR *ppszOptionalStatusText,
        CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReportResult(
        NTSTATUS ntsStatus,
        NTSTATUS ntsSubstatus,
        LPWSTR *ppszOptionalStatusText,
        CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProviderCredential, 0x63913a93, 0x40c1, 0x481a, 0x81,0x8d, 0x40,0x72,0xff,0x8c,0x70,0xcc)
#endif
#else
typedef struct ICredentialProviderCredentialVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderCredential methods ***/
    HRESULT (STDMETHODCALLTYPE *Advise)(
        ICredentialProviderCredential *This,
        ICredentialProviderCredentialEvents *pcpce);

    HRESULT (STDMETHODCALLTYPE *UnAdvise)(
        ICredentialProviderCredential *This);

    HRESULT (STDMETHODCALLTYPE *SetSelected)(
        ICredentialProviderCredential *This,
        WINBOOL *pbAutoLogon);

    HRESULT (STDMETHODCALLTYPE *SetDeselected)(
        ICredentialProviderCredential *This);

    HRESULT (STDMETHODCALLTYPE *GetFieldState)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID,
        CREDENTIAL_PROVIDER_FIELD_STATE *pcpfs,
        CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE *pcpfis);

    HRESULT (STDMETHODCALLTYPE *GetStringValue)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID,
        LPWSTR *ppsz);

    HRESULT (STDMETHODCALLTYPE *GetBitmapValue)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID,
        HBITMAP *phbmp);

    HRESULT (STDMETHODCALLTYPE *GetCheckboxValue)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID,
        WINBOOL *pbChecked,
        LPWSTR *ppszLabel);

    HRESULT (STDMETHODCALLTYPE *GetSubmitButtonValue)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID,
        DWORD *pdwAdjacentTo);

    HRESULT (STDMETHODCALLTYPE *GetComboBoxValueCount)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID,
        DWORD *pcItems,
        DWORD *pdwSelectedItem);

    HRESULT (STDMETHODCALLTYPE *GetComboBoxValueAt)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID,
        DWORD dwItem,
        LPWSTR *ppszItem);

    HRESULT (STDMETHODCALLTYPE *SetStringValue)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID,
        LPCWSTR psz);

    HRESULT (STDMETHODCALLTYPE *SetCheckboxValue)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID,
        WINBOOL bChecked);

    HRESULT (STDMETHODCALLTYPE *SetComboBoxSelectedValue)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID,
        DWORD dwSelectedItem);

    HRESULT (STDMETHODCALLTYPE *CommandLinkClicked)(
        ICredentialProviderCredential *This,
        DWORD dwFieldID);

    HRESULT (STDMETHODCALLTYPE *GetSerialization)(
        ICredentialProviderCredential *This,
        CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr,
        CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs,
        LPWSTR *ppszOptionalStatusText,
        CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon);

    HRESULT (STDMETHODCALLTYPE *ReportResult)(
        ICredentialProviderCredential *This,
        NTSTATUS ntsStatus,
        NTSTATUS ntsSubstatus,
        LPWSTR *ppszOptionalStatusText,
        CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon);

    END_INTERFACE
} ICredentialProviderCredentialVtbl;

interface ICredentialProviderCredential {
    CONST_VTBL ICredentialProviderCredentialVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProviderCredential_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProviderCredential_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProviderCredential_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderCredential methods ***/
#define ICredentialProviderCredential_Advise(This,pcpce) (This)->lpVtbl->Advise(This,pcpce)
#define ICredentialProviderCredential_UnAdvise(This) (This)->lpVtbl->UnAdvise(This)
#define ICredentialProviderCredential_SetSelected(This,pbAutoLogon) (This)->lpVtbl->SetSelected(This,pbAutoLogon)
#define ICredentialProviderCredential_SetDeselected(This) (This)->lpVtbl->SetDeselected(This)
#define ICredentialProviderCredential_GetFieldState(This,dwFieldID,pcpfs,pcpfis) (This)->lpVtbl->GetFieldState(This,dwFieldID,pcpfs,pcpfis)
#define ICredentialProviderCredential_GetStringValue(This,dwFieldID,ppsz) (This)->lpVtbl->GetStringValue(This,dwFieldID,ppsz)
#define ICredentialProviderCredential_GetBitmapValue(This,dwFieldID,phbmp) (This)->lpVtbl->GetBitmapValue(This,dwFieldID,phbmp)
#define ICredentialProviderCredential_GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel) (This)->lpVtbl->GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel)
#define ICredentialProviderCredential_GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo) (This)->lpVtbl->GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo)
#define ICredentialProviderCredential_GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem) (This)->lpVtbl->GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem)
#define ICredentialProviderCredential_GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem) (This)->lpVtbl->GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem)
#define ICredentialProviderCredential_SetStringValue(This,dwFieldID,psz) (This)->lpVtbl->SetStringValue(This,dwFieldID,psz)
#define ICredentialProviderCredential_SetCheckboxValue(This,dwFieldID,bChecked) (This)->lpVtbl->SetCheckboxValue(This,dwFieldID,bChecked)
#define ICredentialProviderCredential_SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem) (This)->lpVtbl->SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem)
#define ICredentialProviderCredential_CommandLinkClicked(This,dwFieldID) (This)->lpVtbl->CommandLinkClicked(This,dwFieldID)
#define ICredentialProviderCredential_GetSerialization(This,pcpgsr,pcpcs,ppszOptionalStatusText,pcpsiOptionalStatusIcon) (This)->lpVtbl->GetSerialization(This,pcpgsr,pcpcs,ppszOptionalStatusText,pcpsiOptionalStatusIcon)
#define ICredentialProviderCredential_ReportResult(This,ntsStatus,ntsSubstatus,ppszOptionalStatusText,pcpsiOptionalStatusIcon) (This)->lpVtbl->ReportResult(This,ntsStatus,ntsSubstatus,ppszOptionalStatusText,pcpsiOptionalStatusIcon)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredential_QueryInterface(ICredentialProviderCredential* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProviderCredential_AddRef(ICredentialProviderCredential* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProviderCredential_Release(ICredentialProviderCredential* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredential methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredential_Advise(ICredentialProviderCredential* This,ICredentialProviderCredentialEvents *pcpce) {
    return This->lpVtbl->Advise(This,pcpce);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_UnAdvise(ICredentialProviderCredential* This) {
    return This->lpVtbl->UnAdvise(This);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_SetSelected(ICredentialProviderCredential* This,WINBOOL *pbAutoLogon) {
    return This->lpVtbl->SetSelected(This,pbAutoLogon);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_SetDeselected(ICredentialProviderCredential* This) {
    return This->lpVtbl->SetDeselected(This);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_GetFieldState(ICredentialProviderCredential* This,DWORD dwFieldID,CREDENTIAL_PROVIDER_FIELD_STATE *pcpfs,CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE *pcpfis) {
    return This->lpVtbl->GetFieldState(This,dwFieldID,pcpfs,pcpfis);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_GetStringValue(ICredentialProviderCredential* This,DWORD dwFieldID,LPWSTR *ppsz) {
    return This->lpVtbl->GetStringValue(This,dwFieldID,ppsz);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_GetBitmapValue(ICredentialProviderCredential* This,DWORD dwFieldID,HBITMAP *phbmp) {
    return This->lpVtbl->GetBitmapValue(This,dwFieldID,phbmp);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_GetCheckboxValue(ICredentialProviderCredential* This,DWORD dwFieldID,WINBOOL *pbChecked,LPWSTR *ppszLabel) {
    return This->lpVtbl->GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_GetSubmitButtonValue(ICredentialProviderCredential* This,DWORD dwFieldID,DWORD *pdwAdjacentTo) {
    return This->lpVtbl->GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_GetComboBoxValueCount(ICredentialProviderCredential* This,DWORD dwFieldID,DWORD *pcItems,DWORD *pdwSelectedItem) {
    return This->lpVtbl->GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_GetComboBoxValueAt(ICredentialProviderCredential* This,DWORD dwFieldID,DWORD dwItem,LPWSTR *ppszItem) {
    return This->lpVtbl->GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_SetStringValue(ICredentialProviderCredential* This,DWORD dwFieldID,LPCWSTR psz) {
    return This->lpVtbl->SetStringValue(This,dwFieldID,psz);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_SetCheckboxValue(ICredentialProviderCredential* This,DWORD dwFieldID,WINBOOL bChecked) {
    return This->lpVtbl->SetCheckboxValue(This,dwFieldID,bChecked);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_SetComboBoxSelectedValue(ICredentialProviderCredential* This,DWORD dwFieldID,DWORD dwSelectedItem) {
    return This->lpVtbl->SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_CommandLinkClicked(ICredentialProviderCredential* This,DWORD dwFieldID) {
    return This->lpVtbl->CommandLinkClicked(This,dwFieldID);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_GetSerialization(ICredentialProviderCredential* This,CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr,CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs,LPWSTR *ppszOptionalStatusText,CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon) {
    return This->lpVtbl->GetSerialization(This,pcpgsr,pcpcs,ppszOptionalStatusText,pcpsiOptionalStatusIcon);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential_ReportResult(ICredentialProviderCredential* This,NTSTATUS ntsStatus,NTSTATUS ntsSubstatus,LPWSTR *ppszOptionalStatusText,CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon) {
    return This->lpVtbl->ReportResult(This,ntsStatus,ntsSubstatus,ppszOptionalStatusText,pcpsiOptionalStatusIcon);
}
#endif
#endif

#endif


#endif  /* __ICredentialProviderCredential_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IQueryContinueWithStatus interface
 */
#ifndef __IQueryContinueWithStatus_INTERFACE_DEFINED__
#define __IQueryContinueWithStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID_IQueryContinueWithStatus, 0x9090be5b, 0x502b, 0x41fb, 0xbc,0xcc, 0x00,0x49,0xa6,0xc7,0x25,0x4b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9090be5b-502b-41fb-bccc-0049a6c7254b")
IQueryContinueWithStatus : public IQueryContinue
{
    virtual HRESULT STDMETHODCALLTYPE SetStatusMessage(
        LPCWSTR psz) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IQueryContinueWithStatus, 0x9090be5b, 0x502b, 0x41fb, 0xbc,0xcc, 0x00,0x49,0xa6,0xc7,0x25,0x4b)
#endif
#else
typedef struct IQueryContinueWithStatusVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IQueryContinue methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryContinue)(
        IQueryContinueWithStatus *This);

    /*** IQueryContinueWithStatus methods ***/
    HRESULT (STDMETHODCALLTYPE *SetStatusMessage)(
        IQueryContinueWithStatus *This,
        LPCWSTR psz);

    END_INTERFACE
} IQueryContinueWithStatusVtbl;

interface IQueryContinueWithStatus {
    CONST_VTBL IQueryContinueWithStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IQueryContinueWithStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IQueryContinueWithStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IQueryContinueWithStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IQueryContinue methods ***/
#define IQueryContinueWithStatus_QueryContinue(This) (This)->lpVtbl->QueryContinue(This)
/*** IQueryContinueWithStatus methods ***/
#define IQueryContinueWithStatus_SetStatusMessage(This,psz) (This)->lpVtbl->SetStatusMessage(This,psz)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IQueryContinueWithStatus_QueryInterface(IQueryContinueWithStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IQueryContinueWithStatus_AddRef(IQueryContinueWithStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IQueryContinueWithStatus_Release(IQueryContinueWithStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IQueryContinue methods ***/
static __WIDL_INLINE HRESULT IQueryContinueWithStatus_QueryContinue(IQueryContinueWithStatus* This) {
    return This->lpVtbl->QueryContinue(This);
}
/*** IQueryContinueWithStatus methods ***/
static __WIDL_INLINE HRESULT IQueryContinueWithStatus_SetStatusMessage(IQueryContinueWithStatus* This,LPCWSTR psz) {
    return This->lpVtbl->SetStatusMessage(This,psz);
}
#endif
#endif

#endif


#endif  /* __IQueryContinueWithStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IConnectableCredentialProviderCredential interface
 */
#ifndef __IConnectableCredentialProviderCredential_INTERFACE_DEFINED__
#define __IConnectableCredentialProviderCredential_INTERFACE_DEFINED__

DEFINE_GUID(IID_IConnectableCredentialProviderCredential, 0x9387928b, 0xac75, 0x4bf9, 0x8a,0xb2, 0x2b,0x93,0xc4,0xa5,0x52,0x90);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9387928b-ac75-4bf9-8ab2-2b93c4a55290")
IConnectableCredentialProviderCredential : public ICredentialProviderCredential
{
    virtual HRESULT STDMETHODCALLTYPE Connect(
        IQueryContinueWithStatus *pqcws) = 0;

    virtual HRESULT STDMETHODCALLTYPE Disconnect(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IConnectableCredentialProviderCredential, 0x9387928b, 0xac75, 0x4bf9, 0x8a,0xb2, 0x2b,0x93,0xc4,0xa5,0x52,0x90)
#endif
#else
typedef struct IConnectableCredentialProviderCredentialVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderCredential methods ***/
    HRESULT (STDMETHODCALLTYPE *Advise)(
        IConnectableCredentialProviderCredential *This,
        ICredentialProviderCredentialEvents *pcpce);

    HRESULT (STDMETHODCALLTYPE *UnAdvise)(
        IConnectableCredentialProviderCredential *This);

    HRESULT (STDMETHODCALLTYPE *SetSelected)(
        IConnectableCredentialProviderCredential *This,
        WINBOOL *pbAutoLogon);

    HRESULT (STDMETHODCALLTYPE *SetDeselected)(
        IConnectableCredentialProviderCredential *This);

    HRESULT (STDMETHODCALLTYPE *GetFieldState)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID,
        CREDENTIAL_PROVIDER_FIELD_STATE *pcpfs,
        CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE *pcpfis);

    HRESULT (STDMETHODCALLTYPE *GetStringValue)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID,
        LPWSTR *ppsz);

    HRESULT (STDMETHODCALLTYPE *GetBitmapValue)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID,
        HBITMAP *phbmp);

    HRESULT (STDMETHODCALLTYPE *GetCheckboxValue)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID,
        WINBOOL *pbChecked,
        LPWSTR *ppszLabel);

    HRESULT (STDMETHODCALLTYPE *GetSubmitButtonValue)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID,
        DWORD *pdwAdjacentTo);

    HRESULT (STDMETHODCALLTYPE *GetComboBoxValueCount)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID,
        DWORD *pcItems,
        DWORD *pdwSelectedItem);

    HRESULT (STDMETHODCALLTYPE *GetComboBoxValueAt)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID,
        DWORD dwItem,
        LPWSTR *ppszItem);

    HRESULT (STDMETHODCALLTYPE *SetStringValue)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID,
        LPCWSTR psz);

    HRESULT (STDMETHODCALLTYPE *SetCheckboxValue)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID,
        WINBOOL bChecked);

    HRESULT (STDMETHODCALLTYPE *SetComboBoxSelectedValue)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID,
        DWORD dwSelectedItem);

    HRESULT (STDMETHODCALLTYPE *CommandLinkClicked)(
        IConnectableCredentialProviderCredential *This,
        DWORD dwFieldID);

    HRESULT (STDMETHODCALLTYPE *GetSerialization)(
        IConnectableCredentialProviderCredential *This,
        CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr,
        CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs,
        LPWSTR *ppszOptionalStatusText,
        CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon);

    HRESULT (STDMETHODCALLTYPE *ReportResult)(
        IConnectableCredentialProviderCredential *This,
        NTSTATUS ntsStatus,
        NTSTATUS ntsSubstatus,
        LPWSTR *ppszOptionalStatusText,
        CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon);

    /*** IConnectableCredentialProviderCredential methods ***/
    HRESULT (STDMETHODCALLTYPE *Connect)(
        IConnectableCredentialProviderCredential *This,
        IQueryContinueWithStatus *pqcws);

    HRESULT (STDMETHODCALLTYPE *Disconnect)(
        IConnectableCredentialProviderCredential *This);

    END_INTERFACE
} IConnectableCredentialProviderCredentialVtbl;

interface IConnectableCredentialProviderCredential {
    CONST_VTBL IConnectableCredentialProviderCredentialVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IConnectableCredentialProviderCredential_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IConnectableCredentialProviderCredential_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IConnectableCredentialProviderCredential_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderCredential methods ***/
#define IConnectableCredentialProviderCredential_Advise(This,pcpce) (This)->lpVtbl->Advise(This,pcpce)
#define IConnectableCredentialProviderCredential_UnAdvise(This) (This)->lpVtbl->UnAdvise(This)
#define IConnectableCredentialProviderCredential_SetSelected(This,pbAutoLogon) (This)->lpVtbl->SetSelected(This,pbAutoLogon)
#define IConnectableCredentialProviderCredential_SetDeselected(This) (This)->lpVtbl->SetDeselected(This)
#define IConnectableCredentialProviderCredential_GetFieldState(This,dwFieldID,pcpfs,pcpfis) (This)->lpVtbl->GetFieldState(This,dwFieldID,pcpfs,pcpfis)
#define IConnectableCredentialProviderCredential_GetStringValue(This,dwFieldID,ppsz) (This)->lpVtbl->GetStringValue(This,dwFieldID,ppsz)
#define IConnectableCredentialProviderCredential_GetBitmapValue(This,dwFieldID,phbmp) (This)->lpVtbl->GetBitmapValue(This,dwFieldID,phbmp)
#define IConnectableCredentialProviderCredential_GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel) (This)->lpVtbl->GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel)
#define IConnectableCredentialProviderCredential_GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo) (This)->lpVtbl->GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo)
#define IConnectableCredentialProviderCredential_GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem) (This)->lpVtbl->GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem)
#define IConnectableCredentialProviderCredential_GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem) (This)->lpVtbl->GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem)
#define IConnectableCredentialProviderCredential_SetStringValue(This,dwFieldID,psz) (This)->lpVtbl->SetStringValue(This,dwFieldID,psz)
#define IConnectableCredentialProviderCredential_SetCheckboxValue(This,dwFieldID,bChecked) (This)->lpVtbl->SetCheckboxValue(This,dwFieldID,bChecked)
#define IConnectableCredentialProviderCredential_SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem) (This)->lpVtbl->SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem)
#define IConnectableCredentialProviderCredential_CommandLinkClicked(This,dwFieldID) (This)->lpVtbl->CommandLinkClicked(This,dwFieldID)
#define IConnectableCredentialProviderCredential_GetSerialization(This,pcpgsr,pcpcs,ppszOptionalStatusText,pcpsiOptionalStatusIcon) (This)->lpVtbl->GetSerialization(This,pcpgsr,pcpcs,ppszOptionalStatusText,pcpsiOptionalStatusIcon)
#define IConnectableCredentialProviderCredential_ReportResult(This,ntsStatus,ntsSubstatus,ppszOptionalStatusText,pcpsiOptionalStatusIcon) (This)->lpVtbl->ReportResult(This,ntsStatus,ntsSubstatus,ppszOptionalStatusText,pcpsiOptionalStatusIcon)
/*** IConnectableCredentialProviderCredential methods ***/
#define IConnectableCredentialProviderCredential_Connect(This,pqcws) (This)->lpVtbl->Connect(This,pqcws)
#define IConnectableCredentialProviderCredential_Disconnect(This) (This)->lpVtbl->Disconnect(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_QueryInterface(IConnectableCredentialProviderCredential* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IConnectableCredentialProviderCredential_AddRef(IConnectableCredentialProviderCredential* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IConnectableCredentialProviderCredential_Release(IConnectableCredentialProviderCredential* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredential methods ***/
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_Advise(IConnectableCredentialProviderCredential* This,ICredentialProviderCredentialEvents *pcpce) {
    return This->lpVtbl->Advise(This,pcpce);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_UnAdvise(IConnectableCredentialProviderCredential* This) {
    return This->lpVtbl->UnAdvise(This);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_SetSelected(IConnectableCredentialProviderCredential* This,WINBOOL *pbAutoLogon) {
    return This->lpVtbl->SetSelected(This,pbAutoLogon);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_SetDeselected(IConnectableCredentialProviderCredential* This) {
    return This->lpVtbl->SetDeselected(This);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_GetFieldState(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,CREDENTIAL_PROVIDER_FIELD_STATE *pcpfs,CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE *pcpfis) {
    return This->lpVtbl->GetFieldState(This,dwFieldID,pcpfs,pcpfis);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_GetStringValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,LPWSTR *ppsz) {
    return This->lpVtbl->GetStringValue(This,dwFieldID,ppsz);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_GetBitmapValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,HBITMAP *phbmp) {
    return This->lpVtbl->GetBitmapValue(This,dwFieldID,phbmp);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_GetCheckboxValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,WINBOOL *pbChecked,LPWSTR *ppszLabel) {
    return This->lpVtbl->GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_GetSubmitButtonValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,DWORD *pdwAdjacentTo) {
    return This->lpVtbl->GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_GetComboBoxValueCount(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,DWORD *pcItems,DWORD *pdwSelectedItem) {
    return This->lpVtbl->GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_GetComboBoxValueAt(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,DWORD dwItem,LPWSTR *ppszItem) {
    return This->lpVtbl->GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_SetStringValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,LPCWSTR psz) {
    return This->lpVtbl->SetStringValue(This,dwFieldID,psz);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_SetCheckboxValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,WINBOOL bChecked) {
    return This->lpVtbl->SetCheckboxValue(This,dwFieldID,bChecked);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_SetComboBoxSelectedValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,DWORD dwSelectedItem) {
    return This->lpVtbl->SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_CommandLinkClicked(IConnectableCredentialProviderCredential* This,DWORD dwFieldID) {
    return This->lpVtbl->CommandLinkClicked(This,dwFieldID);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_GetSerialization(IConnectableCredentialProviderCredential* This,CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr,CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs,LPWSTR *ppszOptionalStatusText,CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon) {
    return This->lpVtbl->GetSerialization(This,pcpgsr,pcpcs,ppszOptionalStatusText,pcpsiOptionalStatusIcon);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_ReportResult(IConnectableCredentialProviderCredential* This,NTSTATUS ntsStatus,NTSTATUS ntsSubstatus,LPWSTR *ppszOptionalStatusText,CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon) {
    return This->lpVtbl->ReportResult(This,ntsStatus,ntsSubstatus,ppszOptionalStatusText,pcpsiOptionalStatusIcon);
}
/*** IConnectableCredentialProviderCredential methods ***/
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_Connect(IConnectableCredentialProviderCredential* This,IQueryContinueWithStatus *pqcws) {
    return This->lpVtbl->Connect(This,pqcws);
}
static __WIDL_INLINE HRESULT IConnectableCredentialProviderCredential_Disconnect(IConnectableCredentialProviderCredential* This) {
    return This->lpVtbl->Disconnect(This);
}
#endif
#endif

#endif


#endif  /* __IConnectableCredentialProviderCredential_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICredentialProviderCredentialEvents interface
 */
#ifndef __ICredentialProviderCredentialEvents_INTERFACE_DEFINED__
#define __ICredentialProviderCredentialEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProviderCredentialEvents, 0xfa6fa76b, 0x66b7, 0x4b11, 0x95,0xf1, 0x86,0x17,0x11,0x18,0xe8,0x16);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fa6fa76b-66b7-4b11-95f1-86171118e816")
ICredentialProviderCredentialEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetFieldState(
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        CREDENTIAL_PROVIDER_FIELD_STATE cpfs) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFieldInteractiveState(
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE cpfis) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFieldString(
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        LPCWSTR psz) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFieldCheckbox(
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        WINBOOL bChecked,
        LPCWSTR pszLabel) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFieldBitmap(
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        HBITMAP hbmp) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFieldComboBoxSelectedItem(
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        DWORD dwSelectedItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteFieldComboBoxItem(
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        DWORD dwItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE AppendFieldComboBoxItem(
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        LPCWSTR pszItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFieldSubmitButton(
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        DWORD dwAdjacentTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnCreatingWindow(
        HWND *phwndOwner) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProviderCredentialEvents, 0xfa6fa76b, 0x66b7, 0x4b11, 0x95,0xf1, 0x86,0x17,0x11,0x18,0xe8,0x16)
#endif
#else
typedef struct ICredentialProviderCredentialEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderCredentialEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFieldState)(
        ICredentialProviderCredentialEvents *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        CREDENTIAL_PROVIDER_FIELD_STATE cpfs);

    HRESULT (STDMETHODCALLTYPE *SetFieldInteractiveState)(
        ICredentialProviderCredentialEvents *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE cpfis);

    HRESULT (STDMETHODCALLTYPE *SetFieldString)(
        ICredentialProviderCredentialEvents *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        LPCWSTR psz);

    HRESULT (STDMETHODCALLTYPE *SetFieldCheckbox)(
        ICredentialProviderCredentialEvents *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        WINBOOL bChecked,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *SetFieldBitmap)(
        ICredentialProviderCredentialEvents *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        HBITMAP hbmp);

    HRESULT (STDMETHODCALLTYPE *SetFieldComboBoxSelectedItem)(
        ICredentialProviderCredentialEvents *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        DWORD dwSelectedItem);

    HRESULT (STDMETHODCALLTYPE *DeleteFieldComboBoxItem)(
        ICredentialProviderCredentialEvents *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        DWORD dwItem);

    HRESULT (STDMETHODCALLTYPE *AppendFieldComboBoxItem)(
        ICredentialProviderCredentialEvents *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        LPCWSTR pszItem);

    HRESULT (STDMETHODCALLTYPE *SetFieldSubmitButton)(
        ICredentialProviderCredentialEvents *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        DWORD dwAdjacentTo);

    HRESULT (STDMETHODCALLTYPE *OnCreatingWindow)(
        ICredentialProviderCredentialEvents *This,
        HWND *phwndOwner);

    END_INTERFACE
} ICredentialProviderCredentialEventsVtbl;

interface ICredentialProviderCredentialEvents {
    CONST_VTBL ICredentialProviderCredentialEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProviderCredentialEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProviderCredentialEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProviderCredentialEvents_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderCredentialEvents methods ***/
#define ICredentialProviderCredentialEvents_SetFieldState(This,pcpc,dwFieldID,cpfs) (This)->lpVtbl->SetFieldState(This,pcpc,dwFieldID,cpfs)
#define ICredentialProviderCredentialEvents_SetFieldInteractiveState(This,pcpc,dwFieldID,cpfis) (This)->lpVtbl->SetFieldInteractiveState(This,pcpc,dwFieldID,cpfis)
#define ICredentialProviderCredentialEvents_SetFieldString(This,pcpc,dwFieldID,psz) (This)->lpVtbl->SetFieldString(This,pcpc,dwFieldID,psz)
#define ICredentialProviderCredentialEvents_SetFieldCheckbox(This,pcpc,dwFieldID,bChecked,pszLabel) (This)->lpVtbl->SetFieldCheckbox(This,pcpc,dwFieldID,bChecked,pszLabel)
#define ICredentialProviderCredentialEvents_SetFieldBitmap(This,pcpc,dwFieldID,hbmp) (This)->lpVtbl->SetFieldBitmap(This,pcpc,dwFieldID,hbmp)
#define ICredentialProviderCredentialEvents_SetFieldComboBoxSelectedItem(This,pcpc,dwFieldID,dwSelectedItem) (This)->lpVtbl->SetFieldComboBoxSelectedItem(This,pcpc,dwFieldID,dwSelectedItem)
#define ICredentialProviderCredentialEvents_DeleteFieldComboBoxItem(This,pcpc,dwFieldID,dwItem) (This)->lpVtbl->DeleteFieldComboBoxItem(This,pcpc,dwFieldID,dwItem)
#define ICredentialProviderCredentialEvents_AppendFieldComboBoxItem(This,pcpc,dwFieldID,pszItem) (This)->lpVtbl->AppendFieldComboBoxItem(This,pcpc,dwFieldID,pszItem)
#define ICredentialProviderCredentialEvents_SetFieldSubmitButton(This,pcpc,dwFieldID,dwAdjacentTo) (This)->lpVtbl->SetFieldSubmitButton(This,pcpc,dwFieldID,dwAdjacentTo)
#define ICredentialProviderCredentialEvents_OnCreatingWindow(This,phwndOwner) (This)->lpVtbl->OnCreatingWindow(This,phwndOwner)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_QueryInterface(ICredentialProviderCredentialEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProviderCredentialEvents_AddRef(ICredentialProviderCredentialEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProviderCredentialEvents_Release(ICredentialProviderCredentialEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredentialEvents methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_SetFieldState(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,CREDENTIAL_PROVIDER_FIELD_STATE cpfs) {
    return This->lpVtbl->SetFieldState(This,pcpc,dwFieldID,cpfs);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_SetFieldInteractiveState(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE cpfis) {
    return This->lpVtbl->SetFieldInteractiveState(This,pcpc,dwFieldID,cpfis);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_SetFieldString(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,LPCWSTR psz) {
    return This->lpVtbl->SetFieldString(This,pcpc,dwFieldID,psz);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_SetFieldCheckbox(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,WINBOOL bChecked,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFieldCheckbox(This,pcpc,dwFieldID,bChecked,pszLabel);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_SetFieldBitmap(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,HBITMAP hbmp) {
    return This->lpVtbl->SetFieldBitmap(This,pcpc,dwFieldID,hbmp);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_SetFieldComboBoxSelectedItem(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwSelectedItem) {
    return This->lpVtbl->SetFieldComboBoxSelectedItem(This,pcpc,dwFieldID,dwSelectedItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_DeleteFieldComboBoxItem(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwItem) {
    return This->lpVtbl->DeleteFieldComboBoxItem(This,pcpc,dwFieldID,dwItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_AppendFieldComboBoxItem(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,LPCWSTR pszItem) {
    return This->lpVtbl->AppendFieldComboBoxItem(This,pcpc,dwFieldID,pszItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_SetFieldSubmitButton(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwAdjacentTo) {
    return This->lpVtbl->SetFieldSubmitButton(This,pcpc,dwFieldID,dwAdjacentTo);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents_OnCreatingWindow(ICredentialProviderCredentialEvents* This,HWND *phwndOwner) {
    return This->lpVtbl->OnCreatingWindow(This,phwndOwner);
}
#endif
#endif

#endif


#endif  /* __ICredentialProviderCredentialEvents_INTERFACE_DEFINED__ */

#ifndef __ICredentialProviderEvents_FWD_DEFINED__
#define __ICredentialProviderEvents_FWD_DEFINED__
typedef interface ICredentialProviderEvents ICredentialProviderEvents;
#ifdef __cplusplus
interface ICredentialProviderEvents;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * ICredentialProvider interface
 */
#ifndef __ICredentialProvider_INTERFACE_DEFINED__
#define __ICredentialProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProvider, 0xd27c3481, 0x5a1c, 0x45b2, 0x8a,0xaa, 0xc2,0x0e,0xbb,0xe8,0x22,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d27c3481-5a1c-45b2-8aaa-c20ebbe8229e")
ICredentialProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetUsageScenario(
        CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSerialization(
        const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs) = 0;

    virtual HRESULT STDMETHODCALLTYPE Advise(
        ICredentialProviderEvents *pcpe,
        UINT_PTR upAdviseContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnAdvise(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFieldDescriptorCount(
        DWORD *pdwCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFieldDescriptorAt(
        DWORD dwIndex,
        CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR **ppcpfd) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCredentialCount(
        DWORD *pdwCount,
        DWORD *pdwDefault,
        WINBOOL *pbAutoLogonWithDefault) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCredentialAt(
        DWORD dwIndex,
        ICredentialProviderCredential **ppcpc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProvider, 0xd27c3481, 0x5a1c, 0x45b2, 0x8a,0xaa, 0xc2,0x0e,0xbb,0xe8,0x22,0x9e)
#endif
#else
typedef struct ICredentialProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUsageScenario)(
        ICredentialProvider *This,
        CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *SetSerialization)(
        ICredentialProvider *This,
        const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs);

    HRESULT (STDMETHODCALLTYPE *Advise)(
        ICredentialProvider *This,
        ICredentialProviderEvents *pcpe,
        UINT_PTR upAdviseContext);

    HRESULT (STDMETHODCALLTYPE *UnAdvise)(
        ICredentialProvider *This);

    HRESULT (STDMETHODCALLTYPE *GetFieldDescriptorCount)(
        ICredentialProvider *This,
        DWORD *pdwCount);

    HRESULT (STDMETHODCALLTYPE *GetFieldDescriptorAt)(
        ICredentialProvider *This,
        DWORD dwIndex,
        CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR **ppcpfd);

    HRESULT (STDMETHODCALLTYPE *GetCredentialCount)(
        ICredentialProvider *This,
        DWORD *pdwCount,
        DWORD *pdwDefault,
        WINBOOL *pbAutoLogonWithDefault);

    HRESULT (STDMETHODCALLTYPE *GetCredentialAt)(
        ICredentialProvider *This,
        DWORD dwIndex,
        ICredentialProviderCredential **ppcpc);

    END_INTERFACE
} ICredentialProviderVtbl;

interface ICredentialProvider {
    CONST_VTBL ICredentialProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProvider methods ***/
#define ICredentialProvider_SetUsageScenario(This,cpus,dwFlags) (This)->lpVtbl->SetUsageScenario(This,cpus,dwFlags)
#define ICredentialProvider_SetSerialization(This,pcpcs) (This)->lpVtbl->SetSerialization(This,pcpcs)
#define ICredentialProvider_Advise(This,pcpe,upAdviseContext) (This)->lpVtbl->Advise(This,pcpe,upAdviseContext)
#define ICredentialProvider_UnAdvise(This) (This)->lpVtbl->UnAdvise(This)
#define ICredentialProvider_GetFieldDescriptorCount(This,pdwCount) (This)->lpVtbl->GetFieldDescriptorCount(This,pdwCount)
#define ICredentialProvider_GetFieldDescriptorAt(This,dwIndex,ppcpfd) (This)->lpVtbl->GetFieldDescriptorAt(This,dwIndex,ppcpfd)
#define ICredentialProvider_GetCredentialCount(This,pdwCount,pdwDefault,pbAutoLogonWithDefault) (This)->lpVtbl->GetCredentialCount(This,pdwCount,pdwDefault,pbAutoLogonWithDefault)
#define ICredentialProvider_GetCredentialAt(This,dwIndex,ppcpc) (This)->lpVtbl->GetCredentialAt(This,dwIndex,ppcpc)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProvider_QueryInterface(ICredentialProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProvider_AddRef(ICredentialProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProvider_Release(ICredentialProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProvider methods ***/
static __WIDL_INLINE HRESULT ICredentialProvider_SetUsageScenario(ICredentialProvider* This,CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,DWORD dwFlags) {
    return This->lpVtbl->SetUsageScenario(This,cpus,dwFlags);
}
static __WIDL_INLINE HRESULT ICredentialProvider_SetSerialization(ICredentialProvider* This,const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs) {
    return This->lpVtbl->SetSerialization(This,pcpcs);
}
static __WIDL_INLINE HRESULT ICredentialProvider_Advise(ICredentialProvider* This,ICredentialProviderEvents *pcpe,UINT_PTR upAdviseContext) {
    return This->lpVtbl->Advise(This,pcpe,upAdviseContext);
}
static __WIDL_INLINE HRESULT ICredentialProvider_UnAdvise(ICredentialProvider* This) {
    return This->lpVtbl->UnAdvise(This);
}
static __WIDL_INLINE HRESULT ICredentialProvider_GetFieldDescriptorCount(ICredentialProvider* This,DWORD *pdwCount) {
    return This->lpVtbl->GetFieldDescriptorCount(This,pdwCount);
}
static __WIDL_INLINE HRESULT ICredentialProvider_GetFieldDescriptorAt(ICredentialProvider* This,DWORD dwIndex,CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR **ppcpfd) {
    return This->lpVtbl->GetFieldDescriptorAt(This,dwIndex,ppcpfd);
}
static __WIDL_INLINE HRESULT ICredentialProvider_GetCredentialCount(ICredentialProvider* This,DWORD *pdwCount,DWORD *pdwDefault,WINBOOL *pbAutoLogonWithDefault) {
    return This->lpVtbl->GetCredentialCount(This,pdwCount,pdwDefault,pbAutoLogonWithDefault);
}
static __WIDL_INLINE HRESULT ICredentialProvider_GetCredentialAt(ICredentialProvider* This,DWORD dwIndex,ICredentialProviderCredential **ppcpc) {
    return This->lpVtbl->GetCredentialAt(This,dwIndex,ppcpc);
}
#endif
#endif

#endif


#endif  /* __ICredentialProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICredentialProviderEvents interface
 */
#ifndef __ICredentialProviderEvents_INTERFACE_DEFINED__
#define __ICredentialProviderEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProviderEvents, 0x34201e5a, 0xa787, 0x41a3, 0xa5,0xa4, 0xbd,0x6d,0xcf,0x2a,0x85,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("34201e5a-a787-41a3-a5a4-bd6dcf2a854e")
ICredentialProviderEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CredentialsChanged(
        UINT_PTR upAdviseContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProviderEvents, 0x34201e5a, 0xa787, 0x41a3, 0xa5,0xa4, 0xbd,0x6d,0xcf,0x2a,0x85,0x4e)
#endif
#else
typedef struct ICredentialProviderEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *CredentialsChanged)(
        ICredentialProviderEvents *This,
        UINT_PTR upAdviseContext);

    END_INTERFACE
} ICredentialProviderEventsVtbl;

interface ICredentialProviderEvents {
    CONST_VTBL ICredentialProviderEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProviderEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProviderEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProviderEvents_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderEvents methods ***/
#define ICredentialProviderEvents_CredentialsChanged(This,upAdviseContext) (This)->lpVtbl->CredentialsChanged(This,upAdviseContext)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderEvents_QueryInterface(ICredentialProviderEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProviderEvents_AddRef(ICredentialProviderEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProviderEvents_Release(ICredentialProviderEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderEvents methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderEvents_CredentialsChanged(ICredentialProviderEvents* This,UINT_PTR upAdviseContext) {
    return This->lpVtbl->CredentialsChanged(This,upAdviseContext);
}
#endif
#endif

#endif


#endif  /* __ICredentialProviderEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICredentialProviderFilter interface
 */
#ifndef __ICredentialProviderFilter_INTERFACE_DEFINED__
#define __ICredentialProviderFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProviderFilter, 0xa5da53f9, 0xd475, 0x4080, 0xa1,0x20, 0x91,0x0c,0x4a,0x73,0x98,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a5da53f9-d475-4080-a120-910c4a739880")
ICredentialProviderFilter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Filter(
        CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
        DWORD dwFlags,
        GUID *rgclsidProviders,
        WINBOOL *rgbAllow,
        DWORD cProviders) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpdateRemoteCredential(
        const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcsIn,
        CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcsOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProviderFilter, 0xa5da53f9, 0xd475, 0x4080, 0xa1,0x20, 0x91,0x0c,0x4a,0x73,0x98,0x80)
#endif
#else
typedef struct ICredentialProviderFilterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *Filter)(
        ICredentialProviderFilter *This,
        CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
        DWORD dwFlags,
        GUID *rgclsidProviders,
        WINBOOL *rgbAllow,
        DWORD cProviders);

    HRESULT (STDMETHODCALLTYPE *UpdateRemoteCredential)(
        ICredentialProviderFilter *This,
        const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcsIn,
        CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcsOut);

    END_INTERFACE
} ICredentialProviderFilterVtbl;

interface ICredentialProviderFilter {
    CONST_VTBL ICredentialProviderFilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProviderFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProviderFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProviderFilter_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderFilter methods ***/
#define ICredentialProviderFilter_Filter(This,cpus,dwFlags,rgclsidProviders,rgbAllow,cProviders) (This)->lpVtbl->Filter(This,cpus,dwFlags,rgclsidProviders,rgbAllow,cProviders)
#define ICredentialProviderFilter_UpdateRemoteCredential(This,pcpcsIn,pcpcsOut) (This)->lpVtbl->UpdateRemoteCredential(This,pcpcsIn,pcpcsOut)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderFilter_QueryInterface(ICredentialProviderFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProviderFilter_AddRef(ICredentialProviderFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProviderFilter_Release(ICredentialProviderFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderFilter methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderFilter_Filter(ICredentialProviderFilter* This,CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,DWORD dwFlags,GUID *rgclsidProviders,WINBOOL *rgbAllow,DWORD cProviders) {
    return This->lpVtbl->Filter(This,cpus,dwFlags,rgclsidProviders,rgbAllow,cProviders);
}
static __WIDL_INLINE HRESULT ICredentialProviderFilter_UpdateRemoteCredential(ICredentialProviderFilter* This,const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcsIn,CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcsOut) {
    return This->lpVtbl->UpdateRemoteCredential(This,pcpcsIn,pcpcsOut);
}
#endif
#endif

#endif


#endif  /* __ICredentialProviderFilter_INTERFACE_DEFINED__ */

#if (NTDDI_VERSION >= NTDDI_WIN8)
/*****************************************************************************
 * ICredentialProviderCredential2 interface
 */
#ifndef __ICredentialProviderCredential2_INTERFACE_DEFINED__
#define __ICredentialProviderCredential2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProviderCredential2, 0xfd672c54, 0x40ea, 0x4d6e, 0x9b,0x49, 0xcf,0xb1,0xa7,0x50,0x7b,0xd7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fd672c54-40ea-4d6e-9b49-cfb1a7507bd7")
ICredentialProviderCredential2 : public ICredentialProviderCredential
{
    virtual HRESULT STDMETHODCALLTYPE GetUserSid(
        LPWSTR *sid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProviderCredential2, 0xfd672c54, 0x40ea, 0x4d6e, 0x9b,0x49, 0xcf,0xb1,0xa7,0x50,0x7b,0xd7)
#endif
#else
typedef struct ICredentialProviderCredential2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderCredential methods ***/
    HRESULT (STDMETHODCALLTYPE *Advise)(
        ICredentialProviderCredential2 *This,
        ICredentialProviderCredentialEvents *pcpce);

    HRESULT (STDMETHODCALLTYPE *UnAdvise)(
        ICredentialProviderCredential2 *This);

    HRESULT (STDMETHODCALLTYPE *SetSelected)(
        ICredentialProviderCredential2 *This,
        WINBOOL *pbAutoLogon);

    HRESULT (STDMETHODCALLTYPE *SetDeselected)(
        ICredentialProviderCredential2 *This);

    HRESULT (STDMETHODCALLTYPE *GetFieldState)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID,
        CREDENTIAL_PROVIDER_FIELD_STATE *pcpfs,
        CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE *pcpfis);

    HRESULT (STDMETHODCALLTYPE *GetStringValue)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID,
        LPWSTR *ppsz);

    HRESULT (STDMETHODCALLTYPE *GetBitmapValue)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID,
        HBITMAP *phbmp);

    HRESULT (STDMETHODCALLTYPE *GetCheckboxValue)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID,
        WINBOOL *pbChecked,
        LPWSTR *ppszLabel);

    HRESULT (STDMETHODCALLTYPE *GetSubmitButtonValue)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID,
        DWORD *pdwAdjacentTo);

    HRESULT (STDMETHODCALLTYPE *GetComboBoxValueCount)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID,
        DWORD *pcItems,
        DWORD *pdwSelectedItem);

    HRESULT (STDMETHODCALLTYPE *GetComboBoxValueAt)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID,
        DWORD dwItem,
        LPWSTR *ppszItem);

    HRESULT (STDMETHODCALLTYPE *SetStringValue)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID,
        LPCWSTR psz);

    HRESULT (STDMETHODCALLTYPE *SetCheckboxValue)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID,
        WINBOOL bChecked);

    HRESULT (STDMETHODCALLTYPE *SetComboBoxSelectedValue)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID,
        DWORD dwSelectedItem);

    HRESULT (STDMETHODCALLTYPE *CommandLinkClicked)(
        ICredentialProviderCredential2 *This,
        DWORD dwFieldID);

    HRESULT (STDMETHODCALLTYPE *GetSerialization)(
        ICredentialProviderCredential2 *This,
        CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr,
        CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs,
        LPWSTR *ppszOptionalStatusText,
        CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon);

    HRESULT (STDMETHODCALLTYPE *ReportResult)(
        ICredentialProviderCredential2 *This,
        NTSTATUS ntsStatus,
        NTSTATUS ntsSubstatus,
        LPWSTR *ppszOptionalStatusText,
        CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon);

    /*** ICredentialProviderCredential2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetUserSid)(
        ICredentialProviderCredential2 *This,
        LPWSTR *sid);

    END_INTERFACE
} ICredentialProviderCredential2Vtbl;

interface ICredentialProviderCredential2 {
    CONST_VTBL ICredentialProviderCredential2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProviderCredential2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProviderCredential2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProviderCredential2_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderCredential methods ***/
#define ICredentialProviderCredential2_Advise(This,pcpce) (This)->lpVtbl->Advise(This,pcpce)
#define ICredentialProviderCredential2_UnAdvise(This) (This)->lpVtbl->UnAdvise(This)
#define ICredentialProviderCredential2_SetSelected(This,pbAutoLogon) (This)->lpVtbl->SetSelected(This,pbAutoLogon)
#define ICredentialProviderCredential2_SetDeselected(This) (This)->lpVtbl->SetDeselected(This)
#define ICredentialProviderCredential2_GetFieldState(This,dwFieldID,pcpfs,pcpfis) (This)->lpVtbl->GetFieldState(This,dwFieldID,pcpfs,pcpfis)
#define ICredentialProviderCredential2_GetStringValue(This,dwFieldID,ppsz) (This)->lpVtbl->GetStringValue(This,dwFieldID,ppsz)
#define ICredentialProviderCredential2_GetBitmapValue(This,dwFieldID,phbmp) (This)->lpVtbl->GetBitmapValue(This,dwFieldID,phbmp)
#define ICredentialProviderCredential2_GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel) (This)->lpVtbl->GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel)
#define ICredentialProviderCredential2_GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo) (This)->lpVtbl->GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo)
#define ICredentialProviderCredential2_GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem) (This)->lpVtbl->GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem)
#define ICredentialProviderCredential2_GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem) (This)->lpVtbl->GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem)
#define ICredentialProviderCredential2_SetStringValue(This,dwFieldID,psz) (This)->lpVtbl->SetStringValue(This,dwFieldID,psz)
#define ICredentialProviderCredential2_SetCheckboxValue(This,dwFieldID,bChecked) (This)->lpVtbl->SetCheckboxValue(This,dwFieldID,bChecked)
#define ICredentialProviderCredential2_SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem) (This)->lpVtbl->SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem)
#define ICredentialProviderCredential2_CommandLinkClicked(This,dwFieldID) (This)->lpVtbl->CommandLinkClicked(This,dwFieldID)
#define ICredentialProviderCredential2_GetSerialization(This,pcpgsr,pcpcs,ppszOptionalStatusText,pcpsiOptionalStatusIcon) (This)->lpVtbl->GetSerialization(This,pcpgsr,pcpcs,ppszOptionalStatusText,pcpsiOptionalStatusIcon)
#define ICredentialProviderCredential2_ReportResult(This,ntsStatus,ntsSubstatus,ppszOptionalStatusText,pcpsiOptionalStatusIcon) (This)->lpVtbl->ReportResult(This,ntsStatus,ntsSubstatus,ppszOptionalStatusText,pcpsiOptionalStatusIcon)
/*** ICredentialProviderCredential2 methods ***/
#define ICredentialProviderCredential2_GetUserSid(This,sid) (This)->lpVtbl->GetUserSid(This,sid)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_QueryInterface(ICredentialProviderCredential2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProviderCredential2_AddRef(ICredentialProviderCredential2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProviderCredential2_Release(ICredentialProviderCredential2* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredential methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_Advise(ICredentialProviderCredential2* This,ICredentialProviderCredentialEvents *pcpce) {
    return This->lpVtbl->Advise(This,pcpce);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_UnAdvise(ICredentialProviderCredential2* This) {
    return This->lpVtbl->UnAdvise(This);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_SetSelected(ICredentialProviderCredential2* This,WINBOOL *pbAutoLogon) {
    return This->lpVtbl->SetSelected(This,pbAutoLogon);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_SetDeselected(ICredentialProviderCredential2* This) {
    return This->lpVtbl->SetDeselected(This);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_GetFieldState(ICredentialProviderCredential2* This,DWORD dwFieldID,CREDENTIAL_PROVIDER_FIELD_STATE *pcpfs,CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE *pcpfis) {
    return This->lpVtbl->GetFieldState(This,dwFieldID,pcpfs,pcpfis);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_GetStringValue(ICredentialProviderCredential2* This,DWORD dwFieldID,LPWSTR *ppsz) {
    return This->lpVtbl->GetStringValue(This,dwFieldID,ppsz);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_GetBitmapValue(ICredentialProviderCredential2* This,DWORD dwFieldID,HBITMAP *phbmp) {
    return This->lpVtbl->GetBitmapValue(This,dwFieldID,phbmp);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_GetCheckboxValue(ICredentialProviderCredential2* This,DWORD dwFieldID,WINBOOL *pbChecked,LPWSTR *ppszLabel) {
    return This->lpVtbl->GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_GetSubmitButtonValue(ICredentialProviderCredential2* This,DWORD dwFieldID,DWORD *pdwAdjacentTo) {
    return This->lpVtbl->GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_GetComboBoxValueCount(ICredentialProviderCredential2* This,DWORD dwFieldID,DWORD *pcItems,DWORD *pdwSelectedItem) {
    return This->lpVtbl->GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_GetComboBoxValueAt(ICredentialProviderCredential2* This,DWORD dwFieldID,DWORD dwItem,LPWSTR *ppszItem) {
    return This->lpVtbl->GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_SetStringValue(ICredentialProviderCredential2* This,DWORD dwFieldID,LPCWSTR psz) {
    return This->lpVtbl->SetStringValue(This,dwFieldID,psz);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_SetCheckboxValue(ICredentialProviderCredential2* This,DWORD dwFieldID,WINBOOL bChecked) {
    return This->lpVtbl->SetCheckboxValue(This,dwFieldID,bChecked);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_SetComboBoxSelectedValue(ICredentialProviderCredential2* This,DWORD dwFieldID,DWORD dwSelectedItem) {
    return This->lpVtbl->SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_CommandLinkClicked(ICredentialProviderCredential2* This,DWORD dwFieldID) {
    return This->lpVtbl->CommandLinkClicked(This,dwFieldID);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_GetSerialization(ICredentialProviderCredential2* This,CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr,CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs,LPWSTR *ppszOptionalStatusText,CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon) {
    return This->lpVtbl->GetSerialization(This,pcpgsr,pcpcs,ppszOptionalStatusText,pcpsiOptionalStatusIcon);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_ReportResult(ICredentialProviderCredential2* This,NTSTATUS ntsStatus,NTSTATUS ntsSubstatus,LPWSTR *ppszOptionalStatusText,CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon) {
    return This->lpVtbl->ReportResult(This,ntsStatus,ntsSubstatus,ppszOptionalStatusText,pcpsiOptionalStatusIcon);
}
/*** ICredentialProviderCredential2 methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredential2_GetUserSid(ICredentialProviderCredential2* This,LPWSTR *sid) {
    return This->lpVtbl->GetUserSid(This,sid);
}
#endif
#endif

#endif


#endif  /* __ICredentialProviderCredential2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICredentialProviderCredentialWithFieldOptions interface
 */
#ifndef __ICredentialProviderCredentialWithFieldOptions_INTERFACE_DEFINED__
#define __ICredentialProviderCredentialWithFieldOptions_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProviderCredentialWithFieldOptions, 0xdbc6fb30, 0xc843, 0x49e3, 0xa6,0x45, 0x57,0x3e,0x6f,0x39,0x44,0x6a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dbc6fb30-c843-49e3-a645-573e6f39446a")
ICredentialProviderCredentialWithFieldOptions : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetFieldOptions(
        DWORD fieldID,
        CREDENTIAL_PROVIDER_CREDENTIAL_FIELD_OPTIONS *options) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProviderCredentialWithFieldOptions, 0xdbc6fb30, 0xc843, 0x49e3, 0xa6,0x45, 0x57,0x3e,0x6f,0x39,0x44,0x6a)
#endif
#else
typedef struct ICredentialProviderCredentialWithFieldOptionsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderCredentialWithFieldOptions methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFieldOptions)(
        ICredentialProviderCredentialWithFieldOptions *This,
        DWORD fieldID,
        CREDENTIAL_PROVIDER_CREDENTIAL_FIELD_OPTIONS *options);

    END_INTERFACE
} ICredentialProviderCredentialWithFieldOptionsVtbl;

interface ICredentialProviderCredentialWithFieldOptions {
    CONST_VTBL ICredentialProviderCredentialWithFieldOptionsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProviderCredentialWithFieldOptions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProviderCredentialWithFieldOptions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProviderCredentialWithFieldOptions_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderCredentialWithFieldOptions methods ***/
#define ICredentialProviderCredentialWithFieldOptions_GetFieldOptions(This,fieldID,options) (This)->lpVtbl->GetFieldOptions(This,fieldID,options)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredentialWithFieldOptions_QueryInterface(ICredentialProviderCredentialWithFieldOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProviderCredentialWithFieldOptions_AddRef(ICredentialProviderCredentialWithFieldOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProviderCredentialWithFieldOptions_Release(ICredentialProviderCredentialWithFieldOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredentialWithFieldOptions methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredentialWithFieldOptions_GetFieldOptions(ICredentialProviderCredentialWithFieldOptions* This,DWORD fieldID,CREDENTIAL_PROVIDER_CREDENTIAL_FIELD_OPTIONS *options) {
    return This->lpVtbl->GetFieldOptions(This,fieldID,options);
}
#endif
#endif

#endif


#endif  /* __ICredentialProviderCredentialWithFieldOptions_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICredentialProviderCredentialEvents2 interface
 */
#ifndef __ICredentialProviderCredentialEvents2_INTERFACE_DEFINED__
#define __ICredentialProviderCredentialEvents2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProviderCredentialEvents2, 0xb53c00b6, 0x9922, 0x4b78, 0xb1,0xf4, 0xdd,0xfe,0x77,0x4d,0xc3,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b53c00b6-9922-4b78-b1f4-ddfe774dc39b")
ICredentialProviderCredentialEvents2 : public ICredentialProviderCredentialEvents
{
    virtual HRESULT STDMETHODCALLTYPE BeginFieldUpdates(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndFieldUpdates(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFieldOptions(
        ICredentialProviderCredential *credential,
        DWORD fieldID,
        CREDENTIAL_PROVIDER_CREDENTIAL_FIELD_OPTIONS options) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProviderCredentialEvents2, 0xb53c00b6, 0x9922, 0x4b78, 0xb1,0xf4, 0xdd,0xfe,0x77,0x4d,0xc3,0x9b)
#endif
#else
typedef struct ICredentialProviderCredentialEvents2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderCredentialEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFieldState)(
        ICredentialProviderCredentialEvents2 *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        CREDENTIAL_PROVIDER_FIELD_STATE cpfs);

    HRESULT (STDMETHODCALLTYPE *SetFieldInteractiveState)(
        ICredentialProviderCredentialEvents2 *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE cpfis);

    HRESULT (STDMETHODCALLTYPE *SetFieldString)(
        ICredentialProviderCredentialEvents2 *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        LPCWSTR psz);

    HRESULT (STDMETHODCALLTYPE *SetFieldCheckbox)(
        ICredentialProviderCredentialEvents2 *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        WINBOOL bChecked,
        LPCWSTR pszLabel);

    HRESULT (STDMETHODCALLTYPE *SetFieldBitmap)(
        ICredentialProviderCredentialEvents2 *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        HBITMAP hbmp);

    HRESULT (STDMETHODCALLTYPE *SetFieldComboBoxSelectedItem)(
        ICredentialProviderCredentialEvents2 *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        DWORD dwSelectedItem);

    HRESULT (STDMETHODCALLTYPE *DeleteFieldComboBoxItem)(
        ICredentialProviderCredentialEvents2 *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        DWORD dwItem);

    HRESULT (STDMETHODCALLTYPE *AppendFieldComboBoxItem)(
        ICredentialProviderCredentialEvents2 *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        LPCWSTR pszItem);

    HRESULT (STDMETHODCALLTYPE *SetFieldSubmitButton)(
        ICredentialProviderCredentialEvents2 *This,
        ICredentialProviderCredential *pcpc,
        DWORD dwFieldID,
        DWORD dwAdjacentTo);

    HRESULT (STDMETHODCALLTYPE *OnCreatingWindow)(
        ICredentialProviderCredentialEvents2 *This,
        HWND *phwndOwner);

    /*** ICredentialProviderCredentialEvents2 methods ***/
    HRESULT (STDMETHODCALLTYPE *BeginFieldUpdates)(
        ICredentialProviderCredentialEvents2 *This);

    HRESULT (STDMETHODCALLTYPE *EndFieldUpdates)(
        ICredentialProviderCredentialEvents2 *This);

    HRESULT (STDMETHODCALLTYPE *SetFieldOptions)(
        ICredentialProviderCredentialEvents2 *This,
        ICredentialProviderCredential *credential,
        DWORD fieldID,
        CREDENTIAL_PROVIDER_CREDENTIAL_FIELD_OPTIONS options);

    END_INTERFACE
} ICredentialProviderCredentialEvents2Vtbl;

interface ICredentialProviderCredentialEvents2 {
    CONST_VTBL ICredentialProviderCredentialEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProviderCredentialEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProviderCredentialEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProviderCredentialEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderCredentialEvents methods ***/
#define ICredentialProviderCredentialEvents2_SetFieldState(This,pcpc,dwFieldID,cpfs) (This)->lpVtbl->SetFieldState(This,pcpc,dwFieldID,cpfs)
#define ICredentialProviderCredentialEvents2_SetFieldInteractiveState(This,pcpc,dwFieldID,cpfis) (This)->lpVtbl->SetFieldInteractiveState(This,pcpc,dwFieldID,cpfis)
#define ICredentialProviderCredentialEvents2_SetFieldString(This,pcpc,dwFieldID,psz) (This)->lpVtbl->SetFieldString(This,pcpc,dwFieldID,psz)
#define ICredentialProviderCredentialEvents2_SetFieldCheckbox(This,pcpc,dwFieldID,bChecked,pszLabel) (This)->lpVtbl->SetFieldCheckbox(This,pcpc,dwFieldID,bChecked,pszLabel)
#define ICredentialProviderCredentialEvents2_SetFieldBitmap(This,pcpc,dwFieldID,hbmp) (This)->lpVtbl->SetFieldBitmap(This,pcpc,dwFieldID,hbmp)
#define ICredentialProviderCredentialEvents2_SetFieldComboBoxSelectedItem(This,pcpc,dwFieldID,dwSelectedItem) (This)->lpVtbl->SetFieldComboBoxSelectedItem(This,pcpc,dwFieldID,dwSelectedItem)
#define ICredentialProviderCredentialEvents2_DeleteFieldComboBoxItem(This,pcpc,dwFieldID,dwItem) (This)->lpVtbl->DeleteFieldComboBoxItem(This,pcpc,dwFieldID,dwItem)
#define ICredentialProviderCredentialEvents2_AppendFieldComboBoxItem(This,pcpc,dwFieldID,pszItem) (This)->lpVtbl->AppendFieldComboBoxItem(This,pcpc,dwFieldID,pszItem)
#define ICredentialProviderCredentialEvents2_SetFieldSubmitButton(This,pcpc,dwFieldID,dwAdjacentTo) (This)->lpVtbl->SetFieldSubmitButton(This,pcpc,dwFieldID,dwAdjacentTo)
#define ICredentialProviderCredentialEvents2_OnCreatingWindow(This,phwndOwner) (This)->lpVtbl->OnCreatingWindow(This,phwndOwner)
/*** ICredentialProviderCredentialEvents2 methods ***/
#define ICredentialProviderCredentialEvents2_BeginFieldUpdates(This) (This)->lpVtbl->BeginFieldUpdates(This)
#define ICredentialProviderCredentialEvents2_EndFieldUpdates(This) (This)->lpVtbl->EndFieldUpdates(This)
#define ICredentialProviderCredentialEvents2_SetFieldOptions(This,credential,fieldID,options) (This)->lpVtbl->SetFieldOptions(This,credential,fieldID,options)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_QueryInterface(ICredentialProviderCredentialEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProviderCredentialEvents2_AddRef(ICredentialProviderCredentialEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProviderCredentialEvents2_Release(ICredentialProviderCredentialEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredentialEvents methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_SetFieldState(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,CREDENTIAL_PROVIDER_FIELD_STATE cpfs) {
    return This->lpVtbl->SetFieldState(This,pcpc,dwFieldID,cpfs);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_SetFieldInteractiveState(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE cpfis) {
    return This->lpVtbl->SetFieldInteractiveState(This,pcpc,dwFieldID,cpfis);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_SetFieldString(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,LPCWSTR psz) {
    return This->lpVtbl->SetFieldString(This,pcpc,dwFieldID,psz);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_SetFieldCheckbox(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,WINBOOL bChecked,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFieldCheckbox(This,pcpc,dwFieldID,bChecked,pszLabel);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_SetFieldBitmap(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,HBITMAP hbmp) {
    return This->lpVtbl->SetFieldBitmap(This,pcpc,dwFieldID,hbmp);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_SetFieldComboBoxSelectedItem(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwSelectedItem) {
    return This->lpVtbl->SetFieldComboBoxSelectedItem(This,pcpc,dwFieldID,dwSelectedItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_DeleteFieldComboBoxItem(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwItem) {
    return This->lpVtbl->DeleteFieldComboBoxItem(This,pcpc,dwFieldID,dwItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_AppendFieldComboBoxItem(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,LPCWSTR pszItem) {
    return This->lpVtbl->AppendFieldComboBoxItem(This,pcpc,dwFieldID,pszItem);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_SetFieldSubmitButton(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwAdjacentTo) {
    return This->lpVtbl->SetFieldSubmitButton(This,pcpc,dwFieldID,dwAdjacentTo);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_OnCreatingWindow(ICredentialProviderCredentialEvents2* This,HWND *phwndOwner) {
    return This->lpVtbl->OnCreatingWindow(This,phwndOwner);
}
/*** ICredentialProviderCredentialEvents2 methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_BeginFieldUpdates(ICredentialProviderCredentialEvents2* This) {
    return This->lpVtbl->BeginFieldUpdates(This);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_EndFieldUpdates(ICredentialProviderCredentialEvents2* This) {
    return This->lpVtbl->EndFieldUpdates(This);
}
static __WIDL_INLINE HRESULT ICredentialProviderCredentialEvents2_SetFieldOptions(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *credential,DWORD fieldID,CREDENTIAL_PROVIDER_CREDENTIAL_FIELD_OPTIONS options) {
    return This->lpVtbl->SetFieldOptions(This,credential,fieldID,options);
}
#endif
#endif

#endif


#endif  /* __ICredentialProviderCredentialEvents2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICredentialProviderUser interface
 */
#ifndef __ICredentialProviderUser_INTERFACE_DEFINED__
#define __ICredentialProviderUser_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProviderUser, 0x13793285, 0x3ea6, 0x40fd, 0xb4,0x20, 0x15,0xf4,0x7d,0xa4,0x1f,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("13793285-3ea6-40fd-b420-15f47da41fbb")
ICredentialProviderUser : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSid(
        LPWSTR *sid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProviderID(
        GUID *providerID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStringValue(
        REFPROPERTYKEY key,
        LPWSTR *stringValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetValue(
        REFPROPERTYKEY key,
        PROPVARIANT *value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProviderUser, 0x13793285, 0x3ea6, 0x40fd, 0xb4,0x20, 0x15,0xf4,0x7d,0xa4,0x1f,0xbb)
#endif
#else
typedef struct ICredentialProviderUserVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderUser methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSid)(
        ICredentialProviderUser *This,
        LPWSTR *sid);

    HRESULT (STDMETHODCALLTYPE *GetProviderID)(
        ICredentialProviderUser *This,
        GUID *providerID);

    HRESULT (STDMETHODCALLTYPE *GetStringValue)(
        ICredentialProviderUser *This,
        REFPROPERTYKEY key,
        LPWSTR *stringValue);

    HRESULT (STDMETHODCALLTYPE *GetValue)(
        ICredentialProviderUser *This,
        REFPROPERTYKEY key,
        PROPVARIANT *value);

    END_INTERFACE
} ICredentialProviderUserVtbl;

interface ICredentialProviderUser {
    CONST_VTBL ICredentialProviderUserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProviderUser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProviderUser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProviderUser_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderUser methods ***/
#define ICredentialProviderUser_GetSid(This,sid) (This)->lpVtbl->GetSid(This,sid)
#define ICredentialProviderUser_GetProviderID(This,providerID) (This)->lpVtbl->GetProviderID(This,providerID)
#define ICredentialProviderUser_GetStringValue(This,key,stringValue) (This)->lpVtbl->GetStringValue(This,key,stringValue)
#define ICredentialProviderUser_GetValue(This,key,value) (This)->lpVtbl->GetValue(This,key,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderUser_QueryInterface(ICredentialProviderUser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProviderUser_AddRef(ICredentialProviderUser* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProviderUser_Release(ICredentialProviderUser* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderUser methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderUser_GetSid(ICredentialProviderUser* This,LPWSTR *sid) {
    return This->lpVtbl->GetSid(This,sid);
}
static __WIDL_INLINE HRESULT ICredentialProviderUser_GetProviderID(ICredentialProviderUser* This,GUID *providerID) {
    return This->lpVtbl->GetProviderID(This,providerID);
}
static __WIDL_INLINE HRESULT ICredentialProviderUser_GetStringValue(ICredentialProviderUser* This,REFPROPERTYKEY key,LPWSTR *stringValue) {
    return This->lpVtbl->GetStringValue(This,key,stringValue);
}
static __WIDL_INLINE HRESULT ICredentialProviderUser_GetValue(ICredentialProviderUser* This,REFPROPERTYKEY key,PROPVARIANT *value) {
    return This->lpVtbl->GetValue(This,key,value);
}
#endif
#endif

#endif


#endif  /* __ICredentialProviderUser_INTERFACE_DEFINED__ */

DEFINE_GUID(Identity_LocalUserProvider, 0xA198529B, 0x730F, 0x4089, 0xB6, 0x46, 0xA1, 0x25, 0x57, 0xF5, 0x66, 0x5E);
/*****************************************************************************
 * ICredentialProviderUserArray interface
 */
#ifndef __ICredentialProviderUserArray_INTERFACE_DEFINED__
#define __ICredentialProviderUserArray_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProviderUserArray, 0x90c119ae, 0x0f18, 0x4520, 0xa1,0xf1, 0x11,0x43,0x66,0xa4,0x0f,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("90c119ae-0f18-4520-a1f1-114366a40fe8")
ICredentialProviderUserArray : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetProviderFilter(
        REFGUID guidProviderToFilterTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAccountOptions(
        CREDENTIAL_PROVIDER_ACCOUNT_OPTIONS *credentialProviderAccountOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCount(
        DWORD *userCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        DWORD userIndex,
        ICredentialProviderUser **user) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProviderUserArray, 0x90c119ae, 0x0f18, 0x4520, 0xa1,0xf1, 0x11,0x43,0x66,0xa4,0x0f,0xe8)
#endif
#else
typedef struct ICredentialProviderUserArrayVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderUserArray methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProviderFilter)(
        ICredentialProviderUserArray *This,
        REFGUID guidProviderToFilterTo);

    HRESULT (STDMETHODCALLTYPE *GetAccountOptions)(
        ICredentialProviderUserArray *This,
        CREDENTIAL_PROVIDER_ACCOUNT_OPTIONS *credentialProviderAccountOptions);

    HRESULT (STDMETHODCALLTYPE *GetCount)(
        ICredentialProviderUserArray *This,
        DWORD *userCount);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        ICredentialProviderUserArray *This,
        DWORD userIndex,
        ICredentialProviderUser **user);

    END_INTERFACE
} ICredentialProviderUserArrayVtbl;

interface ICredentialProviderUserArray {
    CONST_VTBL ICredentialProviderUserArrayVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProviderUserArray_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProviderUserArray_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProviderUserArray_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderUserArray methods ***/
#define ICredentialProviderUserArray_SetProviderFilter(This,guidProviderToFilterTo) (This)->lpVtbl->SetProviderFilter(This,guidProviderToFilterTo)
#define ICredentialProviderUserArray_GetAccountOptions(This,credentialProviderAccountOptions) (This)->lpVtbl->GetAccountOptions(This,credentialProviderAccountOptions)
#define ICredentialProviderUserArray_GetCount(This,userCount) (This)->lpVtbl->GetCount(This,userCount)
#define ICredentialProviderUserArray_GetAt(This,userIndex,user) (This)->lpVtbl->GetAt(This,userIndex,user)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderUserArray_QueryInterface(ICredentialProviderUserArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProviderUserArray_AddRef(ICredentialProviderUserArray* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProviderUserArray_Release(ICredentialProviderUserArray* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderUserArray methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderUserArray_SetProviderFilter(ICredentialProviderUserArray* This,REFGUID guidProviderToFilterTo) {
    return This->lpVtbl->SetProviderFilter(This,guidProviderToFilterTo);
}
static __WIDL_INLINE HRESULT ICredentialProviderUserArray_GetAccountOptions(ICredentialProviderUserArray* This,CREDENTIAL_PROVIDER_ACCOUNT_OPTIONS *credentialProviderAccountOptions) {
    return This->lpVtbl->GetAccountOptions(This,credentialProviderAccountOptions);
}
static __WIDL_INLINE HRESULT ICredentialProviderUserArray_GetCount(ICredentialProviderUserArray* This,DWORD *userCount) {
    return This->lpVtbl->GetCount(This,userCount);
}
static __WIDL_INLINE HRESULT ICredentialProviderUserArray_GetAt(ICredentialProviderUserArray* This,DWORD userIndex,ICredentialProviderUser **user) {
    return This->lpVtbl->GetAt(This,userIndex,user);
}
#endif
#endif

#endif


#endif  /* __ICredentialProviderUserArray_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICredentialProviderSetUserArray interface
 */
#ifndef __ICredentialProviderSetUserArray_INTERFACE_DEFINED__
#define __ICredentialProviderSetUserArray_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICredentialProviderSetUserArray, 0x095c1484, 0x1c0c, 0x4388, 0x9c,0x6d, 0x50,0x0e,0x61,0xbf,0x84,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("095c1484-1c0c-4388-9c6d-500e61bf84bd")
ICredentialProviderSetUserArray : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetUserArray(
        ICredentialProviderUserArray *users) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICredentialProviderSetUserArray, 0x095c1484, 0x1c0c, 0x4388, 0x9c,0x6d, 0x50,0x0e,0x61,0xbf,0x84,0xbd)
#endif
#else
typedef struct ICredentialProviderSetUserArrayVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICredentialProviderSetUserArray methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserArray)(
        ICredentialProviderSetUserArray *This,
        ICredentialProviderUserArray *users);

    END_INTERFACE
} ICredentialProviderSetUserArrayVtbl;

interface ICredentialProviderSetUserArray {
    CONST_VTBL ICredentialProviderSetUserArrayVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICredentialProviderSetUserArray_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICredentialProviderSetUserArray_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICredentialProviderSetUserArray_Release(This) (This)->lpVtbl->Release(This)
/*** ICredentialProviderSetUserArray methods ***/
#define ICredentialProviderSetUserArray_SetUserArray(This,users) (This)->lpVtbl->SetUserArray(This,users)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderSetUserArray_QueryInterface(ICredentialProviderSetUserArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICredentialProviderSetUserArray_AddRef(ICredentialProviderSetUserArray* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICredentialProviderSetUserArray_Release(ICredentialProviderSetUserArray* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderSetUserArray methods ***/
static __WIDL_INLINE HRESULT ICredentialProviderSetUserArray_SetUserArray(ICredentialProviderSetUserArray* This,ICredentialProviderUserArray *users) {
    return This->lpVtbl->SetUserArray(This,users);
}
#endif
#endif

#endif


#endif  /* __ICredentialProviderSetUserArray_INTERFACE_DEFINED__ */

#endif /* (NTDDI_VERSION >= NTDDI_WIN8) */
#ifndef __CredentialProviders_LIBRARY_DEFINED__
#define __CredentialProviders_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_CredentialProviders, 0xd545db01, 0xe522, 0x4a63, 0xaf,0x83, 0xd8,0xdd,0xf9,0x54,0x00,0x4f);

/*****************************************************************************
 * PasswordCredentialProvider coclass
 */

DEFINE_GUID(CLSID_PasswordCredentialProvider, 0x60b78e88, 0xead8, 0x445c, 0x9c,0xfd, 0x0b,0x87,0xf7,0x4e,0xa6,0xcd);

#ifdef __cplusplus
class DECLSPEC_UUID("60b78e88-ead8-445c-9cfd-0b87f74ea6cd") PasswordCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PasswordCredentialProvider, 0x60b78e88, 0xead8, 0x445c, 0x9c,0xfd, 0x0b,0x87,0xf7,0x4e,0xa6,0xcd)
#endif
#endif

/*****************************************************************************
 * V1PasswordCredentialProvider coclass
 */

DEFINE_GUID(CLSID_V1PasswordCredentialProvider, 0x6f45dc1e, 0x5384, 0x457a, 0xbc,0x13, 0x2c,0xd8,0x1b,0x0d,0x28,0xed);

#ifdef __cplusplus
class DECLSPEC_UUID("6f45dc1e-5384-457a-bc13-2cd81b0d28ed") V1PasswordCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(V1PasswordCredentialProvider, 0x6f45dc1e, 0x5384, 0x457a, 0xbc,0x13, 0x2c,0xd8,0x1b,0x0d,0x28,0xed)
#endif
#endif

/*****************************************************************************
 * PINLogonCredentialProvider coclass
 */

DEFINE_GUID(CLSID_PINLogonCredentialProvider, 0xcb82ea12, 0x9f71, 0x446d, 0x89,0xe1, 0x8d,0x09,0x24,0xe1,0x25,0x6e);

#ifdef __cplusplus
class DECLSPEC_UUID("cb82ea12-9f71-446d-89e1-8d0924e1256e") PINLogonCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PINLogonCredentialProvider, 0xcb82ea12, 0x9f71, 0x446d, 0x89,0xe1, 0x8d,0x09,0x24,0xe1,0x25,0x6e)
#endif
#endif

/*****************************************************************************
 * NPCredentialProvider coclass
 */

DEFINE_GUID(CLSID_NPCredentialProvider, 0x3dd6bec0, 0x8193, 0x4ffe, 0xae,0x25, 0xe0,0x8e,0x39,0xea,0x40,0x63);

#ifdef __cplusplus
class DECLSPEC_UUID("3dd6bec0-8193-4ffe-ae25-e08e39ea4063") NPCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(NPCredentialProvider, 0x3dd6bec0, 0x8193, 0x4ffe, 0xae,0x25, 0xe0,0x8e,0x39,0xea,0x40,0x63)
#endif
#endif

/*****************************************************************************
 * SmartcardCredentialProvider coclass
 */

DEFINE_GUID(CLSID_SmartcardCredentialProvider, 0x8fd7e19c, 0x3bf7, 0x489b, 0xa7,0x2c, 0x84,0x6a,0xb3,0x67,0x8c,0x96);

#ifdef __cplusplus
class DECLSPEC_UUID("8fd7e19c-3bf7-489b-a72c-846ab3678c96") SmartcardCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SmartcardCredentialProvider, 0x8fd7e19c, 0x3bf7, 0x489b, 0xa7,0x2c, 0x84,0x6a,0xb3,0x67,0x8c,0x96)
#endif
#endif

/*****************************************************************************
 * V1SmartcardCredentialProvider coclass
 */

DEFINE_GUID(CLSID_V1SmartcardCredentialProvider, 0x8bf9a910, 0xa8ff, 0x457f, 0x99,0x9f, 0xa5,0xca,0x10,0xb4,0xa8,0x85);

#ifdef __cplusplus
class DECLSPEC_UUID("8bf9a910-a8ff-457f-999f-a5ca10b4a885") V1SmartcardCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(V1SmartcardCredentialProvider, 0x8bf9a910, 0xa8ff, 0x457f, 0x99,0x9f, 0xa5,0xca,0x10,0xb4,0xa8,0x85)
#endif
#endif

/*****************************************************************************
 * SmartcardPinProvider coclass
 */

DEFINE_GUID(CLSID_SmartcardPinProvider, 0x94596c7e, 0x3744, 0x41ce, 0x89,0x3e, 0xbb,0xf0,0x91,0x22,0xf7,0x6a);

#ifdef __cplusplus
class DECLSPEC_UUID("94596c7e-3744-41ce-893e-bbf09122f76a") SmartcardPinProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SmartcardPinProvider, 0x94596c7e, 0x3744, 0x41ce, 0x89,0x3e, 0xbb,0xf0,0x91,0x22,0xf7,0x6a)
#endif
#endif

/*****************************************************************************
 * SmartcardReaderSelectionProvider coclass
 */

DEFINE_GUID(CLSID_SmartcardReaderSelectionProvider, 0x1b283861, 0x754f, 0x4022, 0xad,0x47, 0xa5,0xea,0xaa,0x61,0x88,0x94);

#ifdef __cplusplus
class DECLSPEC_UUID("1b283861-754f-4022-ad47-a5eaaa618894") SmartcardReaderSelectionProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SmartcardReaderSelectionProvider, 0x1b283861, 0x754f, 0x4022, 0xad,0x47, 0xa5,0xea,0xaa,0x61,0x88,0x94)
#endif
#endif

/*****************************************************************************
 * SmartcardWinRTProvider coclass
 */

DEFINE_GUID(CLSID_SmartcardWinRTProvider, 0x1ee7337f, 0x85ac, 0x45e2, 0xa2,0x3c, 0x37,0xc7,0x53,0x20,0x97,0x69);

#ifdef __cplusplus
class DECLSPEC_UUID("1ee7337f-85ac-45e2-a23c-37c753209769") SmartcardWinRTProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SmartcardWinRTProvider, 0x1ee7337f, 0x85ac, 0x45e2, 0xa2,0x3c, 0x37,0xc7,0x53,0x20,0x97,0x69)
#endif
#endif

/*****************************************************************************
 * GenericCredentialProvider coclass
 */

DEFINE_GUID(CLSID_GenericCredentialProvider, 0x25cbb996, 0x92ed, 0x457e, 0xb2,0x8c, 0x47,0x74,0x08,0x4b,0xd5,0x62);

#ifdef __cplusplus
class DECLSPEC_UUID("25cbb996-92ed-457e-b28c-4774084bd562") GenericCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(GenericCredentialProvider, 0x25cbb996, 0x92ed, 0x457e, 0xb2,0x8c, 0x47,0x74,0x08,0x4b,0xd5,0x62)
#endif
#endif

/*****************************************************************************
 * RASProvider coclass
 */

DEFINE_GUID(CLSID_RASProvider, 0x5537e283, 0xb1e7, 0x4ef8, 0x9c,0x6e, 0x7a,0xb0,0xaf,0xe5,0x05,0x6d);

#ifdef __cplusplus
class DECLSPEC_UUID("5537e283-b1e7-4ef8-9c6e-7ab0afe5056d") RASProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(RASProvider, 0x5537e283, 0xb1e7, 0x4ef8, 0x9c,0x6e, 0x7a,0xb0,0xaf,0xe5,0x05,0x6d)
#endif
#endif

/*****************************************************************************
 * OnexCredentialProvider coclass
 */

DEFINE_GUID(CLSID_OnexCredentialProvider, 0x07aa0886, 0xcc8d, 0x4e19, 0xa4,0x10, 0x1c,0x75,0xaf,0x68,0x6e,0x62);

#ifdef __cplusplus
class DECLSPEC_UUID("07aa0886-cc8d-4e19-a410-1c75af686e62") OnexCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(OnexCredentialProvider, 0x07aa0886, 0xcc8d, 0x4e19, 0xa4,0x10, 0x1c,0x75,0xaf,0x68,0x6e,0x62)
#endif
#endif

/*****************************************************************************
 * OnexPlapSmartcardCredentialProvider coclass
 */

DEFINE_GUID(CLSID_OnexPlapSmartcardCredentialProvider, 0x33c86cd6, 0x705f, 0x4ba1, 0x9a,0xdb, 0x67,0x07,0x0b,0x83,0x77,0x75);

#ifdef __cplusplus
class DECLSPEC_UUID("33c86cd6-705f-4ba1-9adb-67070b837775") OnexPlapSmartcardCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(OnexPlapSmartcardCredentialProvider, 0x33c86cd6, 0x705f, 0x4ba1, 0x9a,0xdb, 0x67,0x07,0x0b,0x83,0x77,0x75)
#endif
#endif

/*****************************************************************************
 * VaultProvider coclass
 */

DEFINE_GUID(CLSID_VaultProvider, 0x503739d0, 0x4c5e, 0x4cfd, 0xb3,0xba, 0xd8,0x81,0x33,0x4f,0x0d,0xf2);

#ifdef __cplusplus
class DECLSPEC_UUID("503739d0-4c5e-4cfd-b3ba-d881334f0df2") VaultProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(VaultProvider, 0x503739d0, 0x4c5e, 0x4cfd, 0xb3,0xba, 0xd8,0x81,0x33,0x4f,0x0d,0xf2)
#endif
#endif

/*****************************************************************************
 * WinBioCredentialProvider coclass
 */

DEFINE_GUID(CLSID_WinBioCredentialProvider, 0xbec09223, 0xb018, 0x416d, 0xa0,0xac, 0x52,0x39,0x71,0xb6,0x39,0xf5);

#ifdef __cplusplus
class DECLSPEC_UUID("bec09223-b018-416d-a0ac-523971b639f5") WinBioCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WinBioCredentialProvider, 0xbec09223, 0xb018, 0x416d, 0xa0,0xac, 0x52,0x39,0x71,0xb6,0x39,0xf5)
#endif
#endif

/*****************************************************************************
 * V1WinBioCredentialProvider coclass
 */

DEFINE_GUID(CLSID_V1WinBioCredentialProvider, 0xac3ac249, 0xe820, 0x4343, 0xa6,0x5b, 0x37,0x7a,0xc6,0x34,0xdc,0x09);

#ifdef __cplusplus
class DECLSPEC_UUID("ac3ac249-e820-4343-a65b-377ac634dc09") V1WinBioCredentialProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(V1WinBioCredentialProvider, 0xac3ac249, 0xe820, 0x4343, 0xa6,0x5b, 0x37,0x7a,0xc6,0x34,0xdc,0x09)
#endif
#endif

#endif /* __CredentialProviders_LIBRARY_DEFINED__ */
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HBITMAP_UserSize     (ULONG *, ULONG, HBITMAP *);
unsigned char * __RPC_USER HBITMAP_UserMarshal  (ULONG *, unsigned char *, HBITMAP *);
unsigned char * __RPC_USER HBITMAP_UserUnmarshal(ULONG *, unsigned char *, HBITMAP *);
void            __RPC_USER HBITMAP_UserFree     (ULONG *, HBITMAP *);
ULONG           __RPC_USER HWND_UserSize     (ULONG *, ULONG, HWND *);
unsigned char * __RPC_USER HWND_UserMarshal  (ULONG *, unsigned char *, HWND *);
unsigned char * __RPC_USER HWND_UserUnmarshal(ULONG *, unsigned char *, HWND *);
void            __RPC_USER HWND_UserFree     (ULONG *, HWND *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __credentialprovider_h__ */
