PIBIO_STORAGE_GET_CURRENT_RECORD_FN回调函数 (winbio_adapter.h)
由 Windows 生物识别框架或引擎适配器调用,以检索管道结果集中当前记录的内容。
语法
PIBIO_STORAGE_GET_CURRENT_RECORD_FN PibioStorageGetCurrentRecordFn;
HRESULT PibioStorageGetCurrentRecordFn(
[in, out] PWINBIO_PIPELINE Pipeline,
[out] PWINBIO_STORAGE_RECORD RecordContents
)
{...}
参数
[in, out] Pipeline
指向与执行操作的生物识别单元关联的 WINBIO_PIPELINE 结构的指针。
[out] RecordContents
指向将接收记录内容的 WINBIO_STORAGE_RECORD 结构的指针。
返回值
如果函数成功,则返回S_OK。 如果函数失败,则必须返回以下 HRESULT 值之一来指示错误。
返回代码 | 说明 |
---|---|
|
无法为记录分配内存。 |
|
强制指针参数为 NULL。 |
|
结果集中没有记录。 |
|
管道对象的 StorageContext 成员为 NULL 或 FileHandle 成员无效。 |
注解
在调用以下函数之一之前,此函数在 WINBIO_STORAGE_RECORD 结构中返回的任何地址必须保持有效:
- StorageAdapterFirstRecord
- StorageAdapterNextRecord
- StorageAdapterQueryByContent
- StorageAdapterQueryBySubject
- StorageAdapterClearContext
示例
以下伪代码显示了此函数的一种可能实现。 该示例不编译。 必须根据自己的目的调整它。
/////////////////////////////////////////////////////////////////////////////////////////
//
// StorageAdapterGetCurrentRecord
//
// Purpose:
// Retrieves the contents of the current record in the pipeline result set.
//
// Parameters:
// Pipeline - Pointer to a WINBIO_PIPELINE structure associated with
// the biometric unit performing the operation.
// RecordContents - Pointer to a WINBIO_STORAGE_RECORD structure that will receive
// the contents of the record.
//
static HRESULT
WINAPI
StorageAdapterGetCurrentRecord(
__inout PWINBIO_PIPELINE Pipeline,
__out PWINBIO_STORAGE_RECORD RecordContents
)
{
HRESULT hr = S_OK;
struct _MY_ADAPTER_RECORD_HEADER *recordHeader = NULL;
LARGE_INTEGER dataOffset = {0};
SIZE_T allocationSize = 0;
// Verify that pointer arguments are not NULL.
if (!ARGUMENT_PRESENT(Pipeline) ||
!ARGUMENT_PRESENT(RecordContents))
{
hr = E_POINTER;
goto cleanup;
}
// Retrieve the context from the pipeline.
PWINBIO_STORAGE_CONTEXT storageContext = (PWINBIO_STORAGE_CONTEXT)Pipeline->StorageContext;
// Verify the pipeline state.
if (storageContext == NULL || storageContext->FileHandle == INVALID_HANDLE_VALUE)
{
hr = WINBIO_E_INVALID_DEVICE_STATE;
goto cleanup;
}
// Call a custom function (_ResultSetGetCurrent) to retrieve the header
// contents of the current record in the result set. This function should
// also return the file offset of the template data in the record.
hr = _ResultSetGetCurrent(
&storageContext->ResultSet,
&recordHeader,
&dataOffset
);
if (FAILED(hr))
{
goto cleanup;
}
RecordContents->Identity = &recordHeader->Identity;
RecordContents->SubFactor = recordHeader->SubFactor;
RecordContents->IndexVector = _GetIndexVector(recordHeader);
RecordContents->IndexElementCount = recordHeader->IndexElementCount;
// Release any template data buffers created by previous calls to the
// StorageAdapterGetCurrentRecord function.
if (storageContext->RawRecordData != NULL)
{
_AdapterRelease(storageContext->RawRecordData);
storageContext->RawRecordData = NULL;
storageContext->PayloadBlob = NULL;
}
if (storageContext->DecryptedTemplate != NULL)
{
// You must call SecureZeroMemory to clear any memory that contains
// a plaintext version of the template data.
SecureZeroMemory(
storageContext->DecryptedTemplate,
storageContext->DecryptedTemplateSize
);
_AdapterRelease(storageContext->DecryptedTemplate);
storageContext->DecryptedTemplate = NULL;
storageContext->DecryptedTemplateSize = 0;
}
// Allocate a buffer for the template and payload portions of the record.
allocationSize =
recordHeader->EncryptedTemplateBlobSize +
recordHeader->PayloadBlobSize;
storageContext->RawRecordData = (PUCHAR)_AdapterAlloc(allocationSize);
if (storageContext->RawRecordData == NULL)
{
hr = E_OUTOFMEMORY;
goto cleanup;
}
// Call a custom function (_ReadRecordData) that reads the non-header
// portion of the record.
hr = _ReadRecordData(
Pipeline->StorageHandle,
dataOffset,
storageContext->RawRecordData,
(DWORD)allocationSize,
(PDWORD)&storageContext->RawRecordDataSize
);
if (FAILED(hr))
{
goto cleanup;
}
// Call a custom function (_DecryptTemplate) that decrypts the template
// data and stores a pointer to the plaintext version in the storage context.
hr = _DecryptTemplate(
&storageContext->CryptoContext,
storageContext->RawRecordData,
recordHeader->EncryptedTemplateBlobSize,
&storageContext->DecryptedTemplate,
&storageContext->DecryptedTemplateSize
);
if (FAILED(hr))
{
goto cleanup;
}
// Set up return values for the caller. These values will remain valid until
// the next query or get operation.
RecordContents->TemplateBlob = storageContext->DecryptedTemplate;
RecordContents->TemplateBlobSize = recordHeader->TemplateBlobSize;
if (recordHeader->PayloadBlobSize != 0)
{
RecordContents->PayloadBlob =
storageContext->RawRecordData +
recordHeader->EncryptedTemplateBlobSize;
RecordContents->PayloadBlobSize = recordHeader->PayloadBlobSize;
}
else
{
RecordContents->PayloadBlob = NULL;
RecordContents->PayloadBlobSize = 0;
}
cleanup:
if (FAILED(hr))
{
if (storageContext->RawRecordData != NULL)
{
// Because the raw record data (including the payload blob) is
// encrypted, it is not necessary to call SecureZeroMemory.
_AdapterRelease(storageContext->RawRecordData);
storageContext->RawRecordData = NULL;
storageContext->PayloadBlob = NULL;
}
if (storageContext->DecryptedTemplate != NULL)
{
// You must call SecureZeroMemory to clear the plaintext version
// of the template before releasing it.
SecureZeroMemory(
storageContext->DecryptedTemplate,
storageContext->DecryptedTemplateSize
);
_AdapterRelease(storageContext->DecryptedTemplate);
storageContext->DecryptedTemplate = NULL;
storageContext->DecryptedTemplateSize = 0;
}
}
return hr;
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 7 [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2008 R2 [仅限桌面应用] |
目标平台 | Windows |
标头 | winbio_adapter.h (包括 Winbio_adapter.h) |
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