/*++ 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; }