📄 nbcommon.c
字号:
// Module Name: nbcommon.c
//
// Description:
// This file contains the function bodies for a set of
// common NetBIOS functions. See the descriptions for
// each function on what each one does. These functions
// are used by the other NetBIOS sample programs so this
// file needs to be compiled to object code and linked
// with the other executable programs.
//
// Compile:
// cl /c nbcommon.c
//
// Command Line Options:
// NONE - This is a object code
//
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "nbcommon.h"
//
// Function: LanaEnum
//
// Description:
// Enumerate all LANA numbers on the machine. Pass a pointer
// to a valid LANA_ENUM struct into the function and it will
// be filled in.
//
int LanaEnum(LANA_ENUM *lenum)
{
NCB ncb;
ZeroMemory(&ncb, sizeof(NCB));
ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (PUCHAR)lenum;
ncb.ncb_length = sizeof(LANA_ENUM);
if (Netbios(&ncb) != NRC_GOODRET)
{
printf("ERROR: Netbios: NCBENUM: %d\n", ncb.ncb_retcode);
return ncb.ncb_retcode;
}
return NRC_GOODRET;
}
//
// Function: ResetAll
//
// Description:
// Reset each LANA listed in the LANA_ENUM structure. Also set
// the NetBIOS environment (max sessions, max name table size,
// and use the first NetBIOS name).
//
int ResetAll(LANA_ENUM *lenum, UCHAR ucMaxSession,
UCHAR ucMaxName, BOOL bFirstName)
{
NCB ncb;
int i;
ZeroMemory(&ncb, sizeof(NCB));
ncb.ncb_command = NCBRESET;
ncb.ncb_callname[0] = ucMaxSession;
ncb.ncb_callname[2] = ucMaxName;
ncb.ncb_callname[3] = (UCHAR)bFirstName;
for(i=0; i < lenum->length ;i++)
{
ncb.ncb_lana_num = lenum->lana[i];
if (Netbios(&ncb) != NRC_GOODRET)
{
printf("ERROR: Netbios: NCBRESET[%d]: %d\n",
ncb.ncb_lana_num, ncb.ncb_retcode);
return ncb.ncb_retcode;
}
}
return NRC_GOODRET;
}
//
// Function: AddName
//
// Description:
// Add the given name to the given LANA number. Return the name
// number for the registered name. This name number is essential
// for datagram operations.
//
int AddName(int lana, char *name, int *num)
{
NCB ncb;
ZeroMemory(&ncb, sizeof(NCB));
ncb.ncb_command = NCBADDNAME;
ncb.ncb_lana_num = lana;
memset(ncb.ncb_name, ' ', NCBNAMSZ);
strncpy(ncb.ncb_name, name, strlen(name));
if (Netbios(&ncb) != NRC_GOODRET)
{
printf("ERROR: Netbios: NCBADDNAME[lana=%d;name=%s]: %d\n",
lana, name, ncb.ncb_retcode);
return ncb.ncb_retcode;
}
*num = ncb.ncb_num;
return NRC_GOODRET;
}
//
// Function: DelName
//
// Description:
// Delete the given NetBIOS name from the name table associated
// with the LANA number.
//
int DelName(int lana, char *name)
{
NCB ncb;
ZeroMemory(&ncb, sizeof(NCB));
ncb.ncb_command = NCBDELNAME;
ncb.ncb_lana_num = lana;
memset(ncb.ncb_name, ' ', NCBNAMSZ);
strncpy(ncb.ncb_name, name, strlen(name));
if (Netbios(&ncb) != NRC_GOODRET)
{
printf("ERROR: Netbios: NCBADDNAME[lana=%d;name=%s]: %d\n",
lana, name, ncb.ncb_retcode);
return ncb.ncb_retcode;
}
return NRC_GOODRET;
}
//
// Function: AddGroupName
//
// Description:
// Add the given NetBIOS group name to the given LANA
// number. Return the name number for the added name.
//
int AddGroupName(int lana, char *name, int *num)
{
NCB ncb;
ZeroMemory(&ncb, sizeof(NCB));
ncb.ncb_command = NCBADDGRNAME;
ncb.ncb_lana_num = lana;
memset(ncb.ncb_name, ' ', NCBNAMSZ);
strncpy(ncb.ncb_name, name, strlen(name));
if (Netbios(&ncb) != NRC_GOODRET)
{
printf("ERROR: Netbios: NCBADDGRNAME[lana=%d;name=%s]: %d\n",
lana, name, ncb.ncb_retcode);
return ncb.ncb_retcode;
}
*num = ncb.ncb_num;
return NRC_GOODRET;
}
//
// Function: Send
//
// Description:
// Send len bytes from the data buffer on the given session (lsn)
// and lana number. This function performs a synchronous send.
//
int Send(int lana, int lsn, char *data, DWORD len)
{
NCB ncb;
int retcode;
ZeroMemory(&ncb, sizeof(NCB));
ncb.ncb_command = NCBSEND;
ncb.ncb_buffer = (PUCHAR)data;
ncb.ncb_length = (WORD)len;
ncb.ncb_lana_num = lana;
ncb.ncb_lsn = lsn;
retcode = Netbios(&ncb);
return retcode;
}
//
// Function: Recv
//
// Description:
// Receive up to len bytes into the data buffer on the given session
// (lsn) and lana number.
//
int Recv(int lana, int lsn, char *buffer, DWORD *len)
{
NCB ncb;
ZeroMemory(&ncb, sizeof(NCB));
ncb.ncb_command = NCBRECV;
ncb.ncb_buffer = (PUCHAR)buffer;
ncb.ncb_length = (WORD)*len;
ncb.ncb_lana_num = lana;
ncb.ncb_lsn = lsn;
if (Netbios(&ncb) != NRC_GOODRET)
{
*len = -1;
return ncb.ncb_retcode;
}
*len = ncb.ncb_length;
return NRC_GOODRET;
}
//
// Function: Hangup
//
// Description:
// Disconnect the given session on the given lana number.
//
int Hangup(int lana, int lsn)
{
NCB ncb;
int retcode;
ZeroMemory(&ncb, sizeof(NCB));
ncb.ncb_command = NCBHANGUP;
ncb.ncb_lsn = lsn;
ncb.ncb_lana_num = lana;
retcode = Netbios(&ncb);
return retcode;
}
//
// Function: Cancel
//
// Description:
// Cancel the given asynchronous command denoted in the NCB
// structure parameter.
//
int Cancel(PNCB pncb)
{
NCB ncb;
ZeroMemory(&ncb, sizeof(NCB));
ncb.ncb_command = NCBCANCEL;
ncb.ncb_buffer = (PUCHAR)pncb;
ncb.ncb_lana_num = pncb->ncb_lana_num;
if (Netbios(&ncb) != NRC_GOODRET)
{
printf("ERROR: NetBIOS: NCBCANCEL: %d\n", ncb.ncb_retcode);
return ncb.ncb_retcode;
}
return NRC_GOODRET;
}
//
// Function: FormatNetbiosName
//
// Description:
// Format the given NetBIOS name so it is printable. Any unprintable
// characters are replaced by a period. The outname buffer is
// the returned string which is assumed to be at least NCBNAMSZ+1
// characters in length.
//
int FormatNetbiosName(char *nbname, char *outname)
{
int i;
strncpy(outname, nbname, NCBNAMSZ);
outname[NCBNAMSZ-1] = '\0';
for(i=0; i < NCBNAMSZ-1 ;i++)
{
// If the character isn't printable replace it with a '.'
//
if (!((outname[i] >= 32) && (outname[i] <= 126)))
outname[i] = '.';
}
return NRC_GOODRET;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -