[NTOSKRNL:CC] Implemented CcFindBitmapRangeToDirty
This commit is contained in:
parent
955c88d858
commit
6a678794d3
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user