212 lines
5.9 KiB
C
212 lines
5.9 KiB
C
|
#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
|
||
|
|
||
|
|