|
1 | | -using System.Collections.Generic; |
2 | | -using System.Diagnostics.CodeAnalysis; |
| 1 | +using System; |
| 2 | +using System.Collections.Generic; |
3 | 3 | using System.IO; |
4 | 4 | using System.Text; |
5 | 5 | using WowPacketParser.Enums; |
| 6 | +using WowPacketParser.Loading; |
6 | 7 | using WowPacketParser.Misc; |
7 | 8 |
|
8 | 9 | namespace WowPacketParser.Saving |
9 | 10 | { |
10 | 11 | public static class BinaryPacketWriter |
11 | 12 | { |
12 | | - [SuppressMessage("Microsoft.Reliability", "CA2000", Justification = "fileStream is disposed when writer is disposed.")] |
13 | | - public static void Write(SniffType type, string fileName, Encoding encoding, IEnumerable<Packet> packets) |
| 13 | + public static void Write(string fileName, FileMode fileMode, IEnumerable<Packet> packets) |
14 | 14 | { |
15 | | - var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None); |
16 | | - using (var writer = new BinaryWriter(fileStream, encoding)) |
| 15 | + using var fileStream = new FileStream(fileName, fileMode, FileAccess.Write, FileShare.None); |
| 16 | + using var writer = new BinaryWriter(fileStream, Encoding.ASCII); |
| 17 | + |
| 18 | + writer.Write(['P', 'K', 'T']); |
| 19 | + writer.Write((ushort)BinaryPacketReader.PktVersion.V3_1); |
| 20 | + writer.Write((byte)0x15); // sniffer id (pretend to be ymir) |
| 21 | + writer.Write(ClientVersion.BuildInt); |
| 22 | + writer.Write(Encoding.ASCII.GetBytes(ClientLocale.ClientLocaleString)); |
| 23 | + writer.Write(new byte[40]); // session key |
| 24 | + writer.Write((uint)0); // dump start timestamp |
| 25 | + writer.Write((uint)0); // dump start TickCount |
| 26 | + |
| 27 | + uint optionalHeaderLength = 2; |
| 28 | + writer.Write(optionalHeaderLength); // optional header length |
| 29 | + writer.Write((ushort)0x0100); // sniffer version |
| 30 | + |
| 31 | + foreach (var packet in packets) |
17 | 32 | { |
18 | | - foreach (var packet in packets) |
19 | | - { |
20 | | - if (type == SniffType.Pkt) |
21 | | - { |
22 | | - writer.Write((ushort) packet.Opcode); |
23 | | - writer.Write((int) packet.Length); |
24 | | - writer.Write((byte) packet.Direction); |
25 | | - writer.Write(Utilities.GetUnixTimeFromDateTime(packet.Time)); |
26 | | - writer.Write(packet.GetStream(0)); |
27 | | - } |
28 | | - else |
29 | | - { |
30 | | - writer.Write(packet.Opcode); |
31 | | - writer.Write((int) packet.Length); |
32 | | - writer.Write((int) Utilities.GetUnixTimeFromDateTime(packet.Time)); |
33 | | - writer.Write((byte) packet.Direction); |
34 | | - writer.Write(packet.GetStream(0)); |
35 | | - } |
36 | | - } |
| 33 | + writer.Write(packet.Direction == Direction.ClientToServer ? 0x47534d43u : 0x47534d53u); |
| 34 | + writer.Write(packet.ConnectionIndex); |
| 35 | + writer.Write((uint)0); // packet TickCount |
| 36 | + writer.Write((uint)8); // size of optional data |
| 37 | + writer.Write((uint)packet.Length + 4); // size of packet data |
| 38 | + writer.Write((double)((DateTimeOffset)packet.Time).ToUnixTimeMilliseconds()); // optional data |
| 39 | + writer.Write(packet.Opcode); // opcode |
| 40 | + writer.Write(packet.GetStream(0)); // data |
37 | 41 | } |
38 | 42 | } |
39 | 43 | } |
|
0 commit comments