[NTOSKRNL:CC] Implemented CcFindBitmapRangeToDirty
This commit is contained in:
parent
955c88d858
commit
6a678794d3
@ -6,6 +6,72 @@
|
|||||||
* COPYRIGHT: 2023-2029 Dibymartanda Samanta <>
|
* 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 */
|
/* Internal Functions */
|
||||||
LONG
|
LONG
|
||||||
@ -27,7 +93,7 @@ CcFindBitmapRangeToDirty(
|
|||||||
_In_ LONGLONG InputPage,
|
_In_ LONGLONG InputPage,
|
||||||
_Inout_ PULONG* PBITMAP)
|
_Inout_ PULONG* PBITMAP)
|
||||||
{
|
{
|
||||||
NT_DBGBREAK("UNIMPLEMENTED\n");
|
return BitmapRangeManager::FindBitmapRangeToDirty(Mbcb, InputPage, pBitmap);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user