PIBIO_STORAGE_GET_CURRENT_RECORD_FN función de devolución de llamada (winbio_adapter.h)
Lo llama el marco biométrico de Windows o un adaptador de motor para recuperar el contenido del registro actual en el conjunto de resultados de la canalización.
Sintaxis
PIBIO_STORAGE_GET_CURRENT_RECORD_FN PibioStorageGetCurrentRecordFn;
HRESULT PibioStorageGetCurrentRecordFn(
[in, out] PWINBIO_PIPELINE Pipeline,
[out] PWINBIO_STORAGE_RECORD RecordContents
)
{...}
Parámetros
[in, out] Pipeline
Puntero a la estructura de WINBIO_PIPELINE asociada a la unidad biométrica que realiza la operación.
[out] RecordContents
Puntero a una estructura de WINBIO_STORAGE_RECORD que recibirá el contenido del registro.
Valor devuelto
Si la función se ejecuta correctamente, devuelve S_OK. Si se produce un error en la función, debe devolver uno de los siguientes valores HRESULT para indicar el error.
Código devuelto | Descripción |
---|---|
|
No se pudo asignar memoria para el registro. |
|
Un argumento de puntero obligatorio es NULL. |
|
No hay registros en el conjunto de resultados. |
|
El miembro StorageContext del objeto de canalización es NULL o el miembro FileHandle no es válido. |
Comentarios
Las direcciones devueltas por esta función en la estructura WINBIO_STORAGE_RECORD deben permanecer válidas hasta que se llame a una de las siguientes funciones:
- StorageAdapterFirstRecord
- StorageAdapterNextRecord
- StorageAdapterQueryByContent
- StorageAdapterQueryBySubject
- StorageAdapterClearContext
Ejemplos
El siguiente pseudocódigo muestra una posible implementación de esta función. El ejemplo no se compila. Debes adaptarlo para que se adapte a tu propósito.
/////////////////////////////////////////////////////////////////////////////////////////
//
// 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;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 7 [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2008 R2 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | winbio_adapter.h (incluya Winbio_adapter.h) |
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de