public static long FindUnusedRegion(PrivateHeader privateHeader, TOCBlock tocBlock, int sectorCount) { bool[] bitmap = GetPrivateRegionUsageBitmap(privateHeader, tocBlock); // Reserve the first, second, third, third-last and second-last sectors for TOCBlocks bitmap[0] = true; bitmap[1] = true; bitmap[2] = true; bitmap[privateHeader.PrivateRegionSizeLBA - 3] = true; bitmap[privateHeader.PrivateRegionSizeLBA - 2] = true; int startIndex = 0; int freeCount = 0; for (int index = 0; index < bitmap.Length; index++) { if (bitmap[index] == false) // free { if (freeCount == 0) { startIndex = index; } freeCount++; if (freeCount == sectorCount) { return((long)privateHeader.PrivateRegionStartLBA + startIndex); } } else { freeCount = 0; } } return(-1); }
// The secondary TOC is usually alternated between the third-last and the second-last sectors of the private region. public static long FindUnusedLBAForSecondaryToc(PrivateHeader privateHeader, TOCBlock tocBlock) { bool[] bitmap = GetPrivateRegionUsageBitmap(privateHeader, tocBlock); for (int index = bitmap.Length - 1; index >= 0; index--) { if (bitmap[index] == false) { return((long)privateHeader.PrivateRegionStartLBA + index); } } return(-1); }
private static bool[] GetPrivateRegionUsageBitmap(PrivateHeader privateHeader, TOCBlock tocBlock) { // usage bitmap: bool[] bitmap = new bool[privateHeader.PrivateRegionSizeLBA]; bitmap[privateHeader.PrimaryPrivateHeaderLBA] = true; bitmap[privateHeader.SecondaryPrivateHeaderLBA] = true; bitmap[privateHeader.PrimaryTocLBA] = true; bitmap[privateHeader.SecondaryTocLBA] = true; foreach (TOCRegion region in tocBlock.Regions) { for (int index = 0; index < (int)region.SizeLBA; index++) { bitmap[(int)region.StartLBA + index] = true; } } return(bitmap); }
public static long FindUnusedSector(PrivateHeader privateHeader, TOCBlock tocBlock) { return(FindUnusedRegion(privateHeader, tocBlock, 1)); }