1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 06:47:45 +00:00
This commit is contained in:
Mordred 2018-06-07 20:33:06 +02:00
parent 1bde2bd802
commit f29671911e
4 changed files with 167 additions and 185 deletions

View file

@ -7,16 +7,17 @@
#include <boost/format.hpp> #include <boost/format.hpp>
#include "Util/Util.h" #include "Util/Util.h"
Core::Network::Packets::GamePacket::GamePacket( uint16_t subType, uint16_t size, uint32_t id1, uint32_t id2, uint16_t type ) Core::Network::Packets::GamePacket::GamePacket( uint16_t subType, uint16_t size,
uint32_t id1, uint32_t id2, uint16_t type )
{ {
m_dataBuf = std::vector<uint8_t>( size ); m_dataBuf = std::vector< uint8_t >( size );
memset( &m_segHdr, 0, sizeof( m_segHdr ) ); memset( &m_segHdr, 0, sizeof( m_segHdr ) );
setHeader( size, type, id1, id2, subType, 0x00 ); setHeader( size, type, id1, id2, subType, 0x00 );
} }
void Core::Network::Packets::GamePacket::setHeader( uint16_t size, uint16_t type, uint32_t id1, uint32_t id2, uint16_t subType, uint32_t unknown ) void Core::Network::Packets::GamePacket::setHeader( uint16_t size, uint16_t type, uint32_t id1,
uint32_t id2, uint16_t subType, uint32_t unknown )
{ {
m_segHdr.size = size; m_segHdr.size = size;
@ -40,7 +41,7 @@ void Core::Network::Packets::GamePacket::setHeader( uint16_t size, uint16_t type
Core::Network::Packets::GamePacket::GamePacket( char * pData, uint16_t size, bool bWriteStamp ) Core::Network::Packets::GamePacket::GamePacket( char * pData, uint16_t size, bool bWriteStamp )
{ {
m_dataBuf = std::vector<uint8_t>( size ); m_dataBuf = std::vector< uint8_t >( size );
memcpy( &m_dataBuf[0], pData, size ); memcpy( &m_dataBuf[0], pData, size );
m_unknown2 = 0; m_unknown2 = 0;
@ -65,9 +66,12 @@ Core::Network::Packets::GamePacket::GamePacket( const Packets::FFXIVARR_PACKET_R
{ {
m_segHdr = packetData.segHdr; m_segHdr = packetData.segHdr;
m_dataBuf = std::vector<uint8_t>( m_segHdr.size ); m_dataBuf = std::vector< uint8_t >( m_segHdr.size );
memcpy( &m_dataBuf[0] + sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ),
&packetData.data[0],
m_segHdr.size - sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ) );
memcpy( &m_dataBuf[0] + sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ), &packetData.data[0], m_segHdr.size - sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ) );
memcpy( &m_dataBuf[0], &m_segHdr, sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ) ); memcpy( &m_dataBuf[0], &m_segHdr, sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ) );
m_subType = *reinterpret_cast< uint16_t* >( &m_dataBuf[0] + 0x12 ); m_subType = *reinterpret_cast< uint16_t* >( &m_dataBuf[0] + 0x12 );
@ -98,5 +102,5 @@ void Core::Network::Packets::GamePacket::savePacket()
std::string Core::Network::Packets::GamePacket::toString() const std::string Core::Network::Packets::GamePacket::toString() const
{ {
return Core::Util::binaryToHexDump( const_cast<uint8_t *>( &m_dataBuf[0] ), getSize() ); return Core::Util::binaryToHexDump( const_cast< uint8_t* >( &m_dataBuf[0] ), getSize() );
} }

View file

@ -20,7 +20,7 @@ template < typename T, typename T1 >
class GamePacketNew; class GamePacketNew;
template < typename T, typename T1 > template < typename T, typename T1 >
std::ostream& operator<< ( std::ostream& os, const GamePacketNew< T, T1 >& packet ); std::ostream& operator << ( std::ostream& os, const GamePacketNew< T, T1 >& packet );
template< class T > template< class T >
using ZoneChannelPacket = GamePacketNew< T, ServerZoneIpcType >; using ZoneChannelPacket = GamePacketNew< T, ServerZoneIpcType >;
@ -32,15 +32,15 @@ using ChatChannelPacket = GamePacketNew< T, ServerChatIpcType >;
* The base implementation of a game packet. Needed for parsing packets. * The base implementation of a game packet. Needed for parsing packets.
*/ */
template < typename T1 > template < typename T1 >
class FFXIVPacketBase class FFXIVIpcPacketBase
{ {
public: public:
virtual ~FFXIVPacketBase() = default; virtual ~FFXIVIpcPacketBase() = default;
/** /**
* @brief Gets the IPC type of this packet. (Useful for determining the * @brief Gets the IPC type of this packet. (Useful for determining the
* type of a parsed packet.) * type of a parsed packet.)
*/ */
virtual T1 ipcType( void ) = 0; virtual T1 ipcType() = 0;
}; };
/** /**
@ -50,7 +50,7 @@ public:
* 32 byte header information.) * 32 byte header information.)
*/ */
template < typename T, typename T1 > template < typename T, typename T1 >
class GamePacketNew : public FFXIVPacketBase< T1 > class GamePacketNew : public FFXIVIpcPacketBase< T1 >
{ {
public: public:
/** /**
@ -96,7 +96,7 @@ protected:
}; };
public: public:
virtual T1 ipcType( void ) virtual T1 ipcType()
{ {
return static_cast< T1 >( m_data._ServerIpcType ); return static_cast< T1 >( m_data._ServerIpcType );
}; };

View file

@ -5,16 +5,10 @@
using namespace Core::Network::Packets; using namespace Core::Network::Packets;
namespace Core PacketParseResult Core::Network::Packets::getHeader( const std::vector< uint8_t > &buffer,
{
namespace Network
{
namespace Packets
{
PacketParseResult getHeader( const std::vector< uint8_t > &buffer,
const uint32_t offset, const uint32_t offset,
FFXIVARR_PACKET_HEADER &header ) FFXIVARR_PACKET_HEADER &header )
{ {
const auto headerSize = sizeof( FFXIVARR_PACKET_HEADER ); const auto headerSize = sizeof( FFXIVARR_PACKET_HEADER );
// Check if we have enough bytes in the buffer. // Check if we have enough bytes in the buffer.
@ -29,12 +23,12 @@ namespace Core
return Malformed; return Malformed;
return Success; return Success;
} }
PacketParseResult getSegmentHeader( const std::vector< uint8_t > &buffer, PacketParseResult Core::Network::Packets::getSegmentHeader( const std::vector< uint8_t > &buffer,
const uint32_t offset, const uint32_t offset,
FFXIVARR_PACKET_SEGMENT_HEADER &header ) FFXIVARR_PACKET_SEGMENT_HEADER &header )
{ {
const auto headerSize = sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ); const auto headerSize = sizeof( FFXIVARR_PACKET_SEGMENT_HEADER );
// Check if we have enough bytes in the buffer. // Check if we have enough bytes in the buffer.
@ -46,13 +40,13 @@ namespace Core
memcpy( &header, buffer.data() + offset, headerSize ); memcpy( &header, buffer.data() + offset, headerSize );
return Success; return Success;
} }
PacketParseResult getPackets( const std::vector< uint8_t > &buffer, PacketParseResult Core::Network::Packets::getPackets( const std::vector< uint8_t > &buffer,
const uint32_t offset, const uint32_t offset,
const FFXIVARR_PACKET_HEADER &packetHeader, const FFXIVARR_PACKET_HEADER &packetHeader,
std::vector< FFXIVARR_PACKET_RAW > &packets ) std::vector< FFXIVARR_PACKET_RAW > &packets )
{ {
// sanity check: check there's enough bytes in the buffer // sanity check: check there's enough bytes in the buffer
const auto bytesExpected = packetHeader.size - sizeof( struct FFXIVARR_PACKET_HEADER ); const auto bytesExpected = packetHeader.size - sizeof( struct FFXIVARR_PACKET_HEADER );
if( buffer.size() - offset < bytesExpected ) if( buffer.size() - offset < bytesExpected )
@ -85,11 +79,11 @@ namespace Core
return Malformed; return Malformed;
return Success; return Success;
} }
PacketParseResult getPacket( const std::vector< uint8_t > &buffer, const uint32_t offset, PacketParseResult Core::Network::Packets::getPacket( const std::vector< uint8_t > &buffer, const uint32_t offset,
FFXIVARR_PACKET_RAW &packet ) FFXIVARR_PACKET_RAW &packet )
{ {
// Copy segment header // Copy segment header
const auto headerResult = getSegmentHeader( buffer, offset, packet.segHdr ); const auto headerResult = getSegmentHeader( buffer, offset, packet.segHdr );
if( headerResult != Success ) if( headerResult != Success )
@ -107,10 +101,10 @@ namespace Core
memcpy( packet.data.data(), buffer.data() + dataOffset, dataSize ); memcpy( packet.data.data(), buffer.data() + dataOffset, dataSize );
return Success; return Success;
} }
bool checkHeader( const FFXIVARR_PACKET_HEADER &header ) bool Core::Network::Packets::checkHeader( const FFXIVARR_PACKET_HEADER &header )
{ {
// Max size of the packet is capped at 1MB for now. // Max size of the packet is capped at 1MB for now.
if( header.size > 1 * 1024 * 1024 ) if( header.size > 1 * 1024 * 1024 )
return false; return false;
@ -120,16 +114,13 @@ namespace Core
return false; return false;
return true; return true;
} }
bool checkSegmentHeader( const FFXIVARR_PACKET_SEGMENT_HEADER &header ) bool Core::Network::Packets::checkSegmentHeader( const FFXIVARR_PACKET_SEGMENT_HEADER &header )
{ {
// Max size of individual message is capped at 256KB for now. // Max size of individual message is capped at 256KB for now.
if( header.size > 256 * 1024 ) if( header.size > 256 * 1024 )
return false; return false;
return true; return true;
}
}
}
} }

View file

@ -2,12 +2,10 @@
#define _GAMEPACKETPARSER_H #define _GAMEPACKETPARSER_H
#include "CommonNetwork.h" #include "CommonNetwork.h"
namespace Core namespace Core {
{ namespace Network {
namespace Network namespace Packets {
{
namespace Packets
{
enum PacketParseResult enum PacketParseResult
{ {
/// Dissected game packet successfully /// Dissected game packet successfully
@ -22,42 +20,31 @@ namespace Core
/// Read packet header from buffer with given offset. /// Read packet header from buffer with given offset.
/// Buffer with given offset must be pointing to start of the new FFXIV packet. /// Buffer with given offset must be pointing to start of the new FFXIV packet.
PacketParseResult getHeader( PacketParseResult getHeader( const std::vector< uint8_t > &buffer, const uint32_t offset,
const std::vector< uint8_t > &buffer, FFXIVARR_PACKET_HEADER &header );
const uint32_t offset,
FFXIVARR_PACKET_HEADER &header
);
/// Read packet header from buffer with given offset. /// Read packet header from buffer with given offset.
/// Buffer with given offset must be pointing to start of FFXIVARR_PACKET_SEGMENT_HEADER data. /// Buffer with given offset must be pointing to start of FFXIVARR_PACKET_SEGMENT_HEADER data.
/// Keep in mind that this function does check for data validity. Call checkSegmentHeader() if that's needed. /// Keep in mind that this function does check for data validity. Call checkSegmentHeader() if that's needed.
PacketParseResult getSegmentHeader( PacketParseResult getSegmentHeader( const std::vector< uint8_t > &buffer, const uint32_t offset,
const std::vector< uint8_t > &buffer, FFXIVARR_PACKET_SEGMENT_HEADER &header );
const uint32_t offset,
FFXIVARR_PACKET_SEGMENT_HEADER &header
);
/// Read packets from the buffer with given offset. /// Read packets from the buffer with given offset.
/// Buffer with given offset must be pointing to end of FFXIVARR_PACKET_HEADER data. /// Buffer with given offset must be pointing to end of FFXIVARR_PACKET_HEADER data.
PacketParseResult getPackets( PacketParseResult getPackets( const std::vector< uint8_t > &buffer, const uint32_t offset,
const std::vector< uint8_t > &buffer,
const uint32_t offset,
const FFXIVARR_PACKET_HEADER &header, const FFXIVARR_PACKET_HEADER &header,
std::vector< Packets::FFXIVARR_PACKET_RAW > &packets); std::vector< Packets::FFXIVARR_PACKET_RAW > &packets );
/// Read single packet from the buffer with given offset. /// Read single packet from the buffer with given offset.
/// Buffer with an offset must be pointing to start of FFXIVARR_PACKET_SEGMENT_HEADER data. /// Buffer with an offset must be pointing to start of FFXIVARR_PACKET_SEGMENT_HEADER data.
PacketParseResult getPacket( PacketParseResult getPacket( const std::vector< uint8_t > &buffer, const uint32_t offset,
const std::vector< uint8_t > &buffer, FFXIVARR_PACKET_RAW &packet );
const uint32_t offset,
FFXIVARR_PACKET_RAW &packet
);
bool checkHeader(const FFXIVARR_PACKET_HEADER &header); bool checkHeader(const FFXIVARR_PACKET_HEADER &header);
bool checkSegmentHeader(const FFXIVARR_PACKET_SEGMENT_HEADER &header); bool checkSegmentHeader(const FFXIVARR_PACKET_SEGMENT_HEADER &header);
} }
} }
} }