⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packet.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Copyright (C) 1998,1999,2000  Ross Combs (rocombs@cs.nmsu.edu) * Copyright (C) 1999,2000,2001  Marco Ziech (mmz@gmx.net) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */#include "common/setup_before.h"#ifdef HAVE_STDDEF_H# include <stddef.h>#else# ifndef NULL#  define NULL ((void *)0)# endif#endif#ifdef STDC_HEADERS# include <stdlib.h>#else# ifdef HAVE_MALLOC_H#  include <malloc.h># endif#endif#ifdef HAVE_STRING_H# include <string.h>#else# ifdef HAVE_STRINGS_H#  include <strings.h># endif#endif#ifdef HAVE_MEMORY_H# include <memory.h>#endif#include "compat/memcpy.h"#include "common/eventlog.h"#include "common/bn_type.h"#include "common/field_sizes.h"#include "common/xalloc.h"#include "common/lstr.h"#include "common/packet.h"#include "common/setup_after.h"extern t_packet * packet_create(t_packet_class class){    t_packet * temp;        if (class!=packet_class_init &&	class!=packet_class_bnet &&	class!=packet_class_file &&	class!=packet_class_udp &&	class!=packet_class_raw &&	class!=packet_class_d2game &&        class!=packet_class_d2cs &&        class!=packet_class_d2gs &&	class!=packet_class_d2cs_bnetd &&	class!=packet_class_w3route)    {	eventlog(eventlog_level_error,__FUNCTION__,"invalid packet class %d",(int)class);        return NULL;    }    temp = xmalloc(sizeof(t_packet));    temp->ref   = 1;    temp->class = class;    temp->flags = 0;    packet_set_size(temp,0);        return temp;}extern void packet_destroy(t_packet const * packet){    if (!packet)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL packet");	return;    }        xfree((void *)packet); /* avoid warning */}extern t_packet * packet_add_ref(t_packet * packet){    if (!packet)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL packet");	return NULL;    }        packet->ref++;    return packet;}extern void packet_del_ref(t_packet * packet){    if (!packet)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL packet");	return;    }        if (packet->ref<2) /* if would go to zero */	packet_destroy(packet);    else	packet->ref--;}extern t_packet_class packet_get_class(t_packet const * packet){    if (!packet)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL packet");	return packet_class_none;    }        switch (packet->class)    {    case packet_class_init:	return packet_class_init;    case packet_class_bnet:        return packet_class_bnet;    case packet_class_file:        return packet_class_file;    case packet_class_udp:	return packet_class_udp;    case packet_class_raw:        return packet_class_raw;    case packet_class_d2game:        return packet_class_d2game;    case packet_class_d2cs:        return packet_class_d2cs;    case packet_class_d2gs:        return packet_class_d2gs;    case packet_class_d2cs_bnetd:        return packet_class_d2cs_bnetd;    case packet_class_w3route:        return packet_class_w3route;    case packet_class_none:	return packet_class_none;    default:	eventlog(eventlog_level_error,__FUNCTION__,"packet has invalid class %d",(int)packet->class);	return packet_class_none;    }}extern char const * packet_get_class_str(t_packet const * packet){    if (!packet)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL packet");	return "unknown";    }        switch (packet->class)    {    case packet_class_init:        return "init";    case packet_class_bnet:        return "bnet";    case packet_class_file:        return "file";    case packet_class_udp:        return "udp";    case packet_class_raw:        return "raw";    case packet_class_d2game:        return "d2game";    case packet_class_d2gs:        return "d2gs";    case packet_class_d2cs_bnetd:        return "d2cs_bnetd";    case packet_class_d2cs:        return "d2cs";    case packet_class_w3route:	return "w3route";    case packet_class_none:	return "none";    default:	eventlog(eventlog_level_error,__FUNCTION__,"packet has invalid class %d",(int)packet->class);	return "unknown";    }}extern int packet_set_class(t_packet * packet, t_packet_class class){    if (!packet)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL packet");	return -1;    }    if (packet->class!=packet_class_raw)    {	eventlog(eventlog_level_error,__FUNCTION__,"got non-raw packet");	return -1;    }    if (class!=packet_class_init &&	class!=packet_class_bnet &&	class!=packet_class_file &&	class!=packet_class_udp &&	class!=packet_class_raw &&	class!=packet_class_d2game &&        class!=packet_class_d2cs &&        class!=packet_class_d2gs &&        class!=packet_class_d2cs_bnetd &&	class!=packet_class_w3route)    {	eventlog(eventlog_level_error,__FUNCTION__,"invalid packet class %d",(int)class);        return -1;    }        packet->class = class;    return 0;}extern unsigned int packet_get_type(t_packet const * packet){    if (!packet)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL packet");	return 0;    }        switch (packet->class)    {    case packet_class_init:	return CLIENT_INITCONN; /* all init packets are of this type */	    case packet_class_bnet:	if (packet_get_size(packet)<sizeof(t_bnet_header))	{	    eventlog(eventlog_level_error,__FUNCTION__,"bnet packet is shorter than header (len=%u)",packet_get_size(packet));	    return 0;	}	return (unsigned int)bn_short_get(packet->u.bnet.h.type);	    case packet_class_file:	if (packet_get_size(packet)<sizeof(t_file_header))	{	    eventlog(eventlog_level_error,__FUNCTION__,"file packet is shorter than header (len=%u)",packet_get_size(packet));	    return 0;	}	return (unsigned int)bn_short_get(packet->u.file.h.type);	    case packet_class_udp:	if (packet_get_size(packet)<sizeof(t_udp_header))	{	    eventlog(eventlog_level_error,__FUNCTION__,"udp packet is shorter than header (len=%u)",packet_get_size(packet));	    return 0;	}	return bn_int_get(packet->u.udp.h.type);	    case packet_class_raw:	return 0; /* raw packets don't have a type, but don't warn because the packet dump tries anyway */	    case packet_class_d2game:	if (packet_get_size(packet)<sizeof(t_d2game_header))	{	    eventlog(eventlog_level_error,__FUNCTION__,"d2game packet is shorter than header (len=%u)",packet_get_size(packet));	    return 0;	}	return bn_byte_get(packet->u.d2game.h.type);	    case packet_class_d2gs:        if (packet_get_size(packet)<sizeof(t_d2cs_d2gs_header))        {            eventlog(eventlog_level_error,__FUNCTION__,"d2gs packet is shorter than header (len=%u)",packet_get_size(packet));            return 0;        }        return bn_short_get(packet->u.d2cs_d2gs.h.type);    case packet_class_d2cs_bnetd:        if (packet_get_size(packet)<sizeof(t_d2cs_bnetd_header)) {                eventlog(eventlog_level_error,__FUNCTION__,"d2cs_bnetd packet shorter than header (len=%u)",packet_get_size(packet));                return 0;        }        return bn_short_get(packet->u.d2cs_d2gs.h.type);    case packet_class_d2cs:        if (packet_get_size(packet)<sizeof(t_d2cs_client_header))        {            eventlog(eventlog_level_error,__FUNCTION__,"d2cs packet is shorter than header (len=%u)",packet_get_size(packet));            return 0;        }        return bn_byte_get(packet->u.d2cs_client.h.type);    case packet_class_w3route:	if (packet_get_size(packet)<sizeof(t_w3route_header))	{	    eventlog(eventlog_level_error,__FUNCTION__,"w3route packet is shorter than header (len=%u)",packet_get_size(packet));	    return 0;	}	return bn_short_get(packet->u.w3route.h.type);	    default:	eventlog(eventlog_level_error,__FUNCTION__,"packet has invalid class %d",(int)packet->class);	return 0;    }}extern char const * packet_get_type_str(t_packet const * packet, t_packet_dir dir){    if (!packet)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL packet");	return "unknown";    }        switch (dir)    {    case packet_dir_from_client:	switch (packet->class)	{	case packet_class_init:	    return "CLIENT_INITCONN";	case packet_class_bnet:	    if (packet_get_size(packet)<sizeof(t_bnet_header))	    {		eventlog(eventlog_level_error,__FUNCTION__,"packet is shorter than header (len=%u)",packet_get_size(packet));		return "unknown";	    }	    switch (bn_short_get(packet->u.bnet.h.type))	    {	    case CLIENT_COMPINFO1:		return "CLIENT_COMPINFO1";	    case CLIENT_COMPINFO2:		return "CLIENT_COMPINFO2";	    case CLIENT_COUNTRYINFO1:		return "CLIENT_COUNTRYINFO1";	    case CLIENT_COUNTRYINFO_109:		return "CLIENT_COUNTRYINFO_109";	    case CLIENT_CREATEACCTREQ1:		return "CLIENT_CREATEACCTREQ1";	    case CLIENT_UNKNOWN_2B:		return "CLIENT_UNKNOWN_2B";	    case CLIENT_PROGIDENT:		return "CLIENT_PROGIDENT";	    case CLIENT_AUTHREQ1:		return "CLIENT_AUTHREQ1";	    case CLIENT_AUTHREQ_109:		return "CLIENT_AUTHREQ_109";	    case CLIENT_REGSNOOPREPLY:		return "CLIENT_REGSNOOPREPLY";	    case CLIENT_ICONREQ:		return "CLIENT_ICONREQ";	    case CLIENT_LADDERSEARCHREQ:		return "CLIENT_LADDERSEARCHREQ";	    case CLIENT_CDKEY:		return "CLIENT_CDKEY";	    case CLIENT_CDKEY2:		return "CLIENT_CDKEY2";	    case CLIENT_CDKEY3:		return "CLIENT_CDKEY3";			    case CLIENT_REALMLISTREQ:		return "CLIENT_REALMLISTREQ";	    case CLIENT_REALMLISTREQ_110:		return "CLIENT_REALMLISTREQ_110";	    case CLIENT_PROFILEREQ:		return "CLIENT_PROFILEREQ";	    case CLIENT_UNKNOWN_37:		return "CLIENT_UNKNOWN_37";	    case CLIENT_UNKNOWN_39:		return "CLIENT_UNKNOWN_39";	    case CLIENT_LOGINREQ2:		return "CLIENT_LOGINREQ2";	    case CLIENT_MOTD_W3:		return "CLIENT_MOTD_W3";	    case CLIENT_LOGINREQ_W3:                return "CLIENT_LOGINREQ_W3"; 	    case CLIENT_LOGONPROOFREQ:                return "CLIENT_LOGONPROOFREQ";	    case CLIENT_CREATEACCOUNT_W3:		return "CLIENT_CREATEACCOUNT_W3";	    case CLIENT_CHANGEGAMEPORT:                return "CLIENT_CHANGEGAMEPORT";             case CLIENT_CREATEACCTREQ2:		return "CLIENT_CREATEACCTREQ2";	    case CLIENT_UDPOK:		return "CLIENT_UDPOK";	    case CLIENT_FILEINFOREQ:		return "CLIENT_FILEINFOREQ";	    case CLIENT_STATSREQ:		return "CLIENT_STATSREQ";	    case CLIENT_LOGINREQ1:		return "CLIENT_LOGINREQ1";	    case CLIENT_CHANGEPASSREQ:		return "CLIENT_CHANGEPASSREQ";	    case CLIENT_PLAYERINFOREQ:		return "CLIENT_PLAYERINFOREQ";	    case CLIENT_PROGIDENT2:		return "CLIENT_PROGIDENT2";	    case CLIENT_JOINCHANNEL:		return "CLIENT_JOINCHANNEL";	    case CLIENT_MESSAGE:		return "CLIENT_MESSAGE";	    case CLIENT_GAMELISTREQ:		return "CLIENT_GAMELISTREQ";	    case CLIENT_STARTGAME1:		return "CLIENT_STARTGAME1";	    case CLIENT_UNKNOWN_1B:		return "CLIENT_UNKNOWN_1B";	    case CLIENT_STARTGAME3:		return "CLIENT_STARTGAME3";	    case CLIENT_STARTGAME4:		return "CLIENT_STARTGAME4";	    case CLIENT_CLOSEGAME:		return "CLIENT_CLOSEGAME";	    case CLIENT_CLOSEGAME2:		return "CLIENT_CLOSEGAME2";	    case CLIENT_LEAVECHANNEL:		return "CLIENT_LEAVECHANNEL";	    case CLIENT_MAPAUTHREQ1:		return "CLIENT_MAPAUTHREQ1";	    case CLIENT_MAPAUTHREQ2:		return "CLIENT_MAPAUTHREQ2";	    case CLIENT_ADREQ:		return "CLIENT_ADREQ";	    case CLIENT_ADACK:		return "CLIENT_ADACK";	    case CLIENT_ADCLICK:		return "CLIENT_ADCLICK";	    case CLIENT_ADCLICK2:		return "CLIENT_ADCLICK2";	    case CLIENT_UNKNOWN_17:		return "CLIENT_UNKNOWN_17";	    case CLIENT_UNKNOWN_24:		return "CLIENT_UNKNOWN_24";	    case CLIENT_LADDERREQ:		return "CLIENT_LADDERREQ";	    case CLIENT_ECHOREPLY:		return "CLIENT_ECHOREPLY";	    case CLIENT_PINGREQ:		return "CLIENT_PINGREQ";	    case CLIENT_GAME_REPORT:		return "CLIENT_GAME_REPORT";	    case CLIENT_JOIN_GAME:		return "CLIENT_JOIN_GAME";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -