Sunc with trunk revision 58971.
[reactos.git] / ntoskrnl / fsrtl / largemcb.c
index ff6825b..0246b68 100644 (file)
 
 /* GLOBALS *******************************************************************/
 
-#define GET_LIST_HEAD(x) ((PLIST_ENTRY)(&((PRTL_GENERIC_TABLE)x)[1]))
-
 PAGED_LOOKASIDE_LIST FsRtlFirstMappingLookasideList;
 NPAGED_LOOKASIDE_LIST FsRtlFastMutexLookasideList;
 
 typedef struct _LARGE_MCB_MAPPING_ENTRY
 {
-       LARGE_INTEGER RunStartVbn;
-       LARGE_INTEGER SectorCount;
-       LARGE_INTEGER StartingLbn;
-       LIST_ENTRY Sequence;
+    LARGE_INTEGER RunStartVbn;
+    LARGE_INTEGER SectorCount;
+    LARGE_INTEGER StartingLbn;
+    LIST_ENTRY Sequence;
 } LARGE_MCB_MAPPING_ENTRY, *PLARGE_MCB_MAPPING_ENTRY;
 
+typedef struct _LARGE_MCB_MAPPING
+{
+    RTL_GENERIC_TABLE Table;
+    LIST_ENTRY SequenceList;
+} LARGE_MCB_MAPPING, *PLARGE_MCB_MAPPING;
+
+typedef struct _BASE_MCB_INTERNAL {
+    ULONG MaximumPairCount;
+    ULONG PairCount;
+    USHORT PoolType;
+    USHORT Flags;
+    PLARGE_MCB_MAPPING Mapping;
+} BASE_MCB_INTERNAL, *PBASE_MCB_INTERNAL;
+
+
 static PVOID NTAPI McbMappingAllocate(PRTL_GENERIC_TABLE Table, CLONG Bytes)
 {
-       PVOID Result;
-       PBASE_MCB Mcb = (PBASE_MCB)Table->TableContext;
-       Result = ExAllocatePoolWithTag(Mcb->PoolType, Bytes, 'LMCB');
-       DPRINT("McbMappingAllocate(%d) => %p\n", Bytes, Result);
-       return Result;
+    PVOID Result;
+    PBASE_MCB Mcb = (PBASE_MCB)Table->TableContext;
+    Result = ExAllocatePoolWithTag(Mcb->PoolType, Bytes, 'LMCB');
+    DPRINT("McbMappingAllocate(%d) => %p\n", Bytes, Result);
+    return Result;
 }
 
 static VOID NTAPI McbMappingFree(PRTL_GENERIC_TABLE Table, PVOID Buffer)
 {
-       DPRINT("McbMappingFree(%p)\n", Buffer);
-       ExFreePoolWithTag(Buffer, 'LMCB');
+    DPRINT("McbMappingFree(%p)\n", Buffer);
+    ExFreePoolWithTag(Buffer, 'LMCB');
 }
 
 static RTL_GENERIC_COMPARE_RESULTS NTAPI McbMappingCompare
 (RTL_GENERIC_TABLE Table, PVOID PtrA, PVOID PtrB)
 {
-       PLARGE_MCB_MAPPING_ENTRY A = PtrA, B = PtrB;
-       return 
-               (A->RunStartVbn.QuadPart + A->SectorCount.QuadPart <
-                B->RunStartVbn.QuadPart) ? GenericLessThan :
-               (A->RunStartVbn.QuadPart > 
-                B->RunStartVbn.QuadPart + B->SectorCount.QuadPart) ? 
-               GenericGreaterThan : GenericEqual;
+    PLARGE_MCB_MAPPING_ENTRY A = PtrA, B = PtrB;
+
+    return
+        (A->RunStartVbn.QuadPart + A->SectorCount.QuadPart < B->RunStartVbn.QuadPart) ? GenericLessThan :
+        (A->RunStartVbn.QuadPart > B->RunStartVbn.QuadPart + B->SectorCount.QuadPart) ? GenericGreaterThan : GenericEqual;
 }
 
 /* PUBLIC FUNCTIONS **********************************************************/
@@ -63,73 +74,70 @@ static RTL_GENERIC_COMPARE_RESULTS NTAPI McbMappingCompare
  */
 BOOLEAN
 NTAPI
