[NTOSKRNL:CC] Implemented CcFindBitmapRangeToDirty

This commit is contained in:
Dibyamartanda Samanta 2024-09-28 14:17:38 +02:00 committed by CodingWorkshop Signing Team
parent 955c88d858
commit 6a678794d3
Signed by: CodingWorkshop Signing Team
GPG Key ID: 6DC88369C82795D2

View File

@ -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<PBITMAP_RANGE>(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);
}