diff --git a/NTOSKRNL/CC/ccutil.cpp b/NTOSKRNL/CC/ccutil.cpp index e48bf78..335a013 100644 --- a/NTOSKRNL/CC/ccutil.cpp +++ b/NTOSKRNL/CC/ccutil.cpp @@ -6,6 +6,72 @@ * COPYRIGHT: 2023-2029 Dibymartanda Samanta <> */ +class BitmapRangeManager { +private: +static constexpr LONGLONG CalculateBasePage(LONGLONG InputPage) { + return (InputPage & ~(0x1000 - 1)); + } +public: + static PBITMAP_RANGE FindBitmapRangeToDirty(PMBCB Mbcb, LONGLONG InputPage, PULONG* pBitmap) { + PBITMAP_RANGE CurrentRange = nullptr; + PBITMAP_RANGE NewRange = nullptr; + PLIST_ENTRY HeadList = nullptr; + LONGLONG BasePage = {0}; + + + HeadList = &Mbcb->BitmapRanges; + BasePage = CalculateBasePage(InputPage); + + CurrentRange = CONTAINING_RECORD(Mbcb->BitmapRanges.Flink, BITMAP_RANGE, Links); + + while(true){ + if (BasePage == CurrentRange->BasePage) + return CurrentRange; + + if (CurrentRange->DirtyPages || NewRange) { + if (BasePage > CurrentRange->BasePage) + HeadList = &CurrentRange->Links; + } + else { + NewRange = CurrentRange; + } + + if (CurrentRange->Links.Flink == &Mbcb->BitmapRanges) + break; + + CurrentRange = CONTAINING_RECORD(CurrentRange->Links.Flink, BITMAP_RANGE, Links); + + if (CurrentRange->BasePage > BasePage && NewRange) + break; + } + + if (NewRange) { + RemoveEntryList(&NewRange->Links); + } + else { + NewRange = reinterpret_cast(ExAllocatePoolWithTag(NonPagedPool, sizeof(*NewRange), 'rBcC')); + if (!NewRange) { + return nullptr; + } + + RtlZeroMemory(NewRange, sizeof(*NewRange)); + } + + InsertHeadList(HeadList, &NewRange->Links); + + NewRange->BasePage = BasePage; + NewRange->FirstDirtyPage = 0xFFFFFFFF; + NewRange->LastDirtyPage = 0; + + if (!NewRange->Bitmap) { + + NewRange->Bitmap = *pBitmap; + *pBitmap = nullptr; + } + + return NewRange; + } +}; /* Internal Functions */ LONG @@ -27,7 +93,7 @@ CcFindBitmapRangeToDirty( _In_ LONGLONG InputPage, _Inout_ PULONG* PBITMAP) { - NT_DBGBREAK("UNIMPLEMENTED\n"); + return BitmapRangeManager::FindBitmapRangeToDirty(Mbcb, InputPage, pBitmap); }