Windows Dev Center

WinBioEnrollCommit function

Finalizes a pending biometric template and saves it to the database associated with the biometric unit used for enrollment.


HRESULT WINAPI WinBioEnrollCommit(
  _In_      WINBIO_SESSION_HANDLE SessionHandle,
  _Out_opt_ WINBIO_IDENTITY       *Identity,
  _Out_opt_ BOOLEAN               *IsNewTemplate


SessionHandle [in]

A WINBIO_SESSION_HANDLE value that identifies an open biometric session. Open a synchronous session handle by calling WinBioOpenSession. Open an asynchronous session handle by calling WinBioAsyncOpenSession.

Identity [out, optional]

Pointer to a WINBIO_IDENTITY structure that receives the identifier (GUID or SID) of the template.

IsNewTemplate [out, optional]

Pointer to a Boolean value that specifies whether the template being added to the database is new.

Return value

If the function succeeds, it returns S_OK. If the function fails, it returns an HRESULT value that indicates the error. Possible values include, but are not limited to, those in the following table. For a list of common error codes, see Common HRESULT Values.

Return codeDescription

The session handle is not valid.


The pointers specified by the Identity and IsNewTemplate parameters cannot be NULL.


There is no space available in the database for the template.


The template matches one already saved in the database with a different identity or sub-factor (system pool only).


The biometric unit is in use and is locked.



If the pending template is a duplicate of one that already exists in the database, the Identity parameter will point to the existing template and the value pointed to by the IsNewTemplate parameter will be FALSE.

If the WinBioEnrollCommit function succeeds, the following registry value is set to 0x01.

Note  This registry value is never deleted by the Windows Biometric Framework (WBF).

To use WinBioEnrollCommit synchronously, call the function with a session handle created by calling WinBioOpenSession. The function blocks until the operation completes or an error is encountered.

To use WinBioEnrollCommit asynchronously, call the function with a session handle created by calling WinBioAsyncOpenSession. The framework allocates a WINBIO_ASYNC_RESULT structure and uses it to return information about operation success or failure. If the operation is successful, the framework returns WINBIO_IDENTITY information and a flag indicating whether the template is new in a nested EnrollCommit structure. If the operation is unsuccessful, the framework returns error information. The WINBIO_ASYNC_RESULT structure is returned to the application callback or to the application message queue, depending on the value you set in the NotificationMethod parameter of the WinBioAsyncOpenSession function:

  • If you choose to receive completion notices by using a callback, you must implement a PWINBIO_ASYNC_COMPLETION_CALLBACK function and set the NotificationMethod parameter to WINBIO_ASYNC_NOTIFY_CALLBACK.
  • If you choose to receive completion notices by using the application message queue, you must set the NotificationMethod parameter to WINBIO_ASYNC_NOTIFY_MESSAGE. The framework returns a WINBIO_ASYNC_RESULT pointer to the LPARAM field of the window message.

To prevent memory leaks, you must call WinBioFree to release the WINBIO_ASYNC_RESULT structure after you have finished using it.


The following function calls WinBioEnrollCommit to commit a biometric enrollment to system pool. Link to the Winbio.lib static library and include the following header files:

  • Windows.h
  • Stdio.h
  • Conio.h
  • Winbio.h

HRESULT EnrollSysPool(
                      BOOL discardEnrollment, 
                      WINBIO_BIOMETRIC_SUBTYPE subFactor)
    HRESULT hr = S_OK;
    WINBIO_IDENTITY identity = {0};
    WINBIO_UNIT_ID unitId = 0;
    WINBIO_REJECT_DETAIL rejectDetail = 0;
    BOOLEAN isNewTemplate = TRUE;

    // Connect to the system pool. 
    hr = WinBioOpenSession( 
            WINBIO_TYPE_FINGERPRINT,    // Service provider
            WINBIO_POOL_SYSTEM,         // Pool type
            WINBIO_FLAG_DEFAULT,        // Configuration and access
            NULL,                       // Array of biometric unit IDs
            0,                          // Count of biometric unit IDs
            NULL,                       // Database ID
            &sessionHandle              // [out] Session handle
    if (FAILED(hr))
        wprintf_s(L"\n WinBioOpenSession failed. ");
        wprintf_s(L"hr = 0x%x\n", hr);
        goto e_Exit;

    // Locate a sensor.
    wprintf_s(L"\n Swipe your finger on the sensor...\n");
    hr = WinBioLocateSensor( sessionHandle, &unitId);
    if (FAILED(hr))
        wprintf_s(L"\n WinBioLocateSensor failed. hr = 0x%x\n", hr);
        goto e_Exit;

    // Begin the enrollment sequence. 
    wprintf_s(L"\n Starting enrollment sequence...\n");
    hr = WinBioEnrollBegin(
            sessionHandle,      // Handle to open biometric session
            subFactor,          // Finger to create template for
            unitId              // Biometric unit ID
    if (FAILED(hr))
        wprintf_s(L"\n WinBioEnrollBegin failed. hr = 0x%x\n", hr);
        goto e_Exit;

    // Capture enrollment information by swiping the sensor with
    // the finger identified by the subFactor argument in the 
    // WinBioEnrollBegin function.
    for (int swipeCount = 1;; ++swipeCount)
        wprintf_s(L"\n Swipe the sensor to capture %s sample.",
                 (swipeCount == 1)?L"the first":L"another");

        hr = WinBioEnrollCapture(
                sessionHandle,  // Handle to open biometric session
                &rejectDetail   // [out] Failure information

        wprintf_s(L"\n Sample %d captured from unit number %d.", 

        if (hr == WINBIO_I_MORE_DATA)
            wprintf_s(L"\n    More data required.\n");
        if (FAILED(hr))
            if (hr == WINBIO_E_BAD_CAPTURE)
                wprintf_s(L"\n  Error: Bad capture; reason: %d", 
                wprintf_s(L"\n WinBioEnrollCapture failed. hr = 0x%x", hr);
                goto e_Exit;
            wprintf_s(L"\n    Template completed.\n");

    // Discard the enrollment if the appropriate flag is set.
    // Commit the enrollment if it is not discarded.
    if (discardEnrollment == TRUE)
        wprintf_s(L"\n Discarding enrollment...\n\n");
        hr = WinBioEnrollDiscard( sessionHandle );
        if (FAILED(hr))
            wprintf_s(L"\n WinBioLocateSensor failed. hr = 0x%x\n", hr);
        goto e_Exit;    
        wprintf_s(L"\n Committing enrollment...\n");
        hr = WinBioEnrollCommit( 
                sessionHandle,      // Handle to open biometric session
                &identity,          // WINBIO_IDENTITY object for the user
                &isNewTemplate);    // Is this a new template

        if (FAILED(hr))
            wprintf_s(L"\n WinBioEnrollCommit failed. hr = 0x%x\n", hr);
            goto e_Exit;

    if (sessionHandle != NULL)
        sessionHandle = NULL;

    wprintf_s(L" Press any key to continue...");

    return hr;


Minimum supported client

Windows 7 [desktop apps only]

Minimum supported server

Windows Server 2008 R2 [desktop apps only]


Winbio.h (include Winbio.h)





See also




Community Additions

© 2015 Microsoft