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

/* 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 inline HRESULT ICredentialProviderCredential_QueryInterface(ICredentialProviderCredential* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProviderCredential_AddRef(ICredentialProviderCredential* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProviderCredential_Release(ICredentialProviderCredential* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredential methods ***/
static inline HRESULT ICredentialProviderCredential_Advise(ICredentialProviderCredential* This,ICredentialProviderCredentialEvents *pcpce) {
    return This->lpVtbl->Advise(This,pcpce);
}
static inline HRESULT ICredentialProviderCredential_UnAdvise(ICredentialProviderCredential* This) {
    return This->lpVtbl->UnAdvise(This);
}
static inline HRESULT ICredentialProviderCredential_SetSelected(ICredentialProviderCredential* This,WINBOOL *pbAutoLogon) {
    return This->lpVtbl->SetSelected(This,pbAutoLogon);
}
static inline HRESULT ICredentialProviderCredential_SetDeselected(ICredentialProviderCredential* This) {
    return This->lpVtbl->SetDeselected(This);
}
static 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 inline HRESULT ICredentialProviderCredential_GetStringValue(ICredentialProviderCredential* This,DWORD dwFieldID,LPWSTR *ppsz) {
    return This->lpVtbl->GetStringValue(This,dwFieldID,ppsz);
}
static inline HRESULT ICredentialProviderCredential_GetBitmapValue(ICredentialProviderCredential* This,DWORD dwFieldID,HBITMAP *phbmp) {
    return This->lpVtbl->GetBitmapValue(This,dwFieldID,phbmp);
}
static inline HRESULT ICredentialProviderCredential_GetCheckboxValue(ICredentialProviderCredential* This,DWORD dwFieldID,WINBOOL *pbChecked,LPWSTR *ppszLabel) {
    return This->lpVtbl->GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel);
}
static inline HRESULT ICredentialProviderCredential_GetSubmitButtonValue(ICredentialProviderCredential* This,DWORD dwFieldID,DWORD *pdwAdjacentTo) {
    return This->lpVtbl->GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo);
}
static inline HRESULT ICredentialProviderCredential_GetComboBoxValueCount(ICredentialProviderCredential* This,DWORD dwFieldID,DWORD *pcItems,DWORD *pdwSelectedItem) {
    return This->lpVtbl->GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem);
}
static inline HRESULT ICredentialProviderCredential_GetComboBoxValueAt(ICredentialProviderCredential* This,DWORD dwFieldID,DWORD dwItem,LPWSTR *ppszItem) {
    return This->lpVtbl->GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem);
}
static inline HRESULT ICredentialProviderCredential_SetStringValue(ICredentialProviderCredential* This,DWORD dwFieldID,LPCWSTR psz) {
    return This->lpVtbl->SetStringValue(This,dwFieldID,psz);
}
static inline HRESULT ICredentialProviderCredential_SetCheckboxValue(ICredentialProviderCredential* This,DWORD dwFieldID,WINBOOL bChecked) {
    return This->lpVtbl->SetCheckboxValue(This,dwFieldID,bChecked);
}
static inline HRESULT ICredentialProviderCredential_SetComboBoxSelectedValue(ICredentialProviderCredential* This,DWORD dwFieldID,DWORD dwSelectedItem) {
    return This->lpVtbl->SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem);
}
static inline HRESULT ICredentialProviderCredential_CommandLinkClicked(ICredentialProviderCredential* This,DWORD dwFieldID) {
    return This->lpVtbl->CommandLinkClicked(This,dwFieldID);
}
static 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 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 inline HRESULT IQueryContinueWithStatus_QueryInterface(IQueryContinueWithStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IQueryContinueWithStatus_AddRef(IQueryContinueWithStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IQueryContinueWithStatus_Release(IQueryContinueWithStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IQueryContinue methods ***/
static inline HRESULT IQueryContinueWithStatus_QueryContinue(IQueryContinueWithStatus* This) {
    return This->lpVtbl->QueryContinue(This);
}
/*** IQueryContinueWithStatus methods ***/
static 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 inline HRESULT IConnectableCredentialProviderCredential_QueryInterface(IConnectableCredentialProviderCredential* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IConnectableCredentialProviderCredential_AddRef(IConnectableCredentialProviderCredential* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IConnectableCredentialProviderCredential_Release(IConnectableCredentialProviderCredential* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredential methods ***/
static inline HRESULT IConnectableCredentialProviderCredential_Advise(IConnectableCredentialProviderCredential* This,ICredentialProviderCredentialEvents *pcpce) {
    return This->lpVtbl->Advise(This,pcpce);
}
static inline HRESULT IConnectableCredentialProviderCredential_UnAdvise(IConnectableCredentialProviderCredential* This) {
    return This->lpVtbl->UnAdvise(This);
}
static inline HRESULT IConnectableCredentialProviderCredential_SetSelected(IConnectableCredentialProviderCredential* This,WINBOOL *pbAutoLogon) {
    return This->lpVtbl->SetSelected(This,pbAutoLogon);
}
static inline HRESULT IConnectableCredentialProviderCredential_SetDeselected(IConnectableCredentialProviderCredential* This) {
    return This->lpVtbl->SetDeselected(This);
}
static 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 inline HRESULT IConnectableCredentialProviderCredential_GetStringValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,LPWSTR *ppsz) {
    return This->lpVtbl->GetStringValue(This,dwFieldID,ppsz);
}
static inline HRESULT IConnectableCredentialProviderCredential_GetBitmapValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,HBITMAP *phbmp) {
    return This->lpVtbl->GetBitmapValue(This,dwFieldID,phbmp);
}
static inline HRESULT IConnectableCredentialProviderCredential_GetCheckboxValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,WINBOOL *pbChecked,LPWSTR *ppszLabel) {
    return This->lpVtbl->GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel);
}
static inline HRESULT IConnectableCredentialProviderCredential_GetSubmitButtonValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,DWORD *pdwAdjacentTo) {
    return This->lpVtbl->GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo);
}
static inline HRESULT IConnectableCredentialProviderCredential_GetComboBoxValueCount(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,DWORD *pcItems,DWORD *pdwSelectedItem) {
    return This->lpVtbl->GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem);
}
static inline HRESULT IConnectableCredentialProviderCredential_GetComboBoxValueAt(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,DWORD dwItem,LPWSTR *ppszItem) {
    return This->lpVtbl->GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem);
}
static inline HRESULT IConnectableCredentialProviderCredential_SetStringValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,LPCWSTR psz) {
    return This->lpVtbl->SetStringValue(This,dwFieldID,psz);
}
static inline HRESULT IConnectableCredentialProviderCredential_SetCheckboxValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,WINBOOL bChecked) {
    return This->lpVtbl->SetCheckboxValue(This,dwFieldID,bChecked);
}
static inline HRESULT IConnectableCredentialProviderCredential_SetComboBoxSelectedValue(IConnectableCredentialProviderCredential* This,DWORD dwFieldID,DWORD dwSelectedItem) {
    return This->lpVtbl->SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem);
}
static inline HRESULT IConnectableCredentialProviderCredential_CommandLinkClicked(IConnectableCredentialProviderCredential* This,DWORD dwFieldID) {
    return This->lpVtbl->CommandLinkClicked(This,dwFieldID);
}
static 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 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 inline HRESULT IConnectableCredentialProviderCredential_Connect(IConnectableCredentialProviderCredential* This,IQueryContinueWithStatus *pqcws) {
    return This->lpVtbl->Connect(This,pqcws);
}
static 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 inline HRESULT ICredentialProviderCredentialEvents_QueryInterface(ICredentialProviderCredentialEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProviderCredentialEvents_AddRef(ICredentialProviderCredentialEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProviderCredentialEvents_Release(ICredentialProviderCredentialEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredentialEvents methods ***/
static inline HRESULT ICredentialProviderCredentialEvents_SetFieldState(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,CREDENTIAL_PROVIDER_FIELD_STATE cpfs) {
    return This->lpVtbl->SetFieldState(This,pcpc,dwFieldID,cpfs);
}
static 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 inline HRESULT ICredentialProviderCredentialEvents_SetFieldString(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,LPCWSTR psz) {
    return This->lpVtbl->SetFieldString(This,pcpc,dwFieldID,psz);
}
static inline HRESULT ICredentialProviderCredentialEvents_SetFieldCheckbox(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,WINBOOL bChecked,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFieldCheckbox(This,pcpc,dwFieldID,bChecked,pszLabel);
}
static inline HRESULT ICredentialProviderCredentialEvents_SetFieldBitmap(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,HBITMAP hbmp) {
    return This->lpVtbl->SetFieldBitmap(This,pcpc,dwFieldID,hbmp);
}
static inline HRESULT ICredentialProviderCredentialEvents_SetFieldComboBoxSelectedItem(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwSelectedItem) {
    return This->lpVtbl->SetFieldComboBoxSelectedItem(This,pcpc,dwFieldID,dwSelectedItem);
}
static inline HRESULT ICredentialProviderCredentialEvents_DeleteFieldComboBoxItem(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwItem) {
    return This->lpVtbl->DeleteFieldComboBoxItem(This,pcpc,dwFieldID,dwItem);
}
static inline HRESULT ICredentialProviderCredentialEvents_AppendFieldComboBoxItem(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,LPCWSTR pszItem) {
    return This->lpVtbl->AppendFieldComboBoxItem(This,pcpc,dwFieldID,pszItem);
}
static inline HRESULT ICredentialProviderCredentialEvents_SetFieldSubmitButton(ICredentialProviderCredentialEvents* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwAdjacentTo) {
    return This->lpVtbl->SetFieldSubmitButton(This,pcpc,dwFieldID,dwAdjacentTo);
}
static 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 inline HRESULT ICredentialProvider_QueryInterface(ICredentialProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProvider_AddRef(ICredentialProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProvider_Release(ICredentialProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProvider methods ***/
static inline HRESULT ICredentialProvider_SetUsageScenario(ICredentialProvider* This,CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,DWORD dwFlags) {
    return This->lpVtbl->SetUsageScenario(This,cpus,dwFlags);
}
static inline HRESULT ICredentialProvider_SetSerialization(ICredentialProvider* This,const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs) {
    return This->lpVtbl->SetSerialization(This,pcpcs);
}
static inline HRESULT ICredentialProvider_Advise(ICredentialProvider* This,ICredentialProviderEvents *pcpe,UINT_PTR upAdviseContext) {
    return This->lpVtbl->Advise(This,pcpe,upAdviseContext);
}
static inline HRESULT ICredentialProvider_UnAdvise(ICredentialProvider* This) {
    return This->lpVtbl->UnAdvise(This);
}
static inline HRESULT ICredentialProvider_GetFieldDescriptorCount(ICredentialProvider* This,DWORD *pdwCount) {
    return This->lpVtbl->GetFieldDescriptorCount(This,pdwCount);
}
static inline HRESULT ICredentialProvider_GetFieldDescriptorAt(ICredentialProvider* This,DWORD dwIndex,CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR **ppcpfd) {
    return This->lpVtbl->GetFieldDescriptorAt(This,dwIndex,ppcpfd);
}
static inline HRESULT ICredentialProvider_GetCredentialCount(ICredentialProvider* This,DWORD *pdwCount,DWORD *pdwDefault,WINBOOL *pbAutoLogonWithDefault) {
    return This->lpVtbl->GetCredentialCount(This,pdwCount,pdwDefault,pbAutoLogonWithDefault);
}
static 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 inline HRESULT ICredentialProviderEvents_QueryInterface(ICredentialProviderEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProviderEvents_AddRef(ICredentialProviderEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProviderEvents_Release(ICredentialProviderEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderEvents methods ***/
static 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 inline HRESULT ICredentialProviderFilter_QueryInterface(ICredentialProviderFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProviderFilter_AddRef(ICredentialProviderFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProviderFilter_Release(ICredentialProviderFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderFilter methods ***/
static 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 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 inline HRESULT ICredentialProviderCredential2_QueryInterface(ICredentialProviderCredential2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProviderCredential2_AddRef(ICredentialProviderCredential2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProviderCredential2_Release(ICredentialProviderCredential2* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredential methods ***/
static inline HRESULT ICredentialProviderCredential2_Advise(ICredentialProviderCredential2* This,ICredentialProviderCredentialEvents *pcpce) {
    return This->lpVtbl->Advise(This,pcpce);
}
static inline HRESULT ICredentialProviderCredential2_UnAdvise(ICredentialProviderCredential2* This) {
    return This->lpVtbl->UnAdvise(This);
}
static inline HRESULT ICredentialProviderCredential2_SetSelected(ICredentialProviderCredential2* This,WINBOOL *pbAutoLogon) {
    return This->lpVtbl->SetSelected(This,pbAutoLogon);
}
static inline HRESULT ICredentialProviderCredential2_SetDeselected(ICredentialProviderCredential2* This) {
    return This->lpVtbl->SetDeselected(This);
}
static 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 inline HRESULT ICredentialProviderCredential2_GetStringValue(ICredentialProviderCredential2* This,DWORD dwFieldID,LPWSTR *ppsz) {
    return This->lpVtbl->GetStringValue(This,dwFieldID,ppsz);
}
static inline HRESULT ICredentialProviderCredential2_GetBitmapValue(ICredentialProviderCredential2* This,DWORD dwFieldID,HBITMAP *phbmp) {
    return This->lpVtbl->GetBitmapValue(This,dwFieldID,phbmp);
}
static inline HRESULT ICredentialProviderCredential2_GetCheckboxValue(ICredentialProviderCredential2* This,DWORD dwFieldID,WINBOOL *pbChecked,LPWSTR *ppszLabel) {
    return This->lpVtbl->GetCheckboxValue(This,dwFieldID,pbChecked,ppszLabel);
}
static inline HRESULT ICredentialProviderCredential2_GetSubmitButtonValue(ICredentialProviderCredential2* This,DWORD dwFieldID,DWORD *pdwAdjacentTo) {
    return This->lpVtbl->GetSubmitButtonValue(This,dwFieldID,pdwAdjacentTo);
}
static inline HRESULT ICredentialProviderCredential2_GetComboBoxValueCount(ICredentialProviderCredential2* This,DWORD dwFieldID,DWORD *pcItems,DWORD *pdwSelectedItem) {
    return This->lpVtbl->GetComboBoxValueCount(This,dwFieldID,pcItems,pdwSelectedItem);
}
static inline HRESULT ICredentialProviderCredential2_GetComboBoxValueAt(ICredentialProviderCredential2* This,DWORD dwFieldID,DWORD dwItem,LPWSTR *ppszItem) {
    return This->lpVtbl->GetComboBoxValueAt(This,dwFieldID,dwItem,ppszItem);
}
static inline HRESULT ICredentialProviderCredential2_SetStringValue(ICredentialProviderCredential2* This,DWORD dwFieldID,LPCWSTR psz) {
    return This->lpVtbl->SetStringValue(This,dwFieldID,psz);
}
static inline HRESULT ICredentialProviderCredential2_SetCheckboxValue(ICredentialProviderCredential2* This,DWORD dwFieldID,WINBOOL bChecked) {
    return This->lpVtbl->SetCheckboxValue(This,dwFieldID,bChecked);
}
static inline HRESULT ICredentialProviderCredential2_SetComboBoxSelectedValue(ICredentialProviderCredential2* This,DWORD dwFieldID,DWORD dwSelectedItem) {
    return This->lpVtbl->SetComboBoxSelectedValue(This,dwFieldID,dwSelectedItem);
}
static inline HRESULT ICredentialProviderCredential2_CommandLinkClicked(ICredentialProviderCredential2* This,DWORD dwFieldID) {
    return This->lpVtbl->CommandLinkClicked(This,dwFieldID);
}
static 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 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 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 inline HRESULT ICredentialProviderCredentialWithFieldOptions_QueryInterface(ICredentialProviderCredentialWithFieldOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProviderCredentialWithFieldOptions_AddRef(ICredentialProviderCredentialWithFieldOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProviderCredentialWithFieldOptions_Release(ICredentialProviderCredentialWithFieldOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredentialWithFieldOptions methods ***/
static 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 inline HRESULT ICredentialProviderCredentialEvents2_QueryInterface(ICredentialProviderCredentialEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProviderCredentialEvents2_AddRef(ICredentialProviderCredentialEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProviderCredentialEvents2_Release(ICredentialProviderCredentialEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderCredentialEvents methods ***/
static inline HRESULT ICredentialProviderCredentialEvents2_SetFieldState(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,CREDENTIAL_PROVIDER_FIELD_STATE cpfs) {
    return This->lpVtbl->SetFieldState(This,pcpc,dwFieldID,cpfs);
}
static 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 inline HRESULT ICredentialProviderCredentialEvents2_SetFieldString(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,LPCWSTR psz) {
    return This->lpVtbl->SetFieldString(This,pcpc,dwFieldID,psz);
}
static inline HRESULT ICredentialProviderCredentialEvents2_SetFieldCheckbox(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,WINBOOL bChecked,LPCWSTR pszLabel) {
    return This->lpVtbl->SetFieldCheckbox(This,pcpc,dwFieldID,bChecked,pszLabel);
}
static inline HRESULT ICredentialProviderCredentialEvents2_SetFieldBitmap(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,HBITMAP hbmp) {
    return This->lpVtbl->SetFieldBitmap(This,pcpc,dwFieldID,hbmp);
}
static inline HRESULT ICredentialProviderCredentialEvents2_SetFieldComboBoxSelectedItem(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwSelectedItem) {
    return This->lpVtbl->SetFieldComboBoxSelectedItem(This,pcpc,dwFieldID,dwSelectedItem);
}
static inline HRESULT ICredentialProviderCredentialEvents2_DeleteFieldComboBoxItem(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwItem) {
    return This->lpVtbl->DeleteFieldComboBoxItem(This,pcpc,dwFieldID,dwItem);
}
static inline HRESULT ICredentialProviderCredentialEvents2_AppendFieldComboBoxItem(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,LPCWSTR pszItem) {
    return This->lpVtbl->AppendFieldComboBoxItem(This,pcpc,dwFieldID,pszItem);
}
static inline HRESULT ICredentialProviderCredentialEvents2_SetFieldSubmitButton(ICredentialProviderCredentialEvents2* This,ICredentialProviderCredential *pcpc,DWORD dwFieldID,DWORD dwAdjacentTo) {
    return This->lpVtbl->SetFieldSubmitButton(This,pcpc,dwFieldID,dwAdjacentTo);
}
static inline HRESULT ICredentialProviderCredentialEvents2_OnCreatingWindow(ICredentialProviderCredentialEvents2* This,HWND *phwndOwner) {
    return This->lpVtbl->OnCreatingWindow(This,phwndOwner);
}
/*** ICredentialProviderCredentialEvents2 methods ***/
static inline HRESULT ICredentialProviderCredentialEvents2_BeginFieldUpdates(ICredentialProviderCredentialEvents2* This) {
    return This->lpVtbl->BeginFieldUpdates(This);
}
static inline HRESULT ICredentialProviderCredentialEvents2_EndFieldUpdates(ICredentialProviderCredentialEvents2* This) {
    return This->lpVtbl->EndFieldUpdates(This);
}
static 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 inline HRESULT ICredentialProviderUser_QueryInterface(ICredentialProviderUser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProviderUser_AddRef(ICredentialProviderUser* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProviderUser_Release(ICredentialProviderUser* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderUser methods ***/
static inline HRESULT ICredentialProviderUser_GetSid(ICredentialProviderUser* This,LPWSTR *sid) {
    return This->lpVtbl->GetSid(This,sid);
}
static inline HRESULT ICredentialProviderUser_GetProviderID(ICredentialProviderUser* This,GUID *providerID) {
    return This->lpVtbl->GetProviderID(This,providerID);
}
static inline HRESULT ICredentialProviderUser_GetStringValue(ICredentialProviderUser* This,REFPROPERTYKEY key,LPWSTR *stringValue) {
    return This->lpVtbl->GetStringValue(This,key,stringValue);
}
static 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 inline HRESULT ICredentialProviderUserArray_QueryInterface(ICredentialProviderUserArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProviderUserArray_AddRef(ICredentialProviderUserArray* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProviderUserArray_Release(ICredentialProviderUserArray* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderUserArray methods ***/
static inline HRESULT ICredentialProviderUserArray_SetProviderFilter(ICredentialProviderUserArray* This,REFGUID guidProviderToFilterTo) {
    return This->lpVtbl->SetProviderFilter(This,guidProviderToFilterTo);
}
static inline HRESULT ICredentialProviderUserArray_GetAccountOptions(ICredentialProviderUserArray* This,CREDENTIAL_PROVIDER_ACCOUNT_OPTIONS *credentialProviderAccountOptions) {
    return This->lpVtbl->GetAccountOptions(This,credentialProviderAccountOptions);
}
static inline HRESULT ICredentialProviderUserArray_GetCount(ICredentialProviderUserArray* This,DWORD *userCount) {
    return This->lpVtbl->GetCount(This,userCount);
}
static 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 inline HRESULT ICredentialProviderSetUserArray_QueryInterface(ICredentialProviderSetUserArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ICredentialProviderSetUserArray_AddRef(ICredentialProviderSetUserArray* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ICredentialProviderSetUserArray_Release(ICredentialProviderSetUserArray* This) {
    return This->lpVtbl->Release(This);
}
/*** ICredentialProviderSetUserArray methods ***/
static 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__ */
