From 5241f9783b41e74f719dc4a472c6b0803b0eff8c Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Fri, 31 Jul 2020 20:04:19 -0400 Subject: add read add function that makes an ioctl call to return the driver's active mouse_modifier --- common/common.vcxitems | 1 + common/external/tagged-union-single.h | 2 +- common/rawaccel-io.hpp | 46 +++++++++++++++++++++++++ driver/driver.cpp | 63 +++++++++++++++++++++++------------ 4 files changed, 89 insertions(+), 23 deletions(-) create mode 100644 common/rawaccel-io.hpp diff --git a/common/common.vcxitems b/common/common.vcxitems index d1e8db0..aeeaa95 100644 --- a/common/common.vcxitems +++ b/common/common.vcxitems @@ -23,6 +23,7 @@ + diff --git a/common/external/tagged-union-single.h b/common/external/tagged-union-single.h index 3353325..f0de097 100644 --- a/common/external/tagged-union-single.h +++ b/common/external/tagged-union-single.h @@ -137,7 +137,7 @@ struct tagged_union { int tag = 0; struct storage_t { - alignas(max_align_of) char bytes[max_size_of] = ""; + alignas(max_align_of) char bytes[max_size_of] = {}; template inline constexpr T& as() { diff --git a/common/rawaccel-io.hpp b/common/rawaccel-io.hpp new file mode 100644 index 0000000..5d6fad6 --- /dev/null +++ b/common/rawaccel-io.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include + +#define NOMINMAX +#include + +#include "rawaccel.hpp" + +#define RA_IOCTL CTL_CODE(0x8888, 0x888, METHOD_BUFFERED, FILE_ANY_ACCESS) + +namespace rawaccel { + + mouse_modifier read() { + HANDLE ra_handle = INVALID_HANDLE_VALUE; + + ra_handle = CreateFileW(L"\\\\.\\rawaccel", 0, 0, 0, OPEN_EXISTING, 0, 0); + + if (ra_handle == INVALID_HANDLE_VALUE) { + throw std::system_error(GetLastError(), std::system_category(), "CreateFile failed"); + } + + mouse_modifier mod; + DWORD dummy; + + BOOL success = DeviceIoControl( + ra_handle, + RA_IOCTL, + NULL, // input buffer + 0, // input buffer size + &mod, // output buffer + sizeof(mouse_modifier), // output buffer size + &dummy, // bytes returned + NULL // overlapped structure + ); + + CloseHandle(ra_handle); + + if (!success) { + throw std::system_error(GetLastError(), std::system_category(), "DeviceIoControl failed"); + } + + return mod; + } + +} diff --git a/driver/driver.cpp b/driver/driver.cpp index 1f9cebd..c893b8b 100644 --- a/driver/driver.cpp +++ b/driver/driver.cpp @@ -143,41 +143,60 @@ Return Value: --*/ { NTSTATUS status; - void* input_buffer; - size_t input_size; + void* buffer; + size_t size; UNREFERENCED_PARAMETER(Queue); - UNREFERENCED_PARAMETER(OutputBufferLength); UNREFERENCED_PARAMETER(IoControlCode); PAGED_CODE(); DebugPrint(("Ioctl received into filter control object.\n")); - if (InputBufferLength != sizeof(ra::mouse_modifier)) { - DebugPrint(("Received unknown request of %u bytes\n", InputBufferLength)); - // status maps to win32 error code 1784: ERROR_INVALID_USER_BUFFER - WdfRequestComplete(Request, STATUS_INVALID_BUFFER_SIZE); - return; - } + if (InputBufferLength == sizeof(ra::mouse_modifier)) { + status = WdfRequestRetrieveInputBuffer( + Request, + sizeof(ra::mouse_modifier), + &buffer, + &size + ); - status = WdfRequestRetrieveInputBuffer( - Request, - sizeof(ra::mouse_modifier), - &input_buffer, - &input_size - ); + if (!NT_SUCCESS(status)) { + DebugPrint(("RetrieveInputBuffer failed: 0x%x\n", status)); + // status maps to win32 error code 1359: ERROR_INTERNAL_ERROR + WdfRequestComplete(Request, STATUS_MESSAGE_LOST); + return; + } - if (!NT_SUCCESS(status)) { - DebugPrint(("RetrieveInputBuffer failed: 0x%x\n", status)); - // status maps to win32 error code 1359: ERROR_INTERNAL_ERROR - WdfRequestComplete(Request, STATUS_MESSAGE_LOST); - return; + global.modifier = *reinterpret_cast(buffer); + + WdfRequestComplete(Request, STATUS_SUCCESS); } + else if (OutputBufferLength == sizeof(ra::mouse_modifier)) { + status = WdfRequestRetrieveOutputBuffer( + Request, + sizeof(ra::mouse_modifier), + &buffer, + &size + ); + + if (!NT_SUCCESS(status)) { + DebugPrint(("RetrieveOutputBuffer failed: 0x%x\n", status)); + // status maps to win32 error code 1359: ERROR_INTERNAL_ERROR + WdfRequestComplete(Request, STATUS_MESSAGE_LOST); + return; + } + + *reinterpret_cast(buffer) = global.modifier; - global.modifier = *reinterpret_cast(input_buffer); + WdfRequestComplete(Request, STATUS_SUCCESS); + } + else { + DebugPrint(("Received unknown request: in %uB, out %uB\n", InputBufferLength, OutputBufferLength)); + // status maps to win32 error code 1784: ERROR_INVALID_USER_BUFFER + WdfRequestComplete(Request, STATUS_INVALID_BUFFER_SIZE); + } - WdfRequestComplete(Request, STATUS_SUCCESS); } #pragma warning(pop) // enable 28118 again -- cgit v1.2.3