/*** Autogenerated by WIDL 8.13 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__ */
