diff --git a/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj b/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj index 48f326c4..f9da3622 100644 --- a/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj +++ b/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj @@ -71,17 +71,19 @@ - - - + + + + + + - - + - - - - + + + + diff --git a/FFXIVClassic_Lobby_Server/PacketProcessor.cs b/FFXIVClassic_Lobby_Server/PacketProcessor.cs index 87fe9a7b..06d934cc 100644 --- a/FFXIVClassic_Lobby_Server/PacketProcessor.cs +++ b/FFXIVClassic_Lobby_Server/PacketProcessor.cs @@ -1,6 +1,7 @@ using FFXIVClassic_Lobby_Server.common; using FFXIVClassic_Lobby_Server.dataobjects; using FFXIVClassic_Lobby_Server.packets; +using FFXIVClassic_Lobby_Server.packets.receive; using MySql.Data.MySqlClient; using System; using System.Collections.Generic; @@ -79,7 +80,7 @@ namespace FFXIVClassic_Lobby_Server private void ProcessSessionAcknowledgement(ClientConnection client, SubPacket packet) { - PacketStructs.SessionPacket sessionPacket = PacketStructs.toSessionStruct(packet.data); + SessionPacket sessionPacket = new SessionPacket(packet.data); String clientVersion = sessionPacket.version; Log.info(String.Format("Got acknowledgment for secure session.")); @@ -127,7 +128,7 @@ namespace FFXIVClassic_Lobby_Server private void ProcessSelectCharacter(ClientConnection client, SubPacket packet) { - FFXIVClassic_Lobby_Server.packets.PacketStructs.SelectCharRequestPacket selectCharRequest = PacketStructs.toSelectCharRequestStruct(packet.data); + SelectCharacterPacket selectCharRequest = new SelectCharacterPacket(packet.data); Log.info(String.Format("{0} => Select character id {1}", client.currentUserId == 0 ? client.getAddress() : "User " + client.currentUserId, selectCharRequest.characterId)); @@ -156,8 +157,7 @@ namespace FFXIVClassic_Lobby_Server private void ProcessModifyCharacter(ClientConnection client, SubPacket packet) { - - PacketStructs.CharacterRequestPacket charaReq = PacketStructs.toCharacterRequestStruct(packet.data); + CharacterModifyPacket charaReq = new CharacterModifyPacket(packet.data); var slot = charaReq.slot; var code = charaReq.command; var name = charaReq.characterName; diff --git a/FFXIVClassic_Lobby_Server/packets/PacketStructs.cs b/FFXIVClassic_Lobby_Server/packets/PacketStructs.cs deleted file mode 100644 index 683954ca..00000000 --- a/FFXIVClassic_Lobby_Server/packets/PacketStructs.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Lobby_Server.packets -{ - class PacketStructs - { - [StructLayout(LayoutKind.Explicit)] - public unsafe struct SessionPacket - { - [FieldOffset(0)] - public UInt64 sequence; - [FieldOffset(0x10)] - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x40)] - public String session; - [FieldOffset(0x50)] - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)] - public String version; - } - - [StructLayout(LayoutKind.Sequential)] - public unsafe struct CharacterRequestPacket - { - public UInt64 sequence; - public uint characterId; - public uint personType; - public byte slot; - public byte command; - public ushort worldId; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)] - public String characterName; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x190)] - public String characterInfoEncoded; - } - - [StructLayout(LayoutKind.Sequential)] - public unsafe struct SelectCharRequestPacket - { - public UInt64 sequence; - public uint characterId; - public uint unknownId; - public UInt64 ticket; - } - - public static unsafe CharacterRequestPacket toCharacterRequestStruct(byte[] bytes) - { - fixed (byte* pdata = &bytes[0]) - { - return (CharacterRequestPacket)Marshal.PtrToStructure(new IntPtr(pdata), typeof(CharacterRequestPacket)); - } - } - - public static unsafe SessionPacket toSessionStruct(byte[] bytes) - { - fixed (byte* pdata = &bytes[0]) - { - return (SessionPacket)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SessionPacket)); - } - } - - public static unsafe SelectCharRequestPacket toSelectCharRequestStruct(byte[] bytes) - { - fixed (byte* pdata = &bytes[0]) - { - return (SelectCharRequestPacket)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SelectCharRequestPacket)); - } - } - - public static byte[] StructureToByteArray(object obj) - { - int len = Marshal.SizeOf(obj); - - byte[] arr = new byte[len]; - - IntPtr ptr = Marshal.AllocHGlobal(len); - - Marshal.StructureToPtr(obj, ptr, true); - - Marshal.Copy(ptr, arr, 0, len); - - Marshal.FreeHGlobal(ptr); - - return arr; - } - } -} diff --git a/FFXIVClassic_Lobby_Server/packets/receive/CharacterModifyPacket.cs b/FFXIVClassic_Lobby_Server/packets/receive/CharacterModifyPacket.cs new file mode 100644 index 00000000..cc4ebc7f --- /dev/null +++ b/FFXIVClassic_Lobby_Server/packets/receive/CharacterModifyPacket.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Lobby_Server.packets.receive +{ + class CharacterModifyPacket + { + public UInt64 sequence; + public uint characterId; + public uint personType; + public byte slot; + public byte command; + public ushort worldId; + public String characterName; + public String characterInfoEncoded; + + public bool invalidPacket = false; + + public CharacterModifyPacket(byte[] data) + { + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryReader binReader = new BinaryReader(mem)) + { + try + { + sequence = binReader.ReadUInt64(); + characterId = binReader.ReadUInt32(); + personType = binReader.ReadUInt32(); + slot = binReader.ReadByte(); + command = binReader.ReadByte(); + worldId = binReader.ReadUInt16(); + + characterName = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' }); + characterInfoEncoded = Encoding.ASCII.GetString(binReader.ReadBytes(0x190)).Trim(new[] { '\0' }); + } + catch (Exception){ + invalidPacket = true; + } + } + } + } + } +} diff --git a/FFXIVClassic_Lobby_Server/packets/receive/SelectCharacterPacket.cs b/FFXIVClassic_Lobby_Server/packets/receive/SelectCharacterPacket.cs new file mode 100644 index 00000000..4e93d593 --- /dev/null +++ b/FFXIVClassic_Lobby_Server/packets/receive/SelectCharacterPacket.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Lobby_Server.packets.receive +{ + class SelectCharacterPacket + { + public UInt64 sequence; + public uint characterId; + public uint unknownId; + public UInt64 ticket; + + public bool invalidPacket = false; + + public SelectCharacterPacket(byte[] data) + { + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryReader binReader = new BinaryReader(mem)) + { + try + { + sequence = binReader.ReadUInt64(); + characterId = binReader.ReadUInt32(); + unknownId = binReader.ReadUInt32(); + ticket = binReader.ReadUInt64(); + } + catch (Exception){ + invalidPacket = true; + } + } + } + } + + } +} diff --git a/FFXIVClassic_Lobby_Server/packets/receive/SessionPacket.cs b/FFXIVClassic_Lobby_Server/packets/receive/SessionPacket.cs new file mode 100644 index 00000000..53555a8a --- /dev/null +++ b/FFXIVClassic_Lobby_Server/packets/receive/SessionPacket.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Lobby_Server.packets.receive +{ + class SessionPacket + { + public bool invalidPacket = false; + public UInt64 sequence; + public String session; + public String version; + + public SessionPacket(byte[] data) + { + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryReader binReader = new BinaryReader(mem)) + { + try + { + sequence = binReader.ReadUInt64(); + binReader.ReadUInt32(); + binReader.ReadUInt32(); + session = Encoding.ASCII.GetString(binReader.ReadBytes(0x40)).Trim(new[] { '\0' }); + version = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' }); + } + catch (Exception){ + invalidPacket = true; + } + } + } + } + } +} diff --git a/FFXIVClassic_Lobby_Server/packets/AccountListPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/AccountListPacket.cs similarity index 100% rename from FFXIVClassic_Lobby_Server/packets/AccountListPacket.cs rename to FFXIVClassic_Lobby_Server/packets/send/AccountListPacket.cs diff --git a/FFXIVClassic_Lobby_Server/packets/CharaCreatorPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/CharaCreatorPacket.cs similarity index 100% rename from FFXIVClassic_Lobby_Server/packets/CharaCreatorPacket.cs rename to FFXIVClassic_Lobby_Server/packets/send/CharaCreatorPacket.cs diff --git a/FFXIVClassic_Lobby_Server/packets/CharacterListPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/CharacterListPacket.cs similarity index 100% rename from FFXIVClassic_Lobby_Server/packets/CharacterListPacket.cs rename to FFXIVClassic_Lobby_Server/packets/send/CharacterListPacket.cs diff --git a/FFXIVClassic_Lobby_Server/packets/ErrorPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/ErrorPacket.cs similarity index 100% rename from FFXIVClassic_Lobby_Server/packets/ErrorPacket.cs rename to FFXIVClassic_Lobby_Server/packets/send/ErrorPacket.cs diff --git a/FFXIVClassic_Lobby_Server/packets/ImportListPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/ImportListPacket.cs similarity index 100% rename from FFXIVClassic_Lobby_Server/packets/ImportListPacket.cs rename to FFXIVClassic_Lobby_Server/packets/send/ImportListPacket.cs diff --git a/FFXIVClassic_Lobby_Server/packets/RetainerListPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/RetainerListPacket.cs similarity index 100% rename from FFXIVClassic_Lobby_Server/packets/RetainerListPacket.cs rename to FFXIVClassic_Lobby_Server/packets/send/RetainerListPacket.cs diff --git a/FFXIVClassic_Lobby_Server/packets/SelectCharacterConfirmPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/SelectCharacterConfirmPacket.cs similarity index 100% rename from FFXIVClassic_Lobby_Server/packets/SelectCharacterConfirmPacket.cs rename to FFXIVClassic_Lobby_Server/packets/send/SelectCharacterConfirmPacket.cs diff --git a/FFXIVClassic_Lobby_Server/packets/WorldListPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/WorldListPacket.cs similarity index 100% rename from FFXIVClassic_Lobby_Server/packets/WorldListPacket.cs rename to FFXIVClassic_Lobby_Server/packets/send/WorldListPacket.cs