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

425 lines
9.9 KiB
C

#include <stdlib.h>
#include <wtypes.h>
#include "initguid.h"
#include "hidclass.h"
#include "hidsdi.h"
#include "hiddll.h"
#include <winioctl.h>
//
// __cdecl main (int argc, char *argv[])
// {
// return 0;
// }
//
int HidD_Hello (char * buff, int len)
{
CHAR ret[] = "Hello\n";
ULONG length = (sizeof (ret) < len) ? sizeof (ret) : len;
memcpy (buff, ret, length);
return sizeof (ret);
}
void __stdcall
HidD_GetHidGuid (
OUT LPGUID HidGuid
)
/*++
Routine Description:
Please see hidsdi.h for explination
Notes:
--*/
{
memcpy (HidGuid, &(GUID_CLASS_INPUT), sizeof (struct _GUID));
*HidGuid = (GUID_CLASS_INPUT);
}
BOOLEAN __stdcall
HidD_GetPreparsedData (
IN HANDLE HidDeviceObject,
OUT PHIDP_PREPARSED_DATA * PreparsedData
)
/*++
Routine Description:
please see hidsdi.h for explination
Notes:
--*/
{
HID_COLLECTION_INFORMATION info;
ULONG bytes;
PULONG buffer;
if (! DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_COLLECTION_INFORMATION,
0, 0,
&info, sizeof (info),
&bytes, NULL)) {
return FALSE;
}
buffer = (PULONG) malloc ( info.DescriptorSize
+ (ALLOCATION_SHIFT * sizeof (ULONG)));
if (!buffer)
{
SetLastError (ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
*buffer = RANDOM_DATA;
*PreparsedData = (PHIDP_PREPARSED_DATA) (buffer + ALLOCATION_SHIFT);
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_COLLECTION_DESCRIPTOR,
0, 0,
*PreparsedData, info.DescriptorSize,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_GetAttributes (
IN HANDLE HidDeviceObject,
OUT PHIDD_ATTRIBUTES Attributes
)
/*++
Routine Description:
Please see hidsdi.h for explination
--*/
{
HID_COLLECTION_INFORMATION info;
ULONG bytes;
if (! DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_COLLECTION_INFORMATION,
0, 0,
&info, sizeof (info),
&bytes, NULL)) {
return FALSE;
}
Attributes->Size = sizeof (HIDD_ATTRIBUTES);
Attributes->VendorID = info.VendorID;
Attributes->ProductID = info.ProductID;
Attributes->VersionNumber = info.VersionNumber;
return TRUE;
}
BOOLEAN __stdcall
HidD_FreePreparsedData (
IN PHIDP_PREPARSED_DATA PreparsedData
)
/*++
Routine Description:
please see hidsdi.h for explination
Notes:
--*/
{
PULONG buffer;
buffer = (PULONG) PreparsedData - ALLOCATION_SHIFT;
if (RANDOM_DATA != *buffer) {
return FALSE;
}
LocalFree (buffer);
return TRUE;
}
BOOLEAN __stdcall
HidD_FlushQueue (
IN HANDLE HidDeviceObject
)
/*++
Routine Description:
Please see hidsdi.h for explination
Notes:
--*/
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_FLUSH_QUEUE,
0, 0,
0, 0,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_GetConfiguration (
IN HANDLE HidDeviceObject,
OUT PHIDD_CONFIGURATION Configuration,
IN ULONG ConfigurationLength
)
/*++
Routine Description:
Please see hidsdi.h for explination
Notes:
We place a goo at the top so that we can enforce the must get before set
rule.
--*/
{
ULONG bytes;
Configuration->cookie = &HidD_GetConfiguration;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_DRIVER_CONFIG,
0,0,
&Configuration->size,
(ConfigurationLength - 4),
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_SetConfiguration (
IN HANDLE HidDeviceObject,
OUT PHIDD_CONFIGURATION Configuration,
IN ULONG ConfigurationLength
)
/*++
Routine Description:
Please see hidsdi.h for explanation
Notes:
We place a goo at the top so that we can enforce the must get before set
rule.
--*/
{
ULONG bytes;
if (Configuration->cookie != &HidD_GetConfiguration) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_SET_DRIVER_CONFIG,
0,0,
&Configuration->size, (ConfigurationLength - 4),
&bytes, NULL) != FALSE;
}
STDAPI_(BOOL)
Entry32(HINSTANCE hinst, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason) {
default: return TRUE;
}
}
BOOLEAN __stdcall
DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
default: return TRUE;
}
}
BOOLEAN __stdcall
HidD_GetNumInputBuffers (
IN HANDLE HidDeviceObject,
OUT PULONG NumberBuffers) // Number of hid packets actually retained
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS,
NULL, 0,
NumberBuffers, sizeof (ULONG),
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_SetNumInputBuffers (
IN HANDLE HidDeviceObject,
OUT ULONG NumberBuffers) // Number of hid packets actually retained
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS,
&NumberBuffers, sizeof (ULONG),
NULL, 0,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_GetSerialNumberString (
IN HANDLE HidDeviceObject,
OUT PVOID Buffer,
IN ULONG BufferLength
)
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_SERIALNUMBER_STRING,
0, 0,
Buffer, BufferLength,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_GetManufacturerString (
IN HANDLE HidDeviceObject,
OUT PVOID Buffer,
IN ULONG BufferLength
)
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_MANUFACTURER_STRING,
0, 0,
Buffer, BufferLength,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_GetProductString (
IN HANDLE HidDeviceObject,
OUT PVOID Buffer,
IN ULONG BufferLength
)
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_PRODUCT_STRING,
0, 0,
Buffer, BufferLength,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_GetIndexedString (
IN HANDLE HidDeviceObject,
IN ULONG StringIndex,
OUT PVOID Buffer,
IN ULONG BufferLength
)
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_INDEXED_STRING,
&StringIndex, sizeof (ULONG),
Buffer, BufferLength,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_GetPhysicalDescriptor (
IN HANDLE HidDeviceObject,
OUT PVOID ReportBuffer,
IN ULONG ReportBufferLength
)
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_GET_PHYSICAL_DESCRIPTOR,
0, 0,
ReportBuffer, ReportBufferLength,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_GetFeature (
IN HANDLE HidDeviceObject,
OUT PVOID ReportBuffer,
IN ULONG ReportBufferLength
)
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_FEATURE,
0, 0,
ReportBuffer, ReportBufferLength,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_SetFeature (
IN HANDLE HidDeviceObject,
IN PVOID ReportBuffer,
IN ULONG ReportBufferLength
)
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_SET_FEATURE,
ReportBuffer, ReportBufferLength,
0, 0,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_GetInputReport (
IN HANDLE HidDeviceObject,
OUT PVOID ReportBuffer,
IN ULONG ReportBufferLength
)
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_INPUT_REPORT,
0, 0,
ReportBuffer, ReportBufferLength,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_SetOutputReport (
IN HANDLE HidDeviceObject,
IN PVOID ReportBuffer,
IN ULONG ReportBufferLength
)
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_SET_OUTPUT_REPORT,
ReportBuffer, ReportBufferLength,
0, 0,
&bytes, NULL) != FALSE;
}
BOOLEAN __stdcall
HidD_GetMsGenreDescriptor (
IN HANDLE HidDeviceObject,
OUT PVOID ReportBuffer,
IN ULONG ReportBufferLength
)
{
ULONG bytes;
return DeviceIoControl (HidDeviceObject,
IOCTL_HID_GET_MS_GENRE_DESCRIPTOR,
0, 0,
ReportBuffer, ReportBufferLength,
&bytes, NULL) != FALSE;
}