|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
log.c
Abstract:
WinDbg Extension Api implements !_log
Author:
jd
Environment:
User Mode.
Revision History:
--*/
#include "precomp.h"
#include "usbhcdkd.h"
VOID DumpXferLog( MEMLOC LogMemLoc, MEMLOC StartMemLoc, MEMLOC EndMemLoc, ULONG NumEntriesToDump ) { ULONG i; LOG_ENTRY logEntry1, logEntry2; ULONG cb; MEMLOC m1, m2, m3; ENDPOINT_TRANSFER_TYPE t; PUCHAR s; PrintfMemLoc("*TRANSFER LOGSTART: ", LogMemLoc, " "); dprintf("# %d \n", NumEntriesToDump); for (i=0; i< NumEntriesToDump; i++) {
ReadMemory(LogMemLoc, &logEntry2, sizeof(logEntry2), &cb); LogMemLoc+=cb;
if (LogMemLoc > EndMemLoc) { LogMemLoc = StartMemLoc; }
ReadMemory(LogMemLoc, &logEntry1, sizeof(logEntry1), &cb); LogMemLoc+=cb;
if (LogMemLoc > EndMemLoc) { LogMemLoc = StartMemLoc; } #if 0
t = (ENDPOINT_TRANSFER_TYPE) logEntry.TransferType; switch(logEntry.TransferType) { case Isochronous: s = "ISO"; break; case Control: s = "CON"; break; case Bulk: s = "BLK"; break; case Interrupt: s = "INT"; break; default: s = "???"; } #endif
dprintf("[%3.3d] Endpoint(%08.8x) - URB:%08.8x IRP:%8.8x\n", i, logEntry1.le_info1, logEntry1.le_info2, logEntry1.le_info3); dprintf(" \t\t\t Bytes [%6.6d] NT_STATUS %08.8x USBD_STATUS %08.8x\n", logEntry2.le_info3, logEntry2.le_info2, logEntry2.le_info1);
}
}
VOID DumpLog( MEMLOC LogMemLoc, MEMLOC StartMemLoc, MEMLOC EndMemLoc, ULONG NumEntriesToDump, ULONG MarkSig1, ULONG MarkSig2 ) { ULONG i; SIG s; LOG_ENTRY64 logEntry64; LOG_ENTRY32 logEntry32; CHAR c; ULONG cb; MEMLOC m1, m2, m3;
PrintfMemLoc("*LOG: ", LogMemLoc, " "); PrintfMemLoc("*LOGSTART: ", StartMemLoc, " "); PrintfMemLoc("*LOGEND: ", EndMemLoc, " "); dprintf("# %d \n", NumEntriesToDump); #if 0
s.l = MarkSig1; dprintf("*(%c%c%c%c) ", s.c[0], s.c[1], s.c[2], s.c[3]); s.l = MarkSig2; dprintf("*(%c%c%c%c) ", s.c[0], s.c[1], s.c[2], s.c[3]); dprintf("\n"); #endif
for (i=0; i< NumEntriesToDump; i++) {
if (IsPtr64()) { ReadMemory(LogMemLoc, &logEntry64, sizeof(logEntry64), &cb); s.l = logEntry64.le_sig;
m1 = logEntry64.le_info1; m2 = logEntry64.le_info2; m3 = logEntry64.le_info3; } else { ReadMemory(LogMemLoc, &logEntry32, sizeof(logEntry32), &cb);
s.l = logEntry32.le_sig;
m1 = logEntry32.le_info1; m2 = logEntry32.le_info2; m3 = logEntry32.le_info3; }
if (s.l == MarkSig1 || s.l == MarkSig2) { c = '*'; } else { c = ' '; }
dprintf("%c[%3.3d]", c, i); PrintfMemLoc(" ", LogMemLoc, " "); dprintf("%c%c%c%c ", s.c[0], s.c[1], s.c[2], s.c[3]); PrintfMemLoc(" ", m1, " "); PrintfMemLoc(" ", m2, " "); PrintfMemLoc(" ", m3, "\n"); LogMemLoc+=cb;
if (LogMemLoc > EndMemLoc) { LogMemLoc = StartMemLoc; } }
}
VOID DumpEnumLog( MEMLOC LogMemLoc, MEMLOC StartMemLoc, MEMLOC EndMemLoc, ULONG NumEntriesToDump ) { ULONG i; SIG s; LOG_ENTRY64 logEntry64; LOG_ENTRY32 logEntry32; CHAR c; ULONG cb; MEMLOC m1, m2, m3;
PrintfMemLoc("*LOG: ", LogMemLoc, " "); PrintfMemLoc("*LOGSTART: ", StartMemLoc, " "); PrintfMemLoc("*LOGEND: ", EndMemLoc, " "); dprintf("# %d \n", NumEntriesToDump); #if 0
s.l = MarkSig1; dprintf("*(%c%c%c%c) ", s.c[0], s.c[1], s.c[2], s.c[3]); s.l = MarkSig2; dprintf("*(%c%c%c%c) ", s.c[0], s.c[1], s.c[2], s.c[3]); dprintf("\n"); #endif
for (i=0; i< NumEntriesToDump; i++) {
if (IsPtr64()) { ReadMemory(LogMemLoc, &logEntry64, sizeof(logEntry64), &cb); s.l = logEntry64.le_sig;
m1 = logEntry64.le_info1; m2 = logEntry64.le_info2; m3 = logEntry64.le_info3; } else { ReadMemory(LogMemLoc, &logEntry32, sizeof(logEntry32), &cb);
s.l = logEntry32.le_sig;
m1 = logEntry32.le_info1; m2 = logEntry32.le_info2; m3 = logEntry32.le_info3; }
// if (s.l == MarkSig1 || s.l == MarkSig2) {
// c = '*';
// } else {
// c = ' ';
// }
c = ' '; dprintf("%c[%3.3d]", c, i); PrintfMemLoc(" ", LogMemLoc, " "); dprintf("%c%c%c%c ", s.c[0], s.c[1], s.c[2], s.c[3]); PrintfMemLoc(" ", m1, " "); PrintfMemLoc(" ", m2, " "); PrintfMemLoc(" ", m3, "\n"); LogMemLoc+=cb;
if (LogMemLoc > EndMemLoc) { LogMemLoc = StartMemLoc; } }
}
DECLARE_API( _eplog )
/*++
Routine Description:
dumps the extension
Arguments:
args - Address flags
Return Value:
None
--*/
{ MEMLOC addr; PCSTR s; UCHAR buffer1[256]; UCHAR buffer2[256]; UCHAR buffer3[256]; SIG s1, s2; ULONG len = 5; MEMLOC logPtr, logStart, logEnd; UCHAR cs[] = "_HCD_ENDPOINT"; buffer1[0] = '\0'; buffer2[0] = '\0'; buffer3[0] = '\0';
GetExpressionEx( args, &addr, &s ); PrintfMemLoc("LOG@: ", addr, "\n"); sscanf(s, ",%s %s %s", &buffer1, &buffer2, &buffer3);
if ('\0' != buffer1[0]) { sscanf(buffer1, "%d", &len); }
s1.l = 0; if ('\0' != buffer2[0]) { // sscanf(buffer2, "%d", &len);
s1.c[0] = buffer2[0]; s1.c[1] = buffer2[1]; s1.c[2] = buffer2[2]; s1.c[3] = buffer2[3]; }
s2.l = 0; if ('\0' != buffer3[0]) { // sscanf(buffer2, "%d", &len);
s2.c[0] = buffer3[0]; s2.c[1] = buffer3[1]; s2.c[2] = buffer3[2]; s2.c[3] = buffer3[3]; }
logPtr = UsbReadFieldPtr(addr, cs, "Log.LogPtr"); logStart = UsbReadFieldPtr(addr, cs, "Log.LogStart"); logEnd = UsbReadFieldPtr(addr, cs, "Log.LogEnd");
DumpLog (logPtr, logStart, logEnd, len, s1.l, s2.l);
return S_OK; }
DECLARE_API( _log )
/*++
Routine Description:
dumps the extension
Arguments:
args - Address flags
Return Value:
None
--*/
{ MEMLOC addr; PCSTR s; UCHAR buffer1[256]; UCHAR buffer2[256]; UCHAR buffer3[256]; SIG s1, s2; ULONG len = 5; MEMLOC logPtr, logStart, logEnd; UCHAR cs[] = "usbport!_DEVICE_EXTENSION"; ULONG logIdx, m, i; buffer1[0] = '\0'; buffer2[0] = '\0'; buffer3[0] = '\0';
GetExpressionEx( args, &addr, &s ); PrintfMemLoc("LOG@: ", addr, "\n"); sscanf(s, ",%s %s %s", &buffer1, &buffer2, &buffer3);
if ('\0' != buffer1[0]) { sscanf(buffer1, "%d", &len); }
s1.l = 0; if ('\0' != buffer2[0]) { // sscanf(buffer2, "%d", &len);
s1.c[0] = buffer2[0]; s1.c[1] = buffer2[1]; s1.c[2] = buffer2[2]; s1.c[3] = buffer2[3]; }
s2.l = 0; if ('\0' != buffer3[0]) { // sscanf(buffer2, "%d", &len);
s2.c[0] = buffer3[0]; s2.c[1] = buffer3[1]; s2.c[2] = buffer3[2]; s2.c[3] = buffer3[3]; }
logPtr = UsbReadFieldPtr(addr, cs, "Log.LogStart"); logStart = UsbReadFieldPtr(addr, cs, "Log.LogStart"); logEnd = UsbReadFieldPtr(addr, cs, "Log.LogEnd"); logIdx = UsbReadFieldUlong(addr, cs, "Log.LogIdx"); m = UsbReadFieldUlong(addr, cs, "Log.LogSizeMask"); i = logIdx & m; dprintf(">LOG mask = %x idx = %x (%x)\n", m, logIdx, i ); if (IsPtr64()) { logPtr += (i*32); } else { logPtr += (i*16); } DumpLog (logPtr, logStart, logEnd, len, s1.l, s2.l);
return S_OK; }
DECLARE_API( _xlog )
/*++
Routine Description:
dumps the extension
Arguments:
args - Address flags
Return Value:
None
--*/
{ MEMLOC addr; PCSTR s; ULONG len = 5; UCHAR buffer1[256]; MEMLOC logPtr, logStart, logEnd; UCHAR cs[] = "usbport!_DEVICE_EXTENSION"; GetExpressionEx( args, &addr, &s ); PrintfMemLoc("LOG@: ", addr, "\n"); sscanf(s, ",%s ", &buffer1);
if ('\0' != buffer1[0]) { sscanf(buffer1, "%d", &len); }
logPtr = UsbReadFieldPtr(addr, cs, "TransferLog.LogStart"); logStart = UsbReadFieldPtr(addr, cs, "TransferLog.LogStart"); logEnd = UsbReadFieldPtr(addr, cs, "TransferLog.LogEnd");
DumpXferLog (logPtr, logStart, logEnd, len);
return S_OK; }
DECLARE_API( _isolog )
/*++
Routine Description:
dumps the extension
Arguments:
args - Address flags
Return Value:
None
--*/
{ MEMLOC addr; PCSTR s; UCHAR buffer1[256]; UCHAR buffer2[256]; UCHAR buffer3[256]; SIG s1, s2; ULONG len = 5; MEMLOC logPtr, logStart, logEnd; UCHAR cs[] = "_HCD_ENDPOINT"; buffer1[0] = '\0'; buffer2[0] = '\0'; buffer3[0] = '\0';
GetExpressionEx( args, &addr, &s ); PrintfMemLoc("LOG@: ", addr, "\n"); sscanf(s, ",%s %s %s", &buffer1, &buffer2, &buffer3);
if ('\0' != buffer1[0]) { sscanf(buffer1, "%d", &len); }
s1.l = 0; if ('\0' != buffer2[0]) { // sscanf(buffer2, "%d", &len);
s1.c[0] = buffer2[0]; s1.c[1] = buffer2[1]; s1.c[2] = buffer2[2]; s1.c[3] = buffer2[3]; }
s2.l = 0; if ('\0' != buffer3[0]) { // sscanf(buffer2, "%d", &len);
s2.c[0] = buffer3[0]; s2.c[1] = buffer3[1]; s2.c[2] = buffer3[2]; s2.c[3] = buffer3[3]; }
logPtr = UsbReadFieldPtr(addr, cs, "IsoLog.LogPtr"); logStart = UsbReadFieldPtr(addr, cs, "IsoLog.LogStart"); logEnd = UsbReadFieldPtr(addr, cs, "IsoLog.LogEnd");
DumpLog (logPtr, logStart, logEnd, len, s1.l, s2.l);
return S_OK; }
DECLARE_API( _enumlog )
/*++
Routine Description:
dumps the extension
Arguments:
args - Address flags
Return Value:
None
--*/ { MEMLOC addr; PCSTR s; UCHAR buffer1[256]; UCHAR buffer2[256]; UCHAR buffer3[256]; SIG s1, s2; ULONG len = 5; MEMLOC logPtr, logStart, logEnd; UCHAR csFdo[] = "usbport!_FDO_EXTENSION"; UCHAR cs[] = "usbport!_DEVICE_EXTENSION"; ULONG logIdx, m, i; buffer1[0] = '\0'; buffer2[0] = '\0'; buffer3[0] = '\0';
GetExpressionEx( args, &addr, &s ); PrintfMemLoc("LOG@: ", addr, "\n");
sscanf(s, ",%s ", &buffer1);
if ('\0' != buffer1[0]) { sscanf(buffer1, "%d", &len); } logPtr = UsbReadFieldPtr(addr, cs, "EnumLog.LogStart"); logStart = UsbReadFieldPtr(addr, cs, "EnumLog.LogStart"); logEnd = UsbReadFieldPtr(addr, cs, "EnumLog.LogEnd"); logIdx = UsbReadFieldUlong(addr, cs, "EnumLog.LogIdx"); m = UsbReadFieldUlong(addr, cs, "EnumLog.LogSizeMask"); i = logIdx & m;
dprintf(">LOG mask = %x idx = %x (%x)\n", m, logIdx, i ); if (IsPtr64()) { logPtr += (i*32); } else { logPtr += (i*16); } DumpEnumLog (logPtr, logStart, logEnd, len);
return S_OK; }
|