AccessMask.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /* Copyright (C) 2014-2017 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
  12. {
  13. /// <summary>
  14. /// [MS-CIFS] SMB_COM_NT_CREATE_ANDX request (DesiredAccess field) and NT_TRANSACT_CREATE request (DesiredAccess field)
  15. /// [MS-SMB] 2.2.1.4.1 - File_Pipe_Printer_Access_Mask
  16. /// </summary>
  17. [Flags]
  18. public enum FileAccessMask : uint
  19. {
  20. FILE_READ_DATA = 0x00000001,
  21. FILE_WRITE_DATA = 0x00000002,
  22. FILE_APPEND_DATA = 0x00000004,
  23. FILE_READ_EA = 0x00000008,
  24. FILE_WRITE_EA = 0x00000010,
  25. FILE_EXECUTE = 0x00000020,
  26. FILE_READ_ATTRIBUTES = 0x00000080,
  27. FILE_WRITE_ATTRIBUTES = 0x00000100,
  28. DELETE = 0x00010000,
  29. READ_CONTROL = 0x00020000,
  30. WRITE_DAC = 0x00040000,
  31. WRITE_OWNER = 0x00080000,
  32. SYNCHRONIZE = 0x00100000,
  33. ACCESS_SYSTEM_SECURITY = 0x01000000,
  34. MAXIMUM_ALLOWED = 0x02000000,
  35. GENERIC_ALL = 0x10000000,
  36. GENERIC_EXECUTE = 0x20000000,
  37. GENERIC_WRITE = 0x40000000,
  38. GENERIC_READ = 0x80000000,
  39. }
  40. /// <summary>
  41. /// [MS-SMB] 2.2.1.4.2 - Directory_Access_Mask
  42. /// </summary>
  43. [Flags]
  44. public enum DirectoryAccessMask : uint
  45. {
  46. FILE_LIST_DIRECTORY = 0x00000001,
  47. FILE_ADD_FILE = 0x00000002,
  48. FILE_ADD_SUBDIRECTORY = 0x00000004,
  49. FILE_READ_EA = 0x00000008,
  50. FILE_WRITE_EA = 0x00000010,
  51. FILE_TRAVERSE = 0x00000020,
  52. FILE_DELETE_CHILD = 0x00000040,
  53. FILE_READ_ATTRIBUTES = 0x00000080,
  54. FILE_WRITE_ATTRIBUTES = 0x00000100,
  55. DELETE = 0x00010000,
  56. READ_CONTROL = 0x00020000,
  57. WRITE_DAC = 0x00040000,
  58. WRITE_OWNER = 0x00080000,
  59. SYNCHRONIZE = 0x00100000,
  60. ACCESS_SYSTEM_SECURITY = 0x01000000,
  61. MAXIMUM_ALLOWED = 0x02000000,
  62. GENERIC_ALL = 0x10000000,
  63. GENERIC_EXECUTE = 0x20000000,
  64. GENERIC_WRITE = 0x40000000,
  65. GENERIC_READ = 0x80000000,
  66. }
  67. /// <summary>
  68. /// [MS-DTYP] 2.4.3 - ACCESS_MASK
  69. /// </summary>
  70. public struct AccessMask // uint
  71. {
  72. public const int Length = 4;
  73. public FileAccessMask File;
  74. public DirectoryAccessMask Directory;
  75. public AccessMask(byte[] buffer, ref int offset) : this(buffer, offset)
  76. {
  77. offset += Length;
  78. }
  79. public AccessMask(byte[] buffer, int offset)
  80. {
  81. uint value = LittleEndianConverter.ToUInt32(buffer, offset);
  82. File = (FileAccessMask)value;
  83. Directory = (DirectoryAccessMask)value;
  84. }
  85. public void WriteBytes(byte[] buffer, int offset)
  86. {
  87. uint value = (uint)this.File | (uint)this.Directory;
  88. LittleEndianWriter.WriteUInt32(buffer, offset, value);
  89. }
  90. public void WriteBytes(byte[] buffer, ref int offset)
  91. {
  92. WriteBytes(buffer, offset);
  93. offset += 4;
  94. }
  95. public static explicit operator AccessMask(uint value)
  96. {
  97. AccessMask result = new AccessMask();
  98. result.File = (FileAccessMask)value;
  99. result.Directory = (DirectoryAccessMask)value;
  100. return result;
  101. }
  102. public static implicit operator AccessMask(FileAccessMask accessMask)
  103. {
  104. AccessMask result = new AccessMask();
  105. result.File = accessMask;
  106. return result;
  107. }
  108. public static implicit operator AccessMask(DirectoryAccessMask accessMask)
  109. {
  110. AccessMask result = new AccessMask();
  111. result.Directory = accessMask;
  112. return result;
  113. }
  114. public static explicit operator uint(AccessMask accessMask)
  115. {
  116. uint value = (uint)accessMask.File | (uint)accessMask.Directory;
  117. return value;
  118. }
  119. }
  120. }