diff options
Diffstat (limited to 'private/net/netbios/tnetbl.c')
-rw-r--r-- | private/net/netbios/tnetbl.c | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/private/net/netbios/tnetbl.c b/private/net/netbios/tnetbl.c new file mode 100644 index 000000000..268877208 --- /dev/null +++ b/private/net/netbios/tnetbl.c @@ -0,0 +1,269 @@ +/*++ + +Copyright (c) 1991 Microsoft Corporation + +Module Name: + + tnetbios.c + +Abstract: + + This module contains code which exercises the NetBIOS dll and driver. + +Author: + + Colin Watson (ColinW) 13-Mar-1991 + +Environment: + + Application mode + +Revision History: + + Dave Beaver (DBeaver) 10 August 1991 + + Modify to support multiple LAN numbers + +--*/ + +#include <nt.h> +#include <ntrtl.h> +#include <nturtl.h> +#include <windows.h> + +#include <nb30.h> +#include <stdio.h> + +// 1234567890123456 +#define SPACES " " + +#define Hi "Come here Dave, I need you" + +#define ClearNcb( PNCB ) { \ + RtlZeroMemory( PNCB , sizeof (NCB) ); \ + RtlMoveMemory( (PNCB)->ncb_name, SPACES, sizeof(SPACES)-1 );\ + RtlMoveMemory( (PNCB)->ncb_callname, SPACES, sizeof(SPACES)-1 );\ + } + +// Hard code lana-num that is mapped to XNS + +#define XNS 1 +int Limit = 20; + +VOID +usage ( + VOID + ) +{ + printf("usage: tnetbl [-n:lan number][-h] <remote computername> <my computername>\n"); + printf(" -n specifies the lan number (0 is the default)\n"); + printf(" -h specifies that addresses are hexadecimal numbers \n"); + printf(" rather than strings.\n"); + printf(" final two arguments are the remote and local computer names.\n"); +} + +int +main (argc, argv) + int argc; + char *argv[]; +{ + NCB myncb; + CHAR Buffer2[128]; + int i,j; + CHAR localName[16]; + CHAR remoteName[16]; + CHAR localTemp[32]; + CHAR remoteTemp[32]; + ULONG lanNumber=0; + BOOLEAN gotFirst=FALSE; + BOOLEAN asHex=FALSE; + UCHAR lsn; + UCHAR name_number; + USHORT length; + + if ( argc < 3 || argc > 5) { + usage (); + return 1; + } + + // + // dbeaver: added switch to allow 32 byte hex string as name to facilitate + // testing under unusual circumstances + // + + for (j=1;j<16;j++ ) { + localTemp[j] = ' '; + remoteTemp[j] = ' '; + } + + // + // parse the switches + // + + for (i=1;i<argc ;i++ ) { + if (argv[i][0] == '-') { + switch (argv[i][1]) { + case 'n': + if (!NT_SUCCESS(RtlCharToInteger (&argv[i][3], 10, &lanNumber))) { + usage (); + return 1; + } + break; + + case 'h': + asHex = TRUE; + break; + default: + usage (); + return 1; + break; + + } + + } else { + + // + // not a switch must be a name + // + + if (gotFirst != TRUE) { + RtlMoveMemory (remoteTemp, argv[i], lstrlen( argv[i] )); + gotFirst = TRUE; + } else { + RtlMoveMemory (localTemp, argv[i], lstrlen( argv[i] )); + } + + } + } + + if (asHex) { + RtlZeroMemory (localName, 16); + RtlZeroMemory (remoteName, 16); + + for (j=0;j<16 ;j+=4) { + RtlCharToInteger (&localTemp[j*2], 16, (PULONG)&localName[j]); + } + + for (j=0;j<16 ;j+=4) { + RtlCharToInteger (&remoteTemp[j*2], 16, (PULONG)&remoteName[j]); + } + + } else { + for (j=1;j<16;j++ ) { + localName[j] = ' '; + remoteName[j] = ' '; + } + + RtlMoveMemory( localName, localTemp, 16); + RtlMoveMemory( remoteName, remoteTemp, 16); + } + + // Reset + ClearNcb( &myncb ); + myncb.ncb_command = NCBRESET; + myncb.ncb_lsn = 0; // Request resources + myncb.ncb_lana_num = lanNumber; + myncb.ncb_callname[0] = 0; // 16 sessions + myncb.ncb_callname[1] = 0; // 16 commands + myncb.ncb_callname[2] = 0; // 8 names + Netbios( &myncb ); + + // AddName + ClearNcb( &myncb ); + myncb.ncb_command = NCBADDNAME; + RtlMoveMemory( myncb.ncb_name, localName, 16); + myncb.ncb_lana_num = (UCHAR)lanNumber; + Netbios( &myncb ); + + if ( myncb.ncb_retcode != NRC_GOODRET ) { + printf( "Addname returned an error %lx", myncb.ncb_retcode ); + return 1; + } + name_number = myncb.ncb_num; + + printf( "Starting Listen test\n" ); + + for ( j = 0; j <= Limit; j++ ) { + + printf( "\nStarting Listen " ); + + // Listen + ClearNcb( &myncb ); + myncb.ncb_command = NCBLISTEN | ASYNCH; + RtlMoveMemory( myncb.ncb_name, localName, 16); + RtlMoveMemory( myncb.ncb_callname, remoteName, 16); + myncb.ncb_lana_num = (UCHAR)lanNumber; + myncb.ncb_rto = myncb.ncb_rto = 0; //10; 10*500 milliseconds timeout + myncb.ncb_num = name_number; + Netbios( &myncb ); + printf( "Listen returned " ); + while ( myncb.ncb_cmd_cplt == NRC_PENDING ) { + printf( "." ); + Sleep(500); + + } + printf( " Listen completed\n" ); + + if ( myncb.ncb_retcode != NRC_GOODRET ) { + break; + } + + lsn = myncb.ncb_lsn; + + while ( 1 ) { + + // Receive + ClearNcb( &myncb ); + myncb.ncb_command = NCBRECV | ASYNCH; + myncb.ncb_lana_num = (UCHAR)lanNumber; + myncb.ncb_length = sizeof( Buffer2 ); + myncb.ncb_buffer = Buffer2; + myncb.ncb_lsn = lsn; + Netbios( &myncb ); + printf( "R" ); + while ( myncb.ncb_cmd_cplt == NRC_PENDING ) { +// printf( "." ); +// Sleep(250); + + } + printf( "r" ); + if ( myncb.ncb_retcode != NRC_GOODRET ) { + break; + } + //printf( ":%s\n", Buffer2); + length = myncb.ncb_length; + + // Send + ClearNcb( &myncb ); + myncb.ncb_command = NCBSEND; + myncb.ncb_lana_num = (UCHAR)lanNumber; + myncb.ncb_length = length; + myncb.ncb_buffer = Buffer2; + myncb.ncb_lsn = lsn; + Netbios( &myncb ); + if ( myncb.ncb_retcode != NRC_GOODRET ) { + break; + } + } + + // Hangup + ClearNcb( &myncb ); + myncb.ncb_command = NCBHANGUP; + myncb.ncb_lana_num = (UCHAR)lanNumber; + myncb.ncb_lsn = lsn; + Netbios( &myncb ); + if ( myncb.ncb_retcode != NRC_GOODRET ) { + break; + } + } + + // Reset + ClearNcb( &myncb ); + myncb.ncb_command = NCBRESET; + myncb.ncb_lsn = 1; // Free resources + Netbios( &myncb ); + printf( "Ending NetBios\n" ); + + return 0; +} + |