SessionPacket.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
  2. *
  3. * You can redistribute this program and/or modify it under the terms of
  4. * the GNU Lesser Public License as published by the Free Software Foundation,
  5. * either version 3 of the License, or (at your option) any later version.
  6. */
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. using Utilities;
  11. namespace SMBLibrary.NetBios
  12. {
  13. /// <summary>
  14. /// [RFC 1002] 4.3.1. SESSION PACKET
  15. /// </summary>
  16. public abstract class SessionPacket
  17. {
  18. public SessionPacketTypeName Type;
  19. public byte Flags;
  20. public int Length; // 2 bytes + length extension bit
  21. public byte[] Trailer;
  22. public SessionPacket()
  23. {
  24. }
  25. public SessionPacket(byte[] buffer)
  26. {
  27. Type = (SessionPacketTypeName)ByteReader.ReadByte(buffer, 0);
  28. Flags = ByteReader.ReadByte(buffer, 1);
  29. Length = (Flags & 0x01) << 16 | BigEndianConverter.ToUInt16(buffer, 2);
  30. this.Trailer = ByteReader.ReadBytes(buffer, 4, Length);
  31. }
  32. public virtual byte[] GetBytes()
  33. {
  34. Length = this.Trailer.Length;
  35. if (Length > 0x1FFFF)
  36. {
  37. throw new ArgumentException("Invalid NBT packet length");
  38. }
  39. Flags = Convert.ToByte(Length > 0xFFFF);
  40. byte[] buffer = new byte[4 + Trailer.Length];
  41. ByteWriter.WriteByte(buffer, 0, (byte)this.Type);
  42. ByteWriter.WriteByte(buffer, 1, Flags);
  43. BigEndianWriter.WriteUInt16(buffer, 2, (ushort)(Length & 0xFFFF));
  44. ByteWriter.WriteBytes(buffer, 4, this.Trailer);
  45. return buffer;
  46. }
  47. public static SessionPacket GetSessionPacket(byte[] buffer)
  48. {
  49. SessionPacketTypeName type = (SessionPacketTypeName)ByteReader.ReadByte(buffer, 0);
  50. switch (type)
  51. {
  52. case SessionPacketTypeName.SessionMessage:
  53. return new SessionMessagePacket(buffer);
  54. case SessionPacketTypeName.SessionRequest:
  55. return new SessionRequestPacket(buffer);
  56. case SessionPacketTypeName.PositiveSessionResponse:
  57. return new PositiveSessionResponsePacket(buffer);
  58. case SessionPacketTypeName.NegativeSessionResponse:
  59. return new NegativeSessionResponsePacket(buffer);
  60. case SessionPacketTypeName.RetargetSessionResponse:
  61. return new SessionRetargetResponsePacket(buffer);
  62. case SessionPacketTypeName.SessionKeepAlive:
  63. return new SessionKeepAlivePacket(buffer);
  64. default:
  65. throw new InvalidRequestException("Invalid NetBIOS Session Packet");
  66. }
  67. }
  68. }
  69. }