ホーム › Devices.BiometricFramework › PIBIO_ENGINE_CHECK_FOR_DUPLICATE_FN
PIBIO_ENGINE_CHECK_FOR_DUPLICATE_FN
コールバックシグネチャ
HRESULT PIBIO_ENGINE_CHECK_FOR_DUPLICATE_FN(
WINBIO_PIPELINE* Pipeline,
WINBIO_IDENTITY* Identity,
BYTE* SubFactor,
BOOLEAN* Duplicate
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| Pipeline | WINBIO_PIPELINE* | 操作を実行しているバイオメトリック ユニットに関連付けられた WINBIO_PIPELINE 構造体へのポインター。 |
| Identity | WINBIO_IDENTITY* | データベースに格納されている重複テンプレートの GUID または SID を受け取る WINBIO_IDENTITY 構造体へのポインター。 |
| SubFactor | BYTE* | データベース内の重複テンプレートに関連付けられたサブファクターを受け取る WINBIO_BIOMETRIC_SUBTYPE 変数へのポインター。 |
| Duplicate | BOOLEAN* | 一致するテンプレートがデータベース内で見つかったかどうかを示すブール値へのポインター。 |
公式ドキュメント
パイプライン内の新しいテンプレートが、テンプレートに関連付けられた識別情報にかかわらず、データベースに既に保存されているテンプレートと重複するかどうかを判断するために、Windows Biometric Framework から呼び出されます。
戻り値
| 戻り値 | 説明 |
|---|---|
| 必須のポインター パラメーターが NULL です。 | |
| パイプラインのエンジン コンテキストに登録テンプレートがありません。 |
解説(Remarks)
Windows Biometric Framework は、バイオメトリック ユニットのデータベースに新しい登録テンプレートをコミットする前に、この関数を呼び出します。この関数の目的は、エンジン アダプターの照合空間で衝突が起こるのを防ぐことです。衝突は誤検知の一致を招くおそれがあります。
この関数では、ストレージ アダプターを使用して内容ベースのクエリを実行し、テンプレートがデータベース内の既存のテンプレートと一致するかどうかを判断する必要があります。
このメソッドがデータベース内で重複するテンプレートを見つけた場合は、一致したテンプレートの Identity と SubFactor の値を返し、Duplicate パラメーターを TRUE に設定して、HRESULT 値 S_OK を返す必要があります。
このメソッドがデータベース内で一致するテンプレートを見つけられなかった場合は、Duplicate パラメーターを FALSE に設定したうえで、HRESULT 値 S_OK を返す必要があります。
例
次の擬似コードは、この関数の実装例の 1 つを示しています。この例はそのままではコンパイルできません。目的に合わせて調整してください。
//////////////////////////////////////////////////////////////////////////////////////////
//
// EngineAdapterCheckForDuplicate
//
// Purpose:
// Determines whether a new template in the pipeline duplicates any
// template already saved in the database regardless of the identity
// associated with the templates.
//
// Parameters:
// Pipeline - Pointer to a WINBIO_PIPELINE structure associated
// with the biometric unit performing the operation
// Identity - GUID or SID of the duplicate template stored in the
// database
// SubFactor - sub-factor associated with the duplicate template in
// the database
// Duplicate - Boolean value that specifies whether a matching template
// was found in the database
//
static HRESULT
WINAPI
EngineAdapterCheckForDuplicate(
__inout PWINBIO_PIPELINE Pipeline,
__out PWINBIO_IDENTITY Identity,
__out PWINBIO_BIOMETRIC_SUBTYPE SubFactor,
__out PBOOLEAN Duplicate
)
{
HRESULT hr = S_OK;
WINBIO_REJECT_DETAIL rejectDetail = 0;
SIZE_T recordCount = 0;
SIZE_T index = 0;
WINBIO_STORAGE_RECORD thisRecord;
BOOLEAN match = FALSE;
DWORD indexVector[NUMBER_OF_TEMPLATE_BINS] = {0};
// Verify that pointer arguments are not NULL.
if (!ARGUMENT_PRESENT(Pipeline) ||
!ARGUMENT_PRESENT(Identity) ||
!ARGUMENT_PRESENT(SubFactor) ||
!ARGUMENT_PRESENT(Duplicate))
{
hr = E_POINTER;
goto cleanup;
}
// Retrieve the context from the pipeline.
PWINBIO_ENGINE_CONTEXT context =
(PWINBIO_ENGINE_CONTEXT)Pipeline->EngineContext;
// Return if an enrollment is not in progress. This example assumes that
// an enrollment object is part of your engine context structure.
if (context->Enrollment.InProgress != TRUE)
{
hr = WINBIO_E_INVALID_DEVICE_STATE;
goto cleanup;
}
// Zero the memory pointed to by the Identity argument and set the
// pointer to NULL.
ZeroMemory( Identity, sizeof(WINBIO_IDENTITY));
Identity->Type = WINBIO_ID_TYPE_NULL;
// Eliminate sub-factor information.
*SubFactor = WINBIO_SUBTYPE_NO_INFORMATION;
// Initialize the Boolean Duplicate argument to FALSE.
*Duplicate = FALSE;
// If your adapter supports index vectors to place templates into buckets,
// call a custom function (_AdapterCreateIndexVector) to create an index
// vector from the template data in the feature set. In this example, the
// engine adapter context attached to the pipeline contains an Enrollment
// member that references the current template. Your implementation may
// differ.
hr = _AdapterCreateIndexVector(
context,
context->Enrollment.Template,
context->Enrollment.TemplateSize,
indexVector,
NUMBER_OF_TEMPLATE_BINS,
&rejectDetail
);
if (FAILED(hr))
{
goto cleanup;
}
// Retrieve the records in the index vector. If your adapter does not support
// index vectors (the vector length is zero), calling the WbioStorageQueryByContent
// function will retrieve all records.
// WbioStorageQueryByContent is a wrapper function in the Winbio_adapter.h
// header file.
hr = WbioStorageQueryByContent(
Pipeline,
WINBIO_SUBTYPE_ANY,
indexVector,
NUMBER_OF_TEMPLATE_BINS
);
if (FAILED(hr))
{
goto cleanup;
}
// Determine the size of the result set. WbioStorageGetRecordCount is a wrapper
// function in the Winbio_adapter.h header file.
hr = WbioStorageGetRecordCount( Pipeline, &recordCount);
if (FAILED(hr))
{
goto cleanup;
}
// Point the result set cursor at the first record. WbioStorageFirstRecord
// is a wrapper function in the Winbio_adapter.h header file.
hr = WbioStorageFirstRecord( Pipeline );
if (FAILED(hr))
{
goto cleanup;
}
// Iterate through all records in the result set and determine which record
// matches the current feature set. WbioStorageGetCurrentRecord is a wrapper
// function in the Winbio_adapter.h header file.
for (index = 0; index < recordCount; ++index)
{
hr = WbioStorageGetCurrentRecord( Pipeline, &thisRecord );
if (FAILED(hr))
{
goto cleanup;
}
// Call a custom function (_AdapterCompareTemplateToCurrentFeatureSet) to
// compare the feature set attached to the pipeline with the template
// retrieved from storage.
// If the template and feature set match, return S_OK and set the match
// argument to TRUE. If the template and feature set do not match, return
// S_OK and set the match argument to FALSE. If the function fails for some
// other reason, return a failure HRESULT.
hr = _AdapterCompareTemplateToEnrollmentTemplate(
context,
context->Enrollment.Template,
context->Enrollment.TemplateSize,
thisRecord.TemplateBlob,
thisRecord.TemplateBlobSize,
&match
);
if (FAILED(hr))
{
goto cleanup;
}
if (match)
{
break;
}
// Retrieve the next record.
hr = WbioStorageNextRecord( Pipeline );
if (FAILED(hr))
{
if (hr == WINBIO_E_DATABASE_NO_MORE_RECORDS)
{
hr = S_OK;
break;
}
else
{
goto cleanup;
}
}
}
// If there is a duplicate template in the database, return information about
// it to the caller.
if (match)
{
CopyMemory( Identity, thisRecord.Identity, sizeof(WINBIO_IDENTITY));
*SubFactor = thisRecord.SubFactor;
*Duplicate = TRUE;
hr = S_OK;
}
cleanup:
// There are no duplicates. This is an acceptable result.
if (hr == WINBIO_E_DATABASE_NO_RESULTS)
{
hr = S_OK;
}
return hr;
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)