230 lines
5.1 KiB
C
230 lines
5.1 KiB
C
/*++
|
|
|
|
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 <nb.h>
|
|
|
|
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
|
|
|