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.
576 lines
14 KiB
576 lines
14 KiB
/*++
|
|
|
|
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
|
|
|