windows-nt/Source/XPSP1/NT/drivers/wdm/input/legacy/hidgame/hidgame.rtf

682 lines
66 KiB
Plaintext
Raw Normal View History

2020-09-26 03:20:57 -05:00
{\rtf1\ansi \deff0\deflang1033
{\fonttbl
{\f0\froman Times New Roman;}
{\f2\fswiss Arial;}
{\f19\fmodern\fcharset0\fprq1 Courier New;}
}
{\colortbl;
\red0\green0\blue0;
\red0\green0\blue255;
\red0\green255\blue255;
\red0\green255\blue0;
\red255\green0\blue255;
\red255\green0\blue0;
\red255\green255\blue0;
\red255\green255\blue255;
\red0\green0\blue127;
\red0\green127\blue127;
\red0\green127\blue0;
\red127\green0\blue127;
\red127\green0\blue0;
\red127\green127\blue0;
\red127\green127\blue127;
\red192\green192\blue192;
}
{\stylesheet
{\s243\li-1800\sl-210\tqr\tx6960 \b\f2\fs19\lang1033 header;}
{\s251\sb160\sa40\sl-280\keepn \b\f2\lang1033 heading 4;}
{\s252\sb160\sa40\sl-340\keepn \b\f2\fs30\lang1033 heading 3;}
{\s253\li-1800\sb160\sa60\sl-380\keepn \b\f0\fs34\lang1033 heading 2;}
{\s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 heading 1;}
{\*\cs10 \additive Default Paragraph Font;}
{\sa160\sl240 \fs21\lang1033 Normal;}
{\s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 Ex;}
{\s44\li-1770\ri30\sb50\sl-80\brdrt\brdrs\brdrw15\brdrcf2 \fs12\lang1033 header rule;}
{\s45\li-1800\sa180\sl-440\keepn\tx0 \b\f2\fs40\up8\lang1033 Rh1;}
{\s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Rmh;}
{\s50\sl-240\keepn \f0\fs21\lang1033 Term1;}
{\s53\li280\sl-240\keepn \f0\fs21\lang1033 Term2;}
{\s54\li280\sa80\sl-240 \f0\fs21\lang1033 Def1;}
{\s55\li560\sa80\sl-240 \f0\fs21\lang1033 Def2;}
{\s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 Rule;}
{\s93\sl240 \fs21\lang1033
Index Link;}
{\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 Table Text;}
}
\paperw12240\paperh15840\margl3330\margr1530\margt-2540\margb-2220\gutter420
\facingp\deftab280\widowctrl\ftnbj
\sectd \binfsxn1\binsxn1\linex0\headery1990\footery360\endnhere\titlepg
{\headerl \pard\plain \s243\li-1800\sl-210\tqr\tx6960 \b\f2\fs19\lang1033
{\field\flddirty{\*\fldinst PAGE}{\fldrslt 4}}{\expnd50 }Autodoc Output - 03/24/99\par
\pard\plain \s44\li-1770\ri30\sb50\sl-80\brdrt\brdrs\brdrw15\brdrcf2 \fs12\lang1033 \par }
{\headerr \pard\plain \s243\li-1800\sl-210\tqr\tx6960 \b\f2\fs19\lang1033
\tab Autodoc Output - 03/24/99{\expnd50 }
{\field\flddirty{\*\fldinst PAGE}{\fldrslt 3}}
\par \pard\plain \s44\li-1770\ri30\sb50\sl-80\brdrt\brdrs\brdrw15\brdrcf2 \fs12\lang1033
\par }
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 Module HidGame\par
\pard\plain \sa160\sl240 \fs21\lang1033 Filename: C:/NTDDK/SRC/WDM/HID/HIDGAME/HIDGAME.H\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Description\par
\pard\plain \sa160\sl240 \fs21\lang1033 Analog WDM/HID Joystick driver.\par
HidGame is the HID minidriver for analog joysticks.
This driver registers with the HID class driver and
responds to IRPs put out by HIDclass. It informs HIDClass
about the capabilities of the joystick and polls the joystick
in response to a read IOCTL.\par
This driver is loaded in reponse to a "New hardware Found"
PnP event, and consequently must have an entry in an inf file
that binds a PnP hardware ID to this driver.\par
Gameport joysticks are not true PnP devices, so the user has to
inform the system about the joystick that was added to the
gameport by using the Game Controllers CPL "Add" a joystick.
An example of how a new joystick type can be created is provided
in the accompanying inf file.\par
Once a user selects a joystick and gameport, the GameCPL passes
this information to DirectInput which sends an IOCTL to the
gameport bus driver (GameEnum), specifying the number of axes,
buttons and a PnPHardware ID for the joystick. The Gameport Bus
informs PnP of a new device arrival. PnP searches the system for
a match for the hardwareID and loads the appropriate driver.\par
The following files are part of this driver.\par
\line HidGame.c
\line DriverEntry, CreateClose, AddDevice and Unload Routines.
This code performs functions required for any device driver
and so can probably be used without changes for any game
other game device.\par
\line PnP.c
\line Support routines for PnP IOCTLs.\par
\line Ioctl.c
\line Support routines for Non PnP IOCTLs
These deal with all the HID IOCTLs required for an ordinary
game device and so could be used without change as there is
no analog specific funtionality in these routines.
Drivers for some devices may need to add code to support more
complex devices.\par
\line HidJoy.c
\line Support routines to translate legacy joystick flags and
data into HID descriptors. The majority of this code is
needed to support the wide variety of analog joysticks
available so is not relevant to drivers written for specific
devices.\par
\line Poll.c
\line Support routines to read analog joystick data from a
gameport. These functions are likely to be of little use
in a digital joystick driver.\par
\line i386\\timing.c
\line Support routines to use x86 Time Stamp Counter.
Includes code to check for the presence of, calibrate and
read the high speed CPU timer.\par
\line Hidgame.h
\line Common include file.
The general definitions are likely to be of use in most
drivers for game devices but some customization will be needed.\par
\line Debug.h
\line Definitions to aid debugging.
This contains the tag for the driver name used in debug output
which must be changed.\par
\line Analog.h
\line Specific include file.
Definitions specific to analog joystick devices.\par
\line OemSetup.inf
\line Sample inf file.
See comments in this file for how to install devices.\par
\line Source
\line Source file for the NT build utility\par
\line Makefile
\line Used as part of the build process\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 DriverEntry\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b DriverEntry(}{\b IN PDRIVER_OBJECT} {\i DeviceObject}{\b , IN PUNICODE_STRINT} {\i RegistryPath}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Installable driver initialization entry point.
\line This entry point is called directly by the I/O system.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidgame.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the driver object\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i RegistryPath}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to a unicode string representing the path,
to driver-specific key in the registry.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 ???\cell returned HidRegisterMinidriver()\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_AddDevice\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_AddDevice(}{\b IN PDRIVER_OBJECT} {\i DeviceObject}{\b , IN PDEVICE_OBJECT} {\i FunctionalDeviceObject}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Called by hidclass, allows us to initialize our device extensions.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidgame.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the driver object\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i FunctionalDeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to a functional device object created by hidclass.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_ChangeHandler\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b VOID} {\b HGM_ChangeHandler(}{\b IN OUT PDEVICE_EXTENSION} {\i DeviceExtension}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Use IOCTL_GAMEENUM_EXPOSE_SIBLING and IOCTL_GAMEENUM_REMOVE_SELF
to change the attributes of the device.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidjoy.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceExtension}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the mini-driver device extension.\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_CreateClose\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_CreateClose(}{\b IN PDRIVER_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Process the create and close IRPs sent to this device.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidgame.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the driver object\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O Request Packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_INVALID_PARAMETER\cell Irp not handled\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_DeviceChanged\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b VOID} {\b HGM_DeviceChanged(}{\b IN OUT PDEVICE_EXTENSION} {\i DeviceExtension}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Start the process of changing the device attributes by stashing
away all the data needed and then initializing and queuing a work
item to call the IOCTL at the required PASSIVE_LEVEL.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidjoy.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceExtension}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the mini-driver device extension.\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_DriverInit\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b VOID} {\b HGM_DriverInit(void}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Perform global initialization.
\line This is called from DriverEntry. Try to initialize a CPU specific
timer but if it fails set up default\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidjoy.c\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_Game2HID\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b VOID} {\b HGM_Game2HID(}{\b IN PDEVICE_EXTENSION} {\i DeviceExtension}{\b , IN OUT PUHIDGAME_INPUT_DATA} {\i pHIDData}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Process the data returned from polling the gameport into values
and buttons for returning to HID.
\line The meaning of the data is interpreted according to the
characteristics of the device described in the hardware settings
flags.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidjoy.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceExtension}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the mini-driver device extension.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i pHIDData}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the buffer into which the HID report should be written.
This buffer must be assumed to be unaligned.\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_GenerateReport\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_GenerateReport(}{\b IN PDEVICE_OBJECT} {\i DeviceObject}{\b , IN OUT UCHAR *} {\i rgGameReport[MAXBYTES_GAME_REPORT]}{\b , OUT PUSHORT} {\i pCbReport}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Generates a hid report descriptor for a n-axis, m-button joystick,
depending on number of buttons and joy_hws_flags field.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidjoy.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device object\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i rgGameReport[MAXBYTES_GAME_REPORT]}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Array that receives the HID report descriptor\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i pCbReport}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Address of a short integer that receives size of
HID report descriptor.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_BUFFER_TOO_SMALL\cell Need more memory for HID descriptor\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_GetAttributes\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_GetAttributes(}{\b IN PDRIVER_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Respond to IOCTL_HID_GET_ATTRIBUTES, by filling
the HID_DEVICE_ATTRIBUTES struct\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/ioctl.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the driver object\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O Request Packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 ???\cell ???\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_GetDeviceDescriptor\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_GetDeviceDescriptor(}{\b IN PDRIVER_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Respond to HIDCLASS IOCTL_HID_GET_DEVICE_DESCRIPTOR
by returning a device descriptor\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/ioctl.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the driver object\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O Request Packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_BUFFER_TOO_SMALL\cell need more memory\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_GetReportDescriptor\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_GetReportDescriptor(}{\b IN PDRIVER_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Respond to HIDCLASS IOCTL_HID_GET_REPORT_DESCRIPTOR
by returning appropriate the report descriptor\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/ioctl.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the driver object\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O Request Packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 ???\cell ???\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_GetResources\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_GetResources(}{\b IN PDEVICE_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Gets gameport resource information from the GameEnum driver\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/pnp.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device object.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O request packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 ???\cell Return from IoCallDriver()\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_InitAnalog\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_InitAnalog(}{\b IN PDEVICE_OBJECT} {\i DeviceObject}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Check that the configuration is valid whilst there is still time
to refuse it.
\line Detect and validate sibling relationships and call
HGM_JoystickConfig for the rest of the work.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidjoy.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device object\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_DEVICE_CONFIGURATION_ERROR\cell Invalid configuration specified\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_InitDevice\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_InitDevice(}{\b IN PDEVICE_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Get the device information and attempt to initialize a configuration
for a device. If we cannot identify this as a valid HID device or
configure the device, our start device function is failed.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/pnp.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device object.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O request packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_DEVICE_CONFIGURATION_ERROR\cell Resources overlap\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 ???\cell Return from HGM_GetResources() or HGM_JoystickConfig()\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_InternalIoctl\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_InternalIoctl(}{\b IN PDRIVER_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Process the Control IRPs sent to this device.
\line This function cannot be pageable because reads/writes
can be made at dispatch-level\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/ioctl.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the driver object\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O Request Packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_NOT_SUPPORT\cell Irp function not supported\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 ???\cell ???\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_JoystickConfig\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_JoystickConfig(}{\b IN PDEVICE_OBJECT} {\i DeviceObject}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Check that the configuration is valid whilst there is still time
to refuse it.
\line HGM_GenerateReport uses the results generated here if the
settings are OK.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidjoy.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device object\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_DEVICE_CONFIGURATION_ERROR\cell Invalid configuration specified\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_MapAxesFromDevExt\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_MapAxesFromDevExt(}{\b IN OUT PDEVICE_EXTENSION} {\i DeviceExtension}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Use the flags in the DeviceExtension to generate mappings for each
axis.
\line This is called both from HGM_JoystickConfig to validate the
configuration and HGM_GenerateReport to use the axis maps.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidjoy.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceExtension}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the minidriver device extension\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_DEVICE_CONFIGURATION_ERROR\cell The configuration is invalid\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_PnP\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_PnP(}{\b IN PDEVICE_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Plug and Play dispatch routine for this driver.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/pnp.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device object.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O request packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_DELETE_PENDING\cell PnP IRP received after device was removed\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 ???\cell Return from IoCallDriver() or HGM_InitDevice()\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_PnPComplete\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_PnPComplete(}{\b IN PDEVICE_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Completion routine for PnP IRPs.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/pnp.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device object.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O request packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_MORE_PROCESSING_REQUIRED\cell We want the IRP back\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_Power\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_Power(}{\b IN PDEVICE_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 The power dispatch routine.
\line This driver does not recognize power IRPS. It merely sends them down,
unmodified to the next device on the attachment stack.
As this is a POWER irp, and therefore a special irp, special power irp
handling is required. No completion routine is required.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/pnp.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device object.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O request packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 ???\cell Return from PoCallDriver()\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_ReadReport\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_ReadReport(}{\b IN PDRIVER_OBJECT} {\i DeviceObject}{\b , IN PIRP} {\i Irp}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Poll the gameport, remap the axis and button data and package
into the defined HID report field.
\line This routine cannot be pageable as HID can make reads at
dispatch-level.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/ioctl.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the driver object\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Irp}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to an I/O Request Packet.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_DEVICE_NOT_CONNECTED\cell Device Failed to Quiesce
( not connected )\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_TIMEOUT\cell Could not determine exact transition time for
one or more axis but not a failure.\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_RemoveDevice\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b VOID} {\b HGM_RemoveDevice(}{\b IN PDEVICE_EXTENSION} {\i DeviceExtension}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 FDO Remove routine\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/pnp.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceExtension}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device extension.\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_SetupButtons\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_SetupButtons(}{\b IN OUT PDEVICE_EXTENSION} {\i DeviceExtension}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Use the flags in the DeviceExtension to check and set up buttons.
\line This is called both from HGM_JoystickConfig to validate the
configuration and HGM_GenerateReport to prepare for polling.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidjoy.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceExtension}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the minidriver device extension\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_DEVICE_CONFIGURATION_ERROR\cell The configuration is invalid\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_Unload\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b void} {\b HGM_Unload(}{\b IN PDRIVER_OBJECT} {\i DeviceObject}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Free all the allocated resources, etc.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/hidgame.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the driver object\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HGM_UpdateLatestPollData\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HGM_UpdateLatestPollData(}{\b IN OUT PDEVICE_EXTENSION} {\i DeviceExtension}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Do whatever polling is required and possible to update the
LastGoodAxis and LastGoodButton arrays in the DeviceExtension.
Handles synchronization and non-fatal errors.
\line This routine cannot be pageable as HID can make reads at
dispatch-level.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/poll.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceExtension}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device extension containing the data to be updated
and the functions and to use.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_DEVICE_CONFIGURATION_ERROR\cell Invalid configuration specified\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HidAnalogPoll\par
\pard \plain \sa160\sl240 \fs21\lang1033 {\b NTSTATUS} {\b HidAnalogPoll(}{\b IN PDEVICE_EXTENSION} {\i DeviceExtension}{\b , IN UCHAR} {\i resisitiveInputMask}{\b , IN BOOLEAN} {\i fApproximate}{\b , IN OUT ULONG} {\i Axis[MAX_AXES]}{\b , OUT UCHAR} {\i Button[PORT_BUTTONS]}{\b ) }\par
\pard\plain \sa160\sl240 \fs21\lang1033 Polling routine for analog joysticks.
\line Polls the analog device for position and button information.
The position information in analog devices is conveyed by the
duration of a pulse width. Each axis occupies one bit position.
The read operation is started by writing a value to the joystick
io address. Immediately thereafter we begin examing the values
returned and the elapsed time.\par
This sort of device has a few limitations:\par
First, button information is not latched by the device, so if a
button press which occurrs in between polls it will be lost.
There is really no way to prevent this short of devoting
the entire cpu to polling. In reality this does not cause a problem.\par
Second, since it is necessary to measure the duration of the axis pulse,
the most accurate results would be obtained using the smallest possible
sense loop and no interruptions of this loop.
The typical range of pulse lengths is from around 10 uSecs to 1500 uSecs
but depending on the joystick and gameport, this could extend to at least
8000 uSecs. Keeping interrupts disabled for this length of time causes
many problems, like modems losing connections to sound break ups.\par
Third, because each iteration of the poll loop requires an port read, the
speed of the loop is largely constrained by the speed of the IO bus.
This also means that when there is contention for the IO bus, the loop
will be slowed down. IO contention is usually caused by DMAs (or FDMAs)
which result in a significant slow down.\par
Forth, because of the previous two problems, the poll loop may be slowed
down or interrupted at any time so an external time source is needed to
measure the pulse width for each axis. The only cross-platform high
resolution timer is the read with KeQueryPerformanceCounter.
Unfortunately the implementation of this often uses a 1.18MHz 8253 timer
which requires 3 IO accesses to read, compounding the third problem and
even then, the result may need to be reread if the counters were in the
wrong state. Current CPUs have on board counters that can be used to
provide very accurate timing and more recent HAL implementations tend to
use these to implement KeQueryPerformanceCounter so this will be a problem
on less systems as time goes on. In the majority of cases, a poor
KeQueryPerformanceCounter implementation is made irrelevant by testing
for the availability of a CPU time stamp counter on Intel architechtures
and using it directly if it is available.\par
The algorithm implemented here is not the most obvious but works as
follows:\par
Once started, the axes read a value of one until the completion of their
pulse. The axes are the four lower bits in the byte read from the port.
The state of the axes in each iteration of the poll loop is therefore
represented as a value between 0 and 15. The important time for each
axis is the time at which it changes from 1 to 0. This is done by using
the value representing the state of the axes to index an array into which
time values are stored. For each axis, the duration of its pulse width is
the latest time stored in the array at an index with the bit for that axis
set. However since interrupts can occur at any time, it is not possible
to simultaneously read the port value and record that time in an atomic
operation the in each iteration, the current time is stored in two arrays,
one using the index before the time was recorded and the other using the
index after the time was recorded.
Once all the axes being monitored have become 0, or a timeout value is
reached, the data left in the arrays is analysed to find the best
estimate for the transition time for each axis. If the times before and
after the transition differ by too much, it is judged that an interrupt
must have occured so the last known good axis value is returned unless
that falls outside the range in which it is known that the transition
occured.\par
This routine cannot be pageable as HID can make reads at dispatch-level.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: c:/ntddk/src/wdm/hid/hidgame/poll.c\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Parameters\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i DeviceExtension}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Pointer to the device extension.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i resisitiveInputMask}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Mask that describes the axes lines that are to be polled\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i fApproximate}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Boolean value indicating if it is OK to approximate some
value of the current axis state with the last axis state
if polling was not successful (we took an interrput during polling)\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Axis[MAX_AXES]}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 The state of the axes. On entry the last axis state is passed
into this routine. If the fApproximate flag is turned on, we can
make use of the last axis state to "guess" the current axis state.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\i Button[PORT_BUTTONS]}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Receives the state of the buttons. 0x0 specifies the button is not
pressed and 0x1 indicates an armed button state.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Return Codes\par
\trowd \trgaph72\trleft-72 \cellx3078\cellx7038 \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_SUCCESS\cell success\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_DEVICE_NOT_CONNECTED\cell Device Failed to Quiesce
( not connected ) This is a failure code.\cell }\pard \intbl \row \pard\plain \intbl\s25\sa80\widctlpar\intbl \f4\fs21\lang1024 \sbasedon0\snext25 {\fs18 STATUS_TIMEOUT\cell Could not determine exact transition time for
one or more axis. This is a success code.\cell }\pard \intbl \row \pard\plain \li240\sa0\sl240 \f2\fs20\lang1033 \par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 ANALOG_DEVICE Structure\par
\pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 typedef struct \{\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab USHORT nAxes;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab USHORT nButtons;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab HIDGAME_OEM_DATA HidGameOemData;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab ULONG ScaledTimeout;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab ULONG ScaledThreshold;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab ULONG LastGoodAxis[MAX_AXES];\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab UCHAR LastGoodButton[PORT_BUTTONS];\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab int AxisMap[MAX_AXES];\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab int povMap;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab UCHAR resistiveInputMask;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab UCHAR bSiblingState;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab BOOLEAN fSiblingFound;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \} ANALOG_DEVICE;\par
\pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \par
\pard\plain \sa160\sl240 \fs21\lang1033 Analog Device specific data.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: C:/NTDDK/SRC/WDM/HID/HIDGAME/ANALOG.H\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Members\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b nAxes}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Number of axis this device has.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b nButtons}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Number of buttons this device has.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b HidGameOemData}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 The OEM Data field ( Contains joy_hws_dwFlags, vid & pid )\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b ScaledTimeout}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 The number value at which an axis is considered to be not present.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b ScaledThreshold}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 The minimum resolution of a polling cycle.
This is used to detect if we've been
pre-empted or interrupted during a polling loop.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b LastGoodAxis[MAX_AXES]}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Value of the axes on last good poll.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b LastGoodButton[PORT_BUTTONS]}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Value of the buttons on last good poll.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b AxisMap[MAX_AXES]}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Index of axes remapping.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b povMap}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Index of axis where POV is mapped.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b resistiveInputMask}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Resisitive Input mask.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b bSiblingState}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Indicates the state of an expose sibling\\remove self transition\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b fSiblingFound}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Set to true if this device has a sibling.\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 DEVICE_EXTENSION Structure\par
\pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 typedef struct \{\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab PGAMEENUM_READPORT ReadAccessor;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab PGAMEENUM_WRITEPORT WriteAccessor;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab PGAMEENUM_READPORT_DIGITAL ReadAccessorDigital;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab PGAMEENUM_ACQUIRE_PORT AcquirePort;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab PGAMEENUM_RELEASE_PORT ReleasePort;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab PVOID GameContext;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab PVOID PortContext;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab LIST_ENTRY Link;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab KEVENT RemoveEvent;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab LONG RequestCount;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab PDEVICE_OBJECT NextDeviceObject;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab WORK_QUEUE_ITEM WorkItem;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab ANALOG_DEVICE unnamed structure see ANALOG_DEVICE;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab BOOLEAN fRemoved;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab BOOLEAN fStarted;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab BOOLEAN fSurpriseRemoved;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \} DEVICE_EXTENSION;\par
\pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \par
\pard\plain \sa160\sl240 \fs21\lang1033 Device specific data.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: C:/NTDDK/SRC/WDM/HID/HIDGAME/HIDGAME.H\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Members\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b ReadAccessor}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Read Accessor function for the gameport. Obtained in the return from
IOCTL to the gameport.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b WriteAccessor}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Write Accessor function for the gameport. Obtained in the return from
IOCTL to the gameport.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b ReadAccessorDigital}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Digital read accessor for the gameport. Obtained as part of return from
IOCTL to the gameport\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b AcquirePort}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Function to call before reading/writing to the port. Obtained as
part of return from IOCTL to the gameport\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b ReleasePort}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Function to call when done reading/writing to the port. Obtained as
part of return from IOCTL to the gameport\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b GameContext}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Token to read this game port. Obtained as part of the return from
IOCTL to the gameport.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b PortContext}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Context to pass to AcquirePort and ReleasePort. Obtained as part
of the return from IOCTL to the gameport.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b Link}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Link to other hidgame devices on the system.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b RemoveEvent}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 The remove plugplay request must use this event to make sure all
other requests have completed before it deletes the device object.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b RequestCount}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Number of IRPs underway.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b NextDeviceObject}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 NOTE: Only present if CHANGE_DEVICE is defined\par
DeviceObject to send self created IRPs down to\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b WorkItem}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 NOTE: Only present if CHANGE_DEVICE is defined\par
Work item used for expose sibling/remove self\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b unnamed structure see ANALOG_DEVICE}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Structure containing analog device specific information.\par
NOTE: this structure is placed after the DWORD aligned elements.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b fRemoved}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Set to true if the device has been removed => all requests should be failed\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b fStarted}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Set to true is device has started.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b fSurpriseRemoved}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Set to true if the device has been surprise removed by PnPs device has started.\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 See Also\par \pard\plain \sa160\sl240 \fs21\lang1033 {\b ANALOG_DEVICE}.\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HIDGAME_GLOBAL Structure\par
\pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 typedef struct \{\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab FAST_MUTEX Mutex;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab LIST_ENTRY DeviceListHead;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab KSPIN_LOCK SpinLock;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab COUNTER_FUNCTION ReadCounter;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab ULONG CounterScale;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \} HIDGAME_GLOBAL;\par
\pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \par
\pard\plain \sa160\sl240 \fs21\lang1033 Global struct to store driver wide data.
Stuff we need to share across multiple instances of this driver.\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: C:/NTDDK/SRC/WDM/HID/HIDGAME/HIDGAME.H\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Members\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b Mutex}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Mutex to synchronize access to the following list entry\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b DeviceListHead}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Keeps a list of all devices.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b SpinLock}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Spinlock used to stop multiple processors polling gameports at
once. It would be better to keep a list of spinlocks, one for
each gameport but then processors could contend for IO access
and we'd have to maintain another list.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b ReadCounter}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Function to retrieve clock time\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b CounterScale}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 The scale to be used.\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 HIDGAME_INPUT_DATA Structure\par
\pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 typedef struct \{\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab ULONG Axis[MAX_AXES];\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab UCHAR hatswitch[2];\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab UCHAR Button[MAX_BUTTONS];\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \} HIDGAME_INPUT_DATA;\par
\pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \par
\pard\plain \sa160\sl240 \fs21\lang1033 Our HID reports always have 4 axis values (one of which may be a
polled POV), 2 digital POVs and 10 buttons.
Depending on the HWS flags and number of buttons some of the
fields will report constant data.\par
Note, this structure should be byte aligned so that the
sizeof(it) is the same as HID will calculate given the report
descriptor. (In this case it happens to be aligned anyway.)\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: C:/NTDDK/SRC/WDM/HID/HIDGAME/ANALOG.H\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Members\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b Axis[MAX_AXES]}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Axes data values.\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b hatswitch[2]}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 digital POVs (derived from button combos)\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b Button[MAX_BUTTONS]}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Button data values.\par
\pard\plain \s57\li-1770\ri30\sb280\sa250\sl-120\keepn\brdrb\brdrs\brdrw15\brdrcf2 \fs8\cf8\lang1033 \par
\pard\plain \s254\li-1800\sb200\sa80\sl-440\keepn \b\f0\fs40\lang1033 OEMDATA Structure\par
\pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 typedef struct \{\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab USHORT VID;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab USHORT PID;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab ULONG joy_hws_dwFlags;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab ULONG Timeout;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \tab ULONG Reserved;\par \pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \} OEMDATA;\par
\pard\plain \s28\sl-220\tx380\tx760\tx1140\tx1520\tx1900\tx2280\tx2660\tx3040\tx3420\tx3800 \f19\fs16\lang1033 \par
\pard\plain \sa160\sl240 \fs21\lang1033 OEMData is send to gameEnum as a parameter to IOCTL_EXPOSE_HARDWARE.
Defined as 8 DWORDS. We interpert them here\par
\pard\plain \sa160\sl240 \fs21\lang1033 Defined in: C:/NTDDK/SRC/WDM/HID/HIDGAME/ANALOG.H\par
\pard\plain \s46\sb20\sl-220\keepn\pvpara\phpg\posy0\absw1560\dxfrtext240\dfrmtxtx240\dfrmtxty240 \b\f2\fs21\lang1033 Members\par \pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b VID}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Vendor ID\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b PID}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Product ID\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b joy_hws_dwFlags}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 The dwFlags fields for the device ( Usually read from the registry )\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b Timeout}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Global timeout for device polling in micro seconds\par
\pard\plain \s50\sl-240\keepn \f0\fs21\lang1033 {\b Reserved}\par
\pard\plain \s54\li280\sa80\sl-240 \f0\fs21\lang1033 Reserved for future use.\par
}