- LARGE_MCB_MAPPING_ENTRY Node;
- PLARGE_MCB_MAPPING_ENTRY Element;
-
- Node.RunStartVbn.QuadPart = Vbn;
- Node.SectorCount.QuadPart = SectorCount;
-
- while ((Element = RtlLookupElementGenericTable(Mcb->Mapping, &Node)))
- {
- // Must split
- if (Element->RunStartVbn.QuadPart < Node.RunStartVbn.QuadPart &&
- Element->SectorCount.QuadPart > Node.SectorCount.QuadPart)
- {
- LARGE_MCB_MAPPING_ENTRY Upper, Reinsert;
- PLARGE_MCB_MAPPING_ENTRY Reinserted, Inserted;
- LARGE_INTEGER StartHole = Node.RunStartVbn;
- LARGE_INTEGER EndHole;
- EndHole.QuadPart = Node.RunStartVbn.QuadPart + Node.SectorCount.QuadPart;
- Upper.RunStartVbn.QuadPart = EndHole.QuadPart;
- Upper.StartingLbn.QuadPart =
- Element->StartingLbn.QuadPart +
- EndHole.QuadPart -
- Element->RunStartVbn.QuadPart;
- Upper.SectorCount.QuadPart =
- Element->SectorCount.QuadPart -
- (EndHole.QuadPart - Element->RunStartVbn.QuadPart);
- Reinsert = *Element;
- Reinsert.SectorCount.QuadPart =
- Element->RunStartVbn.QuadPart - StartHole.QuadPart;
- RemoveEntryList(&Element->Sequence);
- RtlDeleteElementGenericTable(Mcb->Mapping, Element);
- Mcb->PairCount--;
-
- Reinserted = RtlInsertElementGenericTable
- (Mcb->Mapping, &Reinsert, sizeof(Reinsert), NULL);
- InsertHeadList(GET_LIST_HEAD(Mcb->Mapping), &Reinserted->Sequence);
- Mcb->PairCount++;
-
- Inserted = RtlInsertElementGenericTable
- (Mcb->Mapping, &Upper, sizeof(Upper), NULL);
- InsertHeadList(GET_LIST_HEAD(Mcb->Mapping), &Inserted->Sequence);
- Mcb->PairCount++;
- }
- else if (Element->RunStartVbn.QuadPart < Node.RunStartVbn.QuadPart)
- {
- LARGE_MCB_MAPPING_ENTRY NewElement;
- PLARGE_MCB_MAPPING_ENTRY Reinserted;
- LARGE_INTEGER StartHole = Node.RunStartVbn;
- NewElement.RunStartVbn = Element->RunStartVbn;
- NewElement.StartingLbn = Element->StartingLbn;
- NewElement.SectorCount.QuadPart = StartHole.QuadPart - Element->StartingLbn.QuadPart;
-
- RemoveEntryList(&Element->Sequence);
- RtlDeleteElementGenericTable(Mcb->Mapping, Element);
- Mcb->PairCount--;
-
- Reinserted = RtlInsertElementGenericTable
- (Mcb->Mapping, &NewElement, sizeof(NewElement), NULL);
- InsertHeadList(GET_LIST_HEAD(Mcb->Mapping), &Reinserted->Sequence);
- Mcb->PairCount++;
- }
- else
- {
- LARGE_MCB_MAPPING_ENTRY NewElement;
- PLARGE_MCB_MAPPING_ENTRY Reinserted;
- LARGE_INTEGER EndHole = Element->RunStartVbn;
- LARGE_INTEGER EndRun;
- EndRun.QuadPart = Element->RunStartVbn.QuadPart + Element->SectorCount.QuadPart;
- NewElement.RunStartVbn = EndHole;
- NewElement.StartingLbn.QuadPart = Element->StartingLbn.QuadPart +
- (EndHole.QuadPart - Element->RunStartVbn.QuadPart);
- NewElement.SectorCount.QuadPart = EndRun.QuadPart - EndHole.QuadPart;
-
- RemoveEntryList(&Element->Sequence);
- RtlDeleteElementGenericTable(Mcb->Mapping, Element);
- Mcb->PairCount--;
-
- Reinserted = RtlInsertElementGenericTable
- (Mcb->Mapping, &NewElement, sizeof(NewElement), NULL);
- InsertHeadList(GET_LIST_HEAD(Mcb->Mapping), &Reinserted->Sequence);
- Mcb->PairCount++;
- }
- }