--- /dev/null
+
+spec2def(hidclass.sys hidclass.spec)
+
+list(APPEND SOURCE
+ hidclass.c
+ hidclass.rc
+ ${CMAKE_CURRENT_BINARY_DIR}/hidclass.def)
+
+add_library(hidclass SHARED ${SOURCE})
+
+set_entrypoint(hidclass 0)
+set_image_base(hidclass 0x00010000)
+set_subsystem(hidclass native)
+set_target_properties(hidclass PROPERTIES SUFFIX ".sys")
+
+
+add_importlibs(hidclass ntoskrnl hidparse hal)
+add_cab_target(hidclass 2)
+add_importlib_target(hidclass.spec)
\ No newline at end of file
--- /dev/null
+/*
+ * PROJECT: ReactOS Universal Serial Bus Human Interface Device Driver
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: drivers/hid/hidclass/hidclass.c
+ * PURPOSE: HID Class Driver
+ * PROGRAMMERS:
+ * Michael Martin (michael.martin@reactos.org)
+ * Johannes Anderwald (johannes.anderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+static LPWSTR ClientIdentificationAddress = L"HIDCLASS";
+
+ULONG
+NTAPI
+DllInitialize(ULONG Unknown)
+{
+ return 0;
+}
+
+ULONG
+NTAPI
+DllUnload()
+{
+ return 0;
+}
+
+NTSTATUS
+NTAPI
+HidClassAddDevice(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT PhysicalDeviceObject)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+HidClassDriverUnload(
+ IN PDRIVER_OBJECT DriverObject)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+HidClassDispatch(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ UNIMPLEMENTED
+ ASSERT(FALSE);
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+HidRegisterMinidriver(
+ IN PHID_MINIDRIVER_REGISTRATION MinidriverRegistration)
+{
+ NTSTATUS Status;
+ PHIDCLASS_DRIVER_EXTENSION DriverExtension;
+
+ /* check if the version matches */
+ if (MinidriverRegistration->Revision > HID_REVISION)
+ {
+ /* revision mismatch */
+ ASSERT(FALSE);
+ return STATUS_REVISION_MISMATCH;
+ }
+
+ /* now allocate the driver object extension */
+ Status = IoAllocateDriverObjectExtension(MinidriverRegistration->DriverObject, (PVOID)ClientIdentificationAddress, sizeof(HIDCLASS_DRIVER_EXTENSION), (PVOID*)&DriverExtension);
+ if (!NT_SUCCESS(Status))
+ {
+ /* failed to allocate driver extension */
+ ASSERT(FALSE);
+ return Status;
+ }
+
+ /* zero driver extension */
+ RtlZeroMemory(DriverExtension, sizeof(HIDCLASS_DRIVER_EXTENSION));
+
+ /* init driver extension */
+ DriverExtension->DriverObject = MinidriverRegistration->DriverObject;
+ DriverExtension->DeviceExtensionSize = MinidriverRegistration->DeviceExtensionSize;
+ DriverExtension->DevicesArePolled = MinidriverRegistration->DevicesArePolled;
+ DriverExtension->AddDevice = MinidriverRegistration->DriverObject->DriverExtension->AddDevice;
+ DriverExtension->DriverUnload = MinidriverRegistration->DriverObject->DriverUnload;
+
+ /* copy driver dispatch routines */
+ RtlCopyMemory(DriverExtension->MajorFunction, MinidriverRegistration->DriverObject->MajorFunction, sizeof(PDRIVER_DISPATCH) * IRP_MJ_MAXIMUM_FUNCTION);
+
+ /* initialize lock */
+ KeInitializeSpinLock(&DriverExtension->Lock);
+
+ /* now replace dispatch routines */
+ DriverExtension->DriverObject->DriverExtension->AddDevice = HidClassAddDevice;
+ DriverExtension->DriverObject->DriverUnload = HidClassDriverUnload;
+ DriverExtension->DriverObject->MajorFunction[IRP_MJ_CREATE] = HidClassDispatch;
+ DriverExtension->DriverObject->MajorFunction[IRP_MJ_CLOSE] = HidClassDispatch;
+ DriverExtension->DriverObject->MajorFunction[IRP_MJ_READ] = HidClassDispatch;
+ DriverExtension->DriverObject->MajorFunction[IRP_MJ_WRITE] = HidClassDispatch;
+ DriverExtension->DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HidClassDispatch;
+ DriverExtension->DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = HidClassDispatch;
+ DriverExtension->DriverObject->MajorFunction[IRP_MJ_POWER] = HidClassDispatch;
+ DriverExtension->DriverObject->MajorFunction[IRP_MJ_PNP] = HidClassDispatch;
+
+ /* done */
+ return STATUS_SUCCESS;
+}