/*** Autogenerated by WIDL 11.0-rc1 from include/windows.security.credentials.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 __windows_security_credentials_h__
#define __windows_security_credentials_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential ABI::Windows::Security::Credentials::IKeyCredential
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                interface IKeyCredential;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult ABI::Windows::Security::Credentials::IKeyCredentialAttestationResult
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                interface IKeyCredentialAttestationResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics ABI::Windows::Security::Credentials::IKeyCredentialManagerStatics
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                interface IKeyCredentialManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult ABI::Windows::Security::Credentials::IKeyCredentialOperationResult
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                interface IKeyCredentialOperationResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult ABI::Windows::Security::Credentials::IKeyCredentialRetrievalResult
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                interface IKeyCredentialRetrievalResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredential_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredential_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                class KeyCredential;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredential __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredential;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredential_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationResult_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                class KeyCredentialAttestationResult;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationResult __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationResult;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationResult_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                class KeyCredentialManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialManager __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialOperationResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialOperationResult_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                class KeyCredentialOperationResult;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialOperationResult __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialOperationResult;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialOperationResult_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialRetrievalResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialRetrievalResult_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                class KeyCredentialRetrievalResult;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialRetrievalResult __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialRetrievalResult;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialRetrievalResult_FWD_DEFINED__ */

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.security.cryptography.core.h>
#include <windows.storage.streams.h>
#include <windows.system.h>

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSecurity_CCryptography_CCore_CCryptographicPublicKeyBlobType_ENUM_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCryptography_CCore_CCryptographicPublicKeyBlobType_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Cryptography {
                namespace Core {
                    enum CryptographicPublicKeyBlobType {
                        CryptographicPublicKeyBlobType_X509SubjectPublicKeyInfo = 0,
                        CryptographicPublicKeyBlobType_Pkcs1RsaPublicKey = 1,
                        CryptographicPublicKeyBlobType_BCryptPublicKey = 2,
                        CryptographicPublicKeyBlobType_Capi1PublicKey = 3,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                        CryptographicPublicKeyBlobType_BCryptEccFullPublicKey = 4
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSecurity_CCryptography_CCore_CCryptographicPublicKeyBlobType {
    CryptographicPublicKeyBlobType_X509SubjectPublicKeyInfo = 0,
    CryptographicPublicKeyBlobType_Pkcs1RsaPublicKey = 1,
    CryptographicPublicKeyBlobType_BCryptPublicKey = 2,
    CryptographicPublicKeyBlobType_Capi1PublicKey = 3,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    CryptographicPublicKeyBlobType_BCryptEccFullPublicKey = 4
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
};
#ifdef WIDL_using_Windows_Security_Cryptography_Core
#define CryptographicPublicKeyBlobType __x_ABI_CWindows_CSecurity_CCryptography_CCore_CCryptographicPublicKeyBlobType
#endif /* WIDL_using_Windows_Security_Cryptography_Core */
#endif

#endif /* ____x_ABI_CWindows_CSecurity_CCryptography_CCore_CCryptographicPublicKeyBlobType_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CSecurity_CCryptography_CCore_CCryptographicPublicKeyBlobType __x_ABI_CWindows_CSecurity_CCryptography_CCore_CCryptographicPublicKeyBlobType;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationStatus_ENUM_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationStatus_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                enum KeyCredentialAttestationStatus {
                    KeyCredentialAttestationStatus_Success = 0,
                    KeyCredentialAttestationStatus_UnknownError = 1,
                    KeyCredentialAttestationStatus_NotSupported = 2,
                    KeyCredentialAttestationStatus_TemporaryFailure = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationStatus {
    KeyCredentialAttestationStatus_Success = 0,
    KeyCredentialAttestationStatus_UnknownError = 1,
    KeyCredentialAttestationStatus_NotSupported = 2,
    KeyCredentialAttestationStatus_TemporaryFailure = 3
};
#ifdef WIDL_using_Windows_Security_Credentials
#define KeyCredentialAttestationStatus __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationStatus
#endif /* WIDL_using_Windows_Security_Credentials */
#endif

#endif /* ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationStatus_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationStatus __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationStatus;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialCreationOption_ENUM_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialCreationOption_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                enum KeyCredentialCreationOption {
                    KeyCredentialCreationOption_ReplaceExisting = 0,
                    KeyCredentialCreationOption_FailIfExists = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialCreationOption {
    KeyCredentialCreationOption_ReplaceExisting = 0,
    KeyCredentialCreationOption_FailIfExists = 1
};
#ifdef WIDL_using_Windows_Security_Credentials
#define KeyCredentialCreationOption __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialCreationOption
#endif /* WIDL_using_Windows_Security_Credentials */
#endif

#endif /* ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialCreationOption_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialCreationOption __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialCreationOption;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus_ENUM_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                enum KeyCredentialStatus {
                    KeyCredentialStatus_Success = 0,
                    KeyCredentialStatus_UnknownError = 1,
                    KeyCredentialStatus_NotFound = 2,
                    KeyCredentialStatus_UserCanceled = 3,
                    KeyCredentialStatus_UserPrefersPassword = 4,
                    KeyCredentialStatus_CredentialAlreadyExists = 5,
                    KeyCredentialStatus_SecurityDeviceLocked = 6
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus {
    KeyCredentialStatus_Success = 0,
    KeyCredentialStatus_UnknownError = 1,
    KeyCredentialStatus_NotFound = 2,
    KeyCredentialStatus_UserCanceled = 3,
    KeyCredentialStatus_UserPrefersPassword = 4,
    KeyCredentialStatus_CredentialAlreadyExists = 5,
    KeyCredentialStatus_SecurityDeviceLocked = 6
};
#ifdef WIDL_using_Windows_Security_Credentials
#define KeyCredentialStatus __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus
#endif /* WIDL_using_Windows_Security_Credentials */
#endif

#endif /* ____x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential ABI::Windows::Security::Credentials::IKeyCredential
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                interface IKeyCredential;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult ABI::Windows::Security::Credentials::IKeyCredentialAttestationResult
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                interface IKeyCredentialAttestationResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics ABI::Windows::Security::Credentials::IKeyCredentialManagerStatics
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                interface IKeyCredentialManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult ABI::Windows::Security::Credentials::IKeyCredentialOperationResult
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                interface IKeyCredentialOperationResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult ABI::Windows::Security::Credentials::IKeyCredentialRetrievalResult
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                interface IKeyCredentialRetrievalResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* >
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IKeyCredential interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential, 0x9585ef8d, 0x457b, 0x4847, 0xb1,0x1a, 0xfa,0x96,0x0b,0xbd,0xb1,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                MIDL_INTERFACE("9585ef8d-457b-4847-b11a-fa960bbdb138")
                IKeyCredential : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Name(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RetrievePublicKeyWithDefaultBlobType(
                        ABI::Windows::Storage::Streams::IBuffer **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RetrievePublicKeyWithBlobType(
                        ABI::Windows::Security::Cryptography::Core::CryptographicPublicKeyBlobType blobType,
                        ABI::Windows::Storage::Streams::IBuffer **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RequestSignAsync(
                        ABI::Windows::Storage::Streams::IBuffer *data,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetAttestationAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential, 0x9585ef8d, 0x457b, 0x4847, 0xb1,0x1a, 0xfa,0x96,0x0b,0xbd,0xb1,0x38)
#endif
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential *This,
        TrustLevel *trustLevel);

    /*** IKeyCredential methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *RetrievePublicKeyWithDefaultBlobType)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **value);

    HRESULT (STDMETHODCALLTYPE *RetrievePublicKeyWithBlobType)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential *This,
        __x_ABI_CWindows_CSecurity_CCryptography_CCore_CCryptographicPublicKeyBlobType blobType,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **value);

    HRESULT (STDMETHODCALLTYPE *RequestSignAsync)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *data,
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult **value);

    HRESULT (STDMETHODCALLTYPE *GetAttestationAsync)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential *This,
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult **value);

    END_INTERFACE
} __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialVtbl;

interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential {
    CONST_VTBL __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKeyCredential methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_RetrievePublicKeyWithDefaultBlobType(This,value) (This)->lpVtbl->RetrievePublicKeyWithDefaultBlobType(This,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_RetrievePublicKeyWithBlobType(This,blobType,value) (This)->lpVtbl->RetrievePublicKeyWithBlobType(This,blobType,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_RequestSignAsync(This,data,value) (This)->lpVtbl->RequestSignAsync(This,data,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetAttestationAsync(This,value) (This)->lpVtbl->GetAttestationAsync(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_QueryInterface(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_AddRef(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_Release(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetIids(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetTrustLevel(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKeyCredential methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_get_Name(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_RetrievePublicKeyWithDefaultBlobType(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **value) {
    return This->lpVtbl->RetrievePublicKeyWithDefaultBlobType(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_RetrievePublicKeyWithBlobType(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This,__x_ABI_CWindows_CSecurity_CCryptography_CCore_CCryptographicPublicKeyBlobType blobType,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **value) {
    return This->lpVtbl->RetrievePublicKeyWithBlobType(This,blobType,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_RequestSignAsync(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *data,__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult **value) {
    return This->lpVtbl->RequestSignAsync(This,data,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetAttestationAsync(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential* This,__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult **value) {
    return This->lpVtbl->GetAttestationAsync(This,value);
}
#endif
#ifdef WIDL_using_Windows_Security_Credentials
#define IID_IKeyCredential IID___x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential
#define IKeyCredentialVtbl __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialVtbl
#define IKeyCredential __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential
#define IKeyCredential_QueryInterface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_QueryInterface
#define IKeyCredential_AddRef __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_AddRef
#define IKeyCredential_Release __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_Release
#define IKeyCredential_GetIids __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetIids
#define IKeyCredential_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetRuntimeClassName
#define IKeyCredential_GetTrustLevel __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetTrustLevel
#define IKeyCredential_get_Name __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_get_Name
#define IKeyCredential_RetrievePublicKeyWithDefaultBlobType __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_RetrievePublicKeyWithDefaultBlobType
#define IKeyCredential_RetrievePublicKeyWithBlobType __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_RetrievePublicKeyWithBlobType
#define IKeyCredential_RequestSignAsync __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_RequestSignAsync
#define IKeyCredential_GetAttestationAsync __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_GetAttestationAsync
#endif /* WIDL_using_Windows_Security_Credentials */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IKeyCredentialAttestationResult interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult, 0x78aab3a1, 0xa3c1, 0x4103, 0xb6,0xcc, 0x47,0x2c,0x44,0x17,0x1c,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                MIDL_INTERFACE("78aab3a1-a3c1-4103-b6cc-472c44171cbb")
                IKeyCredentialAttestationResult : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_CertificateChainBuffer(
                        ABI::Windows::Storage::Streams::IBuffer **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AttestationBuffer(
                        ABI::Windows::Storage::Streams::IBuffer **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Status(
                        ABI::Windows::Security::Credentials::KeyCredentialAttestationStatus *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult, 0x78aab3a1, 0xa3c1, 0x4103, 0xb6,0xcc, 0x47,0x2c,0x44,0x17,0x1c,0xbb)
#endif
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult *This,
        TrustLevel *trustLevel);

    /*** IKeyCredentialAttestationResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CertificateChainBuffer)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **value);

    HRESULT (STDMETHODCALLTYPE *get_AttestationBuffer)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **value);

    HRESULT (STDMETHODCALLTYPE *get_Status)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult *This,
        __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationStatus *value);

    END_INTERFACE
} __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResultVtbl;

interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult {
    CONST_VTBL __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKeyCredentialAttestationResult methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_get_CertificateChainBuffer(This,value) (This)->lpVtbl->get_CertificateChainBuffer(This,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_get_AttestationBuffer(This,value) (This)->lpVtbl->get_AttestationBuffer(This,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_get_Status(This,value) (This)->lpVtbl->get_Status(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_QueryInterface(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_AddRef(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_Release(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_GetIids(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_GetTrustLevel(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKeyCredentialAttestationResult methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_get_CertificateChainBuffer(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **value) {
    return This->lpVtbl->get_CertificateChainBuffer(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_get_AttestationBuffer(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **value) {
    return This->lpVtbl->get_AttestationBuffer(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_get_Status(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult* This,__x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialAttestationStatus *value) {
    return This->lpVtbl->get_Status(This,value);
}
#endif
#ifdef WIDL_using_Windows_Security_Credentials
#define IID_IKeyCredentialAttestationResult IID___x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult
#define IKeyCredentialAttestationResultVtbl __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResultVtbl
#define IKeyCredentialAttestationResult __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult
#define IKeyCredentialAttestationResult_QueryInterface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_QueryInterface
#define IKeyCredentialAttestationResult_AddRef __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_AddRef
#define IKeyCredentialAttestationResult_Release __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_Release
#define IKeyCredentialAttestationResult_GetIids __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_GetIids
#define IKeyCredentialAttestationResult_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_GetRuntimeClassName
#define IKeyCredentialAttestationResult_GetTrustLevel __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_GetTrustLevel
#define IKeyCredentialAttestationResult_get_CertificateChainBuffer __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_get_CertificateChainBuffer
#define IKeyCredentialAttestationResult_get_AttestationBuffer __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_get_AttestationBuffer
#define IKeyCredentialAttestationResult_get_Status __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_get_Status
#endif /* WIDL_using_Windows_Security_Credentials */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IKeyCredentialManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics, 0x6aac468b, 0x0ef1, 0x4ce0, 0x82,0x90, 0x41,0x06,0xda,0x6a,0x63,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                MIDL_INTERFACE("6aac468b-0ef1-4ce0-8290-4106da6a63b5")
                IKeyCredentialManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE IsSupportedAsync(
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RenewAttestationAsync(
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RequestCreateAsync(
                        HSTRING name,
                        ABI::Windows::Security::Credentials::KeyCredentialCreationOption option,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE OpenAsync(
                        HSTRING name,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE DeleteAsync(
                        HSTRING name,
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics, 0x6aac468b, 0x0ef1, 0x4ce0, 0x82,0x90, 0x41,0x06,0xda,0x6a,0x63,0xb5)
#endif
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics *This,
        TrustLevel *trustLevel);

    /*** IKeyCredentialManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *IsSupportedAsync)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics *This,
        __FIAsyncOperation_1_boolean **value);

    HRESULT (STDMETHODCALLTYPE *RenewAttestationAsync)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *RequestCreateAsync)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics *This,
        HSTRING name,
        __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialCreationOption option,
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult **value);

    HRESULT (STDMETHODCALLTYPE *OpenAsync)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics *This,
        HSTRING name,
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult **value);

    HRESULT (STDMETHODCALLTYPE *DeleteAsync)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics *This,
        HSTRING name,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    END_INTERFACE
} __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStaticsVtbl;

interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKeyCredentialManagerStatics methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_IsSupportedAsync(This,value) (This)->lpVtbl->IsSupportedAsync(This,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_RenewAttestationAsync(This,operation) (This)->lpVtbl->RenewAttestationAsync(This,operation)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_RequestCreateAsync(This,name,option,value) (This)->lpVtbl->RequestCreateAsync(This,name,option,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_OpenAsync(This,name,value) (This)->lpVtbl->OpenAsync(This,name,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_DeleteAsync(This,name,operation) (This)->lpVtbl->DeleteAsync(This,name,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_QueryInterface(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_AddRef(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_Release(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_GetIids(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_GetTrustLevel(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKeyCredentialManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_IsSupportedAsync(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This,__FIAsyncOperation_1_boolean **value) {
    return This->lpVtbl->IsSupportedAsync(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_RenewAttestationAsync(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->RenewAttestationAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_RequestCreateAsync(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This,HSTRING name,__x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialCreationOption option,__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult **value) {
    return This->lpVtbl->RequestCreateAsync(This,name,option,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_OpenAsync(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This,HSTRING name,__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult **value) {
    return This->lpVtbl->OpenAsync(This,name,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_DeleteAsync(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics* This,HSTRING name,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->DeleteAsync(This,name,operation);
}
#endif
#ifdef WIDL_using_Windows_Security_Credentials
#define IID_IKeyCredentialManagerStatics IID___x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics
#define IKeyCredentialManagerStaticsVtbl __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStaticsVtbl
#define IKeyCredentialManagerStatics __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics
#define IKeyCredentialManagerStatics_QueryInterface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_QueryInterface
#define IKeyCredentialManagerStatics_AddRef __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_AddRef
#define IKeyCredentialManagerStatics_Release __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_Release
#define IKeyCredentialManagerStatics_GetIids __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_GetIids
#define IKeyCredentialManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_GetRuntimeClassName
#define IKeyCredentialManagerStatics_GetTrustLevel __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_GetTrustLevel
#define IKeyCredentialManagerStatics_IsSupportedAsync __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_IsSupportedAsync
#define IKeyCredentialManagerStatics_RenewAttestationAsync __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_RenewAttestationAsync
#define IKeyCredentialManagerStatics_RequestCreateAsync __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_RequestCreateAsync
#define IKeyCredentialManagerStatics_OpenAsync __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_OpenAsync
#define IKeyCredentialManagerStatics_DeleteAsync __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_DeleteAsync
#endif /* WIDL_using_Windows_Security_Credentials */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialManagerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IKeyCredentialOperationResult interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult, 0xf53786c1, 0x5261, 0x4cdd, 0x97,0x6d, 0xcc,0x90,0x9a,0xc7,0x16,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                MIDL_INTERFACE("f53786c1-5261-4cdd-976d-cc909ac71620")
                IKeyCredentialOperationResult : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Result(
                        ABI::Windows::Storage::Streams::IBuffer **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Status(
                        ABI::Windows::Security::Credentials::KeyCredentialStatus *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult, 0xf53786c1, 0x5261, 0x4cdd, 0x97,0x6d, 0xcc,0x90,0x9a,0xc7,0x16,0x20)
#endif
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult *This,
        TrustLevel *trustLevel);

    /*** IKeyCredentialOperationResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Result)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **value);

    HRESULT (STDMETHODCALLTYPE *get_Status)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult *This,
        __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus *value);

    END_INTERFACE
} __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResultVtbl;

interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult {
    CONST_VTBL __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKeyCredentialOperationResult methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_get_Result(This,value) (This)->lpVtbl->get_Result(This,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_get_Status(This,value) (This)->lpVtbl->get_Status(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_QueryInterface(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_AddRef(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_Release(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_GetIids(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_GetTrustLevel(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKeyCredentialOperationResult methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_get_Result(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **value) {
    return This->lpVtbl->get_Result(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_get_Status(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult* This,__x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus *value) {
    return This->lpVtbl->get_Status(This,value);
}
#endif
#ifdef WIDL_using_Windows_Security_Credentials
#define IID_IKeyCredentialOperationResult IID___x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult
#define IKeyCredentialOperationResultVtbl __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResultVtbl
#define IKeyCredentialOperationResult __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult
#define IKeyCredentialOperationResult_QueryInterface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_QueryInterface
#define IKeyCredentialOperationResult_AddRef __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_AddRef
#define IKeyCredentialOperationResult_Release __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_Release
#define IKeyCredentialOperationResult_GetIids __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_GetIids
#define IKeyCredentialOperationResult_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_GetRuntimeClassName
#define IKeyCredentialOperationResult_GetTrustLevel __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_GetTrustLevel
#define IKeyCredentialOperationResult_get_Result __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_get_Result
#define IKeyCredentialOperationResult_get_Status __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_get_Status
#endif /* WIDL_using_Windows_Security_Credentials */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IKeyCredentialRetrievalResult interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult, 0x58cd7703, 0x8d87, 0x4249, 0x9b,0x58, 0xf6,0x59,0x8c,0xc9,0x64,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                MIDL_INTERFACE("58cd7703-8d87-4249-9b58-f6598cc9644e")
                IKeyCredentialRetrievalResult : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Credential(
                        ABI::Windows::Security::Credentials::IKeyCredential **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Status(
                        ABI::Windows::Security::Credentials::KeyCredentialStatus *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult, 0x58cd7703, 0x8d87, 0x4249, 0x9b,0x58, 0xf6,0x59,0x8c,0xc9,0x64,0x4e)
#endif
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult *This,
        TrustLevel *trustLevel);

    /*** IKeyCredentialRetrievalResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Credential)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult *This,
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential **value);

    HRESULT (STDMETHODCALLTYPE *get_Status)(
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult *This,
        __x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus *value);

    END_INTERFACE
} __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResultVtbl;

interface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult {
    CONST_VTBL __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKeyCredentialRetrievalResult methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_get_Credential(This,value) (This)->lpVtbl->get_Credential(This,value)
#define __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_get_Status(This,value) (This)->lpVtbl->get_Status(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_QueryInterface(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_AddRef(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_Release(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_GetIids(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_GetTrustLevel(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKeyCredentialRetrievalResult methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_get_Credential(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult* This,__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredential **value) {
    return This->lpVtbl->get_Credential(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_get_Status(__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult* This,__x_ABI_CWindows_CSecurity_CCredentials_CKeyCredentialStatus *value) {
    return This->lpVtbl->get_Status(This,value);
}
#endif
#ifdef WIDL_using_Windows_Security_Credentials
#define IID_IKeyCredentialRetrievalResult IID___x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult
#define IKeyCredentialRetrievalResultVtbl __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResultVtbl
#define IKeyCredentialRetrievalResult __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult
#define IKeyCredentialRetrievalResult_QueryInterface __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_QueryInterface
#define IKeyCredentialRetrievalResult_AddRef __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_AddRef
#define IKeyCredentialRetrievalResult_Release __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_Release
#define IKeyCredentialRetrievalResult_GetIids __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_GetIids
#define IKeyCredentialRetrievalResult_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_GetRuntimeClassName
#define IKeyCredentialRetrievalResult_GetTrustLevel __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_GetTrustLevel
#define IKeyCredentialRetrievalResult_get_Credential __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_get_Credential
#define IKeyCredentialRetrievalResult_get_Status __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_get_Status
#endif /* WIDL_using_Windows_Security_Credentials */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Security.Credentials.KeyCredential
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Security_Credentials_KeyCredential_DEFINED
#define RUNTIMECLASS_Windows_Security_Credentials_KeyCredential_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredential[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','K','e','y','C','r','e','d','e','n','t','i','a','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredential[] = L"Windows.Security.Credentials.KeyCredential";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredential[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','K','e','y','C','r','e','d','e','n','t','i','a','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_Security_Credentials_KeyCredential_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Security.Credentials.KeyCredentialAttestationResult
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialAttestationResult_DEFINED
#define RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialAttestationResult_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialAttestationResult[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','K','e','y','C','r','e','d','e','n','t','i','a','l','A','t','t','e','s','t','a','t','i','o','n','R','e','s','u','l','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialAttestationResult[] = L"Windows.Security.Credentials.KeyCredentialAttestationResult";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialAttestationResult[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','K','e','y','C','r','e','d','e','n','t','i','a','l','A','t','t','e','s','t','a','t','i','o','n','R','e','s','u','l','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialAttestationResult_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Security.Credentials.KeyCredentialManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialManager_DEFINED
#define RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialManager[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','K','e','y','C','r','e','d','e','n','t','i','a','l','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialManager[] = L"Windows.Security.Credentials.KeyCredentialManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialManager[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','K','e','y','C','r','e','d','e','n','t','i','a','l','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Security.Credentials.KeyCredentialOperationResult
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialOperationResult_DEFINED
#define RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialOperationResult_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialOperationResult[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','K','e','y','C','r','e','d','e','n','t','i','a','l','O','p','e','r','a','t','i','o','n','R','e','s','u','l','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialOperationResult[] = L"Windows.Security.Credentials.KeyCredentialOperationResult";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialOperationResult[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','K','e','y','C','r','e','d','e','n','t','i','a','l','O','p','e','r','a','t','i','o','n','R','e','s','u','l','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialOperationResult_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Security.Credentials.KeyCredentialRetrievalResult
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialRetrievalResult_DEFINED
#define RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialRetrievalResult_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialRetrievalResult[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','K','e','y','C','r','e','d','e','n','t','i','a','l','R','e','t','r','i','e','v','a','l','R','e','s','u','l','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialRetrievalResult[] = L"Windows.Security.Credentials.KeyCredentialRetrievalResult";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_KeyCredentialRetrievalResult[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','K','e','y','C','r','e','d','e','n','t','i','a','l','R','e','t','r','i','e','v','a','l','R','e','s','u','l','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Security_Credentials_KeyCredentialRetrievalResult_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult, 0x2c16e103, 0xf783, 0x5dd9, 0xa5,0xf3, 0x33,0x62,0xbc,0xbd,0xaa,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("2c16e103-f783-5dd9-a5f3-3362bcbdaabd")
            IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult*, ABI::Windows::Security::Credentials::IKeyCredentialAttestationResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult, 0x2c16e103, 0xf783, 0x5dd9, 0xa5,0xf3, 0x33,0x62,0xbc,0xbd,0xaa,0xbd)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *This,
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResultVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_Release(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This,__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_KeyCredentialAttestationResult IID___FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult
#define IAsyncOperationCompletedHandler_KeyCredentialAttestationResultVtbl __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResultVtbl
#define IAsyncOperationCompletedHandler_KeyCredentialAttestationResult __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult
#define IAsyncOperationCompletedHandler_KeyCredentialAttestationResult_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_QueryInterface
#define IAsyncOperationCompletedHandler_KeyCredentialAttestationResult_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_AddRef
#define IAsyncOperationCompletedHandler_KeyCredentialAttestationResult_Release __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_Release
#define IAsyncOperationCompletedHandler_KeyCredentialAttestationResult_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult, 0x39b4609a, 0x0202, 0x55fa, 0x80,0x05, 0x6f,0x83,0x70,0x9e,0x20,0xf3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("39b4609a-0202-55fa-8005-6f83709e20f3")
            IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Security::Credentials::KeyCredentialOperationResult*, ABI::Windows::Security::Credentials::IKeyCredentialOperationResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult, 0x39b4609a, 0x0202, 0x55fa, 0x80,0x05, 0x6f,0x83,0x70,0x9e,0x20,0xf3)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *This,
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResultVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_Release(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This,__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_KeyCredentialOperationResult IID___FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult
#define IAsyncOperationCompletedHandler_KeyCredentialOperationResultVtbl __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResultVtbl
#define IAsyncOperationCompletedHandler_KeyCredentialOperationResult __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult
#define IAsyncOperationCompletedHandler_KeyCredentialOperationResult_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_QueryInterface
#define IAsyncOperationCompletedHandler_KeyCredentialOperationResult_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_AddRef
#define IAsyncOperationCompletedHandler_KeyCredentialOperationResult_Release __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_Release
#define IAsyncOperationCompletedHandler_KeyCredentialOperationResult_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult, 0x03ea60b1, 0xa874, 0x58ce, 0x8e,0x8e, 0xff,0xf4,0x48,0xb6,0x73,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("03ea60b1-a874-58ce-8e8e-fff448b6733e")
            IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult*, ABI::Windows::Security::Credentials::IKeyCredentialRetrievalResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult, 0x03ea60b1, 0xa874, 0x58ce, 0x8e,0x8e, 0xff,0xf4,0x48,0xb6,0x73,0x3e)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *This,
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResultVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_Release(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This,__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_KeyCredentialRetrievalResult IID___FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult
#define IAsyncOperationCompletedHandler_KeyCredentialRetrievalResultVtbl __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResultVtbl
#define IAsyncOperationCompletedHandler_KeyCredentialRetrievalResult __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult
#define IAsyncOperationCompletedHandler_KeyCredentialRetrievalResult_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_QueryInterface
#define IAsyncOperationCompletedHandler_KeyCredentialRetrievalResult_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_AddRef
#define IAsyncOperationCompletedHandler_KeyCredentialRetrievalResult_Release __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_Release
#define IAsyncOperationCompletedHandler_KeyCredentialRetrievalResult_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult, 0xb83d29e9, 0xf4e4, 0x5aa4, 0x92,0xd5, 0xb2,0x62,0xcb,0x40,0xc6,0x22);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b83d29e9-f4e4-5aa4-92d5-b262cb40c622")
            IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult*, ABI::Windows::Security::Credentials::IKeyCredentialAttestationResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult, 0xb83d29e9, 0xf4e4, 0x5aa4, 0x92,0xd5, 0xb2,0x62,0xcb,0x40,0xc6,0x22)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *This,
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResultVtbl;

interface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult {
    CONST_VTBL __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > methods ***/
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_QueryInterface(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_AddRef(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_Release(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetIids(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetTrustLevel(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialAttestationResult* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_put_Completed(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_get_Completed(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetResults(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult* This,__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialAttestationResult **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_KeyCredentialAttestationResult IID___FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult
#define IAsyncOperation_KeyCredentialAttestationResultVtbl __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResultVtbl
#define IAsyncOperation_KeyCredentialAttestationResult __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult
#define IAsyncOperation_KeyCredentialAttestationResult_QueryInterface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_QueryInterface
#define IAsyncOperation_KeyCredentialAttestationResult_AddRef __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_AddRef
#define IAsyncOperation_KeyCredentialAttestationResult_Release __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_Release
#define IAsyncOperation_KeyCredentialAttestationResult_GetIids __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetIids
#define IAsyncOperation_KeyCredentialAttestationResult_GetRuntimeClassName __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetRuntimeClassName
#define IAsyncOperation_KeyCredentialAttestationResult_GetTrustLevel __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetTrustLevel
#define IAsyncOperation_KeyCredentialAttestationResult_put_Completed __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_put_Completed
#define IAsyncOperation_KeyCredentialAttestationResult_get_Completed __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_get_Completed
#define IAsyncOperation_KeyCredentialAttestationResult_GetResults __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialAttestationResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult, 0x6576e5b3, 0x9535, 0x50d6, 0x98,0xf6, 0xc6,0x7d,0x6a,0xac,0xa2,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("6576e5b3-9535-50d6-98f6-c67d6aaca2c5")
            IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Security::Credentials::KeyCredentialOperationResult*, ABI::Windows::Security::Credentials::IKeyCredentialOperationResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult, 0x6576e5b3, 0x9535, 0x50d6, 0x98,0xf6, 0xc6,0x7d,0x6a,0xac,0xa2,0xc5)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *This,
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResultVtbl;

interface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult {
    CONST_VTBL __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > methods ***/
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_QueryInterface(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_AddRef(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_Release(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetIids(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetTrustLevel(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialOperationResult* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_put_Completed(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_get_Completed(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetResults(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult* This,__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialOperationResult **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_KeyCredentialOperationResult IID___FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult
#define IAsyncOperation_KeyCredentialOperationResultVtbl __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResultVtbl
#define IAsyncOperation_KeyCredentialOperationResult __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult
#define IAsyncOperation_KeyCredentialOperationResult_QueryInterface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_QueryInterface
#define IAsyncOperation_KeyCredentialOperationResult_AddRef __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_AddRef
#define IAsyncOperation_KeyCredentialOperationResult_Release __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_Release
#define IAsyncOperation_KeyCredentialOperationResult_GetIids __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetIids
#define IAsyncOperation_KeyCredentialOperationResult_GetRuntimeClassName __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetRuntimeClassName
#define IAsyncOperation_KeyCredentialOperationResult_GetTrustLevel __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetTrustLevel
#define IAsyncOperation_KeyCredentialOperationResult_put_Completed __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_put_Completed
#define IAsyncOperation_KeyCredentialOperationResult_get_Completed __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_get_Completed
#define IAsyncOperation_KeyCredentialOperationResult_GetResults __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialOperationResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult, 0x89d0ad1e, 0xbd4c, 0x55b4, 0x81,0x0e, 0xbd,0xdd,0x4c,0xec,0x7a,0x2a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("89d0ad1e-bd4c-55b4-810e-bddd4cec7a2a")
            IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult*, ABI::Windows::Security::Credentials::IKeyCredentialRetrievalResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult, 0x89d0ad1e, 0xbd4c, 0x55b4, 0x81,0x0e, 0xbd,0xdd,0x4c,0xec,0x7a,0x2a)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *This,
        __x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResultVtbl;

interface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult {
    CONST_VTBL __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > methods ***/
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_QueryInterface(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_AddRef(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_Release(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetIids(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetTrustLevel(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Security::Credentials::KeyCredentialRetrievalResult* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_put_Completed(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_get_Completed(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetResults(__FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult* This,__x_ABI_CWindows_CSecurity_CCredentials_CIKeyCredentialRetrievalResult **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_KeyCredentialRetrievalResult IID___FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult
#define IAsyncOperation_KeyCredentialRetrievalResultVtbl __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResultVtbl
#define IAsyncOperation_KeyCredentialRetrievalResult __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult
#define IAsyncOperation_KeyCredentialRetrievalResult_QueryInterface __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_QueryInterface
#define IAsyncOperation_KeyCredentialRetrievalResult_AddRef __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_AddRef
#define IAsyncOperation_KeyCredentialRetrievalResult_Release __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_Release
#define IAsyncOperation_KeyCredentialRetrievalResult_GetIids __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetIids
#define IAsyncOperation_KeyCredentialRetrievalResult_GetRuntimeClassName __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetRuntimeClassName
#define IAsyncOperation_KeyCredentialRetrievalResult_GetTrustLevel __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetTrustLevel
#define IAsyncOperation_KeyCredentialRetrievalResult_put_Completed __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_put_Completed
#define IAsyncOperation_KeyCredentialRetrievalResult_get_Completed __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_get_Completed
#define IAsyncOperation_KeyCredentialRetrievalResult_GetResults __FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CSecurity__CCredentials__CKeyCredentialRetrievalResult_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_security_credentials_h__ */
