求助:开发集成指纹认证的Windows自定义凭据提供商
自定义Windows指纹认证凭据提供商开发求助
我正在开发一款集成指纹认证的Windows自定义凭据提供商,具体需求:
- 使用外部指纹阅读器/软件完成用户指纹身份验证
- 必须对接Windows生物指纹API(WBF)实现与操作系统的集成
我没有Windows平台及相关API的开发经验,一直未找到适配的开源示例项目,希望有Windows凭据提供商开发经验的人士提供以下三方面的指引:
- Windows生物指纹API的使用方法
- 外部指纹阅读器/软件的集成方案
- 自定义凭据提供商的整体架构设计
若能提供完整可用的开源示例或模板,将更为理想。
我曾找到过类似问题,但答案不够清晰,缺乏指导性,对新手不友好。此外,我向ChatGPT咨询得到了一段代码,但该代码仅为框架,未实现核心功能,不够完善,代码如下:
#include <credentialprovider.h> #include <windows.h> class MyCredentialProvider : public ICredentialProvider, public ICredentialProviderCredential { public: // Implement ICredentialProvider methods HRESULT STDMETHODCALLTYPE SetUsageScenario( __in CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus, __in DWORD dwFlags ) override; HRESULT STDMETHODCALLTYPE SetSerialization( __in const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs ) override; HRESULT STDMETHODCALLTYPE Advise( __in ICredentialProviderEvents* pcpe, __in UINT_PTR upAdviseContext ) override; HRESULT STDMETHODCALLTYPE UnAdvise() override; HRESULT STDMETHODCALLTYPE GetFieldDescriptorCount( __out DWORD* pdwCount ) override; HRESULT STDMETHODCALLTYPE GetFieldDescriptorAt( __in DWORD dwIndex, __deref_out CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR** ppcpfd ) override; HRESULT STDMETHODCALLTYPE GetCredentialCount( __out DWORD* pdwCount, __out DWORD* pdwDefault, __out BOOL* pbAutoLogonWithDefault ) override; HRESULT STDMETHODCALLTYPE GetCredentialAt( __in DWORD dwIndex, __out ICredentialProviderCredential** ppcpc ) override; // Implement ICredentialProviderCredential methods HRESULT STDMETHODCALLTYPE Advise( __in ICredentialProviderCredentialEvents* pcpce ) override; HRESULT STDMETHODCALLTYPE UnAdvise() override; HRESULT STDMETHODCALLTYPE SetSelected( __out BOOL* pbAutoLogon ) override; HRESULT STDMETHODCALLTYPE SetDeselected() override; HRESULT STDMETHODCALLTYPE GetFieldState( __in DWORD dwIndex, __out CREDENTIAL_PROVIDER_FIELD_STATE* pcpfs, __out CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE* pcpfis ) override; HRESULT STDMETHODCALLTYPE GetStringValue( __in DWORD dwIndex, __out LPWSTR* ppwsz ) override; HRESULT STDMETHODCALLTYPE GetBitmapValue( __in DWORD dwIndex, __out HBITMAP* phbmp ) override; HRESULT STDMETHODCALLTYPE GetCheckboxValue( __in DWORD dwIndex, __out BOOL* pbChecked, __deref_out LPWSTR* ppwszLabel ) override; HRESULT STDMETHODCALLTYPE GetSubmitButtonValue( __in DWORD dwIndex, __out DWORD* pdwAdjacentTo ) override; HRESULT STDMETHODCALLTYPE GetComboBoxValueCount( __in DWORD dwIndex, __out DWORD* pcItems, __out DWORD* pdwSelectedItem ) override; HRESULT STDMETHODCALLTYPE GetComboBoxValueAt( __in DWORD dwIndex, __in DWORD dwItem, __deref_out LPWSTR* ppwszItem ) override; HRESULT STDMETHODCALLTYPE SetStringValue( __in DWORD dwIndex, __in PCWSTR pwz ) override; private: // Add private members and methods as needed }; // Implement ICredentialProvider methods HRESULT STDMETHODCALLTYPE MyCredentialProvider::SetUsageScenario( __in CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus, __in DWORD dwFlags ) { // TODO: Implement SetUsageScenario method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::SetSerialization( __in const CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs ) { // TODO: Implement SetSerialization method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::Advise( __in ICredentialProviderEvents* pcpe, __in UINT_PTR upAdviseContext ) { // TODO: Implement Advise method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::UnAdvise() { // TODO: Implement UnAdvise method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetFieldDescriptorCount( __out DWORD* pdwCount ) { // TODO: Implement GetFieldDescriptorCount method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetFieldDescriptorAt( __in DWORD dwIndex, __deref_out CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR** ppcpfd ) { // TODO: Implement GetFieldDescriptorAt method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetCredentialCount( __out DWORD* pdwCount, __out DWORD* pdwDefault, __out BOOL* pbAutoLogonWithDefault ) { // TODO: Implement GetCredentialCount method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetCredentialAt( __in DWORD dwIndex, __out ICredentialProviderCredential** ppcpc ) { // TODO: Implement GetCredentialAt method return E_NOTIMPL; } // Implement ICredentialProviderCredential methods HRESULT STDMETHODCALLTYPE MyCredentialProvider::Advise( __in ICredentialProviderCredentialEvents* pcpce ) { // TODO: Implement Advise method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::UnAdvise() { // TODO: Implement UnAdvise method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::SetSelected( __out BOOL* pbAutoLogon ) { // TODO: Implement SetSelected method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::SetDeselected() { // TODO: Implement SetDeselected method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetFieldState( __in DWORD dwIndex, __out CREDENTIAL_PROVIDER_FIELD_STATE* pcpfs, __out CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE* pcpfis ) { // TODO: Implement GetFieldState method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetStringValue( __in DWORD dwIndex, __out LPWSTR* ppwsz ) { // TODO: Implement GetStringValue method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetBitmapValue( __in DWORD dwIndex, __out HBITMAP* phbmp ) { // TODO: Implement GetBitmapValue method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetCheckboxValue( __in DWORD dwIndex, __out BOOL* pbChecked, __deref_out LPWSTR* ppwszLabel ) { // TODO: Implement GetCheckboxValue method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetSubmitButtonValue( __in DWORD dwIndex, __out DWORD* pdwAdjacentTo ) { // TODO: Implement GetSubmitButtonValue method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetComboBoxValueCount( __in DWORD dwIndex, __out DWORD* pcItems, __out DWORD* pdwSelectedItem ) { // TODO: Implement GetComboBoxValueCount method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::GetComboBoxValueAt( __in DWORD dwIndex, __in DWORD dwItem, __deref_out LPWSTR* ppwszItem ) { // TODO: Implement GetComboBoxValueAt method return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE MyCredentialProvider::SetStringValue( __in DWORD dwIndex, __in PCWSTR pwz ) { // TODO: Implement SetStringValue method return E_NOTIMPL; }
内容的提问来源于stack exchange,提问作者Deema
相关产品推荐
相关产品推荐

