【WBF】アダプタープラグインの作成

# アダプタープラグインとは？
Windows Biometric Framework(以下WBF)では、下記の3種類の"アダプタープラグイン"と呼ばれるDLLを用いて生体認証を行います。

- センサーアダプター(主に生体認証デバイスの制御)
- エンジンアダプター(主にセンサーがキャプチャしたデータを用いた生体認証処理)
- ストレージアダプター(主に生体データの管理)

生体認証デバイスのドライバーをインストールすると、必ず上記の3つのアダプターもインストールされますが、プライベートプールを設定する事により、独自のアダプターに差し替えて使用する事も可能です。

これらのアダプタープラグインはデジタル署名されている必要があるのですが、正式な証明書を持っておらずテスト証明書を使用する場合は、下記を参考に開発環境・実行環境の準備を行ってください。
参考：https://qiita.com/Leeya/items/270ed54335fd0b6d9a7c

ここでは参考として、ストレージアダプターを差し替えてみようと思います。

# ストレージアダプターの作成
(1) VisualStudio2019を起動し、[新しいプロジェクトの作成]を選択します。
![新しいプロジェクトの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/03b5e3c5-a2a8-084f-727e-b024d0813456.png)

(2) [ダイナミック リンク ライブラリ(DLL)]を選択して、[次へ]を押します。
![ダイナミックリンクライブラリを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/f38fb39d-519a-593a-15c8-62a989cde129.png)

(3) [プロジェクト名]等を設定し、[作成]を押します。ここでは"MyStorageAdapter"とします。
![プロジェクト名の設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/62d176a0-0914-1834-37c4-b727d6044f4a.png)

※ 開発環境と実行環境が異なる場合は、プロジェクトのプロパティを開き、[構成プロパティ]→[C/C++]→[コード生成]の[ランタイムライブラリ]を[マルチスレッド]に変更します(Debugの場合は[マルチスレッド デバッグ])。
![プロパティ_マルチスレッド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/8264640c-e6d5-e0d3-b73a-71aa285300af.png)

※ テスト証明書を使用する場合は、プロジェクトのプロパティを開き、[構成プロパティ]→[リンカー]→[コマンドライン]の[追加のオプション]に[/integritycheck]を追加します。
![integritycheck.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/46582e43-ce88-e090-67f5-fe97c6fa60e6.png)

(4) "pch.h"(でなくても良いけど、winbio_adapter.hをインクルードするより前)に下記のコードを追加します。

```C++:pch.h
#ifndef PCH_H
#define PCH_H

// プリコンパイルするヘッダーをここに追加します
#include "framework.h"

// ↓ ここから追加 ↓
#ifndef ARGUMENT_PRESENT
#define ARGUMENT_PRESENT(x) (((x) != NULL))
#endif
// ↑ ここまで追加 ↑

#endif //PCH_H
```

(5) "dllmain.cpp"を下記のサイトのサンプルコードに書き換えます。
https://docs.microsoft.com/en-us/windows/win32/secbiomet/creating-a-storage-adapter

ただし冒頭のコメントは先頭の"/"が抜けているので、追加するかコメント自体を削除してください。
またインクルードするファイルは、下記の2つに変更しました。

```C++:dllmain.cpp
/////////////////////////////////////////////////////////////////////////////////////////
//
// Header files.
//
#include "pch.h"
#include "Winbio_adapter.h"
```

(6) ソリューションエクスプローラーのプロジェクト名を右クリックし、[追加]→[新しい項目]から[モジュール定義ファイル]を追加します。ここではファイル名を"MyStorageAdapter.def"とします。
![新しい項目の追加_モジュール定義ファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/7288bdb8-c393-a060-1f41-7fd96acf4c59.png)

(7) モジュール定義ファイルを使用して、"WbioQueryStorageInterface"関数をエクスポートします。

```C++:MyStorageAdapter.def
LIBRARY
EXPORTS
   WbioQueryStorageInterface @1
```

(8) プロジェクトのプロパティを開き、[構成プロパティ]→[ビルドイベント]→[ビルド後のイベント]の[コマンドライン]に、ビルドしたDLLに署名が行われるようコマンドを設定します。
![ビルド後のイベント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/30497cae-adec-e5f3-2a96-50b1761ee40c.png)

下記はテスト証明書を使用する場合のコマンド例です。
`signtool sign /v /ph /s PrivateCertStore /n Contoso.com(Test) /t http://timestamp.verisign.com/scripts/timestamp.dll  "$(OutDir)$(TargetName)$(TargetExt)"`

# ストレージアダプターの差替
(1) ビルドしたDLLを実行環境の下記のフォルダに置きます。
`C:\Windows\System32\WinBioPlugIns`

(2) プライベートプールを作成します。
参考：https://qiita.com/Leeya/items/d80fdbd4f6ed391f0407

(3) プライベートプールの"StorageAdapterBinary"の値を"MyStorageAdapter.dll"に変更します。
![プライベートプール設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/9af674a4-36a2-aebc-0fe1-173d8d5d1f3e.png)

(4) [Windows Biometric Service]サービスを再起動する事で、(3)で設定した構成情報が反映されます。
![サービス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/1741f18c-86bc-8a42-e44d-7778b30dffb0.png)

これでプライベートプールを使用した指紋認証時に、自作のストレージアダプターが読み込まれるようになりました。
プライベートプールを使用した指紋認証の実装については下記を参考にしてください。
https://docs.microsoft.com/en-us/windows/win32/secbiomet/private-pool-identity