DynamicDiskHelper.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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.IO;
  10. using System.Text;
  11. using DiskAccessLibrary.LogicalDiskManager;
  12. using Utilities;
  13. namespace DiskAccessLibrary
  14. {
  15. public partial class DynamicDiskHelper
  16. {
  17. public static DynamicDisk FindDisk(List<DynamicDisk> disks, Guid diskGuid)
  18. {
  19. foreach (DynamicDisk dynamicDisk in disks)
  20. {
  21. if (dynamicDisk != null)
  22. {
  23. if (dynamicDisk.DiskGuid == diskGuid)
  24. {
  25. return dynamicDisk;
  26. }
  27. }
  28. }
  29. return null;
  30. }
  31. public static long FindUnusedRegionInPrivateRegion(DynamicDisk disk, int sectorCount)
  32. {
  33. bool[] bitmap = GetPrivateRegionUsageBitmap(disk);
  34. int startIndex = 0;
  35. int freeCount = 0;
  36. for (int index = 0; index < bitmap.Length; index++)
  37. {
  38. if (freeCount == 0)
  39. {
  40. if (bitmap[index] == false) // free
  41. {
  42. startIndex = index;
  43. freeCount++;
  44. }
  45. }
  46. else
  47. {
  48. if (bitmap[index] == false) // free
  49. {
  50. freeCount++;
  51. if (freeCount == sectorCount)
  52. {
  53. return (long)disk.PrivateHeader.PrivateRegionStartLBA + startIndex;
  54. }
  55. }
  56. else
  57. {
  58. freeCount = 0;
  59. }
  60. }
  61. }
  62. return -1;
  63. }
  64. public static long FindUnusedSectorInPrivateRegion(DynamicDisk disk)
  65. {
  66. bool[] bitmap = GetPrivateRegionUsageBitmap(disk);
  67. for (int index = 0; index < bitmap.Length; index++)
  68. {
  69. if (bitmap[index] == false)
  70. {
  71. return (long)disk.PrivateHeader.PrivateRegionStartLBA + index;
  72. }
  73. }
  74. return -1;
  75. }
  76. public static bool[] GetPrivateRegionUsageBitmap(DynamicDisk disk)
  77. {
  78. // usage bitmap:
  79. bool[] bitmap = new bool[disk.PrivateHeader.PrivateRegionSizeLBA];
  80. bitmap[disk.PrivateHeader.PrimaryPrivateHeaderLBA] = true;
  81. bitmap[disk.PrivateHeader.SecondaryPrivateHeaderLBA] = true;
  82. bitmap[disk.PrivateHeader.PrimaryTocLBA] = true;
  83. bitmap[disk.PrivateHeader.PreviousPrimaryTocLBA] = true;
  84. bitmap[disk.PrivateHeader.SecondaryTocLBA] = true;
  85. bitmap[disk.PrivateHeader.PreviousSecondaryTocLBA] = true;
  86. foreach (TOCRegion region in disk.TOCBlock.Regions)
  87. {
  88. for (int index = 0; index < (int)region.SizeLBA; index++)
  89. {
  90. bitmap[(int)region.StartLBA + index] = true;
  91. }
  92. }
  93. return bitmap;
  94. }
  95. }
  96. }