diff options
| author | a1xd <[email protected]> | 2020-12-01 01:41:22 -0500 |
|---|---|---|
| committer | a1xd <[email protected]> | 2020-12-01 01:41:22 -0500 |
| commit | b7bd9f5950d9712217e2dd5b40f2aeb82294e3c7 (patch) | |
| tree | 4efb25483733ed5e259c1e3dd20df029fe303a04 /driver | |
| parent | fix dbgprint warning (diff) | |
| download | rawaccel-b7bd9f5950d9712217e2dd5b40f2aeb82294e3c7.tar.xz rawaccel-b7bd9f5950d9712217e2dd5b40f2aeb82294e3c7.zip | |
refactor io
Diffstat (limited to 'driver')
| -rw-r--r-- | driver/driver.cpp | 77 |
1 files changed, 33 insertions, 44 deletions
diff --git a/driver/driver.cpp b/driver/driver.cpp index b158df6..a4de824 100644 --- a/driver/driver.cpp +++ b/driver/driver.cpp @@ -1,10 +1,8 @@ #include <rawaccel.hpp> +#include <rawaccel-io-def.h> #include "driver.h" -#define RA_READ CTL_CODE(0x8888, 0x888, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) -#define RA_WRITE CTL_CODE(0x8888, 0x889, METHOD_BUFFERED, FILE_ANY_ACCESS) - #ifdef ALLOC_PRAGMA #pragma alloc_text (INIT, DriverEntry) #pragma alloc_text (PAGE, EvtDeviceAdd) @@ -144,70 +142,61 @@ Return Value: { NTSTATUS status; void* buffer; - size_t size; UNREFERENCED_PARAMETER(Queue); - - + UNREFERENCED_PARAMETER(OutputBufferLength); + UNREFERENCED_PARAMETER(InputBufferLength); PAGED_CODE(); DebugPrint(("Ioctl received into filter control object.\n")); - if (IoControlCode == RA_WRITE && InputBufferLength == sizeof(ra::settings)) { - LARGE_INTEGER interval; - interval.QuadPart = static_cast<LONGLONG>(ra::WRITE_DELAY) * -10000; - KeDelayExecutionThread(KernelMode, FALSE, &interval); - - status = WdfRequestRetrieveInputBuffer( + switch (IoControlCode) { + case RA_READ: + status = WdfRequestRetrieveOutputBuffer( Request, sizeof(ra::settings), &buffer, - &size + NULL ); - 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; + DebugPrint(("RetrieveOutputBuffer failed: 0x%x\n", status)); } - - ra::settings new_settings = *reinterpret_cast<ra::settings*>(buffer); - - if (new_settings.time_min <= 0 || _isnanf(static_cast<float>(new_settings.time_min))) { - new_settings.time_min = ra::settings{}.time_min; + else { + *reinterpret_cast<ra::settings*>(buffer) = global.args; } - - global.args = new_settings; - global.modifier = { global.args, global.lookups }; - - WdfRequestComplete(Request, STATUS_SUCCESS); - } - else if (IoControlCode == RA_READ && OutputBufferLength == sizeof(ra::settings)) { - status = WdfRequestRetrieveOutputBuffer( + break; + case RA_WRITE: + status = WdfRequestRetrieveInputBuffer( Request, sizeof(ra::settings), &buffer, - &size + NULL ); - 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; + DebugPrint(("RetrieveInputBuffer failed: 0x%x\n", status)); } + else { + LARGE_INTEGER interval; + interval.QuadPart = static_cast<LONGLONG>(ra::WRITE_DELAY) * -10000; + KeDelayExecutionThread(KernelMode, FALSE, &interval); - *reinterpret_cast<ra::settings*>(buffer) = global.args; + ra::settings new_settings = *reinterpret_cast<ra::settings*>(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); + if (new_settings.time_min <= 0 || _isnanf(static_cast<float>(new_settings.time_min))) { + new_settings.time_min = ra::settings{}.time_min; + } + + global.args = new_settings; + global.modifier = { global.args, global.lookups }; + } + break; + default: + status = STATUS_INVALID_DEVICE_REQUEST; + break; } + WdfRequestComplete(Request, status); + } #pragma warning(pop) // enable 28118 again |