for IOCTL_HID_WRITE_REPORT, the KMDF APIs used to extract the buffer do not
work b/c hidclass does not follow the standard rules for formatting. you
get the buffer from Irp->UserBuffer which is a pointer to a HID_XFER_PACKET.
the HID_XFER_PACKET contains pointers for the underlying buffer and its
length
d
--
This posting is provided "AS IS" with no warranties, and confers no rights.
"tatsun" <> wrote in message
news:55918E86-C7FC-4E6A-A548-...
> Thank you Doron
>
> I retrieved the WDFMEMORY from WDFREQUEST as follows,
>
> status = WdfRequestRetrieveInputMemory(Request, &memory);
>
> status is OK, but memory object does not contain buffer information.
> Because
> I added below code and check return value, buffer=NULL.
>
> buffer = WdfMemoryGetBuffer(memory, NULL);
>
> I checked MdlAddress and found the data is stored in MDL. So I retrieved
> the
> buffer and its length successfuly as follows,
>
> Irp = WdfRequestWdmGetIrp(Request);
> Buffer = (PUCHAR)MmGetSystemAddressForMdlSafe(Irp->MdlAddress,
> NormalPagePriority);
> BuffLen = Irp->MdlAddress->ByteCount;
>
> After above I add making the new WDFMEMORY object and called
> WdfUsbTargetPipeFormatRequestForWrite, then called WdfRequestSend, it
> success.
>
> Is my method OK ?
>
> Thanks.
>
> "Doron Holan [MSFT]" wrote:
>
>> WdfUsbTargetPipeFormatRequestForWrite does not send a
>> IOCTL_HID_WRITE_REPORT. you need to format the pipe for an IOCTL
>>
>> d
>>
>> --
>>
>> This posting is provided "AS IS" with no warranties, and confers no
>> rights.
>>
>>
>> "tatsun" <> wrote in message
>> news:9AC48ED6-AB33-47E4-AF05-...
>> > Hi
>> >
>> > I am developing the driver based on HidFx2Usb driver source.
>> > Application call WriteFile() then driver called IOCTL_HID_WRITE_REPORT.
>> > So I add the following code in this IOCTL process in order to send data
>> > to
>> > the USB, but CompleteWriteReport callback routine always called with
>> > status =
>> > STATUS_INVALID_PARAMETER (0xc000000d).
>> >
>> > I do not know why error occurs.
>> >
>> > --- code ---
>> > status = WdfRequestRetrieveInputMemory(Request, &memory);
>> >
>> > if (!NT_SUCCESS(status)) {
>> > goto Exit;
>> > }
>> >
>> > status = WdfUsbTargetPipeFormatRequestForWrite(
>> > pipe,
>> > Request,
>> > memory,
>> > NULL
>> > );
>> > if (!NT_SUCCESS(status)) {
>> > goto Exit;
>> > }
>> > WdfRequestSetCompletionRoutine(
>> > Request,
>> > CompleteWriteReport,
>> > pipe
>> > );
>> >
>> > if (WdfRequestSend(
>> > Request,
>> > WdfUsbTargetPipeGetIoTarget(pipe),
>> > WDF_NO_SEND_OPTIONS
>> > ) == FALSE) {
>> > status = WdfRequestGetStatus(Request);
>> > goto Exit;
>> > }
>> >
>> .
>>
|