LargeRaMDisk.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. namespace DiskAccessLibrary.Mod
  3. {
  4. public class LargeRamDisk : Disk
  5. {
  6. private const int SectorSize = 512;
  7. private const int BlockSize = Consts.Gigabyte;
  8. private byte[][] _blocks;
  9. public LargeRamDisk(int sizeInGigabyte)
  10. {
  11. var arr = new byte[sizeInGigabyte][];
  12. for (var i = 0; i < sizeInGigabyte; i++)
  13. {
  14. arr[i] = new byte[Consts.Gigabyte];
  15. }
  16. _blocks = arr;
  17. Size = (long)sizeInGigabyte * Consts.Gigabyte;
  18. }
  19. public void Free()
  20. {
  21. for (var i = 0; i < _blocks.Length; i++)
  22. {
  23. _blocks[i] = null;
  24. }
  25. _blocks = null;
  26. GC.Collect();
  27. GC.WaitForPendingFinalizers();
  28. }
  29. private void ReadBlock(byte[] buffer, int offset, int count, int blockIndex, int blockOffset)
  30. {
  31. Buffer.BlockCopy(_blocks[blockIndex], blockOffset, buffer, offset, count);
  32. }
  33. private void WriteBlock(byte[] buffer, int offset, int count, int blockIndex, int blockOffset)
  34. {
  35. Buffer.BlockCopy(buffer, offset, _blocks[blockIndex], blockOffset, count);
  36. }
  37. public override byte[] ReadSectors(long sectorIndex, int sectorCount)
  38. {
  39. var rawOffset = sectorIndex * SectorSize;
  40. var rawSize = sectorCount * SectorSize;
  41. var buffer = new byte[rawSize];
  42. for (var i = 0; i < rawSize;)
  43. {
  44. var blockIndex = (int)(rawOffset / BlockSize);
  45. var blockOffset = (int)(rawOffset % BlockSize);
  46. var bytesToRead = BlockSize - blockOffset;
  47. if (i + bytesToRead > rawSize)
  48. {
  49. bytesToRead = rawSize - i;
  50. }
  51. ReadBlock(buffer, i, bytesToRead, blockIndex, blockOffset);
  52. i += bytesToRead;
  53. rawOffset += bytesToRead;
  54. }
  55. return buffer;
  56. }
  57. public override void WriteSectors(long sectorIndex, byte[] data)
  58. {
  59. var rawOffset = sectorIndex * SectorSize;
  60. for (var i = 0; i < data.Length;)
  61. {
  62. var blockIndex = (int)(rawOffset / BlockSize);
  63. var blockOffset = (int)(rawOffset % BlockSize);
  64. var bytesToWrite = BlockSize - blockOffset;
  65. if (i + bytesToWrite > data.Length)
  66. {
  67. bytesToWrite = data.Length - i;
  68. }
  69. WriteBlock(data, i, bytesToWrite, blockIndex, blockOffset);
  70. i += bytesToWrite;
  71. rawOffset += bytesToWrite;
  72. }
  73. }
  74. public override int BytesPerSector => SectorSize;
  75. public override long Size { get; }
  76. }
  77. }