From 6052a9dce9a55608d336b250863177a52ace9038 Mon Sep 17 00:00:00 2001 From: Shauleiz Date: Thu, 9 Mar 2017 12:25:43 +0200 Subject: [PATCH] Correct completion code vJoyGetPositionData() succeeds only if data copied to output buffer successfully Completion code for handler for IOCTL_HID_READ_REPORT is now STATUS_UNSUCCESSFUL if function vJoyGetPositionData() fails. --- driver/sys/driver.c | 15 +++++++++++---- driver/sys/vjoy.h | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/driver/sys/driver.c b/driver/sys/driver.c index 281662c..35678e9 100644 --- a/driver/sys/driver.c +++ b/driver/sys/driver.c @@ -757,7 +757,8 @@ Return Value: } else { // Copy the data stored in the Device Context into the the output buffer - vJoyGetPositionData(HidReport,pDevContext,id, bytesReturned); + if (vJoyGetPositionData(HidReport, pDevContext, id, bytesReturned) != STATUS_SUCCESS) + status = STATUS_UNSUCCESSFUL; } WdfRequestCompleteWithInformation(request, status, bytesReturned); @@ -787,10 +788,12 @@ Routine Description Return Value: - None. + STATUS_SUCCESS if succeeded. + STATUS_TIMEOUT if failed because could not acquire lock + STATUS_ACCESS_VIOLATION if bad pointer --*/ -VOID +NTSTATUS vJoyGetPositionData( OUT HID_INPUT_REPORT_V2 *HidReport, IN DEVICE_EXTENSION *pDevContext, @@ -810,7 +813,7 @@ vJoyGetPositionData( i = id-1; if (!pDevContext->positions[i]) - return; + return STATUS_ACCESS_VIOLATION; if (STATUS_SUCCESS == WdfWaitLockAcquire(pDevContext->positionLock, &timeout)) @@ -839,7 +842,11 @@ vJoyGetPositionData( }; // DEBUGGING HidReport->InputReport.FFBVal = 0xFF; // FFB Value WdfWaitLockRelease(pDevContext->positionLock); + + return STATUS_SUCCESS; }; + + return STATUS_TIMEOUT; } diff --git a/driver/sys/vjoy.h b/driver/sys/vjoy.h index 24e00fe..994b5c7 100644 --- a/driver/sys/vjoy.h +++ b/driver/sys/vjoy.h @@ -1462,7 +1462,7 @@ vJoyCompleteReadReport( UCHAR id ); -VOID +NTSTATUS vJoyGetPositionData( IN HID_INPUT_REPORT_V2 *HidReport, IN DEVICE_EXTENSION *pDevContext,