How to get a handle of the URB in a KMDF driver

Hi All
I am very new to driver dev so forgive me if this is a silly question
What I am doing is try to create a emulated usb camera on win10 based on the instructions below
https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/writing-a-ude-client-driver

I need to transfer video data to host through ISO transfer
I created the queue through the following code
WDF_IO_QUEUE_CONFIG_INIT(&queueConfig, WdfIoQueueDispatchSequential);
queueConfig.EvtIoInternalDeviceControl = IoEvtControlUrb;
status = WdfIoQueueCreate(Device,
&queueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
&pIoContext->ControlQueue);

Then in the callback function I need to handle the URB
VOID
IoEvtControlUrb(
In
WDFQUEUE Queue,
In
WDFREQUEST Request,
In
size_t OutputBufferLength,
In
size_t InputBufferLength,
In
ULONG IoControlCode
)
{

}
Seems for ISO transfer I need to setup some structs (see below) which I believe need to access the URB(correct me if I am wrong)
struct iso_packet
{
unsigned int offset;
unsigned int length;
unsigned int status;
};

My question is how can I access the URB in my callback function above
Thanks in advance

It is impossible for me to believe that this is the right answer to your problem. This is like using a 12-cylinder diesel-powered diamond-studded sledge to hammer some nails in a 2x4. What is the overall goal you are trying to accomplish, for which you think this is the right answer? Please tell us, before you waste your time and our time going further down this rabbit hole. Note that “try to create a emulated usb camera” is not a goal.

Seems for ISO transfer I need to setup some structs …

Well, for an ISO transfer, the client driver above you will have created the URB, which includes the packet list. You, as the simulated hardware, would need to copy the data and fill in those fields. You will get a WDFREQUEST with the ioctl code IOCTL_INTERNAL_USB_SUBMIT_URB. The Paremeters.Others.Argument1 field in the IRP points to the URB. Assuming the request code is URB_FUNCTION_ISOCH_TRANSFER, then the URB is actually a _URB_ISOCH_TRANSFER structure, which contains the USBD_ISO_PACKET_DESCRIPTOR array.