/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
USB.c
Abstract:
WinDbg Extension Api
Author:
Kenneth D. Ray (kenray) June 1997
Environment:
User Mode.
Revision History:
--*/
#include "precomp.h"
typedef union _USB_FLAGS {
struct {
ULONG FullListing : 1;
ULONG Reserved : 31;
};
ULONG Flags;
} USB_FLAGS;
#define PRINT_FLAGS(value, flag) \
if ((value) & (flag)) { \
dprintf (#flag " "); \
}
#define DESC_MAXTOKENS 3
#define DESC_MAXBUFFER 80
#define DESC_USAGE() { UsbStrucUsage(); return E_INVALIDARG; }
extern
ULONG
TokenizeString(
PUCHAR Input,
PUCHAR *Output,
ULONG Max
);
extern
VOID
OhciHcdTd (
ULONG64 MemLoc
);
extern
VOID
OhciHcdEd (
ULONG64 MemLoc
);
extern
VOID
OhciEndpoint (
ULONG64 MemLoc
);
extern
VOID
OhciHCRegisters(
ULONG64 MemLoc
);
extern
VOID
OhciHCCA(
ULONG64 MemLoc
);
extern
VOID
OhciHcEd(
ULONG64 MemLoc
);
extern
VOID
OhciHcTd(
ULONG64 MemLoc
);
VOID
UHCD_HCRegisters(
ULONG64 MemLoc
);
extern
VOID
USBD_DeviceHandle(
ULONG64 MemLoc
);
VOID
UsbStrucUsage ()
{
dprintf("!UsbStruc
\n");
dprintf(" - address of a structure to be dumped\n");
dprintf(" - {OHCIReg | HCCA | OHCIHcdED | OHCIHcdTD |\n"
" OHCIEndpoint | DevData | UHCDReg }\n");
dprintf("\n");
}
DECLARE_API ( usbstruc )
{
ULONG64 Desc = 0;
PUCHAR Tokens[DESC_MAXTOKENS];
UCHAR Buffer[DESC_MAXBUFFER];
PUCHAR s;
UCHAR c;
ULONG count;
//
// Validate parameters. Tokenize the incoming string, the first
// argument should be a (kernel mode) address, the second a string.
//
//
// args is const, we need to modify the buffer, copy it.
//
for (count = 0; count < DESC_MAXBUFFER; count++) {
if ((Buffer[count] = args[count]) == '\0') {
break;
}
}
if (count == DESC_MAXBUFFER) {
dprintf("Buffer to small to contain input arguments\n");
DESC_USAGE();
}
if (TokenizeString(Buffer, Tokens, DESC_MAXTOKENS) !=
(DESC_MAXTOKENS - 1)) {
DESC_USAGE();
}
if ((Desc = GetExpression(Tokens[0])) == 0) {
DESC_USAGE();
}
//
// The second argument should be a string telling us what kind of
// device extension to dump. Convert it to upper case to make life
// easier.
//
s = Tokens[1];
while ((c = *s) != '\0') {
*s++ = (UCHAR)toupper(c);
}
s = Tokens[1];
if (!strcmp(s, "OHCIHCDED")) {
//
// It's an OpenHCI Hcd Endpoint Descriptor
//
OhciHcdEd (Desc);
} else if (!strcmp(s, "OHCIHCDTD")) {
//
// It's an OpenHCI Hcd Transfer Descriptor
//
OhciHcdTd (Desc);
} else if (!strcmp(s, "OHCIENDPOINT")) {
//
// It's an OpenHCI Hcd Endpoint Descriptor
//
OhciEndpoint(Desc);
} else if (!strcmp(s, "OHCIREG")) {
//
// It's the OpenHCI Registers
//
OhciHCRegisters(Desc);
} else if (!strcmp(s, "HCCA")) {
//
// It's the OpenHCI HCCA
//
OhciHCCA(Desc);
} else if (!strcmp(s, "OHCIHCED")) {
//
// It's the OpenHCI HcED
//
OhciHcEd(Desc);
} else if (!strcmp(s, "OHCIHCTD")) {
//
// It's the OpenHCI HcTD
//
OhciHcTd(Desc);
} else if (!strcmp(s, "DEVDATA")) {
//
// It's the USBD_DEVICE_DATA
//
USBD_DeviceHandle(Desc);
} else if (!strcmp(s, "UHCDREG")) {
//
// It's the UHCD_Registers
//
// UHCD_HCRegisters(Desc);
#if 0
} else if (!strcmp(s, "SOME_OTHER_DESCRIPTOR_TYPE")) {
//
// It's some other extension type.
//
UsbStruc (Extension);
#endif
} else {
dprintf("Structure type '%s' is not handled by !usbStruc.\n", s);
}
return S_OK;
}