From b8a563f9d7d59bd42a0b8d8b51891a4216a70815 Mon Sep 17 00:00:00 2001 From: deviltti Date: Tue, 21 Jun 2016 21:13:01 -0400 Subject: [PATCH] Lobby and game server packet ConsoleColor to NLog cleanup. --- FFXIVClassic Common Class Lib/Utils.cs | 453 +++++++++--------- FFXIVClassic Lobby Server/NLog.config | 54 ++- .../packets/BasePacket.cs | 162 ++++--- .../packets/SubPacket.cs | 55 ++- FFXIVClassic Map Server/NLog.config | 7 +- FFXIVClassic Map Server/packets/BasePacket.cs | 2 +- 6 files changed, 382 insertions(+), 351 deletions(-) diff --git a/FFXIVClassic Common Class Lib/Utils.cs b/FFXIVClassic Common Class Lib/Utils.cs index a97f2ee2..12f5f88f 100644 --- a/FFXIVClassic Common Class Lib/Utils.cs +++ b/FFXIVClassic Common Class Lib/Utils.cs @@ -1,233 +1,234 @@ -using System; -using System.Text; - -namespace FFXIVClassic.Common -{ - public static class Utils - { - private static readonly uint[] _lookup32 = CreateLookup32(); - - private static uint[] CreateLookup32() - { - var result = new uint[256]; - for (int i = 0; i < 256; i++) - { - string s = i.ToString("X2"); - result[i] = ((uint)s[0]) + ((uint)s[1] << 16); - } - return result; - } - - public static string ByteArrayToHex(byte[] bytes, int offset = 0, int bytesPerLine = 16) - { - if (bytes == null) - { - return String.Empty; - } - - char[] hexChars = "0123456789ABCDEF".ToCharArray(); - - // 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - // 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - int offsetBlock = 8 + 3; - int byteBlock = offsetBlock + (bytesPerLine * 3) + ((bytesPerLine - 1) / 8) + 2; - int lineLength = byteBlock + bytesPerLine + Environment.NewLine.Length; - - char[] line = (new String(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray(); - int numLines = (bytes.Length + bytesPerLine - 1) / bytesPerLine; - - StringBuilder sb = new StringBuilder(numLines * lineLength); - - for (int i = 0; i < bytes.Length; i += bytesPerLine) - { - int h = i + offset; - - line[0] = hexChars[(h >> 28) & 0xF]; - line[1] = hexChars[(h >> 24) & 0xF]; - line[2] = hexChars[(h >> 20) & 0xF]; - line[3] = hexChars[(h >> 16) & 0xF]; - line[4] = hexChars[(h >> 12) & 0xF]; - line[5] = hexChars[(h >> 8) & 0xF]; - line[6] = hexChars[(h >> 4) & 0xF]; - line[7] = hexChars[(h >> 0) & 0xF]; - - int hexColumn = offsetBlock; - int charColumn = byteBlock; - - for (int j = 0; j < bytesPerLine; j++) - { - if (j > 0 && (j & 7) == 0) - { - hexColumn++; - } - - if (i + j >= bytes.Length) - { - line[hexColumn] = ' '; - line[hexColumn + 1] = ' '; - line[charColumn] = ' '; - } - else - { - byte by = bytes[i + j]; - line[hexColumn] = hexChars[(by >> 4) & 0xF]; - line[hexColumn + 1] = hexChars[by & 0xF]; - line[charColumn] = (by < 32 ? '.' : (char)by); - } - - hexColumn += 3; - charColumn++; - } - - sb.Append(line); - } - - return sb.ToString(); - } - - public static UInt32 UnixTimeStampUTC() - { - UInt32 unixTimeStamp; - DateTime currentTime = DateTime.Now; - DateTime zuluTime = currentTime.ToUniversalTime(); - DateTime unixEpoch = new DateTime(1970, 1, 1); - unixTimeStamp = (UInt32)(zuluTime.Subtract(unixEpoch)).TotalSeconds; - - return unixTimeStamp; - } - - public static UInt64 MilisUnixTimeStampUTC() - { - UInt64 unixTimeStamp; - DateTime currentTime = DateTime.Now; - DateTime zuluTime = currentTime.ToUniversalTime(); - DateTime unixEpoch = new DateTime(1970, 1, 1); - unixTimeStamp = (UInt64)(zuluTime.Subtract(unixEpoch)).TotalMilliseconds; - - return unixTimeStamp; - } - - public static ulong SwapEndian(ulong input) - { - return ((0x00000000000000FF) & (input >> 56) | - (0x000000000000FF00) & (input >> 40) | - (0x0000000000FF0000) & (input >> 24) | - (0x00000000FF000000) & (input >> 8) | - (0x000000FF00000000) & (input << 8) | - (0x0000FF0000000000) & (input << 24) | - (0x00FF000000000000) & (input << 40) | - (0xFF00000000000000) & (input << 56)); - } - - public static uint SwapEndian(uint input) - { - return ((input >> 24) & 0xff) | - ((input << 8) & 0xff0000) | - ((input >> 8) & 0xff00) | - ((input << 24) & 0xff000000); - } - - public static int SwapEndian(int input) - { - uint inputAsUint = (uint)input; - - input = (int) - (((inputAsUint >> 24) & 0xff) | - ((inputAsUint << 8) & 0xff0000) | - ((inputAsUint >> 8) & 0xff00) | - ((inputAsUint << 24) & 0xff000000)); - - return input; - } - - public static uint MurmurHash2(string key, uint seed) - { - // 'm' and 'r' are mixing constants generated offline. - // They're not really 'magic', they just happen to work well. - - byte[] data = Encoding.ASCII.GetBytes(key); - const uint m = 0x5bd1e995; - const int r = 24; - int len = key.Length; - int dataIndex = len - 4; - - // Initialize the hash to a 'random' value - - uint h = seed ^ (uint)len; - - // Mix 4 bytes at a time into the hash - - - while (len >= 4) - { - h *= m; - - uint k = (uint)BitConverter.ToInt32(data, dataIndex); - k = ((k >> 24) & 0xff) | // move byte 3 to byte 0 - ((k << 8) & 0xff0000) | // move byte 1 to byte 2 - ((k >> 8) & 0xff00) | // move byte 2 to byte 1 - ((k << 24) & 0xff000000); // byte 0 to byte 3 - - k *= m; - k ^= k >> r; - k *= m; - - h ^= k; - - dataIndex -= 4; - len -= 4; - } - - // Handle the last few bytes of the input array - switch (len) - { - case 3: - h ^= (uint)data[0] << 16; goto case 2; - case 2: - h ^= (uint)data[len - 2] << 8; goto case 1; - case 1: - h ^= data[len - 1]; - h *= m; - break; - }; - - // Do a few final mixes of the hash to ensure the last few - // bytes are well-incorporated. - - h ^= h >> 13; - h *= m; - h ^= h >> 15; - - return h; - } - - public static byte[] ConvertBoolArrayToBinaryStream(bool[] array) - { - byte[] data = new byte[(array.Length / 8) + (array.Length % 8 != 0 ? 1 : 0)]; - - int dataCounter = 0; - for (int i = 0; i < array.Length; i += 8) - { - for (int bitCount = 0; bitCount < 8; bitCount++) - { - if (i + bitCount >= array.Length) - break; - data[dataCounter] = (byte)(((array[i + bitCount] ? 1 : 0) << 7 - bitCount) | data[dataCounter]); - } - dataCounter++; - } - - return data; +using System; +using System.Text; + +namespace FFXIVClassic.Common +{ + public static class Utils + { + private static readonly uint[] _lookup32 = CreateLookup32(); + + private static uint[] CreateLookup32() + { + var result = new uint[256]; + for (var i = 0; i < 256; i++) + { + var s = i.ToString("X2"); + result[i] = s[0] + ((uint) s[1] << 16); + } + return result; + } + + public static string ByteArrayToHex(byte[] bytes, int offset = 0, int bytesPerLine = 16) + { + if (bytes == null) + { + return string.Empty; + } + + var hexChars = "0123456789ABCDEF".ToCharArray(); + + var offsetBlock = 8 + 3; + var byteBlock = offsetBlock + bytesPerLine*3 + (bytesPerLine - 1)/8 + 2; + var lineLength = byteBlock + bytesPerLine + Environment.NewLine.Length; + + var line = (new string(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray(); + var numLines = (bytes.Length + bytesPerLine - 1)/bytesPerLine; + + var sb = new StringBuilder(numLines*lineLength); + + for (var i = 0; i < bytes.Length; i += bytesPerLine) + { + var h = i + offset; + + line[0] = hexChars[(h >> 28) & 0xF]; + line[1] = hexChars[(h >> 24) & 0xF]; + line[2] = hexChars[(h >> 20) & 0xF]; + line[3] = hexChars[(h >> 16) & 0xF]; + line[4] = hexChars[(h >> 12) & 0xF]; + line[5] = hexChars[(h >> 8) & 0xF]; + line[6] = hexChars[(h >> 4) & 0xF]; + line[7] = hexChars[(h >> 0) & 0xF]; + + var hexColumn = offsetBlock; + var charColumn = byteBlock; + + for (var j = 0; j < bytesPerLine; j++) + { + if (j > 0 && (j & 7) == 0) + { + hexColumn++; + } + + if (i + j >= bytes.Length) + { + line[hexColumn] = ' '; + line[hexColumn + 1] = ' '; + line[charColumn] = ' '; + } + else + { + var by = bytes[i + j]; + line[hexColumn] = hexChars[(by >> 4) & 0xF]; + line[hexColumn + 1] = hexChars[by & 0xF]; + line[charColumn] = by < 32 ? '.' : (char) by; + } + + hexColumn += 3; + charColumn++; + } + + sb.Append(line); + } + + return sb.ToString().TrimEnd(Environment.NewLine.ToCharArray()); + } + + public static uint UnixTimeStampUTC() + { + uint unixTimeStamp; + var currentTime = DateTime.Now; + var zuluTime = currentTime.ToUniversalTime(); + var unixEpoch = new DateTime(1970, 1, 1); + unixTimeStamp = (uint) zuluTime.Subtract(unixEpoch).TotalSeconds; + + return unixTimeStamp; + } + + public static ulong MilisUnixTimeStampUTC() + { + ulong unixTimeStamp; + var currentTime = DateTime.Now; + var zuluTime = currentTime.ToUniversalTime(); + var unixEpoch = new DateTime(1970, 1, 1); + unixTimeStamp = (ulong) zuluTime.Subtract(unixEpoch).TotalMilliseconds; + + return unixTimeStamp; + } + + public static ulong SwapEndian(ulong input) + { + return 0x00000000000000FF & (input >> 56) | + 0x000000000000FF00 & (input >> 40) | + 0x0000000000FF0000 & (input >> 24) | + 0x00000000FF000000 & (input >> 8) | + 0x000000FF00000000 & (input << 8) | + 0x0000FF0000000000 & (input << 24) | + 0x00FF000000000000 & (input << 40) | + 0xFF00000000000000 & (input << 56); + } + + public static uint SwapEndian(uint input) + { + return ((input >> 24) & 0xff) | + ((input << 8) & 0xff0000) | + ((input >> 8) & 0xff00) | + ((input << 24) & 0xff000000); + } + + public static int SwapEndian(int input) + { + var inputAsUint = (uint) input; + + input = (int) + (((inputAsUint >> 24) & 0xff) | + ((inputAsUint << 8) & 0xff0000) | + ((inputAsUint >> 8) & 0xff00) | + ((inputAsUint << 24) & 0xff000000)); + + return input; + } + + public static uint MurmurHash2(string key, uint seed) + { + // 'm' and 'r' are mixing constants generated offline. + // They're not really 'magic', they just happen to work well. + + var data = Encoding.ASCII.GetBytes(key); + const uint m = 0x5bd1e995; + const int r = 24; + var len = key.Length; + var dataIndex = len - 4; + + // Initialize the hash to a 'random' value + + var h = seed ^ (uint) len; + + // Mix 4 bytes at a time into the hash + + + while (len >= 4) + { + h *= m; + + var k = (uint) BitConverter.ToInt32(data, dataIndex); + k = ((k >> 24) & 0xff) | // move byte 3 to byte 0 + ((k << 8) & 0xff0000) | // move byte 1 to byte 2 + ((k >> 8) & 0xff00) | // move byte 2 to byte 1 + ((k << 24) & 0xff000000); // byte 0 to byte 3 + + k *= m; + k ^= k >> r; + k *= m; + + h ^= k; + + dataIndex -= 4; + len -= 4; + } + + // Handle the last few bytes of the input array + switch (len) + { + case 3: + h ^= (uint) data[0] << 16; + goto case 2; + case 2: + h ^= (uint) data[len - 2] << 8; + goto case 1; + case 1: + h ^= data[len - 1]; + h *= m; + break; + } + ; + + // Do a few final mixes of the hash to ensure the last few + // bytes are well-incorporated. + + h ^= h >> 13; + h *= m; + h ^= h >> 15; + + return h; + } + + public static byte[] ConvertBoolArrayToBinaryStream(bool[] array) + { + var data = new byte[array.Length/8 + (array.Length%8 != 0 ? 1 : 0)]; + + var dataCounter = 0; + for (var i = 0; i < array.Length; i += 8) + { + for (var bitCount = 0; bitCount < 8; bitCount++) + { + if (i + bitCount >= array.Length) + break; + data[dataCounter] = (byte) (((array[i + bitCount] ? 1 : 0) << 7 - bitCount) | data[dataCounter]); + } + dataCounter++; + } + + return data; } public static string ToStringBase63(int number) { - string lookup = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + var lookup = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - string secondDigit = lookup.Substring((int)Math.Floor((double)number / (double)lookup.Length), 1); - string firstDigit = lookup.Substring(number % lookup.Length, 1); + var secondDigit = lookup.Substring((int) Math.Floor(number/(double) lookup.Length), 1); + var firstDigit = lookup.Substring(number%lookup.Length, 1); return secondDigit + firstDigit; - } - } -} + } + } +} \ No newline at end of file diff --git a/FFXIVClassic Lobby Server/NLog.config b/FFXIVClassic Lobby Server/NLog.config index 8495609d..0b9cda1d 100644 --- a/FFXIVClassic Lobby Server/NLog.config +++ b/FFXIVClassic Lobby Server/NLog.config @@ -1,48 +1,62 @@ - + + + internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> - - + - - + - - - - - - - - + + + + + + + + + - - - - - + + + + - + \ No newline at end of file diff --git a/FFXIVClassic Lobby Server/packets/BasePacket.cs b/FFXIVClassic Lobby Server/packets/BasePacket.cs index 332e7d6f..075ec2b6 100644 --- a/FFXIVClassic Lobby Server/packets/BasePacket.cs +++ b/FFXIVClassic Lobby Server/packets/BasePacket.cs @@ -1,14 +1,14 @@ using System; using System.Collections.Generic; -using System.Runtime.InteropServices; using System.Diagnostics; -using FFXIVClassic.Common; using System.IO; +using System.Runtime.InteropServices; +using FFXIVClassic.Common; using NLog; +using NLog.Targets; namespace FFXIVClassic_Lobby_Server.packets { - [StructLayout(LayoutKind.Sequential)] public struct BasePacketHeader { @@ -22,25 +22,25 @@ namespace FFXIVClassic_Lobby_Server.packets public class BasePacket { - public static Logger Log = LogManager.GetCurrentClassLogger(); public const int TYPE_ZONE = 1; public const int TYPE_CHAT = 2; public const int BASEPACKET_SIZE = 0x10; - - public BasePacketHeader header; + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); public byte[] data; + public BasePacketHeader header; + //Loads a sniffed packet from a file - public unsafe BasePacket(String path) + public unsafe BasePacket(string path) { - byte[] bytes = File.ReadAllBytes(path); + var bytes = File.ReadAllBytes(path); if (bytes.Length < BASEPACKET_SIZE) throw new OverflowException("Packet Error: Packet was too small"); fixed (byte* pdata = &bytes[0]) { - header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); + header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); } if (bytes.Length < header.packetSize) @@ -65,7 +65,7 @@ namespace FFXIVClassic_Lobby_Server.packets fixed (byte* pdata = &bytes[0]) { - header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); + header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); } if (bytes.Length < header.packetSize) @@ -84,7 +84,7 @@ namespace FFXIVClassic_Lobby_Server.packets fixed (byte* pdata = &bytes[offset]) { - header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); + header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); } int packetSize = header.packetSize; @@ -106,9 +106,9 @@ namespace FFXIVClassic_Lobby_Server.packets public List GetSubpackets() { - List subpackets = new List(header.numSubpackets); + var subpackets = new List(header.numSubpackets); - int offset = 0; + var offset = 0; while (offset < data.Length) subpackets.Add(new SubPacket(data, ref offset)); @@ -116,7 +116,7 @@ namespace FFXIVClassic_Lobby_Server.packets return subpackets; } - public unsafe static BasePacketHeader GetHeader(byte[] bytes) + public static unsafe BasePacketHeader GetHeader(byte[] bytes) { BasePacketHeader header; if (bytes.Length < BASEPACKET_SIZE) @@ -124,7 +124,7 @@ namespace FFXIVClassic_Lobby_Server.packets fixed (byte* pdata = &bytes[0]) { - header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); + header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); } return header; @@ -132,10 +132,10 @@ namespace FFXIVClassic_Lobby_Server.packets public byte[] GetHeaderBytes() { - int size = Marshal.SizeOf(header); - byte[] arr = new byte[size]; + var size = Marshal.SizeOf(header); + var arr = new byte[size]; - IntPtr ptr = Marshal.AllocHGlobal(size); + var ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(header, ptr, true); Marshal.Copy(ptr, arr, 0, size); Marshal.FreeHGlobal(ptr); @@ -144,7 +144,7 @@ namespace FFXIVClassic_Lobby_Server.packets public byte[] GetPacketBytes() { - byte[] outBytes = new byte[header.packetSize]; + var outBytes = new byte[header.packetSize]; Array.Copy(GetHeaderBytes(), 0, outBytes, 0, BASEPACKET_SIZE); Array.Copy(data, 0, outBytes, BASEPACKET_SIZE, data.Length); return outBytes; @@ -153,16 +153,17 @@ namespace FFXIVClassic_Lobby_Server.packets //Replaces all instances of the sniffed actorID with the given one public void ReplaceActorID(uint actorID) { - using (MemoryStream mem = new MemoryStream(data)) + using (var mem = new MemoryStream(data)) { - using (BinaryWriter binWriter = new BinaryWriter(mem)) + using (var binWriter = new BinaryWriter(mem)) { - using (BinaryReader binreader = new BinaryReader(mem)) + using (var binreader = new BinaryReader(mem)) { while (binreader.BaseStream.Position + 4 < data.Length) { - uint read = binreader.ReadUInt32(); - if (read == 0x029B2941 || read == 0x02977DC7 || read == 0x0297D2C8 || read == 0x0230d573 || read == 0x23317df || read == 0x23344a3 || read == 0x1730bdb) //Original ID + var read = binreader.ReadUInt32(); + if (read == 0x029B2941 || read == 0x02977DC7 || read == 0x0297D2C8 || read == 0x0230d573 || + read == 0x23317df || read == 0x23344a3 || read == 0x1730bdb) //Original ID { binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin); binWriter.Write(actorID); @@ -176,15 +177,15 @@ namespace FFXIVClassic_Lobby_Server.packets //Replaces all instances of the sniffed actorID with the given one public void ReplaceActorID(uint fromActorID, uint actorID) { - using (MemoryStream mem = new MemoryStream(data)) + using (var mem = new MemoryStream(data)) { - using (BinaryWriter binWriter = new BinaryWriter(mem)) + using (var binWriter = new BinaryWriter(mem)) { - using (BinaryReader binreader = new BinaryReader(mem)) + using (var binreader = new BinaryReader(mem)) { while (binreader.BaseStream.Position + 4 < data.Length) { - uint read = binreader.ReadUInt32(); + var read = binreader.ReadUInt32(); if (read == fromActorID) //Original ID { binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin); @@ -196,49 +197,65 @@ namespace FFXIVClassic_Lobby_Server.packets } } + public void DebugPrintPacket() + { +#if DEBUG + logger.ColorDebug( + string.Format("IsAuth:{0} Size:0x{1:X}, NumSubpackets:{2}{3}{4}", + header.isAuthenticated, header.packetSize, header.numSubpackets, + Environment.NewLine, Utils.ByteArrayToHex(GetHeaderBytes())), ConsoleOutputColor.DarkYellow); + + foreach (var sub in GetSubpackets()) + { + sub.DebugPrintSubPacket(); + } +#endif + } + #region Utility Functions + public static BasePacket CreatePacket(List subpackets, bool isAuthed, bool isEncrypted) { //Create Header - BasePacketHeader header = new BasePacketHeader(); + var header = new BasePacketHeader(); byte[] data = null; - header.isAuthenticated = isAuthed ? (byte)1 : (byte)0; - header.isEncrypted = isEncrypted ? (byte)1 : (byte)0; - header.numSubpackets = (ushort)subpackets.Count; + header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0; + header.isEncrypted = isEncrypted ? (byte) 1 : (byte) 0; + header.numSubpackets = (ushort) subpackets.Count; header.packetSize = BASEPACKET_SIZE; header.timestamp = Utils.MilisUnixTimeStampUTC(); //Get packet size - foreach (SubPacket subpacket in subpackets) + foreach (var subpacket in subpackets) header.packetSize += subpacket.header.subpacketSize; data = new byte[header.packetSize - 0x10]; //Add Subpackets - int offset = 0; - foreach (SubPacket subpacket in subpackets) + var offset = 0; + foreach (var subpacket in subpackets) { - byte[] subpacketData = subpacket.GetBytes(); + var subpacketData = subpacket.GetBytes(); Array.Copy(subpacketData, 0, data, offset, subpacketData.Length); - offset += (ushort)subpacketData.Length; + offset += (ushort) subpacketData.Length; } Debug.Assert(data != null && offset == data.Length && header.packetSize == 0x10 + offset); - BasePacket packet = new BasePacket(header, data); + var packet = new BasePacket(header, data); return packet; } public static BasePacket CreatePacket(SubPacket subpacket, bool isAuthed, bool isEncrypted) { //Create Header - BasePacketHeader header = new BasePacketHeader(); + var header = new BasePacketHeader(); byte[] data = null; - header.isAuthenticated = isAuthed ? (byte)1 : (byte)0; - header.isEncrypted = isEncrypted ? (byte)1 : (byte)0; - header.numSubpackets = (ushort)1; + header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0; + header.isEncrypted = isEncrypted ? (byte) 1 : (byte) 0; + header.numSubpackets = 1; header.packetSize = BASEPACKET_SIZE; header.timestamp = Utils.MilisUnixTimeStampUTC(); @@ -248,42 +265,41 @@ namespace FFXIVClassic_Lobby_Server.packets data = new byte[header.packetSize - 0x10]; //Add Subpackets - byte[] subpacketData = subpacket.GetBytes(); + var subpacketData = subpacket.GetBytes(); Array.Copy(subpacketData, 0, data, 0, subpacketData.Length); Debug.Assert(data != null); - BasePacket packet = new BasePacket(header, data); + var packet = new BasePacket(header, data); return packet; } public static BasePacket CreatePacket(byte[] data, bool isAuthed, bool isEncrypted) { - Debug.Assert(data != null); //Create Header - BasePacketHeader header = new BasePacketHeader(); + var header = new BasePacketHeader(); - header.isAuthenticated = isAuthed ? (byte)1 : (byte)0; - header.isEncrypted = isEncrypted ? (byte)1 : (byte)0; - header.numSubpackets = (ushort)1; + header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0; + header.isEncrypted = isEncrypted ? (byte) 1 : (byte) 0; + header.numSubpackets = 1; header.packetSize = BASEPACKET_SIZE; header.timestamp = Utils.MilisUnixTimeStampUTC(); //Get packet size - header.packetSize += (ushort)data.Length; + header.packetSize += (ushort) data.Length; - BasePacket packet = new BasePacket(header, data); + var packet = new BasePacket(header, data); return packet; } public static unsafe void EncryptPacket(Blowfish blowfish, BasePacket packet) { - byte[] data = packet.data; + var data = packet.data; int size = packet.header.packetSize; - int offset = 0; + var offset = 0; while (offset < data.Length) { if (data.Length < offset + SubPacket.SUBPACKET_SIZE) @@ -292,7 +308,7 @@ namespace FFXIVClassic_Lobby_Server.packets SubPacketHeader header; fixed (byte* pdata = &data[offset]) { - header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); + header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); } if (data.Length < offset + header.subpacketSize) @@ -302,15 +318,14 @@ namespace FFXIVClassic_Lobby_Server.packets offset += header.subpacketSize; } - } public static unsafe void DecryptPacket(Blowfish blowfish, ref BasePacket packet) { - byte[] data = packet.data; + var data = packet.data; int size = packet.header.packetSize; - int offset = 0; + var offset = 0; while (offset < data.Length) { if (data.Length < offset + SubPacket.SUBPACKET_SIZE) @@ -319,7 +334,7 @@ namespace FFXIVClassic_Lobby_Server.packets SubPacketHeader header; fixed (byte* pdata = &data[offset]) { - header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); + header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); } if (data.Length < offset + header.subpacketSize) @@ -330,24 +345,17 @@ namespace FFXIVClassic_Lobby_Server.packets offset += header.subpacketSize; } } + #endregion - - public void DebugPrintPacket() - { -#if DEBUG - // todo: create new target for colourful packet logging - //Console.BackgroundColor = ConsoleColor.DarkYellow; - - Log.Debug("IsAuth: {0} Size: 0x{1:X}, NumSubpackets: {2}{3}{4}", header.isAuthenticated, header.packetSize, header.numSubpackets, Environment.NewLine, Utils.ByteArrayToHex(GetHeaderBytes())); - - foreach (SubPacket sub in GetSubpackets()) - { - sub.DebugPrintSubPacket(); - } - - //Console.BackgroundColor = ConsoleColor.Black; -#endif - } - } -} + + public static class LoggerExtensions + { + public static void ColorDebug(this Logger logger, string message, ConsoleOutputColor color) + { + var logEvent = new LogEventInfo(LogLevel.Debug, logger.Name, message); + logEvent.Properties["color"] = (int) color; + logger.Log(logEvent); + } + } +} \ No newline at end of file diff --git a/FFXIVClassic Lobby Server/packets/SubPacket.cs b/FFXIVClassic Lobby Server/packets/SubPacket.cs index 0dcb526b..19f0a705 100644 --- a/FFXIVClassic Lobby Server/packets/SubPacket.cs +++ b/FFXIVClassic Lobby Server/packets/SubPacket.cs @@ -2,6 +2,7 @@ using System.Runtime.InteropServices; using FFXIVClassic.Common; using NLog; +using NLog.Targets; namespace FFXIVClassic_Lobby_Server.packets { @@ -27,13 +28,13 @@ namespace FFXIVClassic_Lobby_Server.packets public class SubPacket { - public static Logger Log = LogManager.GetCurrentClassLogger(); public const int SUBPACKET_SIZE = 0x10; public const int GAMEMESSAGE_SIZE = 0x10; + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); + public byte[] data; + public GameMessageHeader gameMessage; public SubPacketHeader header; - public GameMessageHeader gameMessage; - public byte[] data; public unsafe SubPacket(byte[] bytes, ref int offset) { @@ -42,14 +43,15 @@ namespace FFXIVClassic_Lobby_Server.packets fixed (byte* pdata = &bytes[offset]) { - header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); + header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); } if (header.type == 0x3) { fixed (byte* pdata = &bytes[offset + SUBPACKET_SIZE]) { - gameMessage = (GameMessageHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(GameMessageHeader)); + gameMessage = + (GameMessageHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(GameMessageHeader)); } } @@ -72,8 +74,8 @@ namespace FFXIVClassic_Lobby_Server.packets public SubPacket(ushort opcode, uint sourceId, uint targetId, byte[] data) { - this.header = new SubPacketHeader(); - this.gameMessage = new GameMessageHeader(); + header = new SubPacketHeader(); + gameMessage = new GameMessageHeader(); gameMessage.opcode = opcode; header.sourceId = sourceId; @@ -89,13 +91,13 @@ namespace FFXIVClassic_Lobby_Server.packets this.data = data; - header.subpacketSize = (ushort)(SUBPACKET_SIZE + GAMEMESSAGE_SIZE + data.Length); + header.subpacketSize = (ushort) (SUBPACKET_SIZE + GAMEMESSAGE_SIZE + data.Length); } public SubPacket(SubPacket original, uint newTargetId) { - this.header = new SubPacketHeader(); - this.gameMessage = original.gameMessage; + header = new SubPacketHeader(); + gameMessage = original.gameMessage; header.subpacketSize = original.header.subpacketSize; header.type = original.header.type; header.sourceId = original.header.sourceId; @@ -105,10 +107,10 @@ namespace FFXIVClassic_Lobby_Server.packets public byte[] GetHeaderBytes() { - int size = Marshal.SizeOf(header); - byte[] arr = new byte[size]; + var size = Marshal.SizeOf(header); + var arr = new byte[size]; - IntPtr ptr = Marshal.AllocHGlobal(size); + var ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(header, ptr, true); Marshal.Copy(ptr, arr, 0, size); Marshal.FreeHGlobal(ptr); @@ -117,10 +119,10 @@ namespace FFXIVClassic_Lobby_Server.packets public byte[] GetGameMessageBytes() { - int size = Marshal.SizeOf(gameMessage); - byte[] arr = new byte[size]; + var size = Marshal.SizeOf(gameMessage); + var arr = new byte[size]; - IntPtr ptr = Marshal.AllocHGlobal(size); + var ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(gameMessage, ptr, true); Marshal.Copy(ptr, arr, 0, size); Marshal.FreeHGlobal(ptr); @@ -129,7 +131,7 @@ namespace FFXIVClassic_Lobby_Server.packets public byte[] GetBytes() { - byte[] outBytes = new byte[header.subpacketSize]; + var outBytes = new byte[header.subpacketSize]; Array.Copy(GetHeaderBytes(), 0, outBytes, 0, SUBPACKET_SIZE); if (header.type == 0x3) @@ -142,17 +144,20 @@ namespace FFXIVClassic_Lobby_Server.packets public void DebugPrintSubPacket() { #if DEBUG - // todo: create new target for colourful packet logging - Log.Debug("Size: 0x{0:X}{1}{2}", header.subpacketSize, Environment.NewLine, Utils.ByteArrayToHex(GetHeaderBytes())); - + logger.ColorDebug( + string.Format("Size:0x{0:X} Opcode:0x{1:X}{2}{3}", header.subpacketSize, header.type, + Environment.NewLine, + Utils.ByteArrayToHex(GetHeaderBytes())), ConsoleOutputColor.DarkRed); + if (header.type == 0x03) { - Log.Debug("Opcode: 0x{0:X}{1}{2}", gameMessage.opcode, Environment.NewLine, Utils.ByteArrayToHex(GetGameMessageBytes(), SUBPACKET_SIZE)); - } + logger.ColorDebug(Utils.ByteArrayToHex(GetGameMessageBytes(), SUBPACKET_SIZE), + ConsoleOutputColor.DarkRed); - Log.Debug("Data: {0}{1}", Environment.NewLine, Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE)); + logger.ColorDebug(Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE), + ConsoleOutputColor.DarkMagenta); + } #endif } - } -} +} \ No newline at end of file diff --git a/FFXIVClassic Map Server/NLog.config b/FFXIVClassic Map Server/NLog.config index d989ae88..1260ebf7 100644 --- a/FFXIVClassic Map Server/NLog.config +++ b/FFXIVClassic Map Server/NLog.config @@ -34,7 +34,9 @@ + layout="[${date:format=MM/dd/yyyy HH\:mm\:ss}][${uppercase:${level}}]${message}" /> + @@ -50,7 +52,8 @@ - + +