|
|
#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
|