You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
790 lines
34 KiB
790 lines
34 KiB
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
usb.c
|
|
|
|
Abstract: USB lower filter driver
|
|
|
|
Author:
|
|
|
|
Kenneth D. Ray
|
|
|
|
Environment:
|
|
|
|
Kernel mode
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include <wdm.h>
|
|
#include "valueadd.h"
|
|
#include "local.h"
|
|
#include "usbdi.h"
|
|
#include "usbdlib.h"
|
|
|
|
VOID
|
|
VA_PrintURB (
|
|
IN PURB Urb,
|
|
IN ULONG PrintMask
|
|
);
|
|
|
|
NTSTATUS
|
|
VA_FilterURB_Comp (
|
|
IN PDEVICE_OBJECT Device,
|
|
IN PIRP Irp,
|
|
IN PVOID Context
|
|
);
|
|
|
|
NTSTATUS
|
|
VA_FilterURB (
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
The default dispatch routine. If this filter does not recognize the
|
|
IRP, then it should send it down, unmodified.
|
|
No completion routine is required.
|
|
|
|
As we have NO idea which function we are happily passing on, we can make
|
|
NO assumptions about whether or not it will be called at raised IRQL.
|
|
For this reason, this function must be in put into non-paged pool
|
|
(aka the default location).
|
|
|
|
Arguments:
|
|
|
|
DeviceObject - pointer to a device object.
|
|
|
|
Irp - pointer to an I/O Request Packet.
|
|
|
|
Return Value:
|
|
|
|
NT status code
|
|
|
|
--*/
|
|
{
|
|
PVA_USB_DATA usbData;
|
|
NTSTATUS status;
|
|
PIO_STACK_LOCATION stack;
|
|
PURB urb;
|
|
|
|
stack = IoGetCurrentIrpStackLocation (Irp);
|
|
usbData = (PVA_USB_DATA) DeviceObject->DeviceExtension;
|
|
|
|
ASSERT (IRP_MJ_INTERNAL_DEVICE_CONTROL == stack->MajorFunction);
|
|
|
|
if(DeviceObject == Global.ControlObject) {
|
|
//
|
|
// This irp was sent to the control device object, which knows not
|
|
// how to deal with this IRP. It is therefore an error.
|
|
//
|
|
Irp->IoStatus.Information = 0;
|
|
Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return STATUS_NOT_SUPPORTED;
|
|
|
|
}
|
|
|
|
//
|
|
// This IRP was sent to the filter driver.
|
|
// Since we do not know what to do with the IRP, we should pass
|
|
// it on along down the stack.
|
|
//
|
|
|
|
InterlockedIncrement (&usbData->OutstandingIO);
|
|
if (usbData->Removed) {
|
|
status = STATUS_DELETE_PENDING;
|
|
Irp->IoStatus.Information = 0;
|
|
Irp->IoStatus.Status = status;
|
|
IoCompleteRequest (Irp, IO_NO_INCREMENT);
|
|
|
|
} else {
|
|
|
|
switch (stack->Parameters.DeviceIoControl.IoControlCode) {
|
|
case IOCTL_INTERNAL_USB_SUBMIT_URB:
|
|
|
|
urb = stack->Parameters.Others.Argument1;
|
|
|
|
if (VA_PRINT_BEFORE & usbData->PrintMask) {
|
|
VA_PrintURB (urb, usbData->PrintMask);
|
|
}
|
|
|
|
if (VA_PRINT_AFTER & usbData->PrintMask) {
|
|
|
|
//
|
|
// Copy the stack arguments
|
|
//
|
|
|
|
IoCopyCurrentIrpStackLocationToNext (Irp);
|
|
|
|
//
|
|
// Hook the IRP so that we might print after
|
|
//
|
|
IoSetCompletionRoutine (Irp,
|
|
VA_FilterURB_Comp,
|
|
usbData,
|
|
TRUE,
|
|
TRUE,
|
|
TRUE);
|
|
|
|
|
|
} else {
|
|
//
|
|
// Send the IRP on unchanged.
|
|
//
|
|
IoSkipCurrentIrpStackLocation (Irp);
|
|
}
|
|
|
|
status = IoCallDriver (usbData->TopOfStack, Irp);
|
|
break;
|
|
|
|
default:
|
|
//
|
|
// Send the IRP on unchanged.
|
|
//
|
|
IoSkipCurrentIrpStackLocation (Irp);
|
|
status = IoCallDriver (usbData->TopOfStack, Irp);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
if (0 == InterlockedDecrement (&usbData->OutstandingIO)) {
|
|
KeSetEvent (&usbData->RemoveEvent, 0, FALSE);
|
|
}
|
|
return status;
|
|
}
|
|
|
|
NTSTATUS
|
|
VA_FilterURB_Comp (
|
|
IN PDEVICE_OBJECT Device,
|
|
IN PIRP Irp,
|
|
IN PVOID Context
|
|
)
|
|
{
|
|
PVA_USB_DATA usbData;
|
|
PURB urb;
|
|
|
|
UNREFERENCED_PARAMETER (Device);
|
|
urb = IoGetCurrentIrpStackLocation(Irp)->Parameters.Others.Argument1;
|
|
|
|
usbData = (PVA_USB_DATA) Context;
|
|
|
|
VA_PrintURB (urb, usbData->PrintMask);
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
VOID
|
|
VA_PrintURB (
|
|
IN PURB Urb,
|
|
IN ULONG PrintMask
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Print to the debugger the given Urb
|
|
|
|
--*/
|
|
{
|
|
BOOLEAN again = TRUE;
|
|
ULONG i;
|
|
|
|
#define HEADER(URB) \
|
|
VA_KdPrint (("URB: Len (%x) Status (%x) Dev Handle (%x) Flags (%x)\n",\
|
|
URB->UrbHeader.Length, \
|
|
URB->UrbHeader.Status, \
|
|
URB->UrbHeader.UsbdDeviceHandle, \
|
|
URB->UrbHeader.UsbdFlags))
|
|
|
|
while (Urb && again) {
|
|
again = FALSE;
|
|
|
|
switch (Urb->UrbHeader.Function) {
|
|
case URB_FUNCTION_SELECT_INTERFACE:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Select Interface: ConfigHandle (%x) Interface (%x)\n",
|
|
Urb->UrbSelectInterface.ConfigurationHandle,
|
|
Urb->UrbSelectInterface.Interface));
|
|
}
|
|
break;
|
|
|
|
case URB_FUNCTION_SELECT_CONFIGURATION:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Select Config: Config Desc (%x) Hand (%x) Int (%x)\n",
|
|
Urb->UrbSelectConfiguration.ConfigurationDescriptor,
|
|
Urb->UrbSelectConfiguration.ConfigurationHandle,
|
|
Urb->UrbSelectConfiguration.Interface));
|
|
}
|
|
break;
|
|
|
|
case URB_FUNCTION_ABORT_PIPE:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Abort Pipe: (%x)\n",
|
|
Urb->UrbPipeRequest.PipeHandle));
|
|
}
|
|
break;
|
|
|
|
case URB_FUNCTION_RESET_PIPE:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Reset Pipe: (%x)\n",
|
|
Urb->UrbPipeRequest.PipeHandle));
|
|
}
|
|
break;
|
|
|
|
case URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Get Frame Length Control \n"));
|
|
}
|
|
break;
|
|
|
|
case URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Release Frame Length Control \n"));
|
|
}
|
|
break;
|
|
|
|
case URB_FUNCTION_GET_FRAME_LENGTH:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Get Frame Length (%x) Num (%x) \n",
|
|
Urb->UrbGetFrameLength.FrameLength,
|
|
Urb->UrbGetFrameLength.FrameNumber));
|
|
}
|
|
break;
|
|
|
|
case URB_FUNCTION_SET_FRAME_LENGTH:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Set Frame Length Delta (0x%x) \n",
|
|
Urb->UrbSetFrameLength.FrameLengthDelta));
|
|
}
|
|
break;
|
|
|
|
case URB_FUNCTION_GET_CURRENT_FRAME_NUMBER:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Current Frame Number (%x) \n",
|
|
Urb->UrbGetCurrentFrameNumber.FrameNumber));
|
|
}
|
|
break;
|
|
|
|
case URB_FUNCTION_CONTROL_TRANSFER:
|
|
if (PrintMask & VA_PRINT_CONTROL) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Control Xfer: Pipe (%x) Flags (%x) "
|
|
"Len (%x) Buffer (%x) MDL (%x) HCA (%x) "
|
|
"SetupPacket: %02.02x %02.02x %02.02x %02.02x "
|
|
"%02.02x %02.02x %02.02x %02.02x\n",
|
|
Urb->UrbControlTransfer.PipeHandle,
|
|
Urb->UrbControlTransfer.TransferFlags,
|
|
Urb->UrbControlTransfer.TransferBufferLength,
|
|
Urb->UrbControlTransfer.TransferBuffer,
|
|
Urb->UrbControlTransfer.TransferBufferMDL,
|
|
&Urb->UrbControlTransfer.hca,
|
|
(ULONG) Urb->UrbControlTransfer.SetupPacket[0],
|
|
(ULONG) Urb->UrbControlTransfer.SetupPacket[1],
|
|
(ULONG) Urb->UrbControlTransfer.SetupPacket[2],
|
|
(ULONG) Urb->UrbControlTransfer.SetupPacket[3],
|
|
(ULONG) Urb->UrbControlTransfer.SetupPacket[4],
|
|
(ULONG) Urb->UrbControlTransfer.SetupPacket[5],
|
|
(ULONG) Urb->UrbControlTransfer.SetupPacket[6],
|
|
(ULONG) Urb->UrbControlTransfer.SetupPacket[7]));
|
|
}
|
|
Urb = Urb->UrbControlTransfer.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
|
|
if (PrintMask & VA_PRINT_TRANSFER) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Bulk | Interrupt Xfer: Pipe (%x) Flags (%x) "
|
|
"Len (%x) Buffer (%x) MDL (%x) HCA (%x)\n",
|
|
Urb->UrbBulkOrInterruptTransfer.PipeHandle,
|
|
Urb->UrbBulkOrInterruptTransfer.TransferFlags,
|
|
Urb->UrbBulkOrInterruptTransfer.TransferBufferLength,
|
|
Urb->UrbBulkOrInterruptTransfer.TransferBuffer,
|
|
Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL,
|
|
&Urb->UrbControlTransfer.hca));
|
|
}
|
|
Urb = Urb->UrbBulkOrInterruptTransfer.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_ISOCH_TRANSFER:
|
|
if (PrintMask & VA_PRINT_TRANSFER) {
|
|
PUSBD_ISO_PACKET_DESCRIPTOR packet;
|
|
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Isoch Xfer: Pipe (%x) Flags (%x) "
|
|
"Len (%x) Buffer (%x) MDL (%x) HCA (%x) "
|
|
"StartFrame (%x) NumPkts (%x) ErrorCount (%x)\n",
|
|
Urb->UrbIsochronousTransfer.PipeHandle,
|
|
Urb->UrbIsochronousTransfer.TransferFlags,
|
|
Urb->UrbIsochronousTransfer.TransferBufferLength,
|
|
Urb->UrbIsochronousTransfer.TransferBuffer,
|
|
Urb->UrbIsochronousTransfer.TransferBufferMDL,
|
|
&Urb->UrbIsochronousTransfer.hca,
|
|
Urb->UrbIsochronousTransfer.StartFrame,
|
|
Urb->UrbIsochronousTransfer.NumberOfPackets,
|
|
Urb->UrbIsochronousTransfer.ErrorCount));
|
|
|
|
for (i = 0, packet = &Urb->UrbIsochronousTransfer.IsoPacket[0];
|
|
i < Urb->UrbIsochronousTransfer.NumberOfPackets;
|
|
i++, packet++) {
|
|
|
|
VA_KdPrint (("Offset: (%x), Length (%x), Status (%x)\n",
|
|
packet->Offset,
|
|
packet->Length,
|
|
packet->Status));
|
|
}
|
|
}
|
|
break;
|
|
|
|
case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
|
|
if (PrintMask & VA_PRINT_DESCRIPTOR) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Device Desc: Length (%x) Buffer (%x) MDL (%x) "
|
|
"Index (%x) Type (%x) Lang (%x) HCA (%x)\n",
|
|
Urb->UrbControlDescriptorRequest.TransferBufferLength,
|
|
Urb->UrbControlDescriptorRequest.TransferBuffer,
|
|
Urb->UrbControlDescriptorRequest.TransferBufferMDL,
|
|
Urb->UrbControlDescriptorRequest.Index,
|
|
Urb->UrbControlDescriptorRequest.DescriptorType,
|
|
Urb->UrbControlDescriptorRequest.LanguageId,
|
|
&Urb->UrbControlDescriptorRequest.hca));
|
|
}
|
|
Urb = Urb->UrbControlDescriptorRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT:
|
|
if (PrintMask & VA_PRINT_DESCRIPTOR) {
|
|
VA_KdPrint (("Endpoint Desc: Length (%x) Buffer (%x) MDL (%x) "
|
|
"Index (%x) Type (%x) Lang (%x) HCA (%x)\n",
|
|
Urb->UrbControlDescriptorRequest.TransferBufferLength,
|
|
Urb->UrbControlDescriptorRequest.TransferBuffer,
|
|
Urb->UrbControlDescriptorRequest.TransferBufferMDL,
|
|
Urb->UrbControlDescriptorRequest.Index,
|
|
Urb->UrbControlDescriptorRequest.DescriptorType,
|
|
Urb->UrbControlDescriptorRequest.LanguageId,
|
|
&Urb->UrbControlDescriptorRequest.hca));
|
|
}
|
|
Urb = Urb->UrbControlDescriptorRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE:
|
|
if (PrintMask & VA_PRINT_DESCRIPTOR) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Interface Desc: Length (%x) Buffer (%x) MDL (%x) "
|
|
"Index (%x) Type (%x) Lang (%x) HCA (%x)\n",
|
|
Urb->UrbControlDescriptorRequest.TransferBufferLength,
|
|
Urb->UrbControlDescriptorRequest.TransferBuffer,
|
|
Urb->UrbControlDescriptorRequest.TransferBufferMDL,
|
|
Urb->UrbControlDescriptorRequest.Index,
|
|
Urb->UrbControlDescriptorRequest.DescriptorType,
|
|
Urb->UrbControlDescriptorRequest.LanguageId,
|
|
&Urb->UrbControlDescriptorRequest.hca));
|
|
}
|
|
Urb = Urb->UrbBulkOrInterruptTransfer.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE:
|
|
if (PrintMask & VA_PRINT_DESCRIPTOR) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("SET Device Desc: Length (%x) Buffer (%x) MDL (%x) "
|
|
"Index (%x) Type (%x) Lang (%x) HCA (%x)\n",
|
|
Urb->UrbControlDescriptorRequest.TransferBufferLength,
|
|
Urb->UrbControlDescriptorRequest.TransferBuffer,
|
|
Urb->UrbControlDescriptorRequest.TransferBufferMDL,
|
|
Urb->UrbControlDescriptorRequest.Index,
|
|
Urb->UrbControlDescriptorRequest.DescriptorType,
|
|
Urb->UrbControlDescriptorRequest.LanguageId,
|
|
&Urb->UrbControlDescriptorRequest.hca));
|
|
}
|
|
Urb = Urb->UrbControlDescriptorRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT:
|
|
if (PrintMask & VA_PRINT_DESCRIPTOR) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("SET End Desc: Length (%x) Buffer (%x) MDL (%x) "
|
|
"Index (%x) Type (%x) Lang (%x) HCA (%x)\n",
|
|
Urb->UrbControlDescriptorRequest.TransferBufferLength,
|
|
Urb->UrbControlDescriptorRequest.TransferBuffer,
|
|
Urb->UrbControlDescriptorRequest.TransferBufferMDL,
|
|
Urb->UrbControlDescriptorRequest.Index,
|
|
Urb->UrbControlDescriptorRequest.DescriptorType,
|
|
Urb->UrbControlDescriptorRequest.LanguageId,
|
|
&Urb->UrbControlDescriptorRequest.hca));
|
|
}
|
|
Urb = Urb->UrbControlDescriptorRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE:
|
|
if (PrintMask & VA_PRINT_DESCRIPTOR) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("SET Intrfc Desc: Len (%x) Buffer (%x) MDL (%x) "
|
|
"Index (%x) Type (%x) Lang (%x) HCA (%x)\n",
|
|
Urb->UrbControlDescriptorRequest.TransferBufferLength,
|
|
Urb->UrbControlDescriptorRequest.TransferBuffer,
|
|
Urb->UrbControlDescriptorRequest.TransferBufferMDL,
|
|
Urb->UrbControlDescriptorRequest.Index,
|
|
Urb->UrbControlDescriptorRequest.DescriptorType,
|
|
Urb->UrbControlDescriptorRequest.LanguageId,
|
|
&Urb->UrbControlDescriptorRequest.hca));
|
|
}
|
|
Urb = Urb->UrbControlDescriptorRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_SET_FEATURE_TO_DEVICE:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Set Dev Feature: Selector (%x) Index (%x)\n",
|
|
Urb->UrbControlFeatureRequest.FeatureSelector,
|
|
Urb->UrbControlFeatureRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlFeatureRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_SET_FEATURE_TO_INTERFACE:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Set Interface Feature: Selector (%x) Index (%x)\n",
|
|
Urb->UrbControlFeatureRequest.FeatureSelector,
|
|
Urb->UrbControlFeatureRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlFeatureRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_SET_FEATURE_TO_ENDPOINT:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Set Endpoint Feature: Selector (%x) Index (%x)\n",
|
|
Urb->UrbControlFeatureRequest.FeatureSelector,
|
|
Urb->UrbControlFeatureRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlFeatureRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_SET_FEATURE_TO_OTHER:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Set Other Feature: Selector (%x) Index (%x)\n",
|
|
Urb->UrbControlFeatureRequest.FeatureSelector,
|
|
Urb->UrbControlFeatureRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlFeatureRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Clear Device Feature: Selector (%x) Index (%x)\n",
|
|
Urb->UrbControlFeatureRequest.FeatureSelector,
|
|
Urb->UrbControlFeatureRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlFeatureRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Clear Interface Feature: Selector (%x) Index (%x)\n",
|
|
Urb->UrbControlFeatureRequest.FeatureSelector,
|
|
Urb->UrbControlFeatureRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlFeatureRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Clear Endpoint Feature: Selector (%x) Index (%x)\n",
|
|
Urb->UrbControlFeatureRequest.FeatureSelector,
|
|
Urb->UrbControlFeatureRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlFeatureRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_CLEAR_FEATURE_TO_OTHER:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Clear Other Feature: Selector (%x) Index (%x)\n",
|
|
Urb->UrbControlFeatureRequest.FeatureSelector,
|
|
Urb->UrbControlFeatureRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlFeatureRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
|
|
case URB_FUNCTION_GET_STATUS_FROM_DEVICE:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Get Device Status: len (%x) Buffer (%x) MDL (%x) "
|
|
"Index (%x)\n",
|
|
Urb->UrbControlGetStatusRequest.TransferBufferLength,
|
|
Urb->UrbControlGetStatusRequest.TransferBuffer,
|
|
Urb->UrbControlGetStatusRequest.TransferBufferMDL,
|
|
Urb->UrbControlGetStatusRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlGetStatusRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_GET_STATUS_FROM_INTERFACE:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Get Interface Status: len (%x) Buffer (%x) MDL (%x) "
|
|
"Index (%x)\n",
|
|
Urb->UrbControlGetStatusRequest.TransferBufferLength,
|
|
Urb->UrbControlGetStatusRequest.TransferBuffer,
|
|
Urb->UrbControlGetStatusRequest.TransferBufferMDL,
|
|
Urb->UrbControlGetStatusRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlGetStatusRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_GET_STATUS_FROM_ENDPOINT:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Get Endpoint Status: len (%x) Buffer (%x) MDL (%x) "
|
|
"Index (%x)\n",
|
|
Urb->UrbControlGetStatusRequest.TransferBufferLength,
|
|
Urb->UrbControlGetStatusRequest.TransferBuffer,
|
|
Urb->UrbControlGetStatusRequest.TransferBufferMDL,
|
|
Urb->UrbControlGetStatusRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlGetStatusRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_GET_STATUS_FROM_OTHER:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Get Other Status: len (%x) Buffer (%x) MDL (%x) "
|
|
"Index (%x)\n",
|
|
Urb->UrbControlGetStatusRequest.TransferBufferLength,
|
|
Urb->UrbControlGetStatusRequest.TransferBuffer,
|
|
Urb->UrbControlGetStatusRequest.TransferBufferMDL,
|
|
Urb->UrbControlGetStatusRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlGetStatusRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
|
|
case URB_FUNCTION_VENDOR_DEVICE:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Vendor Device Req: len (%x) Buffer (%x) MDL (%x) "
|
|
"Flags (%x) RequestTypeBits (%x) "
|
|
"Request (%x) Value (%x) Index (%x)\n",
|
|
Urb->UrbControlVendorClassRequest.TransferBufferLength,
|
|
Urb->UrbControlVendorClassRequest.TransferBuffer,
|
|
Urb->UrbControlVendorClassRequest.TransferBufferMDL,
|
|
Urb->UrbControlVendorClassRequest.TransferFlags,
|
|
Urb->UrbControlVendorClassRequest.RequestTypeReservedBits,
|
|
Urb->UrbControlVendorClassRequest.Request,
|
|
Urb->UrbControlVendorClassRequest.Value,
|
|
Urb->UrbControlVendorClassRequest.Index));
|
|
}
|
|
Urb = Urb->UrbBulkOrInterruptTransfer.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_VENDOR_INTERFACE:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Vendor Intfc Req: len (%x) Buffer (%x) MDL (%x) "
|
|
"Flags (%x) RequestTypeBits (%x) "
|
|
"Request (%x) Value (%x) Index (%x)\n",
|
|
Urb->UrbControlVendorClassRequest.TransferBufferLength,
|
|
Urb->UrbControlVendorClassRequest.TransferBuffer,
|
|
Urb->UrbControlVendorClassRequest.TransferBufferMDL,
|
|
Urb->UrbControlVendorClassRequest.TransferFlags,
|
|
Urb->UrbControlVendorClassRequest.RequestTypeReservedBits,
|
|
Urb->UrbControlVendorClassRequest.Request,
|
|
Urb->UrbControlVendorClassRequest.Value,
|
|
Urb->UrbControlVendorClassRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlVendorClassRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_VENDOR_ENDPOINT:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Vendor Endpt Req: len (%x) Buffer (%x) MDL (%x) "
|
|
"Flags (%x) RequestTypeBits (%x) "
|
|
"Request (%x) Value (%x) Index (%x)\n",
|
|
Urb->UrbControlVendorClassRequest.TransferBufferLength,
|
|
Urb->UrbControlVendorClassRequest.TransferBuffer,
|
|
Urb->UrbControlVendorClassRequest.TransferBufferMDL,
|
|
Urb->UrbControlVendorClassRequest.TransferFlags,
|
|
Urb->UrbControlVendorClassRequest.RequestTypeReservedBits,
|
|
Urb->UrbControlVendorClassRequest.Request,
|
|
Urb->UrbControlVendorClassRequest.Value,
|
|
Urb->UrbControlVendorClassRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlVendorClassRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_VENDOR_OTHER:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Vendor Other Req: len (%x) Buffer (%x) MDL (%x) "
|
|
"Flags (%x) RequestTypeBits (%x) "
|
|
"Request (%x) Value (%x) Index (%x)\n",
|
|
Urb->UrbControlVendorClassRequest.TransferBufferLength,
|
|
Urb->UrbControlVendorClassRequest.TransferBuffer,
|
|
Urb->UrbControlVendorClassRequest.TransferBufferMDL,
|
|
Urb->UrbControlVendorClassRequest.TransferFlags,
|
|
Urb->UrbControlVendorClassRequest.RequestTypeReservedBits,
|
|
Urb->UrbControlVendorClassRequest.Request,
|
|
Urb->UrbControlVendorClassRequest.Value,
|
|
Urb->UrbControlVendorClassRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlVendorClassRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_CLASS_DEVICE:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Class Device Req: len (%x) Buffer (%x) MDL (%x) "
|
|
"Flags (%x) RequestTypeBits (%x) "
|
|
"Request (%x) Value (%x) Index (%x)\n",
|
|
Urb->UrbControlVendorClassRequest.TransferBufferLength,
|
|
Urb->UrbControlVendorClassRequest.TransferBuffer,
|
|
Urb->UrbControlVendorClassRequest.TransferBufferMDL,
|
|
Urb->UrbControlVendorClassRequest.TransferFlags,
|
|
Urb->UrbControlVendorClassRequest.RequestTypeReservedBits,
|
|
Urb->UrbControlVendorClassRequest.Request,
|
|
Urb->UrbControlVendorClassRequest.Value,
|
|
Urb->UrbControlVendorClassRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlVendorClassRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_CLASS_INTERFACE:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Class Intface Req: len (%x) Buffer (%x) MDL (%x) "
|
|
"Flags (%x) RequestTypeBits (%x) "
|
|
"Request (%x) Value (%x) Index (%x)\n",
|
|
Urb->UrbControlVendorClassRequest.TransferBufferLength,
|
|
Urb->UrbControlVendorClassRequest.TransferBuffer,
|
|
Urb->UrbControlVendorClassRequest.TransferBufferMDL,
|
|
Urb->UrbControlVendorClassRequest.TransferFlags,
|
|
Urb->UrbControlVendorClassRequest.RequestTypeReservedBits,
|
|
Urb->UrbControlVendorClassRequest.Request,
|
|
Urb->UrbControlVendorClassRequest.Value,
|
|
Urb->UrbControlVendorClassRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlVendorClassRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_CLASS_ENDPOINT:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Class Endpnt Req: len (%x) Buffer (%x) MDL (%x) "
|
|
"Flags (%x) RequestTypeBits (%x) "
|
|
"Request (%x) Value (%x) Index (%x)\n",
|
|
Urb->UrbControlVendorClassRequest.TransferBufferLength,
|
|
Urb->UrbControlVendorClassRequest.TransferBuffer,
|
|
Urb->UrbControlVendorClassRequest.TransferBufferMDL,
|
|
Urb->UrbControlVendorClassRequest.TransferFlags,
|
|
Urb->UrbControlVendorClassRequest.RequestTypeReservedBits,
|
|
Urb->UrbControlVendorClassRequest.Request,
|
|
Urb->UrbControlVendorClassRequest.Value,
|
|
Urb->UrbControlVendorClassRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlVendorClassRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_CLASS_OTHER:
|
|
if (PrintMask & VA_PRINT_FEATURE) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Class Other Req: len (%x) Buffer (%x) MDL (%x) "
|
|
"Flags (%x) RequestTypeBits (%x) "
|
|
"Request (%x) Value (%x) Index (%x)\n",
|
|
Urb->UrbControlVendorClassRequest.TransferBufferLength,
|
|
Urb->UrbControlVendorClassRequest.TransferBuffer,
|
|
Urb->UrbControlVendorClassRequest.TransferBufferMDL,
|
|
Urb->UrbControlVendorClassRequest.TransferFlags,
|
|
Urb->UrbControlVendorClassRequest.RequestTypeReservedBits,
|
|
Urb->UrbControlVendorClassRequest.Request,
|
|
Urb->UrbControlVendorClassRequest.Value,
|
|
Urb->UrbControlVendorClassRequest.Index));
|
|
}
|
|
Urb = Urb->UrbControlVendorClassRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_GET_CONFIGURATION:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Get Configuration: len (%x) Buffer (%x) MDL (%x) "
|
|
"\n",
|
|
Urb->UrbControlGetConfigurationRequest.TransferBufferLength,
|
|
Urb->UrbControlGetConfigurationRequest.TransferBuffer,
|
|
Urb->UrbControlGetConfigurationRequest.TransferBufferMDL));
|
|
}
|
|
Urb = Urb->UrbControlGetConfigurationRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
case URB_FUNCTION_GET_INTERFACE:
|
|
if (PrintMask & VA_PRINT_COMMAND) {
|
|
HEADER(Urb);
|
|
VA_KdPrint (("Get Interface: len (%x) Buffer (%x) MDL (%x) "
|
|
"\n",
|
|
Urb->UrbControlGetInterfaceRequest.TransferBufferLength,
|
|
Urb->UrbControlGetInterfaceRequest.TransferBuffer,
|
|
Urb->UrbControlGetInterfaceRequest.TransferBufferMDL));
|
|
}
|
|
Urb = Urb->UrbControlGetInterfaceRequest.UrbLink;
|
|
again = TRUE;
|
|
break;
|
|
|
|
default:
|
|
VA_KdPrint (("WARNING\n", Urb));
|
|
VA_KdPrint (("WARNING Unkown Urb (%x)\n", Urb));
|
|
VA_KdPrint (("WARNING\n", Urb));
|
|
}
|
|
}
|
|
}
|
|
|
|
|