windows-nt/Source/XPSP1/NT/drivers/wdm/usb/usbccgp/debug.c

314 lines
10 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*
*************************************************************************
* File: DEBUG.C
*
* Module: USBCCGP.SYS
* USB Common Class Generic Parent driver.
*
* Copyright (c) 1998 Microsoft Corporation
*
*
* Author: ervinp
*
*************************************************************************
*/
#include <wdm.h>
#include <usbdi.h>
#include <usbdlib.h>
#include <usbioctl.h>
#include "usbccgp.h"
#include "debug.h"
#if DBG
BOOLEAN dbgTrapOnWarn = FALSE;
BOOLEAN dbgVerbose = FALSE;
BOOLEAN dbgShowIsochProgress = FALSE;
VOID DbgLogIrpMajor(ULONG_PTR irpPtr, ULONG majorFunc, ULONG isForParentFdo, ULONG isComplete, ULONG status)
{
if (dbgVerbose){
char *funcName;
switch (majorFunc){
#undef MAKE_CASE
#define MAKE_CASE(fnc) case fnc: funcName = #fnc; break;
MAKE_CASE(IRP_MJ_CREATE)
MAKE_CASE(IRP_MJ_CREATE_NAMED_PIPE)
MAKE_CASE(IRP_MJ_CLOSE)
MAKE_CASE(IRP_MJ_READ)
MAKE_CASE(IRP_MJ_WRITE)
MAKE_CASE(IRP_MJ_QUERY_INFORMATION)
MAKE_CASE(IRP_MJ_SET_INFORMATION)
MAKE_CASE(IRP_MJ_QUERY_EA)
MAKE_CASE(IRP_MJ_SET_EA)
MAKE_CASE(IRP_MJ_FLUSH_BUFFERS)
MAKE_CASE(IRP_MJ_QUERY_VOLUME_INFORMATION)
MAKE_CASE(IRP_MJ_SET_VOLUME_INFORMATION)
MAKE_CASE(IRP_MJ_DIRECTORY_CONTROL)
MAKE_CASE(IRP_MJ_FILE_SYSTEM_CONTROL)
MAKE_CASE(IRP_MJ_DEVICE_CONTROL)
MAKE_CASE(IRP_MJ_INTERNAL_DEVICE_CONTROL)
MAKE_CASE(IRP_MJ_SHUTDOWN)
MAKE_CASE(IRP_MJ_LOCK_CONTROL)
MAKE_CASE(IRP_MJ_CLEANUP)
MAKE_CASE(IRP_MJ_CREATE_MAILSLOT)
MAKE_CASE(IRP_MJ_QUERY_SECURITY)
MAKE_CASE(IRP_MJ_SET_SECURITY)
MAKE_CASE(IRP_MJ_POWER)
MAKE_CASE(IRP_MJ_SYSTEM_CONTROL)
MAKE_CASE(IRP_MJ_DEVICE_CHANGE)
MAKE_CASE(IRP_MJ_QUERY_QUOTA)
MAKE_CASE(IRP_MJ_SET_QUOTA)
MAKE_CASE(IRP_MJ_PNP)
default: funcName = "????"; break;
}
if (isComplete){
DBGOUT(("< %s for %s status=%xh %s (irp=%ph)",
funcName,
isForParentFdo ? "parent" : "function",
status,
NT_SUCCESS(status) ? "" : "<** ERROR **>",
irpPtr));
}
else {
DBGOUT(("> %s for %s (irp=%ph)",
funcName,
isForParentFdo ? "parent" : "function",
irpPtr));
}
}
}
VOID DbgLogPnpIrp(ULONG_PTR irpPtr, ULONG minorFunc, ULONG isForParentFdo, ULONG isComplete, ULONG status)
{
char *funcName;
switch (minorFunc){
#undef MAKE_CASE
#define MAKE_CASE(fnc) case fnc: funcName = #fnc; break;
MAKE_CASE(IRP_MN_START_DEVICE)
MAKE_CASE(IRP_MN_QUERY_REMOVE_DEVICE)
MAKE_CASE(IRP_MN_REMOVE_DEVICE)
MAKE_CASE(IRP_MN_CANCEL_REMOVE_DEVICE)
MAKE_CASE(IRP_MN_STOP_DEVICE)
MAKE_CASE(IRP_MN_QUERY_STOP_DEVICE)
MAKE_CASE(IRP_MN_CANCEL_STOP_DEVICE)
MAKE_CASE(IRP_MN_QUERY_DEVICE_RELATIONS)
MAKE_CASE(IRP_MN_QUERY_INTERFACE)
MAKE_CASE(IRP_MN_QUERY_CAPABILITIES)
MAKE_CASE(IRP_MN_QUERY_RESOURCES)
MAKE_CASE(IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
MAKE_CASE(IRP_MN_QUERY_DEVICE_TEXT)
MAKE_CASE(IRP_MN_READ_CONFIG)
MAKE_CASE(IRP_MN_WRITE_CONFIG)
MAKE_CASE(IRP_MN_EJECT)
MAKE_CASE(IRP_MN_SET_LOCK)
MAKE_CASE(IRP_MN_QUERY_ID)
MAKE_CASE(IRP_MN_QUERY_PNP_DEVICE_STATE)
MAKE_CASE(IRP_MN_QUERY_BUS_INFORMATION)
default: funcName = "????"; break;
}
if (dbgVerbose){
if (isComplete){
DBGOUT((" < %s for %s status=%xh (irp=%ph)",
funcName,
isForParentFdo ? "parent" : "function",
status,
irpPtr));
}
else {
DBGOUT((" > %s for %s (irp=%ph)",
funcName,
isForParentFdo ? "parent" : "function",
irpPtr));
}
}
}
VOID DbgLogIoctl(ULONG ioControlCode, ULONG status)
{
if (dbgVerbose){
PCHAR ioctlStr;
switch (ioControlCode){
#undef MAKE_CASE
#define MAKE_CASE(ioctl) case ioctl: ioctlStr = #ioctl; break;
MAKE_CASE(IOCTL_INTERNAL_USB_SUBMIT_URB)
MAKE_CASE(IOCTL_INTERNAL_USB_RESET_PORT)
MAKE_CASE(IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO)
MAKE_CASE(IOCTL_INTERNAL_USB_GET_PORT_STATUS)
MAKE_CASE(IOCTL_INTERNAL_USB_ENABLE_PORT)
MAKE_CASE(IOCTL_INTERNAL_USB_GET_HUB_COUNT)
MAKE_CASE(IOCTL_INTERNAL_USB_CYCLE_PORT)
MAKE_CASE(IOCTL_INTERNAL_USB_GET_HUB_NAME)
MAKE_CASE(IOCTL_INTERNAL_USB_GET_BUS_INFO)
MAKE_CASE(IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME)
default: ioctlStr = "???"; break;
}
DBGOUT((" IOCTL: %s (%xh) status=%xh", ioctlStr, ioControlCode, status));
}
}
PUCHAR DbgGetUrbName(ULONG urbFunc)
{
PUCHAR urbName;
switch (urbFunc){
#undef MAKE_CASE
#define MAKE_CASE(func) case func: urbName = #func; break;
MAKE_CASE(URB_FUNCTION_SELECT_CONFIGURATION)
MAKE_CASE(URB_FUNCTION_SELECT_INTERFACE)
MAKE_CASE(URB_FUNCTION_ABORT_PIPE)
MAKE_CASE(URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL)
MAKE_CASE(URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL)
MAKE_CASE(URB_FUNCTION_GET_FRAME_LENGTH)
MAKE_CASE(URB_FUNCTION_SET_FRAME_LENGTH)
MAKE_CASE(URB_FUNCTION_GET_CURRENT_FRAME_NUMBER)
MAKE_CASE(URB_FUNCTION_CONTROL_TRANSFER)
MAKE_CASE(URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER)
MAKE_CASE(URB_FUNCTION_ISOCH_TRANSFER)
MAKE_CASE(URB_FUNCTION_RESET_PIPE)
MAKE_CASE(URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE)
MAKE_CASE(URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT)
MAKE_CASE(URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE)
MAKE_CASE(URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE)
MAKE_CASE(URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT)
MAKE_CASE(URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE)
MAKE_CASE(URB_FUNCTION_SET_FEATURE_TO_DEVICE)
MAKE_CASE(URB_FUNCTION_SET_FEATURE_TO_INTERFACE)
MAKE_CASE(URB_FUNCTION_SET_FEATURE_TO_ENDPOINT)
MAKE_CASE(URB_FUNCTION_SET_FEATURE_TO_OTHER)
MAKE_CASE(URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE)
MAKE_CASE(URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE)
MAKE_CASE(URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT)
MAKE_CASE(URB_FUNCTION_CLEAR_FEATURE_TO_OTHER)
MAKE_CASE(URB_FUNCTION_GET_STATUS_FROM_DEVICE)
MAKE_CASE(URB_FUNCTION_GET_STATUS_FROM_INTERFACE)
MAKE_CASE(URB_FUNCTION_GET_STATUS_FROM_ENDPOINT)
MAKE_CASE(URB_FUNCTION_GET_STATUS_FROM_OTHER)
MAKE_CASE(URB_FUNCTION_RESERVED0)
MAKE_CASE(URB_FUNCTION_VENDOR_DEVICE)
MAKE_CASE(URB_FUNCTION_VENDOR_INTERFACE)
MAKE_CASE(URB_FUNCTION_VENDOR_ENDPOINT)
MAKE_CASE(URB_FUNCTION_VENDOR_OTHER)
MAKE_CASE(URB_FUNCTION_CLASS_DEVICE)
MAKE_CASE(URB_FUNCTION_CLASS_INTERFACE)
MAKE_CASE(URB_FUNCTION_CLASS_ENDPOINT)
MAKE_CASE(URB_FUNCTION_CLASS_OTHER)
MAKE_CASE(URB_FUNCTION_RESERVED)
MAKE_CASE(URB_FUNCTION_GET_CONFIGURATION)
MAKE_CASE(URB_FUNCTION_GET_INTERFACE)
default: urbName = NULL; break;
}
return urbName;
}
VOID DbgLogUrb(PURB urb)
{
if (dbgVerbose){
PCHAR urbStr = DbgGetUrbName(urb->UrbHeader.Function);
if (urbStr){
DBGOUT((" URB: %s (%ph)", urbStr, urb));
}
else {
DBGOUT((" URB: func=%xh (%ph)", (ULONG)urb->UrbHeader.Function, urb));
}
}
}
VOID DbgDumpBytes(PUCHAR msg, PVOID bufPtr, ULONG len)
{
PUCHAR buf = bufPtr;
#define PRNT(ch) ((((ch) < ' ') || ((ch) > '~')) ? '.' : (ch))
if (dbgVerbose){
ULONG i;
DbgPrint("%s (len %xh @ %p): \r\n", msg, len, buf);
for (i = 0; i < len; i += 0x10){
if (i && !(i & 0x007f)){
DbgPrint("\r\n");
}
DbgPrint(" ");
if (len-i >= 16){
PUCHAR ptr = buf+i;
DbgPrint("%02x %02x %02x %02x %02x %02x %02x %02x "
"%02x %02x %02x %02x %02x %02x %02x %02x "
" "
"%c%c%c%c%c%c%c%c %c%c%c%c%c%c%c%c",
ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7],
ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15],
PRNT(ptr[0]), PRNT(ptr[1]), PRNT(ptr[2]), PRNT(ptr[3]),
PRNT(ptr[4]), PRNT(ptr[5]), PRNT(ptr[6]), PRNT(ptr[7]),
PRNT(ptr[8]), PRNT(ptr[9]), PRNT(ptr[10]), PRNT(ptr[11]),
PRNT(ptr[12]), PRNT(ptr[13]), PRNT(ptr[14]), PRNT(ptr[15])
);
}
else {
ULONG j;
for (j = 0; j < 16; j++){
if (j == 8) DbgPrint(" ");
if (i+j < len){
DbgPrint("%02x ", (ULONG)buf[i+j]);
}
else {
DbgPrint(" ");
}
}
DbgPrint(" ");
for (j = 0; j < 16; j++){
if (j == 8) DbgPrint(" ");
if (i+j < len){
UCHAR ch = buf[i+j];
DbgPrint("%c", PRNT(ch));
}
else {
// DbgPrint(" ");
}
}
}
DbgPrint("\r\n");
}
}
}
VOID DbgShowIsochProgress()
{
if (dbgShowIsochProgress){
DbgPrint(".");
}
}
#endif