SMB1FileStoreHelper.QueryFileSystem.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 SMBLibrary.SMB1;
  11. using Utilities;
  12. namespace SMBLibrary.Server.SMB1
  13. {
  14. public partial class SMB1FileStoreHelper
  15. {
  16. public static NTStatus GetFileSystemInformation(out QueryFSInformation result, INTFileStore fileStore, QueryFSInformationLevel informationLevel)
  17. {
  18. result = null;
  19. FileSystemInformation fsInfo;
  20. switch (informationLevel)
  21. {
  22. case QueryFSInformationLevel.SMB_QUERY_FS_VOLUME_INFO:
  23. {
  24. NTStatus status = fileStore.GetFileSystemInformation(out fsInfo, FileSystemInformationClass.FileFsVolumeInformation);
  25. if (status != NTStatus.STATUS_SUCCESS)
  26. {
  27. return status;
  28. }
  29. FileFsVolumeInformation volumeInfo = (FileFsVolumeInformation)fsInfo;
  30. QueryFSVolumeInfo information = new QueryFSVolumeInfo();
  31. information.VolumeCreationTime = volumeInfo.VolumeCreationTime;
  32. information.SerialNumber = volumeInfo.VolumeSerialNumber;
  33. information.VolumeLabel = volumeInfo.VolumeLabel;
  34. result = information;
  35. return NTStatus.STATUS_SUCCESS;
  36. }
  37. case QueryFSInformationLevel.SMB_QUERY_FS_SIZE_INFO:
  38. {
  39. NTStatus status = fileStore.GetFileSystemInformation(out fsInfo, FileSystemInformationClass.FileFsSizeInformation);
  40. if (status != NTStatus.STATUS_SUCCESS)
  41. {
  42. return status;
  43. }
  44. FileFsSizeInformation fsSizeInfo = (FileFsSizeInformation)fsInfo;
  45. QueryFSSizeInfo information = new QueryFSSizeInfo();
  46. information.TotalAllocationUnits = fsSizeInfo.TotalAllocationUnits;
  47. information.TotalFreeAllocationUnits = fsSizeInfo.AvailableAllocationUnits;
  48. information.BytesPerSector = fsSizeInfo.BytesPerSector;
  49. information.SectorsPerAllocationUnit = fsSizeInfo.SectorsPerAllocationUnit;
  50. result = information;
  51. return NTStatus.STATUS_SUCCESS;
  52. }
  53. case QueryFSInformationLevel.SMB_QUERY_FS_DEVICE_INFO:
  54. {
  55. NTStatus status = fileStore.GetFileSystemInformation(out fsInfo, FileSystemInformationClass.FileFsDeviceInformation);
  56. if (status != NTStatus.STATUS_SUCCESS)
  57. {
  58. return status;
  59. }
  60. FileFsDeviceInformation fsDeviceInfo = (FileFsDeviceInformation)fsInfo;
  61. QueryFSDeviceInfo information = new QueryFSDeviceInfo();
  62. information.DeviceType = fsDeviceInfo.DeviceType;
  63. information.DeviceCharacteristics = fsDeviceInfo.Characteristics;
  64. result = information;
  65. return NTStatus.STATUS_SUCCESS;
  66. }
  67. case QueryFSInformationLevel.SMB_QUERY_FS_ATTRIBUTE_INFO:
  68. {
  69. NTStatus status = fileStore.GetFileSystemInformation(out fsInfo, FileSystemInformationClass.FileFsAttributeInformation);
  70. if (status != NTStatus.STATUS_SUCCESS)
  71. {
  72. return status;
  73. }
  74. FileFsAttributeInformation fsAttributeInfo = (FileFsAttributeInformation)fsInfo;
  75. QueryFSAttibuteInfo information = new QueryFSAttibuteInfo();
  76. information.FileSystemAttributes = fsAttributeInfo.FileSystemAttributes;
  77. information.MaxFileNameLengthInBytes = fsAttributeInfo.MaximumComponentNameLength;
  78. information.FileSystemName = fsAttributeInfo.FileSystemName;
  79. result = information;
  80. return NTStatus.STATUS_SUCCESS;
  81. }
  82. default:
  83. {
  84. return NTStatus.STATUS_OS2_INVALID_LEVEL;
  85. }
  86. }
  87. }
  88. }
  89. }