report.c
来自「winddk src目录下的WDM源码压缩!」· C语言 代码 · 共 596 行 · 第 1/2 页
C
596 行
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
report.c
Abstract:
This module contains the code for reading/writing hid reports and
translating those HID reports into useful information.
Environment:
User mode
--*/
#include <stdlib.h>
#include <wtypes.h>
#include "hidsdi.h"
#include "hid.h"
BOOLEAN
UnpackReport (
IN PCHAR ReportBuffer,
IN USHORT ReportBufferLength,
IN HIDP_REPORT_TYPE ReportType,
IN OUT PHID_DATA Data,
IN ULONG DataLength,
IN PHIDP_PREPARSED_DATA Ppd
);
BOOLEAN
PackReport (
OUT PCHAR ReportBuffer,
IN USHORT ReportBufferLength,
IN HIDP_REPORT_TYPE ReportType,
IN PHID_DATA Data,
IN ULONG DataLength,
IN PHIDP_PREPARSED_DATA Ppd
);
BOOLEAN
Read (
PHID_DEVICE HidDevice
)
/*++
RoutineDescription:
Given a struct _HID_DEVICE, obtain a read report and unpack the values
into the InputData array.
--*/
{
DWORD bytesRead;
if (!ReadFile (HidDevice->HidDevice,
HidDevice->InputReportBuffer,
HidDevice->Caps.InputReportByteLength,
&bytesRead,
NULL))
{
return FALSE;
}
ASSERT (bytesRead == HidDevice->Caps.InputReportByteLength);
if (bytesRead != HidDevice->Caps.InputReportByteLength)
{
return FALSE;
}
return UnpackReport (HidDevice->InputReportBuffer,
HidDevice->Caps.InputReportByteLength,
HidP_Input,
HidDevice->InputData,
HidDevice->InputDataLength,
HidDevice->Ppd);
}
BOOLEAN
ReadOverlapped (
PHID_DEVICE HidDevice,
HANDLE CompletionEvent
)
/*++
RoutineDescription:
Given a struct _HID_DEVICE, obtain a read report and unpack the values
into the InputData array.
--*/
{
static OVERLAPPED overlap;
DWORD bytesRead;
BOOL readStatus;
/*
// Setup the overlap structure using the completion event passed in to
// to use for signalling the completion of the Read
*/
memset(&overlap, 0, sizeof(OVERLAPPED));
overlap.hEvent = CompletionEvent;
/*
// Execute the read call saving the return code to determine how to
// proceed (ie. the read completed synchronously or not).
*/
readStatus = ReadFile ( HidDevice -> HidDevice,
HidDevice -> InputReportBuffer,
HidDevice -> Caps.InputReportByteLength,
&bytesRead,
&overlap);
/*
// If the readStatus is FALSE, then one of two cases occurred.
// 1) ReadFile call succeeded but the Read is an overlapped one. Here,
// we should return TRUE to indicate that the Read succeeded. However,
// the calling thread should be blocked on the completion event
// which means it won't continue until the read actually completes
//
// 2) The ReadFile call failed for some unknown reason...In this case,
// the return code will be FALSE
*/
if (!readStatus)
{
return (ERROR_IO_PENDING == GetLastError());
}
/*
// If readStatus is TRUE, then the ReadFile call completed synchronously,
// since the calling thread is probably going to wait on the completion
// event, signal the event so it knows it can continue.
*/
else
{
SetEvent(CompletionEvent);
return (TRUE);
}
}
BOOLEAN
Write (
PHID_DEVICE HidDevice
)
/*++
RoutineDescription:
Given a struct _HID_DEVICE, take the information in the HID_DATA array
pack it into multiple write reports and send each report to the HID device
--*/
{
DWORD bytesWritten;
PHID_DATA pData;
ULONG Index;
BOOLEAN Status;
BOOLEAN WriteStatus;
/*
// Begin by looping through the HID_DEVICE's HID_DATA structure and setting
// the IsDataSet field to FALSE to indicate that each structure has
// not yet been set for this Write call.
*/
pData = HidDevice -> OutputData;
for (Index = 0; Index < HidDevice -> OutputDataLength; Index++, pData++)
{
pData -> IsDataSet = FALSE;
}
/*
// In setting all the data in the reports, we need to pack a report buffer
// and call WriteFile for each report ID that is represented by the
// device structure. To do so, the IsDataSet field will be used to
// determine if a given report field has already been set.
*/
Status = TRUE;
pData = HidDevice -> OutputData;
for (Index = 0; Index < HidDevice -> OutputDataLength; Index++, pData++)
{
if (!pData -> IsDataSet)
{
/*
// Package the report for this data structure. PackReport will
// set the IsDataSet fields of this structure and any other
// structures that it includes in the report with this structure
*/
PackReport (HidDevice->OutputReportBuffer,
HidDevice->Caps.OutputReportByteLength,
HidP_Output,
pData,
HidDevice->OutputDataLength - Index,
HidDevice->Ppd);
/*
// Now a report has been packaged up...Send it down to the device
*/
WriteStatus = WriteFile (HidDevice->HidDevice,
HidDevice->OutputReportBuffer,
HidDevice->Caps.OutputReportByteLength,
&bytesWritten,
NULL) && (bytesWritten == HidDevice -> Caps.OutputReportByteLength);
Status = Status && WriteStatus;
}
}
return (Status);
}
BOOLEAN
SetFeature (
PHID_DEVICE HidDevice
)
/*++
RoutineDescription:
Given a struct _HID_DEVICE, take the information in the HID_DATA array
pack it into multiple reports and send it to the hid device via HidD_SetFeature()
--*/
{
PHID_DATA pData;
ULONG Index;
BOOLEAN Status;
BOOLEAN FeatureStatus;
/*
// Begin by looping through the HID_DEVICE's HID_DATA structure and setting
// the IsDataSet field to FALSE to indicate that each structure has
// not yet been set for this SetFeature() call.
*/
pData = HidDevice -> FeatureData;
for (Index = 0; Index < HidDevice -> FeatureDataLength; Index++, pData++)
{
pData -> IsDataSet = FALSE;
}
/*
// In setting all the data in the reports, we need to pack a report buffer
// and call WriteFile for each report ID that is represented by the
// device structure. To do so, the IsDataSet field will be used to
// determine if a given report field has already been set.
*/
Status = TRUE;
pData = HidDevice -> FeatureData;
for (Index = 0; Index < HidDevice -> FeatureDataLength; Index++, pData++)
{
if (!pData -> IsDataSet)
{
/*
// Package the report for this data structure. PackReport will
// set the IsDataSet fields of this structure and any other
// structures that it includes in the report with this structure
*/
PackReport (HidDevice->FeatureReportBuffer,
HidDevice->Caps.FeatureReportByteLength,
HidP_Feature,
pData,
HidDevice->FeatureDataLength - Index,
HidDevice->Ppd);
/*
// Now a report has been packaged up...Send it down to the device
*/
FeatureStatus =(HidD_SetFeature (HidDevice->HidDevice,
HidDevice->FeatureReportBuffer,
HidDevice->Caps.FeatureReportByteLength));
Status = Status && FeatureStatus;
}
}
return (Status);
}
BOOLEAN
GetFeature (
PHID_DEVICE HidDevice
)
/*++
RoutineDescription:
Given a struct _HID_DEVICE, fill in the feature data structures with
all features on the device. May issue multiple HidD_GetFeature() calls to
deal with multiple report IDs.
--*/
{
ULONG Index;
PHID_DATA pData;
BOOLEAN FeatureStatus;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?