/*++ Copyright (c) 1991 Microsoft Corporation Module Name: debug.c Abstract: This component of netbios runs in the kernel and logs through the kernel debugger. Author: Colin Watson (ColinW) 24-Jun-91 Revision History: --*/ #if DBG #include VOID HexDumpLine( PCHAR pch, ULONG len, PCHAR s, PCHAR t ); LONG NetbiosMaxDump = 128; // Macro used in DisplayNcb #define DISPLAY_COMMAND( cmd ) \ case cmd: NbPrint(( #cmd )); break; VOID NbDisplayNcb( IN PDNCB pdncb ) /*++ Routine Description: This routine displays on the standard output stream the contents of the Ncb. Arguments: IN PDNCB - Supplies the NCB to be displayed. Return Value: none. --*/ { NbPrint(( "PDNCB %#010lx\n", pdncb)); NbPrint(( "ncb_command %#04x ", pdncb->ncb_command)); switch ( pdncb->ncb_command & ~ASYNCH ) { DISPLAY_COMMAND( NCBCALL ); DISPLAY_COMMAND( NCBLISTEN ); DISPLAY_COMMAND( NCBHANGUP ); DISPLAY_COMMAND( NCBSEND ); DISPLAY_COMMAND( NCBRECV ); DISPLAY_COMMAND( NCBRECVANY ); DISPLAY_COMMAND( NCBCHAINSEND ); DISPLAY_COMMAND( NCBDGSEND ); DISPLAY_COMMAND( NCBDGRECV ); DISPLAY_COMMAND( NCBDGSENDBC ); DISPLAY_COMMAND( NCBDGRECVBC ); DISPLAY_COMMAND( NCBADDNAME ); DISPLAY_COMMAND( NCBDELNAME ); DISPLAY_COMMAND( NCBRESET ); DISPLAY_COMMAND( NCBASTAT ); DISPLAY_COMMAND( NCBSSTAT ); DISPLAY_COMMAND( NCBCANCEL ); DISPLAY_COMMAND( NCBADDGRNAME ); DISPLAY_COMMAND( NCBENUM ); DISPLAY_COMMAND( NCBUNLINK ); DISPLAY_COMMAND( NCBSENDNA ); DISPLAY_COMMAND( NCBCHAINSENDNA ); DISPLAY_COMMAND( NCBLANSTALERT ); DISPLAY_COMMAND( NCBFINDNAME ); DISPLAY_COMMAND( NCBACTION ); DISPLAY_COMMAND( NCBQUICKADDNAME ); DISPLAY_COMMAND( NCBQUICKADDGRNAME ); DISPLAY_COMMAND( NCALLNIU ); case NCBADDRESERVED: NbPrint(( "Add reserved address(Internal)" )); break; case NCBADDBROADCAST: NbPrint(( "Add Broadcast address(Internal)" )); break; default: NbPrint(( " Unknown type")); break; } if ( pdncb->ncb_command & ASYNCH ) { NbPrint(( " | ASYNCH")); } NbPrint(( "\nncb_retcode %#04x\n", pdncb->ncb_retcode)); NbPrint(( "ncb_lsn %#04x\n", pdncb->ncb_lsn)); NbPrint(( "ncb_num %#04x\n", pdncb->ncb_num)); NbPrint(( "ncb_buffer %#010lx\n",pdncb->ncb_buffer)); NbPrint(( "ncb_length %#06x\n", pdncb->ncb_length)); if ((( pdncb->ncb_command & ~ASYNCH ) == NCBCALL) || (( pdncb->ncb_command & ~ASYNCH ) == NCALLNIU) || (( pdncb->ncb_command & ~ASYNCH ) == NCBDGSEND) || (( pdncb->ncb_command & ~ASYNCH ) == NCBDGRECV) || (( pdncb->ncb_command & ~ASYNCH ) == NCBDGSENDBC) || (( pdncb->ncb_command & ~ASYNCH ) == NCBDGRECVBC) || (( pdncb->ncb_command & ~ASYNCH ) == NCBADDNAME) || (( pdncb->ncb_command & ~ASYNCH ) == NCBADDGRNAME) || (( pdncb->ncb_command & ~ASYNCH ) == NCBLISTEN)) { NbPrint(( "\nncb_callname and ncb->name\n")); NbFormattedDump( pdncb->ncb_callname, NCBNAMSZ ); NbFormattedDump( pdncb->ncb_name, NCBNAMSZ ); NbPrint(( "ncb_rto %#04x\n", pdncb->ncb_rto)); NbPrint(( "ncb_sto %#04x\n", pdncb->ncb_sto)); } NbPrint(( "ncb_post %lx\n", pdncb->ncb_post)); NbPrint(( "ncb_lana_num %#04x\n", pdncb->ncb_lana_num)); NbPrint(( "ncb_cmd_cplt %#04x\n\n", pdncb->ncb_cmd_cplt)); } void NbFormattedDump( PCHAR far_p, LONG len ) /*++ Routine Description: This routine outputs a buffer in lines of text containing hex and printable characters. Arguments: IN far_p - Supplies buffer to be displayed. IN len - Supplies the length of the buffer in bytes. Return Value: none. --*/ { ULONG l; char s[80], t[80]; if ( len > NetbiosMaxDump ) { len = NetbiosMaxDump; } while (len) { l = len < 16 ? len : 16; NbPrint( ("%lx ", far_p)); HexDumpLine (far_p, l, s, t); NbPrint( ("%s%.*s%s\n", s, 1 + ((16 - l) * 3), "", t)); len -= l; far_p += l; } } VOID HexDumpLine( PCHAR pch, ULONG len, PCHAR s, PCHAR t ) /*++ Routine Description: This routine builds a line of text containing hex and printable characters. Arguments: IN pch - Supplies buffer to be displayed. IN len - Supplies the length of the buffer in bytes. IN s - Supplies the start of the buffer to be loaded with the string of hex characters. IN t - Supplies the start of the buffer to be loaded with the string of printable ascii characters. Return Value: none. --*/ { static UCHAR rghex[] = "0123456789ABCDEF"; UCHAR c; UCHAR *hex, *asc; hex = s; asc = t; *(asc++) = '*'; while (len--) { c = *(pch++); *(hex++) = rghex [c >> 4] ; *(hex++) = rghex [c & 0x0F]; *(hex++) = ' '; *(asc++) = (c < ' ' || c > '~') ? (CHAR )'.' : c; } *(asc++) = '*'; *asc = 0; *hex = 0; } #endif