Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

578 lines
18 KiB

/*++
Copyright (c) 2002 Microsoft Corporation
Module Name:
bdl.h
Abstract:
This module contains all definitions for the biometric device driver library.
Environment:
Kernel mode only.
Notes:
Revision History:
- Created May 2002 by Reid Kuhn
--*/
#ifndef _BDL_
#define _BDL_
#ifdef __cplusplus
extern "C" {
#endif
#include <initguid.h>
DEFINE_GUID(BiometricDeviceGuid, 0x83970EB2, 0x86F6, 0x4F3A, 0xB5,0xF4,0xC6,0x05,0xAA,0x49,0x63,0xE1);
typedef PVOID BDD_DATA_HANDLE;
#define BIO_BUFFER_TOO_SMALL 1L
#define BIO_ITEMTYPE_HANDLE 0x00000001
#define BIO_ITEMTYPE_BLOCK 0x00000002
//
///////////////////////////////////////////////////////////////////////////////
//
// Device Action IOCTLs
//
#define BIO_CTL_CODE(code) CTL_CODE(FILE_DEVICE_BIOMETRIC, \
(code), \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define BDD_IOCTL_STARTUP BIO_CTL_CODE(1)
#define BDD_IOCTL_SHUTDOWN BIO_CTL_CODE(2)
#define BDD_IOCTL_GETDEVICEINFO BIO_CTL_CODE(3)
#define BDD_IOCTL_DOCHANNEL BIO_CTL_CODE(4)
#define BDD_IOCTL_GETCONTROL BIO_CTL_CODE(5)
#define BDD_IOCTL_SETCONTROL BIO_CTL_CODE(6)
#define BDD_IOCTL_CREATEHANDLEFROMDATA BIO_CTL_CODE(7)
#define BDD_IOCTL_CLOSEHANDLE BIO_CTL_CODE(8)
#define BDD_IOCTL_GETDATAFROMHANDLE BIO_CTL_CODE(9)
#define BDD_IOCTL_REGISTERNOTIFY BIO_CTL_CODE(10)
#define BDD_IOCTL_GETNOTIFICATION BIO_CTL_CODE(11)
/////////////////////////////////////////////////////////////////////////////////////////
//
// These structures and typedefs are used when making BDSI calls
//
typedef struct _BDSI_ADDDEVICE
{
IN ULONG Size;
IN PDEVICE_OBJECT pPhysicalDeviceObject;
OUT PVOID pvBDDExtension;
} BDSI_ADDDEVICE, *PBDSI_ADDDEVICE;
typedef struct _BDSI_INITIALIZERESOURCES
{
IN ULONG Size;
IN PCM_RESOURCE_LIST pAllocatedResources;
IN PCM_RESOURCE_LIST pAllocatedResourcesTranslated;
OUT WCHAR wszSerialNumber[256];
OUT ULONG HWVersionMajor;
OUT ULONG HWVersionMinor;
OUT ULONG HWBuildNumber;
OUT ULONG BDDVersionMajor;
OUT ULONG BDDVersionMinor;
OUT ULONG BDDBuildNumber;
} BDSI_INITIALIZERESOURCES, *PBDSI_INITIALIZERESOURCES;
typedef struct _BDSI_DRIVERUNLOAD
{
IN ULONG Size;
IN PIRP pIrp;
} BDSI_DRIVERUNLOAD, *PBDSI_DRIVERUNLOAD;
typedef enum _BDSI_POWERSTATE
{
Off = 0,
Low = 1,
On = 2
}BDSI_POWERSTATE, *PBDSI_POWERSTATE;
typedef struct _BDSI_SETPOWERSTATE
{
IN ULONG Size;
IN BDSI_POWERSTATE PowerState;
} BDSI_SETPOWERSTATE, *PBDSI_SETPOWERSTATE;
/////////////////////////////////////////////////////////////////////////////////////////
//
// These structures and typedefs are used when making BDDI calls
//
typedef struct _BDDI_ITEM
{
ULONG Type;
union _BDDI_ITEM_DATA
{
BDD_DATA_HANDLE Handle;
struct _BDDI_ITEM_DATA_BLOCK
{
ULONG cBuffer;
PUCHAR pBuffer;
} Block;
} Data;
} BDDI_ITEM, *PBDDI_ITEM;
typedef PBDDI_ITEM BDD_HANDLE;
typedef struct _BDDI_SOURCELIST
{
ULONG NumSources;
PBDDI_ITEM *rgpSources;
} BDDI_SOURCELIST, *PBDDI_SOURCELIST;
typedef struct _BDDI_PARAMS_REGISTERNOTIFY
{
IN ULONG Size;
IN BOOLEAN fRegister;
IN ULONG ComponentId;
IN ULONG ChannelId;
IN ULONG ControlId;
} BDDI_PARAMS_REGISTERNOTIFY, *PBDDI_PARAMS_REGISTERNOTIFY;
typedef struct _BDDI_PARAMS_DOCHANNEL
{
IN ULONG Size;
IN ULONG ComponentId;
IN ULONG ChannelId;
IN PKEVENT CancelEvent;
IN BDDI_SOURCELIST *rgSourceLists;
IN OUT BDD_DATA_HANDLE hStateData;
OUT PBDDI_ITEM *rgpProducts;
OUT ULONG BIOReturnCode;
} BDDI_PARAMS_DOCHANNEL, *PBDDI_PARAMS_DOCHANNEL;
typedef struct _BDDI_PARAMS_GETCONTROL
{
IN ULONG Size;
IN ULONG ComponentId;
IN ULONG ChannelId;
IN ULONG ControlId;
OUT INT32 Value;
OUT WCHAR wszString[256];
} BDDI_PARAMS_GETCONTROL, *PBDDI_PARAMS_GETCONTROL;
typedef struct _BDDI_PARAMS_SETCONTROL
{
IN ULONG Size;
IN ULONG ComponentId;
IN ULONG ChannelId;
IN ULONG ControlId;
IN INT32 Value;
IN WCHAR wszString[256];
} BDDI_PARAMS_SETCONTROL, *PBDDI_PARAMS_SETCONTROL;
typedef struct _BDDI_PARAMS_CREATEHANDLE_FROMDATA
{
IN ULONG Size;
IN GUID guidFormatId;
IN ULONG cBuffer;
IN PUCHAR pBuffer;
OUT BDD_DATA_HANDLE hData;
} BDDI_PARAMS_CREATEHANDLE_FROMDATA, *PBDDI_PARAMS_CREATEHANDLE_FROMDATA;
typedef struct _BDDI_PARAMS_CLOSEHANDLE
{
IN ULONG Size;
IN BDD_DATA_HANDLE hData;
} BDDI_PARAMS_CLOSEHANDLE, *PBDDI_PARAMS_CLOSEHANDLE;
typedef struct _BDDI_PARAMS_GETDATA_FROMHANDLE
{
IN ULONG Size;
IN BDD_DATA_HANDLE hData;
IN OUT ULONG cBuffer;
IN OUT PUCHAR pBuffer;
OUT ULONG BIOReturnCode;
} BDDI_PARAMS_GETDATA_FROMHANDLE, *PBDDI_PARAMS_GETDATA_FROMHANDLE;
/////////////////////////////////////////////////////////////////////////////////////////
//
// These strucutres and typedefs are used to pass pointers to the BDD's BDDI functions
// when calling bdliInitialize
//
typedef NTSTATUS FN_BDDI_REGISTERNOTIFY (PBDL_DEVICEEXT, PBDDI_PARAMS_REGISTERNOTIFY);
typedef FN_BDDI_REGISTERNOTIFY *PFN_BDDI_REGISTERNOTIFY;
typedef NTSTATUS FN_BDDI_DOCHANNEL (PBDL_DEVICEEXT, PBDDI_PARAMS_DOCHANNEL);
typedef FN_BDDI_DOCHANNEL *PFN_BDDI_DOCHANNEL;
typedef NTSTATUS FN_BDDI_GETCONTROL (PBDL_DEVICEEXT, PBDDI_PARAMS_GETCONTROL);
typedef FN_BDDI_GETCONTROL *PFN_BDDI_GETCONTROL;
typedef NTSTATUS FN_BDDI_SETCONTROL (PBDL_DEVICEEXT, PBDDI_PARAMS_SETCONTROL);
typedef FN_BDDI_SETCONTROL *PFN_BDDI_SETCONTROL;
typedef NTSTATUS FN_BDDI_CREATEHANDLE_FROMDATA (PBDL_DEVICEEXT, PBDDI_PARAMS_CREATEHANDLE_FROMDATA);
typedef FN_BDDI_CREATEHANDLE_FROMDATA *PFN_BDDI_CREATEHANDLE_FROMDATA;
typedef NTSTATUS FN_BDDI_CLOSEHANDLE (PBDL_DEVICEEXT, PBDDI_PARAMS_CLOSEHANDLE);
typedef FN_BDDI_CLOSEHANDLE *PFN_BDDI_CLOSEHANDLE;
typedef NTSTATUS FN_BDDI_GETDATA_FROMHANDLE (PBDL_DEVICEEXT, PBDDI_PARAMS_GETDATA_FROMHANDLE);
typedef FN_BDDI_GETDATA_FROMHANDLE *PFN_BDDI_GETDATA_FROMHANDLE;
typedef struct _BDLI_BDDIFUNCTIONS
{
ULONG Size;
PFN_BDDI_REGISTERNOTIFY pfbddiRegisterNotify;
PFN_BDDI_DOCHANNEL pfbddiDoChannel;
PFN_BDDI_GETCONTROL pfbddiGetControl;
PFN_BDDI_SETCONTROL pfbddiSetControl;
PFN_BDDI_CREATEHANDLE_FROMDATA pfbddiCreateHandleFromData;
PFN_BDDI_CLOSEHANDLE pfbddiCloseHandle;
PFN_BDDI_GETDATA_FROMHANDLE pfbddiGetDataFromHandle;
} BDLI_BDDIFUNCTIONS, *PBDLI_BDDIFUNCTIONS;
/////////////////////////////////////////////////////////////////////////////////////////
//
// These strucutres and typedefs are used to pass pointers to the BDD's BDSI functions
// when calling bdliInitialize
//
typedef NTSTATUS FN_BDSI_ADDDEVICE (PBDL_DEVICEEXT, PBDSI_ADDDEVICE);
typedef FN_BDSI_ADDDEVICE *PFN_BDSI_ADDDEVICE;
typedef NTSTATUS FN_BDSI_REMOVEDEVICE (PBDL_DEVICEEXT);
typedef FN_BDSI_REMOVEDEVICE *PFN_BDSI_REMOVEDEVICE;
typedef NTSTATUS FN_BDSI_INITIALIZERESOURCES (PBDL_DEVICEEXT, PBDSI_INITIALIZERESOURCES);
typedef FN_BDSI_INITIALIZERESOURCES *PFN_BDSI_INITIALIZERESOURCES;
typedef NTSTATUS FN_BDSI_RELEASERESOURCES (PBDL_DEVICEEXT);
typedef FN_BDSI_RELEASERESOURCES *PFN_BDSI_RELEASERESOURCES;
typedef NTSTATUS FN_BDSI_STARTUP (PBDL_DEVICEEXT);
typedef FN_BDSI_STARTUP *PFN_BDSI_STARTUP;
typedef NTSTATUS FN_BDSI_SHUTDOWN (PBDL_DEVICEEXT);
typedef FN_BDSI_SHUTDOWN *PFN_BDSI_SHUTDOWN;
typedef NTSTATUS FN_BDSI_DRIVERUNLOAD (PBDL_DEVICEEXT, PBDSI_DRIVERUNLOAD);
typedef FN_BDSI_DRIVERUNLOAD *PFN_BDSI_DRIVERUNLOAD;
typedef NTSTATUS FN_BDSI_SETPOWERSTATE (PBDL_DEVICEEXT, PBDSI_SETPOWERSTATE);
typedef FN_BDSI_SETPOWERSTATE *PFN_BDSI_SETPOWERSTATE;
typedef struct _BDLI_BDSIFUNCTIONS
{
ULONG Size;
PFN_BDSI_ADDDEVICE pfbdsiAddDevice;
PFN_BDSI_REMOVEDEVICE pfbdsiRemoveDevice;
PFN_BDSI_INITIALIZERESOURCES pfbdsiInitializeResources;
PFN_BDSI_RELEASERESOURCES pfbdsiReleaseResources;
PFN_BDSI_STARTUP pfbdsiStartup;
PFN_BDSI_SHUTDOWN pfbdsiShutdown;
PFN_BDSI_DRIVERUNLOAD pfbdsiDriverUnload;
PFN_BDSI_SETPOWERSTATE pfbdsiSetPowerState;
} BDLI_BDSIFUNCTIONS, *PBDLI_BDSIFUNCTIONS;
typedef struct _BDL_DEVICEEXT
{
//
// size of this struct
//
ULONG Size;
//
// The device object that we are attached to
//
PDEVICE_OBJECT pAttachedDeviceObject;
//
// The BDD's extension
//
PVOID pvBDDExtension;
} BDL_DEVICEEXT, *PBDL_DEVICEEXT;
/////////////////////////////////////////////////////////////////////////////////////////
//
// These functions are exported by the BDL
//
//
// bdliInitialize()
//
// Called in response to the BDD receiving its DriverEntry call. This lets the BDL
// know that a new BDD has been loaded and allows the BDL to initialize its state so that
// it can manage the newly loaded BDD.
//
// The bdliInitialize call will set the appropriate fields in the DRIVER_OBJECT so that
// the BDL will receive all the necessary callbacks from the system for PNP events,
// Power events, and general driver functionality. The BDL will then forward calls that
// require hardware support to the BDD that called bdliInitialize (it will do so using
// the BDDI and BDSI APIs). A BDD must call the bdliInitialize call during its
// DriverEntry function.
//
// PARAMETERS:
// DriverObject This must be the DRIVER_OBJECT pointer that was passed into the
// BDD's DriverEntry call.
// RegistryPath This must be the UNICODE_STRING pointer that was passed into the
// BDD's DriverEntry call.
// pBDDIFunctions Pointer to a BDLI_BDDIFUNCTIONS structure that is filled in with the
// entry points that the BDD exports to support the BDDI API set. The
// pointers themselves are copied by the BDL, as opposed to saving the
// pBDDIFunctions pointer, so the memory pointed to by pBDDIFunctions
// need not remain accessible after the bdliInitialize call.
// pBDSIFunctions Pointer to a BDLI_BDSIFUNCTIONS structure that is filled in with
// the entry points that the BDD exports to support the BDSI API set.
// The pointers themselves are copied by the BDL, as opposed to saving
// the pBDSIFunctions pointer, so the memory pointed to by
// pBDSIFunctions need not remain accessible after the bdliInitialize
// call.
// Flags Unused. Must be 0.
// pReserved Unused. Must be NULL.
//
// RETURNS:
// STATUS_SUCCESS If the bdliInitialize call succeeded
//
NTSTATUS
bdliInitialize
(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath,
IN PBDLI_BDDIFUNCTIONS pBDDIFunctions,
IN PBDLI_BDSIFUNCTIONS pBDSIFunctions,
IN ULONG Flags,
IN PVOID pReserved
);
//
// bdliAlloc()
//
// Allocates memory that can be returned to the BDL.
//
// The BDD must always use this function to allocate memory that it will return to the
// BDL as an OUT parameter of a BDDI call. Once memory has been returned to the BDL,
// it will be owned and managed exclusively by the BDL and must not be further referenced
// by the BDD. (Each BDDI call that requires the use of bdliAlloc will note it).
//
// PARAMETERS:
// pBDLExt Pointer to the BDL_DEVICEEXT structure that was passed into the
// bdsiAddDevice call.
// cBytes The number of bytes to allocate.
// Flags Unused. Must be 0.
//
// RETURNS:
// Returns a pointer to the allocated memory, or NULL if the function fails.
//
void *
bdliAlloc
(
IN PBDL_DEVICEEXT pBDLExt,
IN ULONG cBytes,
IN ULONG Flags
);
//
// bdliFree()
//
// Frees memory allocated by bdliAlloc.
//
// Memory allocated by bdliAlloc is almost always passed to the BDL as a channel product
// (as a BLOCK-type item) and subsequently freed by the BDL. However, if an error
// occurs while processing a channel, the BDD may need to call bdliFree to free memory it
// previous allocated via bdliAlloc.
//
// PARAMETERS:
// pvBlock Block of memory passed in by the BDL.
//
// RETURNS:
// No return value.
//
void
bdliFree
(
IN PVOID pvBlock
);
//
// bdliLogError()
//
// Writes an error to the event log.
//
// Provides a simple mechanism for BDD writers to write errors to the system event log
// without the overhead of registering with the event logging subsystem.
//
// PARAMETERS:
// pObject If the error being logged is device specific then this must be a
// pointer to the BDL_DEVICEEXT structure that was passed into the
// bdsiAddDevice call when the device was added. If the error being
// logged is a general BDD error, then this must be same DRIVER_OBJECT
// structure pointer that was passed into the DriverEntry call of the
// BDD when the driver was loaded.
// ErrorCode Error code of the function logging the error.
// Insertion An insertion string to be written to the event log. Your message file
// must have a place holder for the insertion. For example, "serial port
// %2 is either not available or used by another device". In this
// example, %2 will be replaced by the insertion string. Note that %1 is
// reserved for the file name.
// cDumpData The number of bytes pointed to by pDumpData.
// pDumpData A data block to be displayed in the data window of the event log.
// This may be NULL if the caller does not wish to display any dump data.
// Flags Unused. Must be 0.
// pReserved Unused. Must be NULL.
//
// RETURNS:
// STATUS_SUCCESS If the bdliLogError call succeeded
//
NTSTATUS
bdliLogError
(
IN PVOID pObject,
IN NTSTATUS ErrorCode,
IN PUNICODE_STRING Insertion,
IN ULONG cDumpData,
IN PUCHAR pDumpData,
IN ULONG Flags,
IN PVOID pReserved
);
//
// bdliControlChange()
//
// This function allows BDDs to asynchronously return the values of its controls.
//
// bdliControlChange is generally called by the BDD in response to one of its controls
// changing a value. Specifically, it is most often used in the case of a sensor
// control that has changed from 0 to 1 indicating that a source is present and a sample
// can be taken.
//
// PARAMETERS:
// pBDLExt Pointer to the BDL_DEVICEEXT structure that was passed into the
// bdsiAddDevice call.
// ComponentId Specifies either the Component ID of the component in which the
// control or the control's parent channel resides, or '0' to indicate
// that dwControlId refers to a device control.
// ChannelId If dwComponentId is not '0', dwChannelId specifies either the Channel
// ID of the channel in which the control resides, or '0' to indicate
// that dwControlId refers to a component control.Ignored if
// dwComponentId is '0'.
// ControlId ControlId of the changed control.
// Value Specifies the new value for the control .
// Flags Unused. Must be 0.
// pReserved Unused. Must be NULL.
//
// RETURNS:
// STATUS_SUCCESS If the bdliControlChange call succeeded
//
NTSTATUS
bdliControlChange
(
IN PBDL_DEVICEEXT pBDLExt,
IN ULONG ComponentId,
IN ULONG ChannelId,
IN ULONG ControlId,
IN ULONG Value,
IN ULONG Flags,
IN PVOID pReserved
);
//
// These functions and defines can be used for debugging purposes
//
#define BDL_DEBUG_TRACE ((ULONG) 0x00000001)
#define BDL_DEBUG_ERROR ((ULONG) 0x00000002)
#define BDL_DEBUG_ASSERT ((ULONG) 0x00000004)
ULONG
BDLGetDebugLevel();
#if DBG
#define BDLDebug(LEVEL, STRING) \
{ \
if (LEVEL & BDL_DEBUG_TRACE & BDLGetDebugLevel()) \
KdPrint(STRING); \
if (LEVEL & BDL_DEBUG_ERROR & BDLGetDebugLevel()) \
KdPrint(STRING);\
if (BDLGetDebugLevel() & BDL_DEBUG_ASSERT) \
_asm int 3 \
}
#else
#define BDLDebug(LEVEL, STRING)
#endif
#ifdef __cplusplus
}
#endif
#endif