2025-04-27 07:49:33 -04:00

195 lines
6.4 KiB
C

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
help.c
Abstract:
Help for AFD.SYS Kernel Debugger Extensions.
Author:
Keith Moore (keithmo) 19-Apr-1995
Environment:
User Mode.
Revision History:
--*/
#include "afdkdp.h"
#pragma hdrstop
//
// Public functions.
//
DECLARE_API( help )
/*++
Routine Description:
Displays help for the AFD.SYS Kernel Debugger Extensions.
Arguments:
None.
Return Value:
None.
--*/
{
dprintf( "? - Displays this list\n" );
dprintf( "help - Displays this list\n" );
dprintf( "\n");
dprintf( "endp [-b|-c] [-r] [-s endp | endp...] - Dumps endpoint(s)\n" );
dprintf( "file [-b] [file...] - Dumps endpoint(s) associated with file object(s)\n" );
dprintf( "port [-b|-c] [-r] [-s endp] port [port...] - Dumps endpoint(s) bound to port(s)\n" );
dprintf( "state [-b|-c] [-r] [-s endp] state [state...] - Dumps endpoints in specific states\n" );
dprintf( "proc [-b|-c] [-r] [-s endp] proc|pid [proc|pid...] - Dumps endpoints owned by processes\n" );
dprintf( "\n");
dprintf( "conn [-b|-c] [-r] [-s endp | conn...] - Dumps connections\n" );
dprintf( "rport [-b|-c] [-r] [-s endp] port [port...] - Dumps connections to remote ports\n" );
dprintf( "\n");
dprintf( "tran [-b|-c] [-r] [-s endp | irp...] - Dumps transmit packets(file) info\n" );
dprintf( "\n");
dprintf( "buff [-b|-c] [-r] [-s endp | buff...] - Dumps buffer structure\n" );
dprintf( "\n");
dprintf( "poll [-b|-c] [-r] [-s endp | poll...] - Dumps poll info structure(s)\n" );
dprintf( "\n");
dprintf( "addr [-b] addr... - Dumps transport addresses\n" );
dprintf( "addrlist -b - Dumps addresses registered by the transports\n" );
dprintf( "tranlist -b - Dumps transports known to afd (have open sockets)\n" );
dprintf( "filefind <FsContext> - Finds file object given its FsContext field value\n" );
dprintf( "In all of the above:\n" );
dprintf( " -b - use brief display (1-line per entry),\n" );
dprintf( " -c - don't display entity data, just counts,\n" );
dprintf( " -s endp - scan list starting with this endpoint,\n" );
dprintf( " -r - scan endpoint list in reverse order,\n" );
dprintf( " endp - AFD_ENDPOINT structure at address <endp>,\n" );
dprintf( " file - FILE_OBJECT structure at address <file>,\n" );
dprintf( " conn - AFD_CONNECTION structure at address <conn>,\n" );
dprintf( " proc - EPROCESS structure at address <proc>,\n" );
dprintf( " pid - process id,\n" );
dprintf( " port - port in host byte order and current debugger base (use n 10|16 to set),\n" );
dprintf( " irp - TPackets/TFile/DisconnectEx IRP at address <irp>,\n" );
dprintf( " buff - AFD_BUFFER_HEADER structure at address <buff>,\n" );
dprintf( " poll - AFD_POLL_INFO_INTERNAL structure at address <poll>,\n" );
dprintf( " addr - TRANSPORT_ADDRESS structure at address <addr>,\n" );
dprintf( " state - endpoint state, valid states are:\n" );
dprintf( " 1 - Open\n" );
dprintf( " 2 - Bound\n" );
dprintf( " 3 - Connected\n" );
dprintf( " 4 - Cleanup\n" );
dprintf( " 5 - Closing\n" );
dprintf( " 6 - TransmitClosing\n" );
dprintf( " 7 - Invalid\n" );
dprintf( " 10 - Listening.\n" );
dprintf( "\n");
if( IsReferenceDebug ) {
dprintf( "ref <ref_addr> - Dumps reference debug info\n" );
dprintf( "cref <conn_addr> - Dumps connection reference debug info\n" );
dprintf( "eref <endp_addr> - Dumps endpoint reference debug info\n" );
dprintf( "tref <tpck_addr> - Dumps tpacket reference debug info\n" );
dprintf ("\n");
}
dprintf( "stats - Dumps debug-only statistics\n" );
dprintf( "\n");
#if GLOBAL_REFERENCE_DEBUG
dprintf( "gref - Dumps global reference debug info\n" );
#endif
} // help
ULONG Options;
ULONG64 StartEndpoint;
PCHAR
ProcessOptions (
IN PCHAR Args
)
{
CHAR expr[256];
INT i;
Options = 0;
while (sscanf( Args, "%s%n", expr, &i )==1) {
Args += i;
if (CheckControlC ())
break;
if (expr[0]=='-') {
switch (expr[1]) {
case 'B':
case 'b':
if ((Options & AFDKD_NO_DISPLAY)==0) {
Options |= AFDKD_BRIEF_DISPLAY;
continue;
}
else {
dprintf ("\nProcessOptions: only one of -c or -b options can be specified.\n");
}
break;
case 'R':
case 'r':
Options |= AFDKD_BACKWARD_SCAN;
continue;
case 'S':
case 's':
Options |= AFDKD_ENDPOINT_SCAN;
if (sscanf( Args, "%s%n", expr, &i )==1) {
Args += i;
StartEndpoint = GetExpression (expr);
if (StartEndpoint!=0) {
dprintf ("ProcessOptions: StartEndpoint-%p\n", StartEndpoint);
continue;
}
else {
dprintf ("ProcessOptions: StartEndpoint (%s) evaluates to NULL\n", expr);
}
}
else {
dprintf ("\nProcessOptions: %s option missing required parameter.\n", expr);
}
break;
case 'C':
case 'c':
if ((Options & AFDKD_BRIEF_DISPLAY)==0) {
Options |= AFDKD_NO_DISPLAY;
continue;
}
else {
dprintf ("\nProcessOptions: only one of -c or -b options can be specified.\n");
}
break;
default:
dprintf ("\nProcessOptions: Unrecognized option %s.\n", expr);
}
return NULL;
}
else {
Args -= i;
break;
}
}
return Args;
}