📄 nbview.c
字号:
/*============================================================*/
/* NbView.C */
/*============================================================*/
#include "netbios.h"
/*------------------------------------------------------------*/
#define MSG_SIZE 1001
char message_out[MSG_SIZE];
char message_in[MSG_SIZE];
char string[MSG_SIZE];
char string2[MSG_SIZE];
char localname[17];
char remotename[17];
BYTE lsn;
BYTE name_numbeer;
int choice,x;
int cursor_x,cursor_y;
/*------------------------------------------------------------*/
WORD ncb_segments[10];
WORD ncb_offsets[10];
WORD volatile ncb_head=0;
WORD ncb_tail=0;
/*------------------------------------------------------------*/
NCB reset_ncb;
NCB adapter_status_ncb;
NCB session_status_ncb;
NCB add_name_ncb;
NCB add_group_name_ncb;
NCB delete_name_ncb;
NCB call_ncb;
NCB listen_ncb;
NCB send_ncb;
NCB receive_ncb;
NCB receive_any_ncb;
NCB hangup_ncb;
NCB send_dg_ncb;
NCB receive_dg_ncb;
NCB send_bcdg_ncb;
NCB receive_bcdg_ncb;
NCB temp_ncb;
/*------------------------------------------------------------*/
typedef struct {
char tb1_name[16];
BYTE tb1_name_number;
BYTE tb1_name_status;
} NAME_TABLE;
typedef struct {
BYTE card_id[6];
BYTE unknown[52];
int name_count;
NAME_TABLE name_table[20];
} ADAPTER_DATA;
typedef struct {
BYTE lsn;
BYTE state;
char local_name[16];
char remote_name[16];
BYTE recv_count;
BYTE send_count;
} A_SESSION;
typedef struct {
BYTE name_num;
BYTE session_count;
BYTE junk1;
BYTE junk2;
A_SESSION session_data[40];
} STATUS_INFO;
ADAPTER_DATA adapter_data;
STATUS_INFO session_info;
/*------------------------------------------------------------*/
WOED es_reg,bx_reg;
void interrupt(*int_5C_vector)(void);
char screen_save[4000];
char *state_msg[7]= {
" ",
"listen pending",
"call pending",
"active session",
"hang up pending",
"hang up complete",
"session abort"
};
int name_type;
char *name_type_msg[2]={
"Unique Name",
"Group Name"
};
int name_status;
char *name_status_msg[8]={
"Reg. in progress ",
" ",
" ",
" ",
"Registered ",
"De_registered ",
"Dup1 detected ",
"Dup1; dereg pend. "
};
BYTE *box[3]={
"+-------------[NetTest Post Results]-------------+"
"| |"
"+------------------------------------------------+"
}
char *error_message[]={
"success", "invalid buffer length",
"ret code 02", "invalid command",
"ret code 04", "timed out",
"buffer too small", "ret code 07",
"invalid session num", "no resource",
"session closed", "command cancelled",
"ret code 0C", "dupl. local name",
"name table full", "actie session",
"ret code 10", "session table full",
"no one listening", "invalid name num",
"no answer", "no local name",
"name in use", "name is deleted",
"abnormal end", "name conflict",
"ret code 1A", "ret code 1B",
"ret code 1C", "ret code 1D",
"ret code 1E", "ret code 1F",
"ret code 20", "card busy",
"too many cmds", "invalid card num",
"cancel done", "ret code 25",
"cannot cancel"
}
/*------------------------------------------------------------*/
void NetBios(NCB far *ncb_ptr)
{
_ES=FP_SEG(ncb_ptr);
_BX=FP_OFF(ncb_ptr);
geninterrupt(0x5C);
}
/*------------------------------------------------------------*/
void expand_to_16_chars(char *name)
{
char *p;
int len;
len=strlen(name);
for(p=name+len;p<name+15;*p++=' ');
name[15]='\0';
}
/*------------------------------------------------------------*/
void report_result(void)
{
int i,j;
gettext(1,1,80,25,screen_save);
cursor_x=wherex();
cursor_y=wherey();
clrscr();
gotoxy(5,1);
cprintf("%s",box[0]);
for(i=1;i<20;i++)
{
gotoxy(5,i+1);
cprintf("%s",box[1]);
}
gotoxy(5,21);
cprintf("%s",box[2]);
window(7,2,69,20);
movedata(ncb_segments[ncb_tail],ncb_offsets[ncb_tail],\
FP_SEG(&temp_ncb),FP_OFF(&temp_ncb),sizeof(NCB));
ncb_tail++;
if(ncb_tail==10) ncb_tail=0;
if(temp_ncb.NCB_LENGTH==MSG_SIZE-1) temp_ncb.NCB_LENGTH=0;
if(temp_ncb.NCB_LENGTH>320) temp_ncb.NCB_LENGTH=320;
switch(temp_ncb.NCB_COMMAND) {
case RESET : strcpy(string,"RESET ADAPTER"); break;
case ADAPTER_STATUS : strcpy(string,"ADAPTER STATUS"); break;
case ADD_NAME : strcpy(string,"ADD NAME"); break;
case ADD_GROUP_NAME : strcpy(string,"ADD GROUP NAME"); break;
case DELETE_NAME : strcpy(string,"DELETE NAME"); break;
case LISTEN : strcpy(string,"LISTEN"); break;
case CALL : strcpy(string,"CALL"); break;
case HANG_UP : strcpy(string,"HANG_UP"); break;
case SEND : strcpy(string,"SEND"); break;
case RECEIVE : strcpy(string,"RECEIVE"); break;
case RECEIVE_ANY : strcpy(string,"RECEIVE_ANY"); break;
case SESSION_STATUS : strcpy(string,"SESSION_STATUS"); break;
case SEND_DATAGRAM : strcpy(string,"SEND DATAGRAM"); break;
case RECEIVE_DATAGRAM: strcpy(string,"RECEIVE DATAGRAM"); break;
case SEND_BC_DATAGRAM:
strcpy(string,"SEND BROADCAST DATAGRAM"); break;
case RECEIVE_BC_DATAGRAM:
strcpy(string,"RECEIVE BROADCAST DATAGRAM"); break;
default: strcpy(string,"<UNKNOWN>"); break;
}
gotoxy(1,1);
cprintf("Command: %s",string);
if(temp_ncb.NCB_RETCODE<=0x26)
{
strcpy(string,error_message[temp_ncb.NCB_RETCODE]);
}
else
{
if(temp_ncb.NCB_RETCODE==0xFF)
{
strcpy(string,"Command Panding");
else
{
strcpy(string,"Adapter Malfunction");
}
}
if(temp_ncb.NCB_CMD_CPLT<=0x26)
{
strcpy(string2,error_message[temp_ncb.NCB_CMD_CPLT]);
}
else
{
if(temp_ncb.NCB_CMD_CPLT==0xFF)
{
strcpy(string2,"Command Panding");
else
{
strcpy(string2,"Adapter Malfunction");
}
}
gotoxy(1,2);
cprintf("Immed: %s. Final: %s.",string,string2);
if(temp_ncb.NCB_RETCODE>0 || temp_ncb.NCB_CMD_CPLT>0)
{
goto report_exit;
}
if(temp_ncb.NCB_COMMAND==ADAPTER_STATUS)
{
gotoxy(1,4);
cprintf("Card ID(hex):");
for(i=0;i<6;i++)
{
cprintf("%2.2X",(int)adapter_data.card_id[i]);
}
gotoxy(1,6);
cprintf("NetBios Data Block(hex):");
for(i=0,j=7;i<52;i++)
{
if(i%16==0) gotoxy(1,j++);
cprintf("%2.2X",(int)adapter_data.unknown[i]);
}
gotoxy(1,14);
cprintf("Local name table item:%d"adapter_data.name_count);
gotoxy(23,19);
cprintf("(Press a key)");
bioskey(0);
if(adapter_data.name_count==0) goto report_exit;
clrscr();
for(i=0,j=2;i<adapter_data.name_count;i++)
{
adapter_data.name_table[i].tbl_name[15]='\0';
name_status=(int)adapter_data.name_table[i].tbl_name_status;
name_status&=ox0007;
name_type=(int)adapter_data.name_table[i].tbl_name_status;
name_type&=0x0080;
name_type=(name_type==0x0080)?1:0;
if(i>9)
{
gotoxy(23,19);
cprintf("(Press a key)");
bioskey(0);
clrscr();
j=2;
}
gotoxy(1,j++);
cprintf("%s (#%d) %s %s",adapter_data.name_table[i].tbl_name,\
(int)adapter_data.name_table[i].tbl_name_number,
name_status_msg[name_status],name_type_msg[name_type]);
}
}
else
switch(temp_ncb.NCB_COMMAND)
{
case ADD_NAME:
case ADD_GROUP_NAME:
gotoxy(1,5);
cprintf("Name number=%d.",(int)temp_ncb.NCB_NUM);
break;
case CALL:
gotoxy(1,5);
cprintf("Session establish. LSN=%d.",(int)temp_ncb.NCB_LSN);
break;
case LISTEN:
gotoxy(1,5);
strncpy(string,temp_ncb.NCB_CALLNAME,16);
string[16]='\0';
cprintf("Session establish with '%s'. LSN=%d.",\
string,(int)temp_ncb.NCB_LSN);
break;
case RECEIVE:
case RECEIVE_ANY:
gotoxy(1,5);
cprintf("Message Says:")
for(i=0,j=6;i<temp_ncb.NCB_LENGTH;i++)
{
if(i%60==0) gotoxy(1,j++);
cprintf("%c",message_in[i]);
}
break;
case SESSION_STATUS:
gotoxy(1,4);
cprintf("Name:%d Session:%d",\
(int)session_info.name_num,(int)session_info.session_count);
if(session_info.session_count==0) goto report_exit;
j=5;
for(i=0;i<session_info.session_count;i++)
{
if(i>5)
{
gotoxy(23,19);
cprintf("(Press a key)");
bioskey(0);
clrscr();
j=5;
}
gotoxy(1,j++);
cprintf("lsn=%d (%s) recvcount=%d sendcount=%d",\
(int)session_info.session_data[i].lsn, \
state_msg[(int)session_info.session_data[i].state],\
(int)session_info.session_data[i].recv_count,\
(int)session_info.session_data[i].send_count);
gotoxy(1,j++);
session_info.session_data[i].local_name[15]='\0';
session_info.session_data[i].remote_name[15]='\0';
cprintf("localname='%s' remotename='%s'",\
session_info.session_data[i].local_name,\
session_info.session_data[i].remote_name);
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -