Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

211 lines
5.9 KiB

#ifndef _CKHID_H
#define _CKHID_H
/*
* title: hidpwr.h
*
* purpose: header for wdm kernel hid interface class
*
*/
#define READABLE 0x01
#define WRITEABLE 0x02
#define UsagePowerPage 0x84
#define UsageUPS 0x04
// objectification of hid class structures
#define FeatureType 0x01
#define InputType 0x02
#define OutputType 0x03
class CTypeMask {
public:
int GetReportType() { return ReportType; };
bool IsWriteable() { return bWriteable;};
bool IsString() { return bIsString;};
bool IsVolatile() { return bVolatile;};
bool IsNumber() { return bIsNumber;};
bool IsAlertable() { return bAlertable;};
void SetIsWriteable() { bWriteable = 1; };
void SetAlertable() { bAlertable = 1; };
void SetIsString() { bIsString = 1;};
void SetIsNumber() { bIsNumber = 1;};
void SetVolatile() { bVolatile = 1;};
void SetReportType(int iType) { ReportType = iType;};
CTypeMask();
protected:
unsigned ReportType : 2;
unsigned bWriteable : 1;
unsigned bIsString : 1;
unsigned bIsNumber : 1;
unsigned bAlertable : 1;
unsigned bVolatile : 1;
unsigned Pad : 1;
};
typedef enum {
eFeatureValue = 1,
eFeatureButton,
eInputValue,
eInputButton,
eOutputValue,
eOutputButton
} eHidType;
// forward declarations
class CCollectionArray;
class CHidDevice;
class CUsage;
class CProperties {
public:
LONG m_Unit;
SHORT m_UnitExponent;
LONG m_LogicalMin;
LONG m_LogicalMax;
USHORT m_LinkCollection;
USHORT m_ReportID;
USHORT m_Usage;
USHORT m_UsagePage;
CTypeMask * m_pType; // feature, input, or output, writeable, alertable, etc.
// methods
CProperties(CUsage *);
~CProperties();
};
class CUsage {
public: // public members
CProperties * m_pProperties;
HIDP_BUTTON_CAPS * m_pButtonCaps;
HIDP_VALUE_CAPS * m_pValueCaps;
eHidType m_eType;
union
{
ULONG m_Value;
char * m_String;
};
CHidDevice * m_pHidDevice;
public: // public methods
CUsage();
~CUsage();
bool GetValue();
NTSTATUS GetString(char * pBuffer,USHORT usBuffLen,PULONG BytesReturned);
void SetCapabilities();
bool SetValue(ULONG);
short GetExponent();
ULONG GetUnit();
};
class CUsagePath {
public: // public members
USAGE m_UsagePage;
USAGE m_UsageNumber;
CUsage * m_pUsage;
CUsagePath * m_pNextEntry;
public: // public methods
CUsagePath(USAGE UsagePage, USAGE UsageID, CUsage * pUsage = NULL);
~CUsagePath();
};
class CUsageArray {
public: // members
CUsage ** m_pUsages;
USHORT m_UsageCount;
public: // methods
CUsageArray();
~CUsageArray();
void AddUsage(CUsage * pNewUsage);
};
class CCollection {
public: // public methods
USAGE m_CollectionID;
USAGE m_UsagePage;
CUsageArray * m_UsageArray;
CCollectionArray * m_CollectionArray;
USHORT m_NodeIndex;
CHidDevice * m_HidDevice;
public: // methods and constructors
CCollection(PHIDP_LINK_COLLECTION_NODE TheNodes, USHORT usNodeCount,USHORT usParentIndex);
~CCollection();
void InitUsages(CHidDevice *);
CUsagePath * FindIndexedUsage(USHORT *pCurrIndex, USHORT TargetIndex);
};
class CCollectionArray {
public: // members
CCollection ** m_pCollections;
USHORT m_CollectionCount;
public: // methods
CCollectionArray(PHIDP_LINK_COLLECTION_NODE TheNodes, USHORT usNodeCount,SHORT sParentIndex);
~CCollectionArray();
};
#define MAXREPORTID 256
typedef void (*EVENT_HANDLER)(
IN PVOID Context,
IN CUsage * pUsage
);
// prototypes for callbacks and completion routines used by CHidDevice class
void _stdcall ReadThread(PVOID);
NTSTATUS _stdcall ReadCompletionRoutine(
PDEVICE_OBJECT,
PIRP,
PVOID);
class CHidDevice
{
public:
PHID_DEVICE m_pHidDevice;
PDEVICE_OBJECT m_pDeviceObject;
PDEVICE_OBJECT m_pLowerDeviceObject;
PDEVICE_OBJECT m_pOpenedDeviceObject;
USHORT m_UsagePage;
USHORT m_UsageID;
CCollectionArray * m_CollectionArray;
CUsageArray * m_InputUsageArrays[MAXREPORTID]; // allowing for 10 input reports
PBYTE m_pReadBuffer;
PBYTE m_FeatureBuffer[MAXREPORTID];
HANDLE m_hReadThread;
PVOID m_pThreadObject;
KEVENT m_kReadEvent;
KEVENT m_kAbortEvent;
PHIDP_PREPARSED_DATA m_pPreparsedData;
PHIDP_CAPS m_pCaps;
EVENT_HANDLER m_pEventHandler;
PVOID m_pEventContext;
PFILE_OBJECT m_pFCB; // file control block for hid class read/write i/o
PIRP m_pReadIrp;
private:
HANDLE m_hEventMutex;
PBYTE m_InputBuffer;
USHORT m_ReportIdArray[MAXREPORTID];
public:
CHidDevice();
~CHidDevice();
bool OpenHidDevice(PDEVICE_OBJECT pDeviceObject);
CUsage * FindUsage(CUsagePath * Path, USHORT usType);
NTSTATUS ActivateInput();
USHORT GetIndexFromReportId(USHORT ReportId);
USHORT AssignIndexToReportId(USHORT ReportId);
private:
};
#endif // CKHID_H