/* ******************************************************************************** * * VXDCLNT.H * * * VXDCLNT - Sample Ring-0 HID device mapper for Memphis * * Copyright 1997 Microsoft Corp. * * (ep) * ******************************************************************************** */ #define WANTVXDWRAPS #include #include #include #include #include #include #include #include #include #include /* * Type definitions for imported functions. */ typedef NTSTATUS (*t_pIoGetDeviceClassAssociations) ( IN LPGUID ClassGuid, IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, IN ULONG Flags, OUT PWSTR *SymbolicLinkList ); typedef NTSTATUS (__stdcall *t_pHidP_GetCaps) ( IN PHIDP_PREPARSED_DATA PreparsedData, OUT PHIDP_CAPS Capabilities ); typedef NTSTATUS (__stdcall *t_pHidP_GetUsages) ( IN HIDP_REPORT_TYPE ReportType, IN USAGE UsagePage, IN USHORT LinkCollection, // Optional OUT USAGE * UsageList, IN OUT ULONG * UsageLength, IN PHIDP_PREPARSED_DATA PreparsedData, IN PCHAR Report, IN ULONG ReportLength ); typedef NTSTATUS (__stdcall *t_pHidP_GetUsageValue) ( IN HIDP_REPORT_TYPE ReportType, IN USAGE UsagePage, IN USHORT LinkCollection, // Optional IN USAGE Usage, OUT PULONG UsageValue, IN PHIDP_PREPARSED_DATA PreparsedData, IN PCHAR Report, IN ULONG ReportLength ); typedef NTSTATUS (*t_pHidP_SetUsages) ( IN HIDP_REPORT_TYPE ReportType, IN USAGE UsagePage, IN USHORT LinkCollection, // Optional IN PUSAGE UsageList, IN OUT PULONG UsageLength, IN PHIDP_PREPARSED_DATA PreparsedData, IN OUT PCHAR Report, IN ULONG ReportLength ); typedef NTSTATUS (__stdcall *t_pHidP_GetScaledUsageValue) ( IN HIDP_REPORT_TYPE ReportType, IN USAGE UsagePage, IN USHORT LinkCollection, // Optional IN USAGE Usage, OUT PLONG UsageValue, IN PHIDP_PREPARSED_DATA PreparsedData, IN PCHAR Report, IN ULONG ReportLength ); typedef ULONG (__stdcall *t_pHidP_MaxUsageListLength) ( IN HIDP_REPORT_TYPE ReportType, IN USAGE UsagePage, IN PHIDP_PREPARSED_DATA PreparsedData ); typedef NTSTATUS (__stdcall * t_pHidP_GetValueCaps) ( IN HIDP_REPORT_TYPE ReportType, OUT PHIDP_VALUE_CAPS ValueCaps, IN OUT PULONG ValueCapsLength, IN PHIDP_PREPARSED_DATA PreparsedData ); typedef struct tag_writeReport { PUCHAR report; ULONG reportLen; struct tag_writeReport *next; } writeReport; typedef struct tag_deviceContext { HANDLE devHandle; BOOL readPending; PUCHAR report; LARGE_INTEGER dataLength; HIDP_CAPS hidCapabilities; PHIDP_VALUE_CAPS valueCaps; PHIDP_PREPARSED_DATA hidDescriptor; IO_STATUS_BLOCK ioStatusBlock; WORK_QUEUE_ITEM workItemRead; WORK_QUEUE_ITEM workItemWrite; WORK_QUEUE_ITEM workItemClose; UINT buttonListLength; PUSAGE buttonValues; WCHAR deviceFileName[(MAXIMUM_FILENAME_LENGTH*sizeof(WCHAR))+sizeof(UNICODE_NULL)]; writeReport *writeReportQueue; VMM_SEMAPHORE writeReportQueueSemaphore; struct tag_deviceContext *next; } deviceContext; #ifdef DEBUG extern UINT dbgOpt; #define DBGOUT(msg_in_parens) if (dbgOpt) { _Debug_Printf_Service("\r\nVXDCLNT> "); _Debug_Printf_Service msg_in_parens; _Debug_Printf_Service("\r\n"); } #define DBGERR(msg_in_parens) { _Debug_Printf_Service("\r\n *** VXDCLNT ERROR *** \r\nVXDCLNT> "); _Debug_Printf_Service msg_in_parens; _Debug_Printf_Service("\r\n"); } #define DBGBREAK() { _asm { int 3 } } #else #define DBGOUT(msg_in_parens) #define DBGERR(msg_in_parens) #define DBGBREAK() #endif _inline VOID Signal_Semaphore_No_Switch(VMM_SEMAPHORE sem) { _asm mov eax, [sem] VMMCall(Signal_Semaphore_No_Switch) } VOID ReadCompletion(IN PVOID Context, IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved); VOID VMDPostPointerMessage(LONG deltaX, LONG deltaY, ULONG Buttons, ULONG Wheel); VOID VMDPostAbsolutePointerMessage(LONG deltaX, LONG deltaY, ULONG Buttons); VOID WorkItemCallback_Read(PVOID context); VOID WorkItemCallback_Write(PVOID context); VOID WorkItemCallback_Open(PVOID context); VOID WorkItemCallback_Close(PVOID context); VOID ConnectNTDeviceDrivers(); VOID _cdecl DispatchNtReadFile(deviceContext *device); extern BOOL ShutDown; extern t_pHidP_GetUsageValue pHidP_GetUsageValue; extern t_pHidP_GetScaledUsageValue pHidP_GetScaledUsageValue; extern t_pHidP_SetUsages pHidP_SetUsages; extern t_pHidP_GetUsages pHidP_GetUsages; extern t_pHidP_MaxUsageListLength pHidP_MaxUsageListLength; extern t_pIoGetDeviceClassAssociations pIoGetDeviceClassAssociations; extern t_pHidP_GetCaps pHidP_GetCaps; extern t_pHidP_GetValueCaps pHidP_GetValueCaps;