extern "C" HRESULT __stdcall LrpInvoke(unsigned __int16 componentId, unsigned __int16 methodId, void* heap, unsigned __int32* pSize, void** ppData, unsigned __int32* pCapacity) { MemoryBuffer buffer(heap, *ppData, *pSize, *pCapacity); HRESULT result = LrpInvokeEx(0, componentId, methodId, buffer, nullptr); *pSize = static_cast<unsigned __int32>(buffer.GetSize()); *ppData = buffer.GetData(); *pCapacity = static_cast<unsigned __int32>(buffer.GetCapacity()); buffer = MemoryBuffer(); return result; }
void CUsbDkRedirectorStrategy::DoControlTransfer(CRedirectorRequest &WdfRequest, WDFMEMORY DataBuffer) { PUSBDK_REDIRECTOR_REQUEST_CONTEXT context = WdfRequest.Context(); WDFMEMORY_OFFSET TransferOffset; TransferOffset.BufferOffset = 0; if (DataBuffer != WDF_NO_HANDLE) { CPreAllocatedWdfMemoryBuffer MemoryBuffer(DataBuffer); TransferOffset.BufferLength = static_cast<ULONG>(MemoryBuffer.Size()); } else { TransferOffset.BufferLength = 0; } auto status = m_Target.ControlTransferAsync(WdfRequest, &context->SetupPacket, DataBuffer, &TransferOffset, [](WDFREQUEST Request, WDFIOTARGET Target, PWDF_REQUEST_COMPLETION_PARAMS Params, WDFCONTEXT Context) { UNREFERENCED_PARAMETER(Target); UNREFERENCED_PARAMETER(Context); CRedirectorRequest WdfRequest(Request); auto RequestContext = WdfRequest.Context(); auto status = Params->IoStatus.Status; auto usbCompletionParams = Params->Parameters.Usb.Completion; *RequestContext->BytesTransferred = usbCompletionParams->Parameters.DeviceControlTransfer.Length; if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, TRACE_REDIRECTOR, "%!FUNC! Control transfer failed: %!STATUS! UsbdStatus 0x%x\n", status, usbCompletionParams->UsbdStatus); } WdfRequest.SetOutputDataLen(sizeof(*RequestContext->BytesTransferred)); WdfRequest.SetStatus(status); }); WdfRequest.SetStatus(status); }