|
|
/*++
Copyright (c) 2002 Microsoft Corporation
Module Name:
bdlint.h
Abstract:
This module contains all of the internal efinitions for the BDLmetric device driver library.
Environment:
Kernel mode only.
Notes:
Revision History:
- Created May 2002 by Reid Kuhn
--*/
#ifndef _BDLINT_
#define _BDLINT_
#include "bdl.h"
#define BDL_ULONG_TAG ' LDB'
#define BDLI_ULONG_TAG 'ILDB'
#define BDL_LIST_ULONG_TAG 'LLDB'
#define BIO_CONTROL_FLAG_ASYNCHRONOUS 0x00000001
#define BIO_CONTROL_FLAG_READONLY 0x00000002
#define CONTROL_CHANGE_POOL_SIZE 20
#define SIZEOF_DOCHANNEL_INPUTBUFFER ((4 * sizeof(ULONG)) + sizeof(HANDLE) + sizeof(BDD_HANDLE))
#define SIZEOF_GETCONTROL_INPUTBUFFER (sizeof(ULONG) * 3)
#define SIZEOF_SETCONTROL_INPUTBUFFER (sizeof(ULONG) * 4)
#define SIZEOF_CREATEHANDLEFROMDATA_INPUTBUFFER (sizeof(GUID) + (sizeof(ULONG) * 2))
#define SIZEOF_CLOSEHANDLE_INPUTBUFFER (sizeof(BDD_HANDLE))
#define SIZEOF_GETDATAFROMHANDLE_INPUTBUFFER (sizeof(BDD_HANDLE) + sizeof(ULONG))
#define SIZEOF_REGISTERNOTIFY_INPUTBUFFER (sizeof(ULONG) * 4)
#define SIZEOF_GETDEVICEINFO_OUTPUTBUFFER (sizeof(WCHAR[256]) + (sizeof(ULONG) * 6))
#define SIZEOF_DOCHANNEL_OUTPUTBUFFER (sizeof(ULONG) + sizeof(BDD_HANDLE))
#define SIZEOF_GETCONTROL_OUTPUTBUFFER (sizeof(ULONG))
#define SIZEOF_CREATEHANDLEFROMDATA_OUTPUTBUFFER (sizeof(BDD_HANDLE))
#define SIZEOF_GETDATAFROMHANDLE_OUTPUTBUFFER (sizeof(ULONG) * 2)
#define SIZEOF_GETNOTIFICATION_OUTPUTBUFFER (sizeof(ULONG) * 4)
NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath );
NTSTATUS BDLAddDevice ( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject );
VOID BDLDriverUnload ( IN PDRIVER_OBJECT pDriverObject );
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGEABLE, BDLAddDevice)
#pragma alloc_text(PAGEABLE, BDLDriverUnload)
typedef struct _BDL_CHANNEL_SOURCE_LIST { GUID FormatGUID; ULONG MinSources; ULONG MaxSources; ULONG Flags;
} BDL_CHANNEL_SOURCE_LIST;
typedef struct _BDL_CONTROL { ULONG ControlId; INT32 NumericMinimum; INT32 NumericMaximum; ULONG NumericGranularity; ULONG NumericDivisor; ULONG Flags;
} BDL_CONTROL;
typedef struct _BDL_PRODUCT { ULONG Flags;
} BDL_PRODUCT;
typedef struct _BDL_CHANNEL { ULONG ChannelId; ULONG NumControls; BDL_CONTROL *rgControls; BOOLEAN fCancelable; ULONG NumSourceLists; BDL_CHANNEL_SOURCE_LIST *rgSourceLists; ULONG NumProducts; BDL_PRODUCT *rgProducts;
} BDL_CHANNEL;
typedef struct _BDL_COMPONENT { ULONG ComponentId; ULONG NumControls; BDL_CONTROL *rgControls; ULONG NumChannels; BDL_CHANNEL *rgChannels;
} BDL_COMPONENT;
typedef struct _BDL_DEVICE_CAPABILITIES { ULONG NumControls; BDL_CONTROL *rgControls; ULONG NumComponents; BDL_COMPONENT *rgComponents;
} BDL_DEVICE_CAPABILITIES;
typedef struct _BDL_IOCTL_CONTROL_CHANGE_ITEM { ULONG ComponentId; ULONG ChannelId; ULONG ControlId; ULONG Value; LIST_ENTRY ListEntry;
} BDL_IOCTL_CONTROL_CHANGE_ITEM;
typedef struct _BDL_ISR_CONTROL_CHANGE_ITEM { ULONG ComponentId; ULONG ChannelId; ULONG ControlId; ULONG Value; LIST_ENTRY ListEntry; BOOLEAN fUsed;
} BDL_ISR_CONTROL_CHANGE_ITEM;
typedef struct _BDL_CONTROL_CHANGE_REGISTRATION { ULONG ComponentId; ULONG ChannelId; ULONG ControlId; LIST_ENTRY ListEntry;
} BDL_CONTROL_CHANGE_REGISTRATION;
typedef struct _BDL_CONTROL_CHANGE_STRUCT { //
// This lock protects all the members of this structure that
// are accessed at ISR IRQL (DpcObject, ISRControlChangeQueue,
// ISRirql, rgControlChangePool, StartTime, and NumCalls)
//
KSPIN_LOCK ISRControlChangeLock;
//
// DPC object used for DPC request
//
KDPC DpcObject;
//
// This is the list that holds the control changes which are
// generated via ISR calls and the lock which protects it
//
LIST_ENTRY ISRControlChangeQueue; KIRQL ISRirql;
//
// Pre-allocated pool of items used in the ISRControlChangeQueue
//
BDL_ISR_CONTROL_CHANGE_ITEM rgControlChangePool[CONTROL_CHANGE_POOL_SIZE];
//
// These values are used to ensure the BDD doesn't call bdliControlChange
// too often
//
LARGE_INTEGER StartTime; ULONG NumCalls; //
// This lock protects all the members of this structure that
// are accessed at DISPATCH IRQL (IOCTLControlChangeQueue, pIrp, and
// ControlChangeRegistrationList)
//
KSPIN_LOCK ControlChangeLock;
//
// This is the list that holds the control changes which are
// returned when the BDD_IOCTL_GETNOTIFICATION call is made
//
LIST_ENTRY IOCTLControlChangeQueue; //
// This is the single outstanding BDD_IOCTL_GETNOTIFICATION IRP
// used to retrieve asynchronous control changes.
//
PIRP pIrp;
//
// This is the list of registered controls
//
LIST_ENTRY ControlChangeRegistrationList; } BDL_CONTROL_CHANGE_STRUCT;
typedef struct LIST_NODE_ { void *pNext; BDD_DATA_HANDLE handle;
} LIST_NODE, *PLIST_NODE;
typedef struct HANDLELIST_ { LIST_NODE *pHead; LIST_NODE *pTail; ULONG NumHandles;
} HANDLELIST, *PHANDLELIST;
typedef struct _BDL_DRIVER_EXTENSION { BDLI_BDDIFUNCTIONS bddiFunctions; BDLI_BDSIFUNCTIONS bdsiFunctions;
} BDL_DRIVER_EXTENSION, *PBDL_DRIVER_EXTENSION;
typedef struct _BDL_INTERNAL_DEVICE_EXTENSION { //
// This is the portion of the BDL extension struct that
// BDD writers have access to
//
BDL_DEVICEEXT BdlExtenstion;
//
// The driver object for this device
//
PBDL_DRIVER_EXTENSION pDriverExtension;
//
// Symbolic Link Name, created when the interface is registered
//
UNICODE_STRING SymbolicLinkName;
//
// mutual exclusion for this struct
//
KSPIN_LOCK SpinLock;
//
// Used to signal that the device is able to process requests
//
KEVENT DeviceStartedEvent;
//
// The current number of io-requests
//
ULONG IoCount;
//
// remove lock
//
IO_REMOVE_LOCK RemoveLock;
//
// Used to signal wether the device is open or not
//
LONG DeviceOpen;
//
// The BDL device specific capabilities
//
BDL_DEVICE_CAPABILITIES DeviceCapabilities;
//
// Holds the following:
// 1) queued control changes generated from ISR calls
// 2) queue of items to be returned via IOCTL calls
// 3) list of controls which have been registered
//
BDL_CONTROL_CHANGE_STRUCT ControlChangeStruct;
//
// The current power state of the device
//
BDSI_POWERSTATE CurrentPowerState;
//
// This indicates whether BDLPnPStart() completed succesfully
//
BOOLEAN fStartSucceeded;
//
// This indicates that there has been a surprise removal
//
BOOLEAN fDeviceRemoved;
//
// This is the list of outstanding BDD Handles
//
KSPIN_LOCK HandleListLock; HANDLELIST HandleList;
//
// Device info
//
WCHAR wszSerialNumber[256]; ULONG HWVersionMajor; ULONG HWVersionMinor; ULONG HWBuildNumber; ULONG BDDVersionMajor; ULONG BDDVersionMinor; ULONG BDDBuildNumber;
} BDL_INTERNAL_DEVICE_EXTENSION, *PBDL_INTERNAL_DEVICE_EXTENSION;
//
// This function retrieves the device capabilities from the registry.
//
NTSTATUS BDLGetDeviceCapabilities ( PDEVICE_OBJECT pPhysicalDeviceObject, PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension );
//
// This function free's up the memory allocated by BDLGetDevicesCapabilities
//
VOID BDLCleanupDeviceCapabilities ( PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension );
//
// This function is used to call the lower lever driver when more processing
// is required after the lower level driver is done with the IRP.
//
NTSTATUS BDLCallLowerLevelDriverAndWait ( IN PDEVICE_OBJECT pAttachedDeviceObject, IN PIRP pIrp );
//
// These functions are used to manage the devices handle list
//
VOID BDLLockHandleList ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, OUT KIRQL *pirql );
VOID BDLReleaseHandleList ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN KIRQL irql );
VOID BDLInitializeHandleList ( IN HANDLELIST *pList );
NTSTATUS BDLAddHandleToList ( IN HANDLELIST *pList, IN BDD_DATA_HANDLE handle );
BOOLEAN BDLRemoveHandleFromList ( IN HANDLELIST *pList, IN BDD_DATA_HANDLE handle );
BOOLEAN BDLGetFirstHandle ( IN HANDLELIST *pList, OUT BDD_DATA_HANDLE *phandle );
BOOLEAN BDLValidateHandleIsInList ( IN HANDLELIST *pList, IN BDD_DATA_HANDLE handle );
//
// All these functions are used for supporting BDL IOCTL calls
//
NTSTATUS BDLIOCTL_Startup ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, OUT ULONG *pOutputBufferUsed );
NTSTATUS BDLIOCTL_Shutdown ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, OUT ULONG *pOutputBufferUsed );
NTSTATUS BDLIOCTL_GetDeviceInfo ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, OUT ULONG *pOutputBufferUsed );
NTSTATUS BDLIOCTL_DoChannel ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, OUT ULONG *pOutputBufferUsed );
NTSTATUS BDLIOCTL_GetControl ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, OUT ULONG *pOutputBufferUsed );
NTSTATUS BDLIOCTL_SetControl ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, OUT ULONG *pOutputBufferUsed );
NTSTATUS BDLIOCTL_CreateHandleFromData ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, OUT ULONG *pOutputBufferUsed );
NTSTATUS BDLIOCTL_CloseHandle ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, OUT ULONG *pOutputBufferUsed );
NTSTATUS BDLIOCTL_GetDataFromHandle ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, OUT ULONG *pOutputBufferUsed );
NTSTATUS BDLIOCTL_RegisterNotify ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, OUT ULONG *pOutputBufferUsed );
NTSTATUS BDLIOCTL_GetNotification ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension, IN ULONG InpuBufferLength, IN ULONG OutputBufferLength, IN PVOID pBuffer, IN PIRP pIrp, OUT ULONG *pOutputBufferUsed );
VOID BDLCancelGetNotificationIRP ( IN PBDL_INTERNAL_DEVICE_EXTENSION pBDLExtension );
VOID BDLCleanupNotificationStruct ( IN BDL_INTERNAL_DEVICE_EXTENSION *pBDLExtension );
VOID BDLCleanupDataHandles ( IN BDL_INTERNAL_DEVICE_EXTENSION *pBDLExtension );
#endif
|