/*++ Copyright (c) 1999 Microsoft Corporation Module Name: util.c Abstract: WinDbg Extension Api Author: Chris Robinson (crobins) Feburary 1999 Environment: User Mode. Revision History: --*/ #include "precomp.h" #include "genusbkd.h" #include "..\sys\genusb.h" VOID DumpUSBDescriptor( PVOID Descriptor ) { PUSB_DEVICE_DESCRIPTOR dd = Descriptor; PUSB_COMMON_DESCRIPTOR cd = Descriptor; PUSB_INTERFACE_DESCRIPTOR id = Descriptor; PUSB_CONFIGURATION_DESCRIPTOR cf = Descriptor; PUSB_ENDPOINT_DESCRIPTOR ed = Descriptor; switch (cd->bDescriptorType) { case USB_CONFIGURATION_DESCRIPTOR_TYPE: dprintf("[CONFIGURATION DESCRIPTOR]\n"); dprintf("bLength 0x%x\n", cf->bLength); dprintf("bDescriptorType 0x%x\n", cf->bDescriptorType); dprintf("wTotalLength 0x%x (%d)\n", cf->wTotalLength, cf->wTotalLength); dprintf("bNumInterfaces 0x%x\n", cf->bNumInterfaces); dprintf("bConfigurationValue 0x%x\n", cf->bConfigurationValue); dprintf("iConfiguration 0x%x\n", cf->iConfiguration); dprintf("bmAttributes 0x%x\n", cf->bmAttributes); dprintf("MaxPower 0x%x (%d)\n", cf->MaxPower, cf->MaxPower); break; case USB_INTERFACE_DESCRIPTOR_TYPE: dprintf("[INTERFACE DESCRIPTOR]\n"); dprintf("bLength 0x%x\n", id->bLength); dprintf("bDescriptorType 0x%x\n", id->bDescriptorType); dprintf("bInterfaceNumber 0x%x\n", id->bInterfaceNumber); dprintf("bAlternateSetting 0x%x\n", id->bAlternateSetting); dprintf("bNumEndpoints 0x%x\n", id->bNumEndpoints); dprintf("bInterfaceClass 0x%x\n", id->bInterfaceClass); dprintf("bInterfaceSubClass 0x%x\n", id->bInterfaceSubClass); dprintf("bInterfaceProtocol 0x%x\n", id->bInterfaceProtocol); dprintf("iInterface 0x%x\n", id->iInterface); break; case USB_DEVICE_DESCRIPTOR_TYPE: dprintf("[DEVICE DESCRIPTOR]\n"); dprintf("bLength 0x%x\n", dd->bLength); dprintf("bDescriptorType 0x%x\n", dd->bDescriptorType); dprintf("bcdUSB 0x%x\n", dd->bcdUSB); dprintf("bDeviceClass 0x%x\n", dd->bDeviceClass); dprintf("bDeviceSubClass 0x%x\n", dd->bDeviceSubClass); dprintf("bDeviceProtocol 0x%x\n", dd->bDeviceProtocol); dprintf("bMaxPacketSize0 0x%x\n", dd->bMaxPacketSize0); dprintf("idVendor 0x%x\n", dd->idVendor); dprintf("idProduct 0x%x\n", dd->idProduct); dprintf("bcdDevice 0x%x\n", dd->bcdDevice); dprintf("iManufacturer 0x%x\n", dd->iManufacturer); dprintf("iProduct 0x%x\n", dd->iProduct); dprintf("iSerialNumber 0x%x\n", dd->iSerialNumber); dprintf("bNumConfigurations 0x%x\n", dd->bNumConfigurations); break; case USB_ENDPOINT_DESCRIPTOR_TYPE: dprintf("[ENDPOINT DESCRIPTOR]\n"); dprintf("bLength 0x%x\n", ed->bLength); dprintf("bDescriptorType 0x%x\n", ed->bDescriptorType); dprintf("bEndpointAddress 0x%x\n", ed->bEndpointAddress); dprintf("bmAttributes 0x%x\n", ed->bmAttributes); dprintf("wMaxPacketSize 0x%x\n", ed->wMaxPacketSize); dprintf("bInterval 0x%x\n", ed->bInterval); break; default: dprintf("[DESCRIPTOR ???]\n"); } } VOID DumpUnicodeString( UNICODE_STRING uniString ) { dprintf(">> Buffer: %08.8x, Length %d\n", uniString.Buffer, uniString.Length); } VOID Sig( ULONG Sig, PUCHAR p ) { SIG s; dprintf(p); s.l = Sig; dprintf("Sig:%08.8x %c%c%c%c\n", Sig, s.c[0], s.c[1], s.c[2], s.c[3]); } CPPMOD ScanfMemLoc( PMEMLOC MemLoc, PCSTR args ) { // UCHAR buffer[256]; ULONG tmp1 = 0, tmp2 = 0; //buffer[0] = '\0'; if (IsPtr64()) { //sscanf(args, "%lx %lx", &MemLoc->p64, buffer); } else { sscanf(args, "%lx %lx", &tmp1, &tmp2); *MemLoc = (ULONG64) tmp1; dprintf("tmp1 = %x tmp2 = %x\n", tmp1, tmp2); } } VOID PrintfMemLoc( PUCHAR Str1, MEMLOC MemLoc, PUCHAR Str2 ) { if (IsPtr64()) { ULONG tmp = (ULONG) MemLoc; ULONG tmp1 = (ULONG) (MemLoc>>32); #ifdef DEBUGIT dprintf("%s%08.8x%08.8x (64)%s", Str1, tmp1, tmp, Str2); #else dprintf("%s%08.8x%08.8x %s", Str1, tmp1, tmp, Str2); #endif } else { ULONG tmp = (ULONG) MemLoc; #ifdef DEBUGIT dprintf("%s%08.8x (32)%s", Str1, tmp, Str2); #else dprintf("%s%08.8x %s", Str1, tmp, Str2); #endif } } VOID BadMemLoc( ULONG MemLoc ) { dprintf("could not read mem location %08.8x\n", MemLoc); } VOID BadSig( ULONG Sig, ULONG ExpectedSig ) { dprintf("Bad Structure Signature %08.8x\n", Sig); } VOID UsbDumpFlags( ULONG Flags, PFLAG_TABLE FlagTable, ULONG NumEntries ) { ULONG i; PFLAG_TABLE ft = FlagTable; for (i=0; i< NumEntries; i++) { if (ft->Mask & Flags) { dprintf ("\t> %s\n", ft->Name); } ft++; } } ULONG UsbFieldOffset( IN LPSTR Type, IN LPSTR Field ) { ULONG offset; ULONG r; r = GetFieldOffset(Type, Field, &offset); #ifdef DEBUGIT dprintf("", r, offset); #endif return offset; } MEMLOC UsbReadFieldPtr( IN ULONG64 Addr, IN LPSTR Type, IN LPSTR Field ) { MEMLOC p; ULONG r; r = GetFieldValue(Addr, Type, Field, p); #ifdef DEBUGIT dprintf("", r); #endif return p; } UCHAR UsbReadFieldUchar( IN ULONG64 Addr, IN LPSTR Type, IN LPSTR Field ) { UCHAR ch; ULONG r; r = GetFieldValue(Addr, Type, Field, ch); #ifdef DEBUGIT dprintf("", r); #endif return ch; } ULONG UsbReadFieldUlong( IN ULONG64 Addr, IN LPSTR Type, IN LPSTR Field ) { ULONG l; ULONG r; r = GetFieldValue(Addr, Type, Field, l); #ifdef DEBUGIT dprintf("", r); #endif return l; } USHORT UsbReadFieldUshort( IN ULONG64 Addr, IN LPSTR Type, IN LPSTR Field ) { USHORT s; ULONG r; r = GetFieldValue(Addr, Type, Field, s); #ifdef DEBUGIT dprintf("", r); #endif return s; } VOID UsbDumpStruc( MEMLOC MemLoc, PUCHAR Cs, PSTRUC_ENTRY FieldList, ULONG NumEntries ) { ULONG i, l; UCHAR s[80]; SIG sig; for (i=0; i< NumEntries; i++) { switch (FieldList->FieldType) { case FT_ULONG: dprintf("%s: 0x%08.8x\n", FieldList->FieldName, UsbReadFieldUlong(MemLoc, Cs, FieldList->FieldName)); break; case FT_UCHAR: dprintf("%s: 0x%02.2x\n", FieldList->FieldName, UsbReadFieldUchar(MemLoc, Cs, FieldList->FieldName)); break; case FT_USHORT: dprintf("%s: 0x%04.4x\n", FieldList->FieldName, UsbReadFieldUshort(MemLoc, Cs, FieldList->FieldName)); break; case FT_PTR: sprintf(s, "%s: ", FieldList->FieldName); PrintfMemLoc(s, UsbReadFieldPtr(MemLoc, Cs, FieldList->FieldName), "\n"); break; case FT_SIG: sig.l = UsbReadFieldUlong(MemLoc, Cs, FieldList->FieldName); Sig(sig.l, ""); break; case FT_DEVSPEED: l = UsbReadFieldUlong(MemLoc, Cs, FieldList->FieldName); dprintf("%s: ", FieldList->FieldName); switch (l) { case UsbLowSpeed: dprintf("UsbLowSpeed\n"); break; case UsbFullSpeed: dprintf("UsbFullSpeed\n"); break; case UsbHighSpeed: dprintf("UsbHighSpeed\n"); break; } break; } FieldList++; } } ULONG CheckSym() { MEMLOC m; // // Verify that we have the right symbols. // m = GetExpression ("usbport!USBPORT_MiniportDriverList"); if (m == 0) { dprintf ("Incorrect symbols for USBPORT\n"); return E_INVALIDARG; } return S_OK; }