Module: wine
Branch: master
Commit: 1e1599d961de93ba2d5bae2669a668a6553a030c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e1599d961de93ba2d5bae266…
Author: Aric Stewart <aric(a)codeweavers.com>
Date: Tue Jun 30 07:39:40 2015 -0500
hid: Implement HidP_GetCaps.
---
dlls/hid/Makefile.in | 1 +
dlls/hid/hid.spec | 2 +-
dlls/hid/hidp.c | 53 ++++++++++++++++++++++++++++++++++++++
dlls/hid/parse.h | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 127 insertions(+), 1 deletion(-)
diff --git a/dlls/hid/Makefile.in b/dlls/hid/Makefile.in
index 3a115ca..97ae959 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 f58953a..9d7899f 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 0000000..a6f462c
--- /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 <stdarg.h>
+
+#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 0000000..1d902f8
--- /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 */