diff --git a/dlls/hid/Makefile.in b/dlls/hid/Makefile.in index 3a115ca997e..97ae9594388 100644 --- a/dlls/hid/Makefile.in +++ b/dlls/hid/Makefile.in @@ -3,6 +3,7 @@ IMPORTLIB = hid C_SRCS = \ hidd.c \ + hidp.c \ main.c RC_SRCS = version.rc diff --git a/dlls/hid/hid.spec b/dlls/hid/hid.spec index f58953a4920..9d7899f3fb5 100644 --- a/dlls/hid/hid.spec +++ b/dlls/hid/hid.spec @@ -19,7 +19,7 @@ @ stub HidD_SetNumInputBuffers @ stub HidD_SetOutputReport @ stub HidP_GetButtonCaps -@ stub HidP_GetCaps +@ stdcall HidP_GetCaps(ptr ptr) @ stub HidP_GetData @ stub HidP_GetExtendedAttributes @ stub HidP_GetLinkCollectionNodes diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c new file mode 100644 index 00000000000..a6f462c5d56 --- /dev/null +++ b/dlls/hid/hidp.c @@ -0,0 +1,53 @@ +/* + * Human Input Devices + * + * Copyright (C) 2015 Aric Stewart + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include + +#define NONAMELESSUNION +#define WIN32_NO_STATUS +#include "windef.h" +#include "winbase.h" +#include "winternl.h" +#include "winioctl.h" +#include "ddk/wdm.h" + +#include "hidusage.h" +#include "ddk/hidpi.h" +#include "parse.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(hidp); + +NTSTATUS WINAPI HidP_GetCaps(PHIDP_PREPARSED_DATA PreparsedData, + PHIDP_CAPS Capabilities) +{ + PWINE_HIDP_PREPARSED_DATA data = (PWINE_HIDP_PREPARSED_DATA)PreparsedData; + + TRACE("(%p, %p)\n",PreparsedData, Capabilities); + + if (data->magic != HID_MAGIC) + return HIDP_STATUS_INVALID_PREPARSED_DATA; + + *Capabilities = data->caps; + + return HIDP_STATUS_SUCCESS; +} diff --git a/dlls/hid/parse.h b/dlls/hid/parse.h new file mode 100644 index 00000000000..1d902f849c4 --- /dev/null +++ b/dlls/hid/parse.h @@ -0,0 +1,72 @@ +/* + * Internal HID structures + * + * Copyright 2015 Aric Stewart + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __HID_PARSE_H +#define __HID_PARSE_H + +#define HID_MAGIC 0x8491759 + +typedef enum { + UnknownElement = 0, + ButtonElement, + ValueElement, +} WINE_ELEMENT_TYPE; + +typedef struct +{ + WINE_ELEMENT_TYPE ElementType; + UINT valueStartBit; + UINT bitCount; + union { + HIDP_VALUE_CAPS value; + HIDP_BUTTON_CAPS button; + } caps; +} WINE_HID_ELEMENT; + +typedef struct +{ + UCHAR reportID; + DWORD dwSize; + DWORD elementCount; + WINE_HID_ELEMENT Elements[1]; +} WINE_HID_REPORT; + +typedef struct +{ + DWORD magic; + DWORD dwSize; + HIDP_CAPS caps; + + DWORD dwInputReportCount; + DWORD dwOutputReportCount; + DWORD dwFeatureReportCount; + + DWORD dwOutputReportOffset; + DWORD dwFeatureReportOffset; + + WINE_HID_REPORT InputReports[1]; +} WINE_HIDP_PREPARSED_DATA, *PWINE_HIDP_PREPARSED_DATA; + +#define HID_NEXT_REPORT(d,r) ((r)?(WINE_HID_REPORT*)(((BYTE*)(r))+(r)->dwSize):(d)->InputReports) +#define HID_INPUT_REPORTS(d) ((d)->InputReports) +#define HID_OUTPUT_REPORTS(d) ((WINE_HID_REPORT*)(((BYTE*)(d)->InputReports)+(d)->dwOutputReportOffset)) +#define HID_FEATURE_REPORTS(d) ((WINE_HID_REPORT*)(((BYTE*)(d)->InputReports)+(d)->dwFeatureReportOffset)) + +#endif /* __HID_PARSE_H */