windows-nt/Source/XPSP1/NT/drivers/wdm/input/client/hidserv/hidserv.h
2020-09-26 16:20:57 +08:00

558 lines
19 KiB
C

/*++
*
* Component: hidserv.dll
* File: hidaudio.h
* Purpose: main application header
*
* Copyright (C) Microsoft Corporation 1997,1998. All rights reserved.
*
* WGJ
--*/
#ifndef _HIDSERV_H_
#define _HIDSERV_H_
////
/// Defines
//
#define STRICT
#ifndef GLOBALS
#define GLOBALS extern
#define EQU ; / ## /
#else
#define EQU =
#endif //GLOBALS
#define HIDSERV_USAGE_PAGE 0x0c
// default step size is 4% of max volume.
#define DEFAULT_STEP ((int)(65535/25))
#define MAX_BUTTON_LIST 10
// APP messages
#define WM_HIDSERV_START (WM_APP+301)
#define WM_HIDSERV_STOP (WM_APP+302)
#define WM_HIDSERV_REPORT_DISPATCH (WM_APP+304)
#define WM_HIDSERV_SERVICE_REQUEST (WM_APP+305)
#define WM_HIDSERV_INPUT_CLIENT (WM_APP+306)
#define WM_HIDSERV_MEDIAFOCUS_CLIENT (WM_APP+307)
#define WM_HIDSERV_SETMEDIAFOCUS (WM_APP+308)
#define WM_HIDSERV_MEDIAFOCUS_NOTIFY (WM_APP+309)
#define WM_HIDSERV_PNP_HID (WM_APP+310)
#if WIN95_BUILD
#define WM_HIDSERV_STOP_DEVICE (WM_APP+311)
#endif // WIN95_BUILD
#define WM_CUSTOM_USAGE (WM_APP+313)
// CInput Messages
//
#define WM_CI_USAGE (WM_APP+314)
#define WM_CI_MEDIA_FOCUS (WM_APP+315)
#define WM_CI_DEVICE_CHANGE (WM_APP+316)
#define TIMERID_BASE 3
#define TIMERID_TOP 22
#define TIMERID_VOLUMEUP 3
#define TIMERID_VOLUMEDN 4
#define TIMERID_BASSUP 5
#define TIMERID_BASSDN 6
#define TIMERID_TREBLEUP 7
#define TIMERID_TREBLEDN 8
#define TIMERID_APPBACK 9
#define TIMERID_APPFORWARD 10
#define TIMERID_PREVTRACK 11
#define TIMERID_NEXTTRACK 12
#define TIMERID_VOLUMEUP_VK 13
#define TIMERID_VOLUMEDN_VK 14
#define TIMERID_KEYPAD_LPAREN 15
#define TIMERID_KEYPAD_RPAREN 16
#define TIMERID_KEYPAD_AT 17
#define TIMERID_KEYPAD_EQUAL 18
#define TIMERID_CHANNELUP 19
#define TIMERID_CHANNELDOWN 20
#define TIMERID_FF 21
#define TIMERID_RW 22
#define MAX_MEDIA_TYPES 33
#define MAX_CLIENTS 16
#define MAX_USAGE_LIST 32
#define MAX_PENDING_BUTTONS 16
#define MakeLongUsage(c,u) ((ULONG)(c<<16) | (u))
#define SET_SERVICE_STATE(Status) if(hService){ ServiceStatus.dwCurrentState = Status; \
SetServiceStatus(hService, &ServiceStatus);}
////
/// Includes
//
#include <windows.h>
#include <windowsx.h>
#include <winuser.h>
#include <shellapi.h>
#include <mmsystem.h>
#include <math.h>
#include <basetyps.h>
#include <wtypes.h>
#include <setupapi.h>
#include <hidsdi.h>
#include <dbt.h>
#include <regstr.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
// Local includes
#include "hid.h"
#include "list.h"
#include "dbg.h"
//
// Calculate the address of the base of the structure given its type, and an
// address of a field within the structure.
//
#define ContainingRecord(address, type, field) ((type *)( \
(PCHAR)(address) - \
(PCHAR)(&((type *)0)->field)))
// Data Types
//
typedef unsigned long CI_CLIENT_ID;
typedef UINT_PTR OOC_STATE;
typedef struct _Pending_Button{
USAGE Collection;
USAGE Page;
USAGE Usage;
} PENDING_BUTTON, *PPENDING_BUTTON;
typedef LONG (WINAPI *WINSTATIONSENDWINDOWMESSAGE)
(HANDLE hServer,
ULONG sessionID,
ULONG timeOut,
ULONG hWnd,
ULONG Msg,
WPARAM wParam,
LPARAM lParam,
LONG *pResponse);
////
/// Globals
//
// Linked list of current hid devices
GLOBALS LIST_NODE HidDeviceList;
GLOBALS BOOL PnpEnabled EQU FALSE;
GLOBALS HDEVNOTIFY hNotifyArrival EQU 0;
// This timeout (150ms) is selected to allow the control to cover the range
// (25 steps) in about 5 sec..
GLOBALS UINT INITIAL_WAIT EQU 500;
GLOBALS UINT REPEAT_INTERVAL EQU 150;
// The instance and hwnd for the main thread.
GLOBALS HANDLE hInstance EQU 0;
GLOBALS HWND hWndHidServ EQU 0;
// how many threads are active?
GLOBALS ULONG cThreadRef EQU 0;
// Access to OOC state data is mutex protected.
GLOBALS OOC_STATE OOC_State[TIMERID_TOP-TIMERID_BASE+1];
GLOBALS HANDLE hMutexOOC EQU 0;
GLOBALS PENDING_BUTTON PendingButtonList[MAX_PENDING_BUTTONS];
// NT Service data
GLOBALS SERVICE_STATUS_HANDLE hService EQU 0;
GLOBALS TCHAR HidservServiceName[] EQU TEXT("HidServ");
GLOBALS SERVICE_STATUS ServiceStatus;
// The event signalling that there is input to send.
GLOBALS HANDLE hInputEvent;
GLOBALS HANDLE hDesktopSwitch;
GLOBALS HANDLE hInputDoneEvent;
GLOBALS BOOLEAN InputIsAppCommand;
GLOBALS BOOLEAN InputIsChar;
GLOBALS UCHAR InputVKey;
GLOBALS SHORT InputDown;
GLOBALS USHORT InputAppCommand;
GLOBALS BOOL InputThreadEnabled;
GLOBALS DWORD InputThreadId;
GLOBALS DWORD MessagePumpThreadId;
GLOBALS ULONG InputSessionId;
GLOBALS BOOLEAN InputSessionLocked;
GLOBALS HINSTANCE WinStaDll;
GLOBALS WINSTATIONSENDWINDOWMESSAGE WinStaProc;
/*
WinStationSendWindowMessage(
SERVERNAME_CURRENT, // global server handle
InputSessionId, // session id
5, // wait in seconds
NULL, // handle of destination window
Down ? WM_KEYDOWN : WM_KEYUP,
Vkey, // wParam
1, // lParam - input is char
NULL); // No response
*/
#define CrossSessionWindowMessage(m, w, l) \
if (WinStaProc) { LONG response; \
WinStaProc (NULL, InputSessionId, 5, HandleToUlong(hWndHidServ), (m), (w), (l), &response); }
#define OOC(_x_) OOC_State[_x_ - TIMERID_BASE]
////
/// Prototypes
//
//hidaudio.c
DWORD
WINAPI
HidServMain(
HANDLE InitDoneEvent
);
DWORD
WINAPI
ThreadMain(
HWND hwnd,
HINSTANCE hInst,
LPSTR szCmd,
int nShow
);
BOOL
HidServInit(
void
);
void
HidServExit(
void
);
DWORD
WINAPI
HidThreadProc(
PHID_DEVICE HidDevice
);
DWORD
WINAPI
HidThreadInputProc(
PVOID Ignore
);
DWORD
WINAPI
HidMessagePump(
PVOID Ignore
);
VOID
HidFreeDevice(PHID_DEVICE HidDevice);
BOOL
UsageInList(
PUSAGE_AND_PAGE pUsage,
PUSAGE_AND_PAGE pUsageList
);
void
CustomUsageDispatch(
USAGE Collection,
USAGE Usage,
LONG Data
);
void
HidServReportDispatch(
PHID_DEVICE HidDevice
);
VOID
VolumeTimerHandler(
WPARAM TimerID
);
void
HidServUpdate(
DWORD LongUsage,
DWORD Value
);
BOOL
DeviceChangeHandler(
WPARAM wParam,
LPARAM lParam
);
LRESULT CALLBACK HidServProc(
HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam
);
//
// Media Types
#define CInput_MediaType_None (0x00000000) // actually ALL media types, but with low priority
#define CInput_MediaType_Software (0x00000001) // Virtual, or software devices (player does not use a hrdware medium)
#define CInput_MediaType_System (0x00000002) // The "system" device, Windows itself is a media type
#define CInput_MediaType_CD (0x00000004)
#define CInput_MediaType_DVD (0x00000008)
#define CInput_MediaType_TV (0x00000010)
#define CInput_MediaType_WWW (0x00000020)
#define CInput_MediaType_Telephone (0x00000040)
#define CInput_MediaType_ProgramGuide (0x00000080)
#define CInput_MediaType_VideoPhone (0x00000100)
#define CInput_MediaType_Games (0x00000200)
#define CInput_MediaType_Messages (0x00000400)
#define CInput_MediaType_VCR (0x00000800)
#define CInput_MediaType_Tuner (0x00001000)
#define CInput_MediaType_Tape (0x00002000)
#define CInput_MediaType_Cable (0x00004000)
#define CInput_MediaType_Satellite (0x00008000)
#define CInput_MediaType_Security (0x00010000)
#define CInput_MediaType_Home (0x00020000)
#define CInput_MediaType_Call (0x00040000)
#define CInput_MediaType_Speakers (0x00080000)
#define CInput_MediaType_All (0xffffffff)
#define CInputUsage_NULL ((USAGE) 0x0000)
#define CInputUsage_RANGE ((USAGE) 0xFFFF)
//
// Collections
#define CInputCollection_Consumer_Control ((USAGE) 0x0001)
#define CInputCollection_Numeric_Key_Pad ((USAGE) 0x0002)
#define CInputCollection_Function_Buttons ((USAGE) 0x0036)
#define CInputCollection_Selection ((USAGE) 0x0080)
#define CInputCollection_Media_Selection ((USAGE) 0x0087)
#define CInputCollection_Select_Disc ((USAGE) 0x00BA)
#define CInputCollection_Playback_Speed ((USAGE) 0x00F1)
//
// Media Selection
#define CInput_Media_Select_Computer ((USAGE) 0x0088)
#define CInput_Media_Select_TV ((USAGE) 0x0089)
#define CInput_Media_Select_WWW ((USAGE) 0x008A)
#define CInput_Media_Select_DVD ((USAGE) 0x008B)
#define CInput_Media_Select_Telephone ((USAGE) 0x008C)
#define CInput_Media_Select_Program_Guide ((USAGE) 0x008D)
#define CInput_Media_Select_Video_Phone ((USAGE) 0x008E)
#define CInput_Media_Select_Games ((USAGE) 0x008F)
#define CInput_Media_Select_Messages ((USAGE) 0x0090)
#define CInput_Media_Select_CD ((USAGE) 0x0091)
#define CInput_Media_Select_VCR ((USAGE) 0x0092)
#define CInput_Media_Select_Tuner ((USAGE) 0x0093)
#define CInput_Media_Select_Tape ((USAGE) 0x0096)
#define CInput_Media_Select_Cable ((USAGE) 0x0097)
#define CInput_Media_Select_Satellite ((USAGE) 0x0098)
#define CInput_Media_Select_Security ((USAGE) 0x0099)
#define CInput_Media_Select_Home ((USAGE) 0x009A)
#define CInput_Media_Select_Call ((USAGE) 0x009B)
////////////////////////////////////
// General Usages
//
#define CInputUsage_Plus_10 ((USAGE) 0x0020)
#define CInputUsage_Plus_100 ((USAGE) 0x0021)
#define CInputUsage_AM_PM ((USAGE) 0x0022)
// device control
#define CInputUsage_Power ((USAGE) 0x0030)
#define CInputUsage_Reset ((USAGE) 0x0031)
#define CInputUsage_Sleep ((USAGE) 0x0032)
#define CInputUsage_Sleep_After ((USAGE) 0x0033)
#define CInputUsage_Sleep_Mode ((USAGE) 0x0034)
#define CInputUsage_Illumination ((USAGE) 0x0035)
// menu
#define CInputUsage_Menu ((USAGE) 0x0040)
#define CInputUsage_Menu_Pick ((USAGE) 0x0041)
#define CInputUsage_Menu_Up ((USAGE) 0x0042)
#define CInputUsage_Menu_Down ((USAGE) 0x0043)
#define CInputUsage_Menu_Left ((USAGE) 0x0044)
#define CInputUsage_Menu_Right ((USAGE) 0x0045)
#define CInputUsage_Menu_Escape ((USAGE) 0x0046)
#define CInputUsage_Menu_Value_Increase ((USAGE) 0x0047)
#define CInputUsage_Menu_Value_Decrease ((USAGE) 0x0048)
// video display
#define CInputUsage_Data_On_Screen ((USAGE) 0x0060)
#define CInputUsage_Closed_Caption ((USAGE) 0x0061)
#define CInputUsage_Closed_Caption_Select ((USAGE) 0x0062)
#define CInputUsage_VCR_TV ((USAGE) 0x0063)
#define CInputUsage_Broadcast_Mode ((USAGE) 0x0064)
#define CInputUsage_Snapshot ((USAGE) 0x0065)
#define CInputUsage_Still ((USAGE) 0x0066)
// broadcast/cable
#define CInputUsage_Assign_Selection ((USAGE) 0x0081)
#define CInputUsage_Mode_Step ((USAGE) 0x0082)
#define CInputUsage_Recall_Last ((USAGE) 0x0083)
#define CInputUsage_Enter_Channel ((USAGE) 0x0084)
#define CInputUsage_Order_Movie ((USAGE) 0x0085)
#define CInputUsage_Channel ((USAGE) 0x0086)
// app control
#define CInputUsage_Quit ((USAGE) 0x0094)
#define CInputUsage_Help ((USAGE) 0x0095)
// channel
#define CInputUsage_Channel_Increment ((USAGE) 0x009C)
#define CInputUsage_Channel_Decrement ((USAGE) 0x009D)
// vcr control
#define CInputUsage_VCR_Plus ((USAGE) 0x00A0)
#define CInputUsage_Once ((USAGE) 0x00A1)
#define CInputUsage_Daily ((USAGE) 0x00A2)
#define CInputUsage_Weekly ((USAGE) 0x00A3)
#define CInputUsage_Monthly ((USAGE) 0x00A4)
// transport control
#define CInputUsage_Play ((USAGE) 0x00B0)
#define CInputUsage_Pause ((USAGE) 0x00B1)
#define CInputUsage_Record ((USAGE) 0x00B2)
#define CInputUsage_Fast_Forward ((USAGE) 0x00B3)
#define CInputUsage_Rewind ((USAGE) 0x00B4)
#define CInputUsage_Scan_Next_Track ((USAGE) 0x00B5)
#define CInputUsage_Scan_Previous_Track ((USAGE) 0x00B6)
#define CInputUsage_Stop ((USAGE) 0x00B7)
#define CInputUsage_Eject ((USAGE) 0x00B8)
#define CInputUsage_Random_Play ((USAGE) 0x00B9)
// advanced transport control
#define CInputUsage_Enter_Disc ((USAGE) 0x00BB)
#define CInputUsage_Repeat ((USAGE) 0x00BC)
#define CInputUsage_Tracking ((USAGE) 0x00BD)
#define CInputUsage_Track_Normal ((USAGE) 0x00BE)
#define CInputUsage_Slow_Tracking ((USAGE) 0x00BF)
#define CInputUsage_Frame_Forward ((USAGE) 0x00C0)
#define CInputUsage_Frame_Back ((USAGE) 0x00C1)
#define CInputUsage_Mark ((USAGE) 0x00C2)
#define CInputUsage_Clear_Mark ((USAGE) 0x00C3)
#define CInputUsage_Repeat_From_Mark ((USAGE) 0x00C4)
#define CInputUsage_Return_To_Mark ((USAGE) 0x00C5)
#define CInputUsage_Search_Mark_Forward ((USAGE) 0x00C6)
#define CInputUsage_Search_Mark_Backwards ((USAGE) 0x00C7)
#define CInputUsage_Counter_Reset ((USAGE) 0x00C8)
#define CInputUsage_Show_Counter ((USAGE) 0x00C9)
#define CInputUsage_Tracking_Increment ((USAGE) 0x00CA)
#define CInputUsage_Tracking_Decrement ((USAGE) 0x00CB)
#define CInputUsage_Stop_Eject ((USAGE) 0x00CC)
#define CInputUsage_Play_Pause ((USAGE) 0x00CD)
#define CInputUsage_Play_Skip ((USAGE) 0x00CE)
// audio
#define CInputUsage_Volume ((USAGE) 0x00E0)
#define CInputUsage_Balance ((USAGE) 0x00E1)
#define CInputUsage_Mute ((USAGE) 0x00E2)
#define CInputUsage_Bass ((USAGE) 0x00E3)
#define CInputUsage_Treble ((USAGE) 0x00E4)
#define CInputUsage_Bass_Boost ((USAGE) 0x00E5)
#define CInputUsage_Surround_Mode ((USAGE) 0x00E6)
#define CInputUsage_Loudness ((USAGE) 0x00E7)
#define CInputUsage_MPX ((USAGE) 0x00E8)
#define CInputUsage_Volume_Increment ((USAGE) 0x00E9)
#define CInputUsage_Volume_Decrement ((USAGE) 0x00EA)
// advanced vcr control
#define CInputUsage_Speed_Select ((USAGE) 0x00F0)
#define CInputUsage_Standard_Play ((USAGE) 0x00F2)
#define CInputUsage_Long_Play ((USAGE) 0x00F3)
#define CInputUsage_Extended_Play ((USAGE) 0x00F4)
#define CInputUsage_Slow ((USAGE) 0x00F5)
// advanced device control
#define CInputUsage_Fan_Enable ((USAGE) 0x0100)
#define CInputUsage_Fan_Speed ((USAGE) 0x0101)
#define CInputUsage_Light_Enable ((USAGE) 0x0102)
#define CInputUsage_Illumination_Level ((USAGE) 0x0103)
#define CInputUsage_Climate_Control_Enable ((USAGE) 0x0104)
#define CInputUsage_Room_Temperature ((USAGE) 0x0105)
#define CInputUsage_Security_Enable ((USAGE) 0x0106)
#define CInputUsage_Fire_Alarm ((USAGE) 0x0107)
#define CInputUsage_Police_Alarm ((USAGE) 0x0108)
// suppl. audio
#define CInputUsage_Balance_Right ((USAGE) 0x0150)
#define CInputUsage_Balance_Left ((USAGE) 0x0151)
#define CInputUsage_Bass_Increment ((USAGE) 0x0152)
#define CInputUsage_Bass_Decrement ((USAGE) 0x0153)
#define CInputUsage_Treble_Increment ((USAGE) 0x0154)
#define CInputUsage_Treble_Decrement ((USAGE) 0x0155)
#define CInputUsage_MS_Bass_Up ((USAGE) 0x0169)
#define CInputUsage_MS_Bass_Down ((USAGE) 0x0169)
#define CInputUsage_MS_Bass_Page ((USAGE) 0xff00)
// App Launch
#define CInputUsage_Launch_Configuration ((USAGE) 0x0183)
#define CInputUsage_Launch_Email ((USAGE) 0x018A)
#define CInputUsage_Launch_Calculator ((USAGE) 0x0192)
#define CInputUsage_Launch_Browser ((USAGE) 0x0194)
// App Commands
#define CInputUsage_App_Help ((USAGE) 0x0095)
#define CInputUsage_App_Spell_Check ((USAGE) 0x01AB)
#define CInputUsage_App_New ((USAGE) 0x0201)
#define CInputUsage_App_Open ((USAGE) 0x0202)
#define CInputUsage_App_Close ((USAGE) 0x0203)
#define CInputUsage_App_Save ((USAGE) 0x0207)
#define CInputUsage_App_Print ((USAGE) 0x0208)
#define CInputUsage_App_Undo ((USAGE) 0x021A)
#define CInputUsage_App_Copy ((USAGE) 0x021B)
#define CInputUsage_App_Cut ((USAGE) 0x021C)
#define CInputUsage_App_Paste ((USAGE) 0x021D)
#define CInputUsage_App_Find ((USAGE) 0x021F)
#define CInputUsage_App_Search ((USAGE) 0x0221)
#define CInputUsage_App_Home ((USAGE) 0x0223)
#define CInputUsage_App_Back ((USAGE) 0x0224)
#define CInputUsage_App_Forward ((USAGE) 0x0225)
#define CInputUsage_App_Stop ((USAGE) 0x0226)
#define CInputUsage_App_Refresh ((USAGE) 0x0227)
#define CInputUsage_App_Previous ((USAGE) 0x0228)
#define CInputUsage_App_Next ((USAGE) 0x0229)
#define CInputUsage_App_Bookmarks ((USAGE) 0x022A)
#define CInputUsage_App_Redo ((USAGE) 0x0279)
#define CInputUsage_App_Reply_To_Mail ((USAGE) 0x0289)
#define CInputUsage_App_Forward_Mail ((USAGE) 0x028B)
#define CInputUsage_App_Send_Mail ((USAGE) 0x028C)
// Keyboard/Keypad
#define CInputUsage_Keypad_Equals ((USAGE) 0x0067)
#define CInputUsage_Keypad_LParen ((USAGE) 0x00B6)
#define CInputUsage_Keypad_RParen ((USAGE) 0x00B7)
#define CInputUsage_Keypad_At ((USAGE) 0x00CE)
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif // _HIDSERV_H_