PIBIO_ENGINE_CHECK_FOR_DUPLICATE_FN コールバック関数 (winbio_adapter.h)
Windows 生体認証フレームワークによって呼び出され、テンプレートに関連付けられている ID に関係なく、パイプライン内の新しいテンプレートがデータベースに既に保存されているテンプレートと重複しているかどうかを判断します。
構文
PIBIO_ENGINE_CHECK_FOR_DUPLICATE_FN PibioEngineCheckForDuplicateFn;
HRESULT PibioEngineCheckForDuplicateFn(
[in, out] PWINBIO_PIPELINE Pipeline,
[out] PWINBIO_IDENTITY Identity,
[out] PWINBIO_BIOMETRIC_SUBTYPE SubFactor,
[out] PBOOLEAN Duplicate
)
{...}
パラメーター
[in, out] Pipeline
操作を実行する生体認証ユニットに関連付けられている WINBIO_PIPELINE 構造体へのポインター。
[out] Identity
データベースに格納されている重複するテンプレートの GUID または SID を受け取る WINBIO_IDENTITY構造体への ポインター。
[out] SubFactor
データベース 内の 重複するテンプレートに関連付けられているサブ要素を受け取るWINBIO_BIOMETRIC_SUBTYPE変数へのポインター。
[out] Duplicate
一致するテンプレートがデータベースで見つかったかどうかを指定するブール値へのポインター。
戻り値
リターン コード | 説明 |
---|---|
|
必須ポインター パラメーターは NULL です。 |
|
パイプライン エンジン コンテキストに登録テンプレートはありません。 |
注釈
Windows 生体認証フレームワークは、生体認証ユニットのデータベースに新しい登録テンプレートをコミットする前に、この関数を呼び出します。 この関数の目的は、エンジン アダプターの一致する領域での競合を防ぐことです。 衝突すると、誤検知の一致が発生する可能性があります。
この関数は、ストレージ アダプターを使用してコンテンツ ベースのクエリを実行し、テンプレートがデータベースに既に存在するテンプレートと一致するかどうかを判断する必要があります。
このメソッドがデータベース内で重複するテンプレートを検出した場合は、一致するテンプレートの 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;
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 7 [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows Server 2008 R2 [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | winbio_adapter.h (Winbio_adapter.h を含む) |