NameServicePacketHeader.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using Utilities;
  6. namespace SMBLibrary.NetBios
  7. {
  8. /// <summary>
  9. /// [RFC 1002] 4.2.1.1. HEADER
  10. /// </summary>
  11. public class NameServicePacketHeader
  12. {
  13. public const int Length = 12;
  14. public ushort TransactionID;
  15. public NameServiceOperation OpCode;
  16. public OperationFlags Flags;
  17. public byte ResultCode;
  18. public ushort QDCount;
  19. public ushort ANCount;
  20. public ushort NSCount;
  21. public ushort ARCount;
  22. public NameServicePacketHeader()
  23. {
  24. }
  25. public NameServicePacketHeader(byte[] buffer, ref int offset) : this(buffer, offset)
  26. {
  27. offset += Length;
  28. }
  29. public NameServicePacketHeader(byte[] buffer, int offset)
  30. {
  31. TransactionID = BigEndianConverter.ToUInt16(buffer, offset + 0);
  32. ushort temp = BigEndianConverter.ToUInt16(buffer, offset + 2);
  33. ResultCode = (byte)(temp & 0xF);
  34. Flags = (OperationFlags)((temp >> 4) & 0x7F);
  35. OpCode = (NameServiceOperation)((temp >> 11) & 0x1F);
  36. QDCount = BigEndianConverter.ToUInt16(buffer, offset + 4);
  37. ANCount = BigEndianConverter.ToUInt16(buffer, offset + 6);
  38. NSCount = BigEndianConverter.ToUInt16(buffer, offset + 8);
  39. ARCount = BigEndianConverter.ToUInt16(buffer, offset + 10);
  40. }
  41. public void WriteBytes(Stream stream)
  42. {
  43. BigEndianWriter.WriteUInt16(stream, TransactionID);
  44. ushort temp = (ushort)(ResultCode & (0xF));
  45. temp |= (ushort)((byte)Flags << 4);
  46. temp |= (ushort)((byte)OpCode << 11);
  47. BigEndianWriter.WriteUInt16(stream, temp);
  48. BigEndianWriter.WriteUInt16(stream, QDCount);
  49. BigEndianWriter.WriteUInt16(stream, ANCount);
  50. BigEndianWriter.WriteUInt16(stream, NSCount);
  51. BigEndianWriter.WriteUInt16(stream, ARCount);
  52. }
  53. }
  54. }