?? ipx.h
字號:
struct IPXECB //ECB結構定義
{
void far *link_address;
void far (*event_service_routine)(void);
unsigned char in_use;
unsigned char completion_code;
unsigned int socket_number;
unsigned char ipx_workspace[4];
unsigned char driver_workspace [12];
unsigned char immediate_address[ 6];
unsigned int packet_count;
struct {
void far *address;
unsigned int length;
} packet [2];
};
struct IPXHEADER //IPX分組頭定義
{
unsigned int checksum;
unsigned char length[2];
unsigned char transport_control;
unsigned char packet_type;
unsigned char dest_network_number [4];
unsigned char dest_network_node [6];
unsigned int dest_network_socket;
unsigned char source_network_number [4];
unsigned char source_network_node [6];
unsigned int source_network_socket;
};
int ipx_spx_installed(void);
int ipx_cancel_event(struct IPXECB *ecb_ptr);
void close_socket(unsigned int socket);
int open_socket(unsigned int socket);
int get_local_target(unsigned char *dest_network,
unsigned char *dest_node,
unsigned int dest_socket,
unsigned char *bridge_address);
void ipx_relinquish_control(void);
void ipx_listen_for_packet(struct IPXECB *ecb_ptr);
void ipx_send_packet(struct IPXECB *ecb_ptr);
int get_internet_address(unsigned char connection_number,
unsigned char *network_number,
unsigned char *physical_node);
unsigned int get_1st_connection_num(char *who);
unsigned char get_connection_number(void);
void get_user_id(unsigned char connection_number,
unsigned char *user_id);
unsigned int get_interval_marker(void);
void get_network_address(unsigned char *network_number,
unsigned char *physical_node);
void ipx_schedule_ipx_event(struct IPXECB far *ecb_ptr,
unsigined int ticks);
void far (*ipx_spx)(void); //IPX安裝檢測
int ipx_spx_installed(void)
{
union REGS regs;
struct SREGS sregs;
regs.x.ax=0x7a00;
int86x(0x2f,®s,®s,&sregs);
if (regs.h.al!=0xff) return -1;
ipx_spx=MK_FP(sregs.es,regs.x.di);
_BX=0x0010;
_AL=0x00;
ipx_spx();
if (_AL==0x00) return 0;
return 1;
}
int ipx_cancel_event(struct IPXECB *ecb_ptr) //取消IPX/SPX事件
{
_ES=FP_SEG( (void far *) ecb_ptr);
_SI=FP_OFF( (void far *) ecb_ptr);
_BX=0x0006;
ipx_spx();
_AH=0;
return _AX;
}
void close_socket(unsigned int socket) //關閉管套
{
if (ipx_spx_installed()<1)return;
_BX=0x0001;
_DX=socket;
ipx_spx();
}
int open_socket(unsigned int socket) //打開管套
{
if (ipx_spx_installed()<1) return -1;
_DX=socket;
_BX=0x0000;
_AL=0xff;
ipx_spx();
_AH=0;
return _AX;
}
int get_local_target(unsigned char *dest_network,
unsigned char *dest_node,
unsigned int dest_socket,
unsigned char *bridge_address)
//獲取本地目標
{
unsigned int temp_ax;
struct{
unsigned char network_number [4];
unsigned char physical_node [6];
unsigned int socket;
} request_buffer;
struct{
unsigned char local_target [6];
} reply_buffer;
memcpy(request_buffer.network_number,dest_network,4);
memcpy(request_buffer.physical_node,dest_node,6);
request_buffer.socket=dest_socket;
_ES=FP_SEG((void far *)&request_buffer);
_SI=FP_OFF((void far *)&request_buffer);
_DI=FP_OFF((void far *)&reply_buffer);
_BX=0x0002;
ipx_spx();
_AH=0;
temp_ax=_AX;
memcpy(bridge_address,reply_buffer.local_target,6);
return temp_ax;
}
void ipx_relinquish_control(void)
{
_BX=0x000a;
ipx_spx();
}
void ipx_listen_for_packet(struct IPXECB *ecb_ptr) //幀聽分組
{
_ES=FP_SEG( (void far *) ecb_ptr);
_SI=FP_OFF( (void far *) ecb_ptr);
_BX=0x0004;
ipx_spx();
}
void ipx_send_packet(struct IPXECB *ecb_ptr) //發送分組
{
_ES=FP_SEG((void far*)ecb_ptr);
_SI=FP_OFF((void far*)ecb_ptr);
_BX=0x0003;
ipx_spx();
}
int get_internet_address(unsigned char connection_number,
unsigned char *network_number,
unsigned char *physical_node)
//獲取互連網地址
{
union REGS regs;
struct SREGS sregs;
struct{
unsigned int len;
unsigned char buffer_type;
unsigned char connection_number;
} request_buffer;
struct{
unsigned int len;
unsigned char network_number[4];
unsigned char physical_node [6];
unsigned int server_socket;
} reply_buffer;
regs.h.ah=0xe3;
request_buffer.len=2;
request_buffer.buffer_type=0x13;
request_buffer.connection_number=connection_number;
reply_buffer.len=12;
regs.x.si=FP_OFF((void far *)&request_buffer);
sregs.ds=FP_SEG((void far *)&request_buffer);
regs.x.di=FP_OFF((void far *)&reply_buffer);
sregs.es=FP_SEG((void far *)&reply_buffer);
int86x(0x21,®s,®s,&sregs);
memcpy(network_number,reply_buffer.network_number,4);
memcpy(physical_node,reply_buffer.physical_node,6);
regs.h.ah=0;
return regs.x.ax;
}
unsigned int get_1st_connection_num(char *who) //獲取第一連接號
{
union REGS regs;
struct SREGS sregs;
struct{
unsigned int len;
unsigned char buffer_type;
unsigned int object_type;
unsigned char name_len;
unsigned char name [47];
} request_buffer;
struct{
unsigned int len;
unsigned char number_connections;
unsigned char connection_num [100];
} reply_buffer;
regs.h.ah=0xe3;
request_buffer.len=51;
request_buffer.buffer_type=0x15;
request_buffer.object_type=0x0100;
request_buffer.name_len=(unsigned char) strlen(who);
strcpy(request_buffer.name,who);
reply_buffer.len=101;
regs.x.si=FP_OFF((void far *)&request_buffer);
sregs.ds=FP_SEG((void far *)&request_buffer);
regs.x.di=FP_OFF((void far *)&reply_buffer);
sregs.es=FP_SEG((void far *)&reply_buffer);
int86x(0x21,®s,®s,&sregs);
if (regs.h.al!=0) return 0;
if (reply_buffer.number_connections==0) return 0;
regs.h.ah=0;
regs.h.al=reply_buffer.connection_num[0];
return regs.x.ax;
}
unsigned char get_connection_number(void)
{
_AH=0xdc;
geninterrupt(0x21);
return _AL;
}
void get_user_id(unsigned char connection_number,
unsigned char *user_id)
//獲取用戶ID
{
union REGS regs;
struct SREGS sregs;
struct {
unsigned int len;
unsigned char buffer_type;
unsigned char connection_number;
}request_buffer;
struct {
unsigned int len;
unsigned char object_id[4];
unsigned char obrect_type[2];
char object_name[48];
char login_time[7];
}reply_buffer;
regs.h.ah=0xe3;
request_buffer.len=2;
request_buffer.buffer_type=0x16;
request_buffer.connection_number=connection_number;
reply_buffer.len=61;
regs.x.si=FP_OFF((void far *)&request_buffer);
sregs.ds=FP_SEG((void far *)&request_buffer);
regs.x.di=FP_OFF((void far *)&reply_buffer);
sregs.es=FP_SEG((void far *)&reply_buffer);
int86x(0x21,®s,®s,&sregs);
strncpy(user_id,reply_buffer.object_name,48);
}
unsigned int get_interval_marker(void) //獲取時間間隔標志
{
_BX=0x0008;
ipx_spx();
return _AX;
}
void get_network_address( unsigned char *network_number,
unsigned char *physical_node)
{
union REGS regs;
struct SREGS sregs;
struct {
unsigned char network_number[4];
unsigned char physical_node [6];
}reply_buffer;
regs.x.di=FP_OFF((void far *)&reply_buffer);
sregs.es=FP_SEG((void far *)&reply_buffer);
_BX=0x0009;
ipx_spx();
memcpy(network_number,reply_buffer.network_number,4);
memcpy(physical_node,reply_buffer.physical_node,6);
}
void ipx_schedule_ipx_event(struct IPXECB far *ecb_ptr,unsigined int ticks)
{
_ES=FP_SEG((VOID FAR *)ecb_ptr);
_SI=FP_OFF((VOID FAR *)ecb_ptr);
_BX=0x0005;
_AX=ticks;
ipx_spx();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -