PIBIO_STORAGE_GET_CURRENT_RECORD_FN Rückruffunktion (winbio_adapter.h)
Wird vom Windows Biometric Framework oder von einem Moduladapter aufgerufen, um den Inhalt des aktuellen Datensatzes im Pipelineergebnissatz abzurufen.
Syntax
PIBIO_STORAGE_GET_CURRENT_RECORD_FN PibioStorageGetCurrentRecordFn;
HRESULT PibioStorageGetCurrentRecordFn(
[in, out] PWINBIO_PIPELINE Pipeline,
[out] PWINBIO_STORAGE_RECORD RecordContents
)
{...}
Parameter
[in, out] Pipeline
Zeiger auf die WINBIO_PIPELINE Struktur, die der biometrischen Einheit zugeordnet ist, die den Vorgang ausführt.
[out] RecordContents
Zeiger auf eine WINBIO_STORAGE_RECORD Struktur, die den Inhalt des Datensatzes empfängt.
Rückgabewert
Wenn die Funktion erfolgreich ist, gibt sie S_OK zurück. Wenn die Funktion fehlschlägt, muss sie einen der folgenden HRESULT-Werte zurückgeben, um den Fehler anzugeben.
Rückgabecode | Beschreibung |
---|---|
|
Arbeitsspeicher konnte nicht für den Datensatz zugewiesen werden. |
|
Ein obligatorisches Zeigerargument ist NULL. |
|
Es sind keine Datensätze im Resultset vorhanden. |
|
Das StorageContext-Element des Pipelineobjekts ist NULL , oder das FileHandle-Element ist ungültig. |
Hinweise
Alle Adressen, die von dieser Funktion in der WINBIO_STORAGE_RECORD-Struktur zurückgegeben werden, müssen gültig bleiben, bis eine der folgenden Funktionen aufgerufen wird:
- StorageAdapterFirstRecord
- StorageAdapterNextRecord
- StorageAdapterQueryByContent
- StorageAdapterQueryBySubject
- StorageAdapterClearContext
Beispiele
Der folgende Pseudocode zeigt eine mögliche Implementierung dieser Funktion. Das Beispiel wird nicht kompiliert. Sie müssen es an Ihren Zweck anpassen.
/////////////////////////////////////////////////////////////////////////////////////////
//
// 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;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 7 [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2008 R2 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | winbio_adapter.h (einschließlich Winbio_adapter.h) |
Weitere Informationen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für