270 lines
6.4 KiB
C
270 lines
6.4 KiB
C
/*++
|
|
|
|
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;
|
|
}
|
|
|