Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

512 lines
8.7 KiB

/****************************************************************************
FILE: Netsubs.c
Provides high-level NetBIOS interfaces for WinVTP.
TABS:
Set for 4 spaces.
****************************************************************************/
#include <windows.h>
#include <commdlg.h>
#include <string.h>
#include "netbios.h"
// NT NETONE extensions.
#include "nb30p.h"
#include "winvtp.h"
void SetName(char *, char *);
int NetBIOSEnumAdapters(char *);
extern UI ui; /* from winvtp.c */
#ifdef NBTEST
char rgchOutput[64];
#endif
WORD cLanaNum = 0;
/* NetBIOSAddName ----------------------------------------------------------*/
int
NetBIOSAddName(LPSTR szName)
{
NCB ncb;
PNCB pncb = &ncb;
#ifdef NBTEST
OutputDebugString("NetBIOSAddName In\n");
#endif
pncb->ncb_command = NCBADDNAME;
pncb->ncb_retcode = 0;
pncb->ncb_cmd_cplt = 0;
pncb->ncb_rto = 0;
pncb->ncb_sto = 0;
pncb->ncb_post = (void far *)NULL;
pncb->ncb_lsn = 0;
pncb->ncb_lana_num = 0;
SetName(pncb->ncb_name,szName);
#ifdef NBTEST
OutputDebugString("NetBIOSAddName Out\n");
#endif
return NetBIOSRequest( pncb );
}
/* NetBIOSDelName ----------------------------------------------------------*/
int
NetBIOSDelName(LPSTR szName)
{
NCB ncb;
PNCB pncb = &ncb;
#ifdef NBTEST
OutputDebugString("NetBIOSDelName In\n");
#endif
pncb->ncb_command = NCBDELNAME;
pncb->ncb_retcode = 0;
pncb->ncb_cmd_cplt = 0;
pncb->ncb_rto = 0;
pncb->ncb_sto = 0;
pncb->ncb_post = (void far *)NULL;
pncb->ncb_lsn = 0;
SetName(pncb->ncb_name,szName);
#ifdef NBTEST
OutputDebugString("NetBIOSDelName Out\n");
#endif
return NetBIOSRequest( pncb );
}
/*** whoami.c -- return the machine identifier as a string */
char far *
MyNetName(char far *buffer)
{
NCB ncb;
PNCB pncb = &ncb;
ADAPTER_STATUS stats;
#ifdef NBTEST
OutputDebugString("MyNetName In\n");
#endif
NetBIOSZero( pncb );
memset( &stats, 0, sizeof(stats) );
pncb->ncb_command = NCBASTAT;
pncb->ncb_callname[0] = '*';
#ifdef NEVER
SetName( pncb->ncb_name, "*" );
pncb->ncb_length = 0x15c; // sizeof(ADAPTER_STATUS);
#endif
pncb->ncb_length = sizeof(ADAPTER_STATUS);
pncb->ncb_buffer = (char far *) &stats;
NetBIOSRequest( pncb );
#ifdef NBTEST
OutputDebugString("MyNetName Out\n");
#endif
if ( pncb->ncb_retcode )
{
return ( (char *) 0 );
}
else
{
memset(buffer, '\0', 10);
memcpy(buffer + 10, stats.adapter_address, 6);
return (buffer);
}
}
/*** NetBIOSCall.c - establish an open circuit
*
* Returns local session number or -1 on failure.
*/
int
NetBIOSCall(char *lname, char *rname)
{
NCB ncb;
PNCB pncb = &ncb;
#ifdef NBTEST
OutputDebugString("NetBIOSCall In\n");
#endif
NetBIOSZero( pncb );
pncb->ncb_command = ((ui.fXNS & fdwXNSConnect) == fdwXNSConnect)
? NCALLNIU : NCBCALL;
pncb->ncb_sto = 40;
memcpy( pncb->ncb_name, lname, NAMSZ );
memcpy( pncb->ncb_callname, rname, NAMSZ );
NetBIOSRequest( pncb );
#ifdef NBTEST
OutputDebugString("NetBIOSCall Out\n");
#endif
if ( pncb->ncb_retcode )
{
return ( -1 );
}
else
{
return ( pncb->ncb_lsn );
}
}
#define HOSTNAMSZ 8 /* max size of a machine name */
#define ACK 0x06 /* expected reply from server daemon */
/*** NetBiosConnect - connect to a remote server daemon
*/
int
NetBIOSConnect(LPSTR rname, LPSTR service)
#ifdef NEVER
LPSTR rname; /* remote host */
LPSTR service; /* name of desired service */
#endif
{
#if 0
char callname[NAMSZ];
char myname[NAMSZ];
#endif
int lsn;
#ifdef NBTEST
OutputDebugString("NetBIOSConnect In\n");
#endif
if ( (lsn = NetBIOSEnumAdapters( (LPSTR)rname ) ) < 0 )
{
#ifdef NBTEST
OutputDebugString("NetBIOSConnect Out\n");
#endif
return ( -1 );
}
#if 0
/* tell the server daemon what service we want */
if ( NetBIOSWrite( lsn, service, strlen(service)+1 ) < 0 ||
NetBIOSRead( lsn, (LPSTR)callname, 1) < 0 )
{
NetBIOSHangup( lsn );
return ( -1 );
}
if ( *callname != ACK )
{
NetBIOSHangup( lsn );
return ( -1 );
}
#endif
#ifdef NBTEST
OutputDebugString("NetBIOSConnect Out\n");
#endif
return ( lsn ); /* worked */
}
int
NetBIOSCancel(LPSTR addr)
{
NCB ncb;
PNCB pncb = &ncb;
#ifdef NBTEST
OutputDebugString("NetBIOSCancel In\n");
#endif
pncb->ncb_command = NCBCANCEL;
pncb->ncb_retcode = 0;
pncb->ncb_cmd_cplt = 0;
pncb->ncb_buffer = (char far *)addr;
NetBIOSRequest( pncb );
#ifdef NBTEST
OutputDebugString("NetBIOSCancel Out\n");
#endif
if ( pncb->ncb_retcode )
{
return ( -1 );
}
else
return ( 0 );
}
int
NetBIOSHangup(int lsn)
{
NCB ncb;
PNCB pncb = &ncb;
#ifdef NBTEST
OutputDebugString("NetBIOHangup In\n");
#endif
NetBIOSZero((PNCB)&ncb);
pncb->ncb_command = NCBHANGUP;
pncb->ncb_retcode = 0;
pncb->ncb_cmd_cplt = 0;
pncb->ncb_post = (void far *)NULL;
pncb->ncb_lsn = (char)lsn; /* use same lsn */
NetBIOSRequest( pncb );
#ifdef NBTEST
OutputDebugString("NetBIOSHangup Out\n");
#endif
if ( pncb->ncb_retcode )
{
return ( -1 );
}
else
return ( 0 );
}
/*** NetBIOSRead.c - read data on an open circuit
*
* Returns number of chars read, or -1 on failure.
*/
int
NetBIOSRead(int lsn, LPSTR addr, int cnt)
{
NCB ncb;
PNCB pncb = &ncb;
#ifdef NBTEST
OutputDebugString("NetBIOSRead In\n");
#endif
NetBIOSZero((PNCB)&ncb);
pncb->ncb_command = NCBRECV | ASYNCH;
pncb->ncb_retcode = 0;
pncb->ncb_cmd_cplt = 0;
pncb->ncb_post = NULL;
pncb->ncb_lsn = (char)lsn;
pncb->ncb_length = cnt;
pncb->ncb_buffer = addr;
NetBIOSRequest( pncb );
#ifdef NBTEST
OutputDebugString("NetBIOSRead Out\n");
#endif
if ( pncb->ncb_retcode && ( pncb->ncb_retcode != NRC_INCOMP ))
return ( -1 );
else
return ( pncb->ncb_length );
}
/*** NetBIOSWrite.c - write data on an open circuit
*
* Returns number of chars written, or -1 on failure.
*/
int
NetBIOSWrite(int lsn, LPSTR addr, int cnt)
{
NCB ncb;
PNCB pncb = &ncb;
#ifdef NBTEST
OutputDebugString("NetBIOSWrite In\n");
#endif
NetBIOSZero((PNCB)&ncb);
pncb->ncb_command = NCBSEND;
pncb->ncb_retcode = 0;
pncb->ncb_cmd_cplt = 0;
pncb->ncb_post = NULL;
pncb->ncb_lsn = (char)lsn;
pncb->ncb_length = cnt;
pncb->ncb_buffer = addr;
NetBIOSRequest( pncb );
#ifdef NBTEST
OutputDebugString("NetBIOSWrite Out\n");
#endif
if ( pncb->ncb_retcode )
{
return ( -1 );
}
else
return ( cnt );
}
UCHAR LanaNum = 0;
int
NetBIOSEnumAdapters(char * rname)
{
NCB ncb;
LANA_ENUM lana_enum;
char myname[NAMSZ];
char callname1[NAMSZ];
#if 0
char callname2[NAMSZ];
#endif
int i, lsn;
#ifdef NBTEST
OutputDebugString( rname );
#endif
// For NT NETONE Addressing, callname is NAMSZ long. The first
// byte gives the number of valid bytes (eg. "\03oak" ).
#ifdef NBTEST
OutputDebugString("NetBIOSEnumAdapters In\n");
#endif
if (ui.fXNS & fdwUseXNS)
{
memset( callname1, 0, NAMSZ );
strncpy( callname1+1, rname, NAMSZ-1 );
callname1[0] = (char)strlen( rname );
if ( callname1[0] > NAMSZ-1 )
{
// Name too long to fit
#ifdef NBTEST
OutputDebugString("NetBIOSEnumAdapters Out\n");
#endif
return -1;
}
}
else
{
SetName( callname1, rname );
}
#if 0
/* setup up the callnames */
SetName( callname1, rname );
callname1[NAMSZ-1] = 's';
memset( callname2, 0, NAMSZ );
strncpy( callname2, rname, NAMSZ );
callname2[NAMSZ] = '\0';
strcat(callname2, ".srv" );
#endif
ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (char *)&lana_enum;
ncb.ncb_length = sizeof(lana_enum);
if ( NetBIOSRequest( &ncb ) )
{
cLanaNum = 0;
#ifdef NBTEST
OutputDebugString("NetBIOSEnumAdapters Out\n");
#endif
return -1;
}
cLanaNum = lana_enum.length;
for( i=cLanaNum; i > 0; i-- )
{
#if 0
char szText[80];
char callname[NAMSZ];
#endif
LanaNum = lana_enum.lana[i-1];
NetBIOSReset( &ncb, 0, 0 );
MyNetName( myname );
#ifdef NBTEST
OutputDebugString( callname1 );
#endif
if ( (lsn = NetBIOSCall( myname, callname1 )) >= 0 )
break;
#if 0
OutputDebugString( callname2 );
if ( (lsn = NetBIOSCall( myname, callname2 )) >= 0 )
break;
#endif
}
#ifdef NBTEST
OutputDebugString("NetBIOSEnumAdapters Out\n");
#endif
if ( i == 0 )
return -1;
else
return lsn;
}
/*** NetBIOSRead.c - read data on an open circuit
*
* Returns number of chars read, or -1 on failure.
*/
int
NetBIOSReadSync(int lsn, LPSTR addr, int cnt)
{
NCB ncb;
PNCB pncb = &ncb;
#ifdef NBTEST
OutputDebugString("NetBIOSRead In\n");
#endif
NetBIOSZero((PNCB)&ncb);
pncb->ncb_command = NCBRECV;
pncb->ncb_retcode = 0;
pncb->ncb_cmd_cplt = 0;
pncb->ncb_post = NULL;
pncb->ncb_lsn = (char)lsn;
pncb->ncb_length = cnt;
pncb->ncb_buffer = addr;
NetBIOSRequest( pncb );
#ifdef NBTEST
OutputDebugString("NetBIOSRead Out\n");
#endif
if ( pncb->ncb_retcode && ( pncb->ncb_retcode != NRC_INCOMP ))
return ( -1 );
else
return ( pncb->ncb_length );
}