-FsRtlAddBaseMcbEntry(IN PBASE_MCB Mcb,
+FsRtlAddBaseMcbEntry(IN PBASE_MCB OpaqueMcb,
                      IN LONGLONG Vbn,
                      IN LONGLONG Lbn,
                      IN LONGLONG SectorCount)
 {
-       LARGE_MCB_MAPPING_ENTRY Node;
-       PLARGE_MCB_MAPPING_ENTRY Existing = NULL;
-       BOOLEAN NewElement = FALSE;
-
-       Node.RunStartVbn.QuadPart = Vbn;
-       Node.StartingLbn.QuadPart = Lbn;
-       Node.SectorCount.QuadPart = SectorCount;
-
-       while (!NewElement)
-       {
-               DPRINT("Inserting %x:%x\n", Node.RunStartVbn.LowPart, Node.SectorCount.LowPart);
-               Existing = RtlInsertElementGenericTable
-                       (Mcb->Mapping, &Node, sizeof(Node), &NewElement);
-               DPRINT("Existing %x\n", Existing);
-               if (!Existing) break;
-
-               DPRINT("NewElement %d\n", NewElement);
-               if (!NewElement)
-               {
-                       // We merge the existing runs
-                       LARGE_INTEGER StartVbn, FinalVbn;
-                       DPRINT("Existing: %x:%x\n", 
-                                  Existing->RunStartVbn.LowPart, Node.SectorCount.LowPart);
-                       if (Existing->RunStartVbn.QuadPart < Node.RunStartVbn.QuadPart)
-                       {
-                               StartVbn = Existing->RunStartVbn;
-                               Node.StartingLbn = Existing->StartingLbn;
-                       }
-                       else
-                       {
-                               StartVbn = Node.RunStartVbn;
-                       }
-                       DPRINT("StartVbn %x\n", StartVbn.LowPart);
-                       if (Existing->RunStartVbn.QuadPart + Existing->SectorCount.QuadPart >
-                               Node.RunStartVbn.QuadPart + Node.SectorCount.QuadPart)
-                       {
-                               FinalVbn.QuadPart = 
-                                       Existing->RunStartVbn.QuadPart + Existing->SectorCount.QuadPart;
-                       }
-                       else
-                       {
-                               FinalVbn.QuadPart =
-                                       Node.RunStartVbn.QuadPart + Node.SectorCount.QuadPart;
-                       }
-                       DPRINT("FinalVbn %x\n", FinalVbn.LowPart);
-                       Node.RunStartVbn.QuadPart = StartVbn.QuadPart;
-                       Node.SectorCount.QuadPart = FinalVbn.QuadPart - StartVbn.QuadPart;
-                       RemoveHeadList(&Existing->Sequence);
-                       RtlDeleteElementGenericTable(Mcb->Mapping, Existing);
-                       Mcb->PairCount--;
-               }
-               else
-               {
-                       DPRINT("Mapping added %x\n", Existing);
-                       Mcb->MaximumPairCount++;
-                       Mcb->PairCount++;
-                       InsertHeadList(GET_LIST_HEAD(Mcb->Mapping), &Existing->Sequence);
-               }
-       }
-
-       DPRINT("!!Existing %d\n", !!Existing);
-       return !!Existing;
+    PBASE_MCB_INTERNAL Mcb = (PBASE_MCB_INTERNAL)OpaqueMcb;
+    LARGE_MCB_MAPPING_ENTRY Node;
+    PLARGE_MCB_MAPPING_ENTRY Existing = NULL;
+    BOOLEAN NewElement = FALSE;
+
+    Node.RunStartVbn.QuadPart = Vbn;
+    Node.StartingLbn.QuadPart = Lbn;
+    Node.SectorCount.QuadPart = SectorCount;
+
+    while (!NewElement)
+    {
+        DPRINT("Inserting %x:%x\n", Node.RunStartVbn.LowPart, Node.SectorCount.LowPart);
+        Existing = RtlInsertElementGenericTable(&Mcb->Mapping->Table, &Node, sizeof(Node), &NewElement);
+        DPRINT("Existing %x\n", Existing);
+        if (!Existing) break;
+
+        DPRINT("NewElement %d\n", NewElement);
+        if (!NewElement)
+        {
+            // We merge the existing runs
+            LARGE_INTEGER StartVbn, FinalVbn;
+            DPRINT("Existing: %x:%x\n", Existing->RunStartVbn.LowPart, Node.SectorCount.LowPart);
+            if (Existing->RunStartVbn.QuadPart < Node.RunStartVbn.QuadPart)
+            {
+                StartVbn = Existing->RunStartVbn;
+                Node.StartingLbn = Existing->StartingLbn;
+            }
+            else
+            {
+                StartVbn = Node.RunStartVbn;
+            }
+            DPRINT("StartVbn %x\n", StartVbn.LowPart);
+            if (Existing->RunStartVbn.QuadPart + Existing->SectorCount.QuadPart >
+                Node.RunStartVbn.QuadPart + Node.SectorCount.QuadPart)
+            {
+                FinalVbn.QuadPart = Existing->RunStartVbn.QuadPart + Existing->SectorCount.QuadPart;
+            }
+            else
+            {
+                FinalVbn.QuadPart = Node.RunStartVbn.QuadPart + Node.SectorCount.QuadPart;
+            }
+            DPRINT("FinalVbn %x\n", FinalVbn.LowPart);
+            Node.RunStartVbn.QuadPart = StartVbn.QuadPart;
+            Node.SectorCount.QuadPart = FinalVbn.QuadPart - StartVbn.QuadPart;
+            RemoveHeadList(&Existing->Sequence);
+            RtlDeleteElementGenericTable(&Mcb->Mapping->Table, Existing);
+            Mcb->PairCount--;
+        }
+        else
+        {
+            DPRINT("Mapping added %x\n", Existing);
+            Mcb->MaximumPairCount++;
+            Mcb->PairCount++;
+            InsertHeadList(&Mcb->Mapping->SequenceList, &Existing->Sequence);
+        }
+    }
+
+    DPRINT("!!Existing %d\n", !!Existing);
+    return !!Existing;
 }
 
 /*
@@ -144,7 +152,7 @@ FsRtlAddLargeMcbEntry(IN PLARGE_MCB Mcb,
 {
     BOOLEAN Result;
 
-       DPRINT("Mcb %x Vbn %x Lbn %x SectorCount %x\n", Mcb, Vbn, Lbn, SectorCount);
+    DPRINT("Mcb %x Vbn %x Lbn %x SectorCount %x\n", Mcb, Vbn, Lbn, SectorCount);
 
     KeAcquireGuardedMutex(Mcb->GuardedMutex);
     Result = FsRtlAddBaseMcbEntry(&(Mcb->BaseMcb),
@@ -153,7 +161,7 @@ FsRtlAddLargeMcbEntry(IN PLARGE_MCB Mcb,
                                   SectorCount);
     KeReleaseGuardedMutex(Mcb->GuardedMutex);
 
-       DPRINT("Done %d\n", Result);
+    DPRINT("Done %d\n", Result);
 
     return Result;
 }
@@ -163,32 +171,33 @@ FsRtlAddLargeMcbEntry(IN PLARGE_MCB Mcb,
  */
 BOOLEAN
 NTAPI
-FsRtlGetNextBaseMcbEntry(IN PBASE_MCB Mcb,
+FsRtlGetNextBaseMcbEntry(IN PBASE_MCB OpaqueMcb,
                          IN ULONG RunIndex,
                          OUT PLONGLONG Vbn,
                          OUT PLONGLONG Lbn,
                          OUT PLONGLONG SectorCount)
 {
-       ULONG i = 0;
-       BOOLEAN Result = FALSE;
-       PLARGE_MCB_MAPPING_ENTRY Entry;
-       for (Entry = (PLARGE_MCB_MAPPING_ENTRY)
-                        RtlEnumerateGenericTable(Mcb->Mapping, TRUE);
-                Entry && i < RunIndex;
-                Entry = (PLARGE_MCB_MAPPING_ENTRY)
-                        RtlEnumerateGenericTable(Mcb->Mapping, FALSE), i++);
-       if (Entry)
-       {
-               Result = TRUE;
-               if (Vbn)
-                       *Vbn = Entry->RunStartVbn.QuadPart;
-               if (Lbn)
-                       *Lbn = Entry->StartingLbn.QuadPart;
-               if (SectorCount)
-                       *SectorCount = Entry->SectorCount.QuadPart;
-       }
-
-       return Result;
+    PBASE_MCB_INTERNAL Mcb = (PBASE_MCB_INTERNAL)OpaqueMcb;
+    ULONG i = 0;
+    BOOLEAN Result = FALSE;
+    PLARGE_MCB_MAPPING_ENTRY Entry;
+
+    for (Entry = (PLARGE_MCB_MAPPING_ENTRY)RtlEnumerateGenericTable(&Mcb->Mapping->Table, TRUE);
+        Entry && (i < RunIndex);
+        Entry = (PLARGE_MCB_MAPPING_ENTRY)RtlEnumerateGenericTable(&Mcb->Mapping->Table, FALSE), i++);
+
+    if (Entry)
+    {
+        Result = TRUE;
+        if (Vbn)
+            *Vbn = Entry->RunStartVbn.QuadPart;
+        if (Lbn)
+            *Lbn = Entry->StartingLbn.QuadPart;
+        if (SectorCount)
+            *SectorCount = Entry->SectorCount.QuadPart;
+    }
+
+    return Result;
 }
 
 /*
@@ -204,7 +213,7 @@ FsRtlGetNextLargeMcbEntry(IN PLARGE_MCB Mcb,
 {
     BOOLEAN Result;
 
-       DPRINT("FsRtlGetNextLargeMcbEntry Mcb %x RunIndex %x\n", Mcb, RunIndex);
+    DPRINT("FsRtlGetNextLargeMcbEntry Mcb %x RunIndex %x\n", Mcb, RunIndex);
 
     KeAcquireGuardedMutex(Mcb->GuardedMutex);
     Result = FsRtlGetNextBaseMcbEntry(&(Mcb->BaseMcb),
@@ -214,7 +223,7 @@ FsRtlGetNextLargeMcbEntry(IN PLARGE_MCB Mcb,
                                       SectorCount);
     KeReleaseGuardedMutex(Mcb->GuardedMutex);
 
-       DPRINT("Done %d\n", Result);
+    DPRINT("Done %d\n", Result);
 
     return Result;
 }
@@ -224,9 +233,10 @@ FsRtlGetNextLargeMcbEntry(IN PLARGE_MCB Mcb,
  */
 VOID
 NTAPI
-FsRtlInitializeBaseMcb(IN PBASE_MCB Mcb,
+FsRtlInitializeBaseMcb(IN PBASE_MCB OpaqueMcb,
                        IN POOL_TYPE PoolType)
 {
+    PBASE_MCB_INTERNAL Mcb = (PBASE_MCB_INTERNAL)OpaqueMcb;
     Mcb->PairCount = 0;
 
     if (PoolType == PagedPool)
@@ -236,19 +246,18 @@ FsRtlInitializeBaseMcb(IN PBASE_MCB Mcb,
     else
     {
         Mcb->Mapping = ExAllocatePoolWithTag(PoolType | POOL_RAISE_IF_ALLOCATION_FAILURE,
-                                                                                        sizeof(RTL_GENERIC_TABLE) + sizeof(LIST_ENTRY),
+                                             sizeof(LARGE_MCB_MAPPING),
                                              'FSBC');
     }
 
     Mcb->PoolType = PoolType;
     Mcb->MaximumPairCount = MAXIMUM_PAIR_COUNT;
-       RtlInitializeGenericTable
-               (Mcb->Mapping,
-                (PRTL_GENERIC_COMPARE_ROUTINE)McbMappingCompare,
-                McbMappingAllocate,
-                McbMappingFree,
-                Mcb);
-       InitializeListHead(GET_LIST_HEAD(Mcb->Mapping));
+    RtlInitializeGenericTable(&Mcb->Mapping->Table,
+                              (PRTL_GENERIC_COMPARE_ROUTINE)McbMappingCompare,
+                              McbMappingAllocate,
+                              McbMappingFree,
+                              Mcb);
+    InitializeListHead(&Mcb->Mapping->SequenceList);
 }
 
 /*
@@ -288,7 +297,7 @@ FsRtlInitializeLargeMcbs(VOID)
                                    NULL,
                                    NULL,
                                    POOL_RAISE_IF_ALLOCATION_FAILURE,
-                                                                  sizeof(RTL_GENERIC_TABLE) + sizeof(LIST_ENTRY),
+                                   sizeof(LARGE_MCB_MAPPING),
                                    IFS_POOL_TAG,
                                    0); /* FIXME: Should be 4 */
 
@@ -307,7 +316,7 @@ FsRtlInitializeLargeMcbs(VOID)
  */
 BOOLEAN
 NTAPI
-FsRtlLookupBaseMcbEntry(IN PBASE_MCB Mcb,
+FsRtlLookupBaseMcbEntry(IN PBASE_MCB OpaqueMcb,
                         IN LONGLONG Vbn,
                         OUT PLONGLONG Lbn OPTIONAL,
                         OUT PLONGLONG SectorCountFromLbn OPTIONAL,
@@ -315,41 +324,44 @@ FsRtlLookupBaseMcbEntry(IN PBASE_MCB Mcb,
                         OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL,
                         OUT PULONG Index OPTIONAL)
 {
-       BOOLEAN Result = FALSE;
-       LARGE_MCB_MAPPING_ENTRY ToLookup;
-       PLARGE_MCB_MAPPING_ENTRY Entry;
-
-       ToLookup.RunStartVbn.QuadPart = Vbn;
-       ToLookup.SectorCount.QuadPart = 1;
-
-       Entry = RtlLookupElementGenericTable(Mcb->Mapping, &ToLookup);
-       if (!Entry)
-       {
-               // Find out if we have a following entry.  The spec says we should return
-               // found with Lbn == -1 when we're beneath the largest map.
-               ToLookup.SectorCount.QuadPart = (1ull<<62) - ToLookup.RunStartVbn.QuadPart;
-               Entry = RtlLookupElementGenericTable(Mcb->Mapping, &ToLookup);
-               if (Entry)
-               {
-                       Result = TRUE;
-                       if (Lbn) *Lbn = ~0ull;
-               }
-               else
-               {
-                       Result = FALSE;
-               }
-       }
-       else
-       {
-               LARGE_INTEGER Offset;
-               Offset.QuadPart = Vbn - Entry->RunStartVbn.QuadPart;
-               Result = TRUE;
-               if (Lbn) *Lbn = Entry->StartingLbn.QuadPart + Offset.QuadPart;
-               if (SectorCountFromLbn) *SectorCountFromLbn = Entry->SectorCount.QuadPart - Offset.QuadPart;
-               if (StartingLbn) *StartingLbn = Entry->StartingLbn.QuadPart;
-               if (SectorCountFromStartingLbn) *SectorCountFromStartingLbn = Entry->SectorCount.QuadPart;
-       }
-       
+    PBASE_MCB_INTERNAL Mcb = (PBASE_MCB_INTERNAL)OpaqueMcb;
+    BOOLEAN Result = FALSE;
+    LARGE_MCB_MAPPING_ENTRY ToLookup;
+    PLARGE_MCB_MAPPING_ENTRY Entry;
+
+    ToLookup.RunStartVbn.QuadPart = Vbn;
+    ToLookup.SectorCount.QuadPart = 1;
+
+    Entry = RtlLookupElementGenericTable(&Mcb->Mapping->Table, &ToLookup);
+    DPRINT("Entry %p\n", Entry);
+    if (!Entry)
+    {
+        // Find out if we have a following entry.  The spec says we should return
+        // found with Lbn == -1 when we're beneath the largest map.
+        ToLookup.SectorCount.QuadPart = (1ull<<62) - ToLookup.RunStartVbn.QuadPart;
+        Entry = RtlLookupElementGenericTable(&Mcb->Mapping->Table, &ToLookup);
+        DPRINT("Entry %p\n", Entry);
+        if (Entry)
+        {
+            Result = TRUE;
+            if (Lbn) *Lbn = ~0ull;
+        }
+        else
+        {
+            Result = FALSE;
+        }
+    }
+    else
+    {
+        LARGE_INTEGER Offset;
+        Offset.QuadPart = Vbn - Entry->RunStartVbn.QuadPart;
+        Result = TRUE;
+        if (Lbn) *Lbn = Entry->StartingLbn.QuadPart + Offset.QuadPart;
+        if (SectorCountFromLbn) *SectorCountFromLbn = Entry->SectorCount.QuadPart - Offset.QuadPart;
+        if (StartingLbn) *StartingLbn = Entry->StartingLbn.QuadPart;
+        if (SectorCountFromStartingLbn) *SectorCountFromStartingLbn = Entry->SectorCount.QuadPart;
+    }
+    DPRINT("Done\n");
     return Result;
 }
 
@@ -368,7 +380,7 @@ FsRtlLookupLargeMcbEntry(IN PLARGE_MCB Mcb,
 {
     BOOLEAN Result;
 
-       DPRINT("FsRtlLookupLargeMcbEntry Mcb %x Vbn %x\n", Mcb, (ULONG)Vbn);
+    DPRINT("FsRtlLookupLargeMcbEntry Mcb %x Vbn %x\n", Mcb, (ULONG)Vbn);
 
     KeAcquireGuardedMutex(Mcb->GuardedMutex);
     Result = FsRtlLookupBaseMcbEntry(&(Mcb->BaseMcb),
@@ -380,7 +392,7 @@ FsRtlLookupLargeMcbEntry(IN PLARGE_MCB Mcb,
                                      Index);
     KeReleaseGuardedMutex(Mcb->GuardedMutex);
 
-       DPRINT("Done %d\n", Result);
+    DPRINT("Done %d\n", Result);
 
     return Result;
 }
@@ -395,28 +407,29 @@ FsRtlLookupLastBaseMcbEntryAndIndex(IN PBASE_MCB OpaqueMcb,
                                     IN OUT PLONGLONG LargeLbn,
                                     IN OUT PULONG Index)
 {
-       ULONG i = 0;
-       BOOLEAN Result = FALSE;
-       PLIST_ENTRY ListEntry;
-       PLARGE_MCB_MAPPING_ENTRY Entry;
-       PLARGE_MCB_MAPPING_ENTRY CountEntry;
-
-       ListEntry = GET_LIST_HEAD(OpaqueMcb->Mapping);
-       if (!IsListEmpty(ListEntry))
-       {
-               Entry = CONTAINING_RECORD(ListEntry->Flink, LARGE_MCB_MAPPING_ENTRY, Sequence);
-               Result = TRUE;
-               *LargeVbn = Entry->RunStartVbn.QuadPart;
-               *LargeLbn = Entry->StartingLbn.QuadPart;
-
-               for (i = 0, CountEntry = RtlEnumerateGenericTable(OpaqueMcb->Mapping, TRUE);
-                        CountEntry != Entry;
-                        CountEntry = RtlEnumerateGenericTable(OpaqueMcb->Mapping, FALSE));
-
-               *Index = i;
-       }
-
-       return Result;
+    PBASE_MCB_INTERNAL Mcb = (PBASE_MCB_INTERNAL)OpaqueMcb;
+    ULONG i = 0;
+    BOOLEAN Result = FALSE;
+    PLIST_ENTRY ListEntry;
+    PLARGE_MCB_MAPPING_ENTRY Entry;
+    PLARGE_MCB_MAPPING_ENTRY CountEntry;
+
+    ListEntry = &Mcb->Mapping->SequenceList;
+    if (!IsListEmpty(ListEntry))
+    {
+        Entry = CONTAINING_RECORD(ListEntry->Flink, LARGE_MCB_MAPPING_ENTRY, Sequence);
+        Result = TRUE;
+        *LargeVbn = Entry->RunStartVbn.QuadPart;
+        *LargeLbn = Entry->StartingLbn.QuadPart;
+
+        for (i = 0, CountEntry = RtlEnumerateGenericTable(&Mcb->Mapping->Table, TRUE);
+            CountEntry != Entry;
+            CountEntry = RtlEnumerateGenericTable(&Mcb->Mapping->Table, FALSE));
+        DPRINT1("Most probably we are returning shit now\n");
+        *Index = i;
+    }
+
+    return Result;
 }
 
 /*
@@ -431,7 +444,7 @@ FsRtlLookupLastLargeMcbEntryAndIndex(IN PLARGE_MCB OpaqueMcb,
 {
     BOOLEAN Result;
 
-       DPRINT("FsRtlLookupLastLargeMcbEntryAndIndex %x\n", OpaqueMcb);
+    DPRINT("FsRtlLookupLastLargeMcbEntryAndIndex %x\n", OpaqueMcb);
 
     KeAcquireGuardedMutex(OpaqueMcb->GuardedMutex);
     Result = FsRtlLookupLastBaseMcbEntryAndIndex(&(OpaqueMcb->BaseMcb),
@@ -440,7 +453,7 @@ FsRtlLookupLastLargeMcbEntryAndIndex(IN PLARGE_MCB OpaqueMcb,
                                                  Index);
     KeReleaseGuardedMutex(OpaqueMcb->GuardedMutex);
 
-       DPRINT("Done %d\n", Result);
+    DPRINT("Done %d\n", Result);
 
     return Result;
 }
@@ -450,24 +463,25 @@ FsRtlLookupLastLargeMcbEntryAndIndex(IN PLARGE_MCB OpaqueMcb,
  */
 BOOLEAN
 NTAPI
-FsRtlLookupLastBaseMcbEntry(IN PBASE_MCB Mcb,
+FsRtlLookupLastBaseMcbEntry(IN PBASE_MCB OpaqueMcb,
                             OUT PLONGLONG Vbn,
                             OUT PLONGLONG Lbn)
 {
-       BOOLEAN Result = FALSE;
-       PLIST_ENTRY ListEntry;
-       PLARGE_MCB_MAPPING_ENTRY Entry;
-
-       ListEntry = GET_LIST_HEAD(Mcb->Mapping);
-       if (!IsListEmpty(ListEntry))
-       {
-               Entry = CONTAINING_RECORD(ListEntry->Flink, LARGE_MCB_MAPPING_ENTRY, Sequence);
-               Result = TRUE;
-               *Vbn = Entry->RunStartVbn.QuadPart;
-               *Lbn = Entry->StartingLbn.QuadPart;
-       }
-       
-       return Result;
+    PBASE_MCB_INTERNAL Mcb = (PBASE_MCB_INTERNAL)OpaqueMcb;
+    BOOLEAN Result = FALSE;
+    PLIST_ENTRY ListEntry;
+    PLARGE_MCB_MAPPING_ENTRY Entry;
+
+    ListEntry = &Mcb->Mapping->SequenceList;
+    if (!IsListEmpty(ListEntry))
+    {
+        Entry = CONTAINING_RECORD(ListEntry->Flink, LARGE_MCB_MAPPING_ENTRY, Sequence);
+        Result = TRUE;
+        *Vbn = Entry->RunStartVbn.QuadPart;
+        *Lbn = Entry->StartingLbn.QuadPart;
+    }
+
+    return Result;
 }
 
 /*
@@ -481,7 +495,7 @@ FsRtlLookupLastLargeMcbEntry(IN PLARGE_MCB Mcb,
 {
     BOOLEAN Result;
 
-       DPRINT("FsRtlLookupLastLargeMcbEntry Mcb %x\n", Mcb);
+    DPRINT("FsRtlLookupLastLargeMcbEntry Mcb %x\n", Mcb);
 
     KeAcquireGuardedMutex(Mcb->GuardedMutex);
     Result = FsRtlLookupLastBaseMcbEntry(&(Mcb->BaseMcb),
@@ -489,7 +503,7 @@ FsRtlLookupLastLargeMcbEntry(IN PLARGE_MCB Mcb,
                                          Lbn);
     KeReleaseGuardedMutex(Mcb->GuardedMutex);
 
-       DPRINT("Done %d\n", Result);
+    DPRINT("Done %d\n", Result);
 
     return Result;
 }
@@ -514,14 +528,14 @@ FsRtlNumberOfRunsInLargeMcb(IN PLARGE_MCB Mcb)
 {
     ULONG NumberOfRuns;
 
-       DPRINT("FsRtlNumberOfRunsInLargeMcb Mcb %x\n", Mcb);
+    DPRINT("FsRtlNumberOfRunsInLargeMcb Mcb %x\n", Mcb);
 
     /* Read the number of runs while holding the MCB lock */
     KeAcquireGuardedMutex(Mcb->GuardedMutex);
     NumberOfRuns = Mcb->BaseMcb.PairCount;
     KeReleaseGuardedMutex(Mcb->GuardedMutex);
 
-       DPRINT("Done %d\n", NumberOfRuns);
+    DPRINT("Done %d\n", NumberOfRuns);
 
     /* Return the count */
     return NumberOfRuns;
@@ -532,94 +546,86 @@ FsRtlNumberOfRunsInLargeMcb(IN PLARGE_MCB Mcb)
  */
 BOOLEAN
 NTAPI
-FsRtlRemoveBaseMcbEntry(IN PBASE_MCB Mcb,
+FsRtlRemoveBaseMcbEntry(IN PBASE_MCB OpaqueMcb,
                         IN LONGLONG Vbn,
                         IN LONGLONG SectorCount)
 {
-       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++;                       
-               }
-       }
-
-       return TRUE;
+    PBASE_MCB_INTERNAL Mcb = (PBASE_MCB_INTERNAL)OpaqueMcb;
+    LARGE_MCB_MAPPING_ENTRY Node;
+    LARGE_MCB_MAPPING_ENTRY NewElement;
+    PLARGE_MCB_MAPPING_ENTRY Element;
+    PLARGE_MCB_MAPPING_ENTRY Reinserted, Inserted;
+    LARGE_INTEGER StartHole, EndHole, EndRun;
+
+    Node.RunStartVbn.QuadPart = Vbn;
+    Node.SectorCount.QuadPart = SectorCount;
+
+    while ((Element = RtlLookupElementGenericTable(&Mcb->Mapping->Table, &Node)))
+    {
+        DPRINT1("Node.RunStartVbn %I64d, Node.SectorCount %I64d\n", Node.RunStartVbn.QuadPart, Node.SectorCount.QuadPart);
+        DPRINT1("Element %p, .RunStartVbn %I64d, .SectorCount %I64d\n", Element, Element->RunStartVbn.QuadPart, Element->SectorCount.QuadPart);
+        // Must split
+        if (Element->RunStartVbn.QuadPart < Node.RunStartVbn.QuadPart &&
+            Element->SectorCount.QuadPart > Node.SectorCount.QuadPart)
+        {
+            LARGE_MCB_MAPPING_ENTRY Upper, Reinsert;
+            StartHole = Node.RunStartVbn;
+            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->Table, Element);
+            Mcb->PairCount--;
+
+            Reinserted = RtlInsertElementGenericTable(&Mcb->Mapping->Table, &Reinsert, sizeof(Reinsert), NULL);
+            InsertHeadList(&Mcb->Mapping->SequenceList, &Reinserted->Sequence);
+            Mcb->PairCount++;
+
+            Inserted = RtlInsertElementGenericTable(&Mcb->Mapping->Table, &Upper, sizeof(Upper), NULL);
+            InsertHeadList(&Mcb->Mapping->SequenceList, &Inserted->Sequence);
+            Mcb->PairCount++;
+        }
+        else if (Element->RunStartVbn.QuadPart < Node.RunStartVbn.QuadPart)
+        {
+            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->Table, Element);
+            Mcb->PairCount--;
+
+            Reinserted = RtlInsertElementGenericTable(&Mcb->Mapping->Table, &NewElement, sizeof(NewElement), NULL);
+            InsertHeadList(&Mcb->Mapping->SequenceList, &Reinserted->Sequence);
+            Mcb->PairCount++;
+        }
+        else
+        {
+            EndHole = Element->RunStartVbn;
+            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->Table, Element);
+            Mcb->PairCount--;
+
+            Reinserted = RtlInsertElementGenericTable(&Mcb->Mapping->Table, &NewElement, sizeof(NewElement), NULL);
+            InsertHeadList(&Mcb->Mapping->SequenceList, &Reinserted->Sequence);
+            Mcb->PairCount++;
+
+            DPRINT1("Reinserted %p, .RunStartVbn %I64d, .SectorCount %I64d\n", Reinserted, Reinserted->RunStartVbn.QuadPart, Reinserted->SectorCount.QuadPart);
+            DPRINT1("NewElement .RunStartVbn %I64d, .SectorCount %I64d\n", NewElement.RunStartVbn.QuadPart, NewElement.SectorCount.QuadPart);
+        }
+    }
+
+    return TRUE;
 }
 
 /*
@@ -631,15 +637,13 @@ FsRtlRemoveLargeMcbEntry(IN PLARGE_MCB Mcb,
                          IN LONGLONG Vbn,
                          IN LONGLONG SectorCount)
 {
-       DPRINT("FsRtlRemoveLargeMcbEntry Mcb %x, Vbn %x, SectorCount %x\n", Mcb, (ULONG)Vbn, (ULONG)SectorCount);
+    DPRINT("FsRtlRemoveLargeMcbEntry Mcb %x, Vbn %I64d, SectorCount %I64d\n", Mcb, (ULONG)Vbn, (ULONG)SectorCount);
 
     KeAcquireGuardedMutex(Mcb->GuardedMutex);
-    FsRtlRemoveBaseMcbEntry(&(Mcb->BaseMcb),
-                            Vbn,
-                            SectorCount);
+    FsRtlRemoveBaseMcbEntry(&(Mcb->BaseMcb), Vbn, SectorCount);
     KeReleaseGuardedMutex(Mcb->GuardedMutex);
 
-       DPRINT("Done\n");
+    DPRINT("Done\n");
 }
 
 /*
@@ -647,18 +651,19 @@ FsRtlRemoveLargeMcbEntry(IN PLARGE_MCB Mcb,
  */
 VOID
 NTAPI
-FsRtlResetBaseMcb(IN PBASE_MCB Mcb)
+FsRtlResetBaseMcb(IN PBASE_MCB OpaqueMcb)
 {
-       PLARGE_MCB_MAPPING_ENTRY Element;
+    PBASE_MCB_INTERNAL Mcb = (PBASE_MCB_INTERNAL)OpaqueMcb;
+    PLARGE_MCB_MAPPING_ENTRY Element;
 
-       while (RtlNumberGenericTableElements(Mcb->Mapping) &&
-                  (Element = (PLARGE_MCB_MAPPING_ENTRY)RtlGetElementGenericTable(Mcb->Mapping, 0)))
-       {
-               RtlDeleteElementGenericTable(Mcb->Mapping, Element);
-       }
+    while (RtlNumberGenericTableElements(&Mcb->Mapping->Table) &&
+           (Element = (PLARGE_MCB_MAPPING_ENTRY)RtlGetElementGenericTable(&Mcb->Mapping->Table, 0)))
+    {
+        RtlDeleteElementGenericTable(&Mcb->Mapping->Table, Element);
+    }
 
-       Mcb->PairCount = 0;
-       Mcb->MaximumPairCount = 0;
+    Mcb->PairCount = 0;
+    Mcb->MaximumPairCount = 0;
 }
 
 /*
@@ -670,52 +675,49 @@ FsRtlResetLargeMcb(IN PLARGE_MCB Mcb,
                    IN BOOLEAN SelfSynchronized)
 {
     if (!SelfSynchronized)
-    {
         KeAcquireGuardedMutex(Mcb->GuardedMutex);
-       }
-
-       FsRtlResetBaseMcb(&Mcb->BaseMcb);
 
+    FsRtlResetBaseMcb(&Mcb->BaseMcb);
 
     if (!SelfSynchronized)
-    {
-               KeReleaseGuardedMutex(Mcb->GuardedMutex);
-    }
+        KeReleaseGuardedMutex(Mcb->GuardedMutex);
 }
 
 #define MCB_BUMP_NO_MORE 0
 #define MCB_BUMP_AGAIN   1
 
-static ULONG NTAPI McbBump(PBASE_MCB Mcb, PLARGE_MCB_MAPPING_ENTRY FixedPart)
+static ULONG NTAPI McbBump(PBASE_MCB_INTERNAL Mcb, PLARGE_MCB_MAPPING_ENTRY FixedPart)
 {
-       LARGE_MCB_MAPPING_ENTRY Reimagined;
-       PLARGE_MCB_MAPPING_ENTRY Found = NULL;
-
-       DPRINT("McbBump %x (%x:%x)\n", Mcb, FixedPart->RunStartVbn.LowPart, FixedPart->SectorCount.LowPart);
-
-       Reimagined = *FixedPart;
-       while ((Found = RtlLookupElementGenericTable(Mcb->Mapping, &Reimagined)))
-       {
-               Reimagined = *Found;
-               Reimagined.RunStartVbn.QuadPart = 
-                       FixedPart->RunStartVbn.QuadPart + FixedPart->SectorCount.QuadPart;
-               DPRINT("Reimagined %x\n", Reimagined.RunStartVbn.LowPart);
-       }
-
-       DPRINT("Found %x\n", Found);
-       if (!Found) return MCB_BUMP_NO_MORE;
-       DPRINT1
-               ("Moving %x-%x to %x because %x-%x overlaps\n",
-                Found->RunStartVbn.LowPart, 
-                Found->RunStartVbn.LowPart + Found->SectorCount.QuadPart,
-                Reimagined.RunStartVbn.LowPart + Reimagined.SectorCount.LowPart,
-                Reimagined.RunStartVbn.LowPart,
-                Reimagined.RunStartVbn.LowPart + Reimagined.SectorCount.LowPart);
-       Found->RunStartVbn.QuadPart = Reimagined.RunStartVbn.QuadPart + Reimagined.SectorCount.QuadPart;
-       Found->StartingLbn.QuadPart = Reimagined.StartingLbn.QuadPart + Reimagined.SectorCount.QuadPart;
-
-       DPRINT("Again\n");
-       return MCB_BUMP_AGAIN;
+    LARGE_MCB_MAPPING_ENTRY Reimagined;
+    PLARGE_MCB_MAPPING_ENTRY Found = NULL;
+
+    DPRINT("McbBump %x (%x:%x)\n", Mcb, FixedPart->RunStartVbn.LowPart, FixedPart->SectorCount.LowPart);
+
+    Reimagined = *FixedPart;
+    while ((Found = RtlLookupElementGenericTable(&Mcb->Mapping->Table, &Reimagined)))
+    {
+        Reimagined = *Found;
+        Reimagined.RunStartVbn.QuadPart = 
+            FixedPart->RunStartVbn.QuadPart + FixedPart->SectorCount.QuadPart;
+        DPRINT("Reimagined %x\n", Reimagined.RunStartVbn.LowPart);
+    }
+
+    DPRINT("Found %x\n", Found);
+    if (!Found) return MCB_BUMP_NO_MORE;
+
+    DPRINT1
+        ("Moving %x-%x to %x because %x-%x overlaps\n",
+        Found->RunStartVbn.LowPart, 
+        Found->RunStartVbn.LowPart + Found->SectorCount.QuadPart,
+        Reimagined.RunStartVbn.LowPart + Reimagined.SectorCount.LowPart,
+        Reimagined.RunStartVbn.LowPart,
+        Reimagined.RunStartVbn.LowPart + Reimagined.SectorCount.LowPart);
+
+    Found->RunStartVbn.QuadPart = Reimagined.RunStartVbn.QuadPart + Reimagined.SectorCount.QuadPart;
+    Found->StartingLbn.QuadPart = Reimagined.StartingLbn.QuadPart + Reimagined.SectorCount.QuadPart;
+
+    DPRINT("Again\n");
+    return MCB_BUMP_AGAIN;
 }
 
 /*
@@ -723,77 +725,77 @@ static ULONG NTAPI McbBump(PBASE_MCB Mcb, PLARGE_MCB_MAPPING_ENTRY FixedPart)
  */
 BOOLEAN
 NTAPI
-FsRtlSplitBaseMcb(IN PBASE_MCB Mcb,
+FsRtlSplitBaseMcb(IN PBASE_MCB OpaqueMcb,
                   IN LONGLONG Vbn,
                   IN LONGLONG Amount)
 {
-       ULONG Result;
-       LARGE_MCB_MAPPING_ENTRY Node;
-       PLARGE_MCB_MAPPING_ENTRY Existing = NULL;
-
-       Node.RunStartVbn.QuadPart = Vbn;
-       Node.SectorCount.QuadPart = 0;
-       
-       Existing = RtlLookupElementGenericTable(Mcb->Mapping, &Node);
-
-       if (Existing)
-       {
-               // We're in the middle of a run
-               LARGE_MCB_MAPPING_ENTRY UpperPart;
-               LARGE_MCB_MAPPING_ENTRY LowerPart;
-               PLARGE_MCB_MAPPING_ENTRY InsertedUpper;
-
-               UpperPart.RunStartVbn.QuadPart = Node.RunStartVbn.QuadPart + Amount;
-               UpperPart.SectorCount.QuadPart = Existing->RunStartVbn.QuadPart + 
-                       (Existing->SectorCount.QuadPart - Node.RunStartVbn.QuadPart);
-               UpperPart.StartingLbn.QuadPart = Existing->StartingLbn.QuadPart + 
-                       (Node.RunStartVbn.QuadPart - Existing->RunStartVbn.QuadPart);
-               LowerPart.RunStartVbn.QuadPart = Existing->RunStartVbn.QuadPart;
-               LowerPart.SectorCount.QuadPart = Node.RunStartVbn.QuadPart - Existing->RunStartVbn.QuadPart;
-               LowerPart.StartingLbn.QuadPart = Existing->StartingLbn.QuadPart;
-               
-               Node = UpperPart;
-
-               DPRINT("Loop: %x\n", Node.RunStartVbn.LowPart);
-               while ((Result = McbBump(Mcb, &Node)) == MCB_BUMP_AGAIN)
-               {
-                       DPRINT("Node: %x\n", Node.RunStartVbn.LowPart);
-               }
-               DPRINT("Done\n");
-
-               if (Result == MCB_BUMP_NO_MORE)
-               {
-                       Node = *Existing;
-                       RemoveHeadList(&Existing->Sequence);
-                       RtlDeleteElementGenericTable(Mcb->Mapping, Existing);
-                       Mcb->PairCount--;
-                       
-                       // Adjust the element we found.
-                       Existing->SectorCount = LowerPart.SectorCount;
-
-                       InsertedUpper = RtlInsertElementGenericTable
-                               (Mcb->Mapping, &UpperPart, sizeof(UpperPart), NULL);
-                       if (!InsertedUpper)
-                       {
-                               // Just make it like it was
-                               Existing->SectorCount = Node.SectorCount;
-                               return FALSE;
-                       }
-                       InsertHeadList(GET_LIST_HEAD(Mcb->Mapping), &InsertedUpper->Sequence);
-                       Mcb->PairCount++;
-               }
-               else
-               {
-                       Node.RunStartVbn.QuadPart = Vbn;
-                       Node.SectorCount.QuadPart = Amount;
-                       while ((Result = McbBump(Mcb, &Node)) == MCB_BUMP_AGAIN);
-                       return Result == MCB_BUMP_NO_MORE;
-               }
-       }
-
-       DPRINT("Done\n");
-       
-       return TRUE;
+    PBASE_MCB_INTERNAL Mcb = (PBASE_MCB_INTERNAL)OpaqueMcb;
+    ULONG Result;
+    LARGE_MCB_MAPPING_ENTRY Node;
+    PLARGE_MCB_MAPPING_ENTRY Existing = NULL;
+
+    Node.RunStartVbn.QuadPart = Vbn;
+    Node.SectorCount.QuadPart = 0;
+
+    Existing = RtlLookupElementGenericTable(&Mcb->Mapping->Table, &Node);
+
+    if (Existing)
+    {
+        // We're in the middle of a run
+        LARGE_MCB_MAPPING_ENTRY UpperPart;
+        LARGE_MCB_MAPPING_ENTRY LowerPart;
+        PLARGE_MCB_MAPPING_ENTRY InsertedUpper;
+
+        UpperPart.RunStartVbn.QuadPart = Node.RunStartVbn.QuadPart + Amount;
+        UpperPart.SectorCount.QuadPart = Existing->RunStartVbn.QuadPart + 
+            (Existing->SectorCount.QuadPart - Node.RunStartVbn.QuadPart);
+        UpperPart.StartingLbn.QuadPart = Existing->StartingLbn.QuadPart + 
+            (Node.RunStartVbn.QuadPart - Existing->RunStartVbn.QuadPart);
+        LowerPart.RunStartVbn.QuadPart = Existing->RunStartVbn.QuadPart;
+        LowerPart.SectorCount.QuadPart = Node.RunStartVbn.QuadPart - Existing->RunStartVbn.QuadPart;
+        LowerPart.StartingLbn.QuadPart = Existing->StartingLbn.QuadPart;
+
+        Node = UpperPart;
+
+        DPRINT("Loop: %x\n", Node.RunStartVbn.LowPart);
+        while ((Result = McbBump(Mcb, &Node)) == MCB_BUMP_AGAIN)
+        {
+            DPRINT("Node: %x\n", Node.RunStartVbn.LowPart);
+        }
+        DPRINT("Done\n");
+
+        if (Result == MCB_BUMP_NO_MORE)
+        {
+            Node = *Existing;
+            RemoveHeadList(&Existing->Sequence);
+            RtlDeleteElementGenericTable(&Mcb->Mapping->Table, Existing);
+            Mcb->PairCount--;
+
+            // Adjust the element we found.
+            Existing->SectorCount = LowerPart.SectorCount;
+
+            InsertedUpper = RtlInsertElementGenericTable(&Mcb->Mapping->Table, &UpperPart, sizeof(UpperPart), NULL);
+            if (!InsertedUpper)
+            {
+                // Just make it like it was
+                Existing->SectorCount = Node.SectorCount;
+                return FALSE;
+            }
+            InsertHeadList(&Mcb->Mapping->SequenceList, &InsertedUpper->Sequence);
+            Mcb->PairCount++;
+        }
+        else
+        {
+            Node.RunStartVbn.QuadPart = Vbn;
+            Node.SectorCount.QuadPart = Amount;
+            while ((Result = McbBump(Mcb, &Node)) == MCB_BUMP_AGAIN);
+            return Result == MCB_BUMP_NO_MORE;
+        }
+    }
+
+    DPRINT("Done\n");
+
+    return TRUE;
 }
 
 /*
@@ -807,7 +809,7 @@ FsRtlSplitLargeMcb(IN PLARGE_MCB Mcb,
 {
     BOOLEAN Result;
 
-       DPRINT("FsRtlSplitLargeMcb %x, Vbn %x, Amount %x\n", Mcb, (ULONG)Vbn, (ULONG)Amount);
+    DPRINT("FsRtlSplitLargeMcb %x, Vbn %x, Amount %x\n", Mcb, (ULONG)Vbn, (ULONG)Amount);
 
     KeAcquireGuardedMutex(Mcb->GuardedMutex);
     Result = FsRtlSplitBaseMcb(&(Mcb->BaseMcb),
@@ -815,7 +817,7 @@ FsRtlSplitLargeMcb(IN PLARGE_MCB Mcb,
                                Amount);
     KeReleaseGuardedMutex(Mcb->GuardedMutex);
 
-       DPRINT("Done %d\n", Result);
+    DPRINT("Done %d\n", Result);
 
     return Result;
 }
@@ -825,26 +827,27 @@ FsRtlSplitLargeMcb(IN PLARGE_MCB Mcb,
  */
 VOID
 NTAPI
-FsRtlTruncateBaseMcb(IN PBASE_MCB Mcb,
+FsRtlTruncateBaseMcb(IN PBASE_MCB OpaqueMcb,
                      IN LONGLONG Vbn)
 {
-       if (!Vbn)
-       {
-               FsRtlResetBaseMcb(Mcb);
-       }
-       else
-       {
-               LARGE_MCB_MAPPING_ENTRY Truncate;
-               PLARGE_MCB_MAPPING_ENTRY Found;
-               Truncate.RunStartVbn.QuadPart = Vbn;
-               Truncate.SectorCount.QuadPart = (1ull<<62) - Truncate.RunStartVbn.QuadPart;
-               while ((Found = RtlLookupElementGenericTable(Mcb->Mapping, &Truncate)))
-               {
-                       RemoveEntryList(&Found->Sequence);
-                       RtlDeleteElementGenericTable(Mcb->Mapping, Found);
-                       Mcb->PairCount--;
-               }
-       }
+    PBASE_MCB_INTERNAL Mcb = (PBASE_MCB_INTERNAL)OpaqueMcb;
+    if (!Vbn)
+    {
+        FsRtlResetBaseMcb(OpaqueMcb);
+    }
+    else
+    {
+        LARGE_MCB_MAPPING_ENTRY Truncate;
+        PLARGE_MCB_MAPPING_ENTRY Found;
+        Truncate.RunStartVbn.QuadPart = Vbn;
+        Truncate.SectorCount.QuadPart = (1ull<<62) - Truncate.RunStartVbn.QuadPart;
+        while ((Found = RtlLookupElementGenericTable(&Mcb->Mapping->Table, &Truncate)))
+        {
+            RemoveEntryList(&Found->Sequence);
+            RtlDeleteElementGenericTable(&Mcb->Mapping->Table, Found);
+            Mcb->PairCount--;
+        }
+    }
 }
 
 /*
@@ -855,12 +858,11 @@ NTAPI
 FsRtlTruncateLargeMcb(IN PLARGE_MCB Mcb,
                       IN LONGLONG Vbn)
 {
-       DPRINT("FsRtlTruncateLargeMcb %x Vbn %x\n", Mcb, (ULONG)Vbn);
+    DPRINT("FsRtlTruncateLargeMcb %x Vbn %x\n", Mcb, (ULONG)Vbn);
     KeAcquireGuardedMutex(Mcb->GuardedMutex);
-    FsRtlTruncateBaseMcb(&(Mcb->BaseMcb),
-                         Vbn);
+    FsRtlTruncateBaseMcb(&(Mcb->BaseMcb), Vbn);
     KeReleaseGuardedMutex(Mcb->GuardedMutex);
-       DPRINT("Done\n");
+    DPRINT("Done\n");
 }
 
 /*
@@ -870,7 +872,7 @@ VOID
 NTAPI
 FsRtlUninitializeBaseMcb(IN PBASE_MCB Mcb)
 {
-       FsRtlResetBaseMcb(Mcb);
+    FsRtlResetBaseMcb(Mcb);
 
     if ((Mcb->PoolType == PagedPool) && (Mcb->MaximumPairCount == MAXIMUM_PAIR_COUNT))
     {
@@ -897,4 +899,3 @@ FsRtlUninitializeLargeMcb(IN PLARGE_MCB Mcb)
         FsRtlUninitializeBaseMcb(&(Mcb->BaseMcb));
     }
 }
-