Ejemplo n.º 1
0
BioAPI_RETURN BioAPI MDSU_Init( MDSU_CONTEXT *pContext,
							   const BioAPI_MEMORY_FUNCS *pMemFuncs,
							   const BioAPI_UUID *pUuid,
							   const char *szDirectoryName,
							   CSSM_DB_ACCESS_TYPE AccessType,
							   uint32 CommitSize )
{
	BioAPI_RETURN rv = CSSM_OK;

	/* Parameter check */
	if ( ( pContext == NULL ) ||
		 ( pMemFuncs == NULL ) ||
		 ( szDirectoryName == NULL ) )
	{
		rv = CSSMERR_CSSM_INVALID_POINTER;
	}
	else
	{
		/* Set the default access value if one is not specified */
		if ( AccessType == 0 )
		{
			AccessType = CSSM_DB_ACCESS_READ;
		}

		/* Wipe the context clean */
		memset( pContext, 0, sizeof(MDSU_CONTEXT) );

		/* Set the memory functions */
		pContext->MemFuncs = *pMemFuncs;

		/* Attempt to initialize the MDS and get an MDS handle */
		if ( ( rv = MDS_Initialize( pUuid,
									NULL,
									&pContext->MemFuncs,
									&s_MDSUFuncs,
									&pContext->hMds ) ) == CSSM_OK )
		{
			/* Open the requested MDS directory */
			 if ( ( rv = s_MDSUFuncs.DbOpen( pContext->hMds,
											 szDirectoryName,
											 NULL,
											 AccessType,
											 NULL,
											 NULL,
											 &pContext->hDb.DBHandle ) ) == CSSM_OK )
			 {
				 pContext->hDb.DLHandle = pContext->hMds;

				/* Copy the proper values into the MDSU context */
				if ( pUuid != NULL )
				{
					BioAPI_CopyUuid (&pContext->ModuleUuid, pUuid);
				}
				else
				{
					BioAPI_ClearUuid (&pContext->ModuleUuid);
				}

				/* Allocate the commit cache */
				pContext->pCommitCache =
							MDSU_calloc( pContext,
										 sizeof(CSSM_DB_UNIQUE_RECORD_PTR),
										 CommitSize );
				pContext->CommitSize = CommitSize;
				pContext->CacheCount = 0;

				/* Close the database if there is an error condition */
				if ( rv != CSSM_OK )
				{
					s_MDSUFuncs.DbClose( pContext->hDb );
				}
			 }

			 /* Terminate the MDS in an error condition */
			 if ( rv != CSSM_OK )
			 {
				 MDS_Terminate( pContext->hMds );
				 memset( pContext, 0, sizeof(MDSU_CONTEXT) );
			 }
		} /* MDS_Initialize */
	} /* Validation */

	return rv;
}
Ejemplo n.º 2
0
BioAPI_RETURN BioAPI
BioAPI_EnumDevices(const BioAPI_UUID *uuid,
									BioAPI_DEVICE_SCHEMA * DeviceSchemaArray,
									uint32 ArraySize,
									uint32 * ElementsNeeded,
									uint32 * NumElementsReturned)

{
	BioAPI_RETURN err;
	MDSU_CONTEXT MdsuContext;
	BioAPI_DEVICE_SCHEMA DeviceTemplate;
	BioAPI_DEVICE_SCHEMA DeviceData;
	BioAPI_DEVICE_SCHEMA * CurrentSchemaPtr;
	uint32 Count;

	/* Initialize in case of early return (usually caused by no installed devices) */
	*NumElementsReturned = 0;
	*ElementsNeeded = 0;

	if((err = MDSU_Init(&MdsuContext,
					&BioAPIMemoryFuncs,
					uuid,
					MDS_CDSA_DIRECTORY,
					(CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE),
					BIOAPI_MDS_COMMIT_SIZE)) != BioAPI_OK)
		return err;

	/* Handle the simple case first...NULL passed for DeviceSchemaArray */
	if(DeviceSchemaArray == NULL)
	{
		Count = 0;
		BioAPI_CopyUuid (DeviceTemplate.ModuleId, uuid);
		ERR(err = MDSU_FindFirst(&MdsuContext,
								 &IfiMdsuBioAPIBspDeviceSchema,
								 &DeviceTemplate,
								 MDSU_BIOAPI_DEV_MODULEID,
								 &DeviceData,
								 NULL));
		if (CSSM_OK != err)
		{
			MDSU_Term( &MdsuContext );
			return err;
		}
		while(CSSM_OK == err)
		{
			Count ++;
			err = MDSU_FindNext(&MdsuContext,
								&DeviceData,
								NULL);
		}
		*ElementsNeeded = Count;
	}
	else
	{
		if(ArraySize == 0)
			return BioAPI_ERRCODE_INVALID_DATA;
		Count = 0;
		CurrentSchemaPtr = DeviceSchemaArray;
		BioAPI_CopyUuid (DeviceTemplate.ModuleId, uuid);
		err = MDSU_FindFirst(&MdsuContext,
								 &IfiMdsuBioAPIBspCapabilitySchema,
								 &DeviceTemplate,
								 MDSU_BIOAPI_DEV_MODULEID,
								 &DeviceData,
								 NULL);
		if (CSSM_OK != err)
		{
			MDSU_Term( &MdsuContext );
			return err;
		}
		while(CSSM_OK == err)
		{
			Count ++;
			if(Count <= ArraySize)
			{
				memcpy(CurrentSchemaPtr, &DeviceData, sizeof(BioAPI_DEVICE_SCHEMA));
				CurrentSchemaPtr++;
			}
			err = MDSU_FindNext(&MdsuContext,
								&DeviceData,
								NULL);
		}
		if(Count > ArraySize)
		{
			*NumElementsReturned = ArraySize;
		}
		else
		{
			*NumElementsReturned = Count;
		}
		*ElementsNeeded = Count;
	}
	MDSU_Term( &MdsuContext );
	return (BioAPI_OK);

}
Ejemplo n.º 3
0
Archivo: main.c Proyecto: ozgend/hive
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
	{
		HDC hdc;
		PAINTSTRUCT ps;
		RECT rc;
		HBRUSH hBrush, hBrushOld;
		HPEN hPen, hPenOld;
		LOGBRUSH lgBrush;
		int index;
		static BioAPI_UUID_PTR uuid;
		BioAPI_RETURN bioReturn;
		TCHAR szUserName[100];
		BioAPI_VERSION Version;

		BioAPI_BIR_HANDLE EnrolledTemplate, CapturedTemplate, ProcessedBir;

		BioAPI_INPUT_BIR birEnroll, birCapture, InputBirProcessed;
		BioAPI_BIR_HEADER birHeader;
		BioAPI_FAR MaxFAR, AchievedFAR;

		BioAPI_BOOL bResponse;
		BioAPI_BOOL bPrecedence = BioAPI_TRUE;

		static BioAPI_BSP_SCHEMA * CurrSchema;

		switch (iMsg)
			{
			case WM_PAINT :
				hdc = BeginPaint(hwnd, &ps);
				GetClientRect(hwnd, &rc);
				lgBrush.lbStyle = BS_SOLID;
				lgBrush.lbColor = GetSysColor(COLOR_3DFACE);
				hBrush = CreateBrushIndirect(&lgBrush);
				hPen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DFACE));
				hPenOld = SelectObject(hdc, hPen);
				hBrushOld = SelectObject(hdc, hBrush);
				Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
				SelectObject(hdc, hBrushOld);
				SelectObject(hdc, hPenOld);
				DeleteObject(hBrush);
				DeleteObject(hPen);
				EndPaint(hwnd, &ps);
				return 0;

			case WM_COMMAND :
				switch (HIWORD (wParam))
					{
					case CBN_SELCHANGE :
						ReleaseBSP(&uuid);

						// Retrieve the index of the item selected
						index = SendMessage(hEnumTech, CB_GETCURSEL, 0, 0);
						// Retrieve a pointer to the uuid for the module
						CurrSchema = (BioAPI_BSP_SCHEMA *)SendMessage(hEnumTech, CB_GETITEMDATA, index, 0);
						uuid = (BioAPI_UUID *)malloc(sizeof(BioAPI_UUID));
						if(uuid == NULL)
						{
							MessageBox(hwnd, TEXT("Unable to allocate memory to load the module identifier"),
										TEXT("BioAPI Sample"), MB_OK);
							return 0;
						}
						BioAPI_CopyUuid(uuid, CurrSchema->ModuleId);
						bioReturn = BioAPI_ModuleLoad(uuid, 0, NULL/*(BioAPI_ModuleEventHandler)BiometricEventHandler*/, 0);

						if(BioAPI_OK != bioReturn)
							{
								PrintErrorCode(bioReturn);
								free(uuid);
								uuid = NULL;
								return 0;
							}
//						wsprintf(szCurrHandle, TEXT("Current Handle: 0x%X"), hBtCurrent);
//						SetWindowText(hCurrHbt, szCurrHandle);

						Version.Major = BioAPI_MAJOR;
						Version.Minor = BioAPI_MINOR;
						bioReturn = BioAPI_ModuleAttach(uuid, &Version, &BioAPIWinMemoryFuncs,
										0,
										0,0,0,
										NULL,
										0,
										NULL,
										&gModuleHandle);
						if(BioAPI_OK != bioReturn)
							{
								PrintErrorCode(bioReturn);
								BioAPI_ModuleUnload (uuid, NULL, 0);
								free(uuid);
								uuid = NULL;
								return 0;
							}

						break;

					case BN_CLICKED:
						switch (LOWORD (wParam))
							{
								case IDOK :
									ReleaseBSP(&uuid);
									EndDialog(hwnd, 0);
									PostQuitMessage(0);
									break;
								case IDC_ENROLL :
									if(GetWindowText(hUserId, szUserName, 100)==0)
										MessageBox(hwnd, TEXT("Please specify a user id"), TEXT("Bad User Id"), MB_OK);
									else
										{
											bioReturn = BioAPI_Enroll(gModuleHandle,
															BioAPI_PURPOSE_ENROLL_FOR_VERIFICATION_ONLY,
															NULL,
															&EnrolledTemplate,
															NULL,
															-1,
															NULL);

											if(bioReturn != BioAPI_OK)
												{
													PrintErrorCode(bioReturn);
													return 0;
												}

											OutputToFile(szUserName, EnrolledTemplate);
										}
									break;
								case IDC_VERIFY :
									if(GetWindowText(hUserId, szUserName, 100)==0)
										MessageBox(hwnd, TEXT("Please specify a user id"), TEXT("Bad User Id"), MB_OK);
									else
										{
											if(InputFromFile(szUserName, &birEnroll) != BioAPI_OK)
												{
													MessageBox(hwnd, TEXT("User not enrolled"), TEXT("Bad User Id"), MB_OK);
													return 0;
												}
											// See if the BSP supports BioAPI_VerifyMatch by checking
											// the operations mask
											if(CurrSchema->Operations & BioAPI_VERIFYMATCH)
												{
													if((bioReturn = BioAPI_Capture(gModuleHandle,
																		BioAPI_PURPOSE_VERIFY,
																		&CapturedTemplate,
																		-1,
																		NULL)) != BioAPI_OK)
														{
															PrintErrorCode(bioReturn);
															GlobalFree(birEnroll.InputBIR.BIR);
															return 0;
														}
													if((bioReturn = BioAPI_GetHeaderFromHandle(gModuleHandle,
																		CapturedTemplate,
																		&birHeader)) != BioAPI_OK)
														{
															PrintErrorCode(bioReturn);
															GlobalFree(birEnroll.InputBIR.BIR);
															return 0;
														}
													if(birHeader.Type == BioAPI_BIR_DATA_TYPE_INTERMEDIATE)
														{
															birCapture.Form = BioAPI_BIR_HANDLE_INPUT;
															birCapture.InputBIR.BIRinBSP = &CapturedTemplate;
															if((bioReturn = BioAPI_Process(gModuleHandle,
																				&birCapture,
																				&ProcessedBir)) != BioAPI_OK)
																{
																	PrintErrorCode(bioReturn);
																	GlobalFree(birEnroll.InputBIR.BIR);
																	return 0;
																}
															MaxFAR = 1;
															InputBirProcessed.Form = BioAPI_BIR_HANDLE_INPUT;
															InputBirProcessed.InputBIR.BIRinBSP = &ProcessedBir;
														}
													else
														{
															MaxFAR = 1;
															InputBirProcessed.Form = BioAPI_BIR_HANDLE_INPUT;
															InputBirProcessed.InputBIR.BIRinBSP = &CapturedTemplate;
														}
													bioReturn = BioAPI_VerifyMatch(gModuleHandle,
																	&MaxFAR,
																	NULL,
																	&bPrecedence,
																	&InputBirProcessed,
																	&birEnroll,
																	NULL,
																	&bResponse,
																	&AchievedFAR,
																	NULL,
																	NULL);
												}
											else		// We simply call BioAPI_Verify
												{
													MaxFAR = 1;
													bioReturn = BioAPI_Verify(gModuleHandle,
																				&MaxFAR,
																				NULL,
																				&bPrecedence,
																				&birEnroll,
																				NULL,
																				&bResponse,
																				&AchievedFAR,
																				NULL,
																				NULL,
																				-1,
																				NULL);
												}
											GlobalFree(birEnroll.InputBIR.BIR);

											if(bioReturn != BioAPI_OK)
												{
													PrintErrorCode(bioReturn);
													return 0;
												}
											if(bResponse == TRUE)
												MessageBox(hwnd, TEXT("Match"), TEXT("BioAPI"), MB_OK);
											else MessageBox(hwnd, TEXT("No Match"), TEXT("BioAPI"), MB_OK);
										}
									break;
							}
						break;
					}
				return 0 ;
			case WM_CLOSE :
				ReleaseBSP(&uuid);
				EndDialog(hwnd, 0);
				PostQuitMessage(0);
				return 0;
			case WM_DESTROY :
				ReleaseBSP(&uuid);
				EndDialog(hwnd, 0);
				PostQuitMessage(0);
				return 0 ;
			}
		return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
	}