Returning data when completing with WdfRequestCompleteWithInformation() fails.

So I have a standard app which uses DeviceIoControl with an input buffer and output buffer to my driver. This is a METHOD_BUFFFERED ioctl.

I understand that the input buffer and output buffer in the ioctl handler point to the same address. This is fine.
In error cases, I fill up the output buffer with extended status code and call WdfRequestCompleteWithInformation(Request, , # of bytes). I am careful to not touch the input buffer after the output buffer is written.

In these cases, application is getting 0 as the return value of DeviceIoControl which is correct.
But the dwBytesReturned field of DeviceIoControl is always zero and no bytes are actually copied to the output buffer.

How do I return data in the output buffer in case of error in the ioctl handler?.
I am able to pass data back to the application in the output buffer if I complete the request with STATUS_SUCCESS.

Aneesh

If you return an error, nothing is copied, There’s one exception, and I forget whether it’s ERROR_BUFFER_OVERFLOW or one of the other “too small” errors.

You want to complete with STATUS_BUFFER_OVERFLOW. That’s a warning code so the DeviceIoControl call returns FALSE but the output data is still copied.