/*++ Copyright (c) 1996-2001 Microsoft Corporation Module Name: DBG.C Abstract: USBSTOR driver debug utility functions Environment: kernel mode Revision History: 06-01-98 : started rewrite --*/ //***************************************************************************** // I N C L U D E S //***************************************************************************** #include #include #include #include "usbmass.h" #ifdef ALLOC_PRAGMA #if DBG #pragma alloc_text(PAGE, USBSTOR_QueryGlobalParams) #endif #if DEBUG_LOG #pragma alloc_text(PAGE, USBSTOR_LogInit) #pragma alloc_text(PAGE, USBSTOR_LogUnInit) #endif #if DBG #pragma alloc_text(PAGE, DumpDeviceDesc) #pragma alloc_text(PAGE, DumpConfigDesc) #pragma alloc_text(PAGE, DumpConfigurationDescriptor) #pragma alloc_text(PAGE, DumpInterfaceDescriptor) #pragma alloc_text(PAGE, DumpEndpointDescriptor) #endif #endif //****************************************************************************** // // G L O B A L S // //****************************************************************************** #if DBG || DEBUG_LOG DRIVERGLOBALS USBSTOR_DriverGlobals = { #if DBG 0, // DebugFlags 0, // DebugLevel #endif 0, // LogStart 0, // LogPtr 0, // LogEnd 0 // LogSpinLock }; #endif #if DBG //****************************************************************************** // // USBSTOR_QueryGlobalParams() // //****************************************************************************** VOID USBSTOR_QueryGlobalParams ( ) { RTL_QUERY_REGISTRY_TABLE paramTable[3]; DBGPRINT(2, ("enter: USBSTOR_QueryGlobalParams\n")); RtlZeroMemory (¶mTable[0], sizeof(paramTable)); paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; paramTable[0].Name = L"DebugFlags"; paramTable[0].EntryContext = &USBSTOR_DriverGlobals.DebugFlags; paramTable[0].DefaultType = REG_BINARY; paramTable[0].DefaultData = &USBSTOR_DriverGlobals.DebugFlags; paramTable[0].DefaultLength = sizeof(ULONG); paramTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; paramTable[1].Name = L"DebugLevel"; paramTable[1].EntryContext = &USBSTOR_DriverGlobals.DebugLevel; paramTable[1].DefaultType = REG_BINARY; paramTable[1].DefaultData = &USBSTOR_DriverGlobals.DebugLevel; paramTable[1].DefaultLength = sizeof(ULONG); RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, L"USBSTOR", ¶mTable[0], NULL, // Context NULL); // Environment DBGPRINT(2, ("exit: USBSTOR_QueryGlobalParams\n")); } #endif #if DBG || DEBUG_LOG //***************************************************************************** // // USBSTOR_LogInit() // //***************************************************************************** VOID USBSTOR_LogInit ( ) { KeInitializeSpinLock(&USBSTOR_DriverGlobals.LogSpinLock); USBSTOR_DriverGlobals.LogStart = ExAllocatePoolWithTag(NonPagedPool, LOGSIZE, POOL_TAG); if (USBSTOR_DriverGlobals.LogStart != NULL) { USBSTOR_DriverGlobals.LogEnd = USBSTOR_DriverGlobals.LogStart + LOGSIZE / sizeof(USBSTOR_LOG_ENTRY); USBSTOR_DriverGlobals.LogPtr = USBSTOR_DriverGlobals.LogEnd - 1; } } //***************************************************************************** // // USBSTOR_LogUnInit() // //***************************************************************************** VOID USBSTOR_LogUnInit ( ) { PUSBSTOR_LOG_ENTRY logStart; logStart = USBSTOR_DriverGlobals.LogStart; USBSTOR_DriverGlobals.LogStart = 0; ExFreePool(logStart); } //***************************************************************************** // // USBSTOR_LogEntry() // //***************************************************************************** VOID USBSTOR_LogEntry ( IN ULONG Tag, IN ULONG_PTR Info1, IN ULONG_PTR Info2, IN ULONG_PTR Info3 ) { KIRQL irql; if (USBSTOR_DriverGlobals.LogStart == NULL) { return; } KeAcquireSpinLock(&USBSTOR_DriverGlobals.LogSpinLock, &irql); USBSTOR_DriverGlobals.LogPtr->le_tag = Tag; USBSTOR_DriverGlobals.LogPtr->le_info1 = Info1; USBSTOR_DriverGlobals.LogPtr->le_info2 = Info2; USBSTOR_DriverGlobals.LogPtr->le_info3 = Info3; if (USBSTOR_DriverGlobals.LogPtr > USBSTOR_DriverGlobals.LogStart) { USBSTOR_DriverGlobals.LogPtr--; } else { USBSTOR_DriverGlobals.LogPtr = USBSTOR_DriverGlobals.LogEnd - 1; } KeReleaseSpinLock(&USBSTOR_DriverGlobals.LogSpinLock, irql); } #endif #if DBG //***************************************************************************** // // PnPMinorFunctionString() // // MinorFunction - The IRP_MJ_PNP minor function // //***************************************************************************** PCHAR PnPMinorFunctionString ( UCHAR MinorFunction ) { switch (MinorFunction) { case IRP_MN_START_DEVICE: return "IRP_MN_START_DEVICE"; case IRP_MN_QUERY_REMOVE_DEVICE: return "IRP_MN_QUERY_REMOVE_DEVICE"; case IRP_MN_REMOVE_DEVICE: return "IRP_MN_REMOVE_DEVICE"; case IRP_MN_CANCEL_REMOVE_DEVICE: return "IRP_MN_CANCEL_REMOVE_DEVICE"; case IRP_MN_STOP_DEVICE: return "IRP_MN_STOP_DEVICE"; case IRP_MN_QUERY_STOP_DEVICE: return "IRP_MN_QUERY_STOP_DEVICE"; case IRP_MN_CANCEL_STOP_DEVICE: return "IRP_MN_CANCEL_STOP_DEVICE"; case IRP_MN_QUERY_DEVICE_RELATIONS: return "IRP_MN_QUERY_DEVICE_RELATIONS"; case IRP_MN_QUERY_INTERFACE: return "IRP_MN_QUERY_INTERFACE"; case IRP_MN_QUERY_CAPABILITIES: return "IRP_MN_QUERY_CAPABILITIES"; case IRP_MN_QUERY_RESOURCES: return "IRP_MN_QUERY_RESOURCES"; case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: return "IRP_MN_QUERY_RESOURCE_REQUIREMENTS"; case IRP_MN_QUERY_DEVICE_TEXT: return "IRP_MN_QUERY_DEVICE_TEXT"; case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: return "IRP_MN_FILTER_RESOURCE_REQUIREMENTS"; case IRP_MN_READ_CONFIG: return "IRP_MN_READ_CONFIG"; case IRP_MN_WRITE_CONFIG: return "IRP_MN_WRITE_CONFIG"; case IRP_MN_EJECT: return "IRP_MN_EJECT"; case IRP_MN_SET_LOCK: return "IRP_MN_SET_LOCK"; case IRP_MN_QUERY_ID: return "IRP_MN_QUERY_ID"; case IRP_MN_QUERY_PNP_DEVICE_STATE: return "IRP_MN_QUERY_PNP_DEVICE_STATE"; case IRP_MN_QUERY_BUS_INFORMATION: return "IRP_MN_QUERY_BUS_INFORMATION"; case IRP_MN_DEVICE_USAGE_NOTIFICATION: return "IRP_MN_DEVICE_USAGE_NOTIFICATION"; case IRP_MN_SURPRISE_REMOVAL: return "IRP_MN_SURPRISE_REMOVAL"; default: return "IRP_MN_?????"; } } //***************************************************************************** // // PowerMinorFunctionString() // // MinorFunction - The IRP_MJ_POWER minor function // //***************************************************************************** PCHAR PowerMinorFunctionString ( UCHAR MinorFunction ) { switch (MinorFunction) { case IRP_MN_WAIT_WAKE: return "IRP_MN_WAIT_WAKE"; case IRP_MN_POWER_SEQUENCE: return "IRP_MN_POWER_SEQUENCE"; case IRP_MN_SET_POWER: return "IRP_MN_SET_POWER"; case IRP_MN_QUERY_POWER: return "IRP_MN_QUERY_POWER"; default: return "IRP_MN_?????"; } } //***************************************************************************** // // PowerDeviceStateString() // // State - The DEVICE_POWER_STATE // //***************************************************************************** PCHAR PowerDeviceStateString ( DEVICE_POWER_STATE State ) { switch (State) { case PowerDeviceUnspecified: return "PowerDeviceUnspecified"; case PowerDeviceD0: return "PowerDeviceD0"; case PowerDeviceD1: return "PowerDeviceD1"; case PowerDeviceD2: return "PowerDeviceD2"; case PowerDeviceD3: return "PowerDeviceD3"; case PowerDeviceMaximum: return "PowerDeviceMaximum"; default: return "PowerDevice?????"; } } //***************************************************************************** // // PowerSystemStateString() // // State - The SYSTEM_POWER_STATE // //***************************************************************************** PCHAR PowerSystemStateString ( SYSTEM_POWER_STATE State ) { switch (State) { case PowerSystemUnspecified: return "PowerSystemUnspecified"; case PowerSystemWorking: return "PowerSystemWorking"; case PowerSystemSleeping1: return "PowerSystemSleeping1"; case PowerSystemSleeping2: return "PowerSystemSleeping2"; case PowerSystemSleeping3: return "PowerSystemSleeping3"; case PowerSystemHibernate: return "PowerSystemHibernate"; case PowerSystemShutdown: return "PowerSystemShutdown"; case PowerSystemMaximum: return "PowerSystemMaximum"; default: return "PowerSystem?????"; } } //***************************************************************************** // // DumpDeviceDesc() // // DeviceDesc - The Device Descriptor // //***************************************************************************** VOID DumpDeviceDesc ( PUSB_DEVICE_DESCRIPTOR DeviceDesc ) { DBGPRINT(3, ("------------------\n")); DBGPRINT(3, ("Device Descriptor:\n")); DBGPRINT(3, ("bcdUSB: 0x%04X\n", DeviceDesc->bcdUSB)); DBGPRINT(3, ("bDeviceClass: 0x%02X\n", DeviceDesc->bDeviceClass)); DBGPRINT(3, ("bDeviceSubClass: 0x%02X\n", DeviceDesc->bDeviceSubClass)); DBGPRINT(3, ("bDeviceProtocol: 0x%02X\n", DeviceDesc->bDeviceProtocol)); DBGPRINT(3, ("bMaxPacketSize0: 0x%02X (%d)\n", DeviceDesc->bMaxPacketSize0, DeviceDesc->bMaxPacketSize0)); DBGPRINT(3, ("idVendor: 0x%04X\n", DeviceDesc->idVendor)); DBGPRINT(3, ("idProduct: 0x%04X\n", DeviceDesc->idProduct)); DBGPRINT(3, ("bcdDevice: 0x%04X\n", DeviceDesc->bcdDevice)); DBGPRINT(3, ("iManufacturer: 0x%02X\n", DeviceDesc->iManufacturer)); DBGPRINT(3, ("iProduct: 0x%02X\n", DeviceDesc->iProduct)); DBGPRINT(3, ("iSerialNumber: 0x%02X\n", DeviceDesc->iSerialNumber)); DBGPRINT(3, ("bNumConfigurations: 0x%02X\n", DeviceDesc->bNumConfigurations)); } //***************************************************************************** // // DumpConfigDesc() // // ConfigDesc - The Configuration Descriptor, and associated Interface and // EndpointDescriptors // //***************************************************************************** VOID DumpConfigDesc ( PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc ) { PUCHAR descEnd; PUSB_COMMON_DESCRIPTOR commonDesc; BOOLEAN dumpUnknown; descEnd = (PUCHAR)ConfigDesc + ConfigDesc->wTotalLength; commonDesc = (PUSB_COMMON_DESCRIPTOR)ConfigDesc; while ((PUCHAR)commonDesc + sizeof(USB_COMMON_DESCRIPTOR) < descEnd && (PUCHAR)commonDesc + commonDesc->bLength <= descEnd) { dumpUnknown = FALSE; switch (commonDesc->bDescriptorType) { case USB_CONFIGURATION_DESCRIPTOR_TYPE: if (commonDesc->bLength != sizeof(USB_CONFIGURATION_DESCRIPTOR)) { dumpUnknown = TRUE; break; } DumpConfigurationDescriptor((PUSB_CONFIGURATION_DESCRIPTOR)commonDesc); break; case USB_INTERFACE_DESCRIPTOR_TYPE: if (commonDesc->bLength != sizeof(USB_INTERFACE_DESCRIPTOR)) { dumpUnknown = TRUE; break; } DumpInterfaceDescriptor((PUSB_INTERFACE_DESCRIPTOR)commonDesc); break; case USB_ENDPOINT_DESCRIPTOR_TYPE: if (commonDesc->bLength != sizeof(USB_ENDPOINT_DESCRIPTOR)) { dumpUnknown = TRUE; break; } DumpEndpointDescriptor((PUSB_ENDPOINT_DESCRIPTOR)commonDesc); break; default: dumpUnknown = TRUE; break; } if (dumpUnknown) { // DumpUnknownDescriptor(commonDesc); } (PUCHAR)commonDesc += commonDesc->bLength; } } //***************************************************************************** // // DumpConfigurationDescriptor() // //***************************************************************************** VOID DumpConfigurationDescriptor ( PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc ) { DBGPRINT(3, ("-------------------------\n")); DBGPRINT(3, ("Configuration Descriptor:\n")); DBGPRINT(3, ("wTotalLength: 0x%04X\n", ConfigDesc->wTotalLength)); DBGPRINT(3, ("bNumInterfaces: 0x%02X\n", ConfigDesc->bNumInterfaces)); DBGPRINT(3, ("bConfigurationValue: 0x%02X\n", ConfigDesc->bConfigurationValue)); DBGPRINT(3, ("iConfiguration: 0x%02X\n", ConfigDesc->iConfiguration)); DBGPRINT(3, ("bmAttributes: 0x%02X\n", ConfigDesc->bmAttributes)); if (ConfigDesc->bmAttributes & 0x80) { DBGPRINT(3, (" Bus Powered\n")); } if (ConfigDesc->bmAttributes & 0x40) { DBGPRINT(3, (" Self Powered\n")); } if (ConfigDesc->bmAttributes & 0x20) { DBGPRINT(3, (" Remote Wakeup\n")); } DBGPRINT(3, ("MaxPower: 0x%02X (%d Ma)\n", ConfigDesc->MaxPower, ConfigDesc->MaxPower * 2)); } //***************************************************************************** // // DumpInterfaceDescriptor() // //***************************************************************************** VOID DumpInterfaceDescriptor ( PUSB_INTERFACE_DESCRIPTOR InterfaceDesc ) { DBGPRINT(3, ("---------------------\n")); DBGPRINT(3, ("Interface Descriptor:\n")); DBGPRINT(3, ("bInterfaceNumber: 0x%02X\n", InterfaceDesc->bInterfaceNumber)); DBGPRINT(3, ("bAlternateSetting: 0x%02X\n", InterfaceDesc->bAlternateSetting)); DBGPRINT(3, ("bNumEndpoints: 0x%02X\n", InterfaceDesc->bNumEndpoints)); DBGPRINT(3, ("bInterfaceClass: 0x%02X\n", InterfaceDesc->bInterfaceClass)); DBGPRINT(3, ("bInterfaceSubClass: 0x%02X\n", InterfaceDesc->bInterfaceSubClass)); DBGPRINT(3, ("bInterfaceProtocol: 0x%02X\n", InterfaceDesc->bInterfaceProtocol)); DBGPRINT(3, ("iInterface: 0x%02X\n", InterfaceDesc->iInterface)); } //***************************************************************************** // // DumpEndpointDescriptor() // //***************************************************************************** VOID DumpEndpointDescriptor ( PUSB_ENDPOINT_DESCRIPTOR EndpointDesc ) { DBGPRINT(3, ("--------------------\n")); DBGPRINT(3, ("Endpoint Descriptor:\n")); DBGPRINT(3, ("bEndpointAddress: 0x%02X\n", EndpointDesc->bEndpointAddress)); switch (EndpointDesc->bmAttributes & 0x03) { case 0x00: DBGPRINT(3, ("Transfer Type: Control\n")); break; case 0x01: DBGPRINT(3, ("Transfer Type: Isochronous\n")); break; case 0x02: DBGPRINT(3, ("Transfer Type: Bulk\n")); break; case 0x03: DBGPRINT(3, ("Transfer Type: Interrupt\n")); break; } DBGPRINT(3, ("wMaxPacketSize: 0x%04X (%d)\n", EndpointDesc->wMaxPacketSize, EndpointDesc->wMaxPacketSize)); DBGPRINT(3, ("bInterval: 0x%02X\n", EndpointDesc->bInterval)); } #endif