Bemanitools v5.26 release

This commit is contained in:
icex2
2019-09-27 22:36:50 +02:00
commit cbd7720349
718 changed files with 62731 additions and 0 deletions
+112
View File
@@ -0,0 +1,112 @@
#define LOG_MODULE "hid-generic"
#include <windows.h>
#include <hidsdi.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "geninput/hid-report-out.h"
#include "util/log.h"
#include "util/mem.h"
bool hid_report_out_init(struct hid_report_out *r, PHIDP_PREPARSED_DATA ppd,
uint8_t id, size_t nbytes)
{
NTSTATUS status;
r->id = id;
r->nbytes = nbytes;
r->bytes = xmalloc(nbytes);
status = HidP_InitializeReportForID(HidP_Output, r->id, ppd,
(PCHAR) r->bytes, r->nbytes);
if (status != HIDP_STATUS_SUCCESS) {
log_warning("Report %02X: HidP_InitializeReportForID failed: %08x",
id, (unsigned int) status);
goto fail;
}
return true;
fail:
free(r->bytes);
return false;
}
void hid_report_out_get_bytes(const struct hid_report_out *r, uint8_t *bytes)
{
memcpy(bytes, r->bytes, r->nbytes);
}
bool hid_report_out_set_bit(struct hid_report_out *r,
PHIDP_PREPARSED_DATA ppd, uint16_t collection_id, uint32_t usage,
bool value)
{
NTSTATUS status;
unsigned long count;
uint16_t usage_hi;
uint16_t usage_lo;
usage_hi = (uint16_t) (usage >> 16);
usage_lo = (uint16_t) (usage >> 0);
count = 1;
if (value) {
status = HidP_SetUsages(HidP_Output, usage_hi, collection_id,
&usage_lo, &count, ppd, (PCHAR) r->bytes, r->nbytes);
if (status != HIDP_STATUS_SUCCESS) {
log_warning("HidP_SetUsages failed: %08x", (unsigned int) status);
return false;
}
} else {
status = HidP_UnsetUsages(HidP_Output, usage_hi, collection_id,
&usage_lo, &count, ppd, (PCHAR) r->bytes, r->nbytes);
if (status != HIDP_STATUS_SUCCESS
&& status != HIDP_STATUS_BUTTON_NOT_PRESSED /* jfc */) {
log_warning("HidP_UnsetUsages failed: %08x", (unsigned int) status);
return false;
}
}
return true;
}
bool hid_report_out_set_value(struct hid_report_out *r,
PHIDP_PREPARSED_DATA ppd, uint16_t collection_id, uint32_t usage,
uint32_t value)
{
NTSTATUS status;
uint16_t usage_hi;
uint16_t usage_lo;
usage_hi = (uint16_t) (usage >> 16);
usage_lo = (uint16_t) (usage >> 0);
status = HidP_SetUsageValue(HidP_Output, usage_hi, collection_id,
usage_lo, value, ppd, (PCHAR) r->bytes, r->nbytes);
if (status != HIDP_STATUS_SUCCESS) {
log_warning("HidP_SetUsages failed: %08x", (unsigned int) status);
return false;
}
return true;
}
void hid_report_out_fini(struct hid_report_out *r)
{
free(r->bytes);
}