/* * PROJECT: Alcyone System Kernel * LICENSE: BSD Clause 3 * PURPOSE: Cache Controllerm, Cache Utility Handler. * NT KERNEL: 5.11.9360 * 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 CcCopyReadExceptionFilter( _In_ PEXCEPTION_POINTERS ExceptionInfo, _Out_ NTSTATUS* OutStatus) { NT_ASSERT(!NT_SUCCESS(*OutStatus)); return EXCEPTION_EXECUTE_HANDLER; } PBITMAP_RANGE NTAPI CcFindBitmapRangeToDirty( _In_ PMBCB Mbcb, _In_ LONGLONG InputPage, _Inout_ PULONG* PBITMAP) { return BitmapRangeManager::FindBitmapRangeToDirty(Mbcb, InputPage, pBitmap); } VOID NTAPI CcSetDirtyInMask( _In_ PSHARED_CACHE_MAP SharedMap, _In_ PLARGE_INTEGER FileOffset, _In_ ULONG Length) { NT_DBGBREAK("UNIMPLEMENTED\n"); } BOOLEAN NTAPI CcMapAndCopy( _In_ PSHARED_CACHE_MAP SharedMap, _In_ PVOID Buffer, _In_ PLARGE_INTEGER FileOffset, _In_ ULONG Length, _In_ ULONG CopyFlags, _In_ PFILE_OBJECT FileObject, _In_ PLARGE_INTEGER ValidDataLength, _In_ BOOLEAN Wait) { NT_DBGBREAK("UNIMPLEMENTED\n"); } /* EXTERNAL API FUNCTIONS */ BOOLEAN NTAPI CcCanIWrite( _In_ PFILE_OBJECT FileObject, _In_ ULONG BytesToWrite, _In_ BOOLEAN Wait, _In_ BOOLEAN IsRetrying) { NT_DBGBREAK("UNIMPLEMENTED\n"); } BOOLEAN NTAPI CcCopyRead( _In_ PFILE_OBJECT FileObject, _In_ PLARGE_INTEGER FileOffset, _In_ ULONG Length, _In_ BOOLEAN Wait, _Out_ PVOID Buffer, _Out_ IO_STATUS_BLOCK* OutIoStatus) { NT_DBGBREAK("UNIMPLEMENTED\n"); } BOOLEAN NTAPI CcCopyWrite( _In_ PFILE_OBJECT FileObject, _In_ PLARGE_INTEGER FileOffset, _In_ ULONG Length, _In_ BOOLEAN Wait, _In_ PVOID Buffer) { NT_DBGBREAK("UNIMPLEMENTED\n"); } VOID NTAPI CcDeferWrite(IN PFILE_OBJECT FileObject, IN PCC_POST_DEFERRED_WRITE PostRoutine, IN PVOID Context1, IN PVOID Context2, IN ULONG BytesToWrite, IN BOOLEAN Retrying) { NT_DBGBREAK("UNIMPLEMENTED\n"); } VOID NTAPI CcFastCopyRead( _In_ PFILE_OBJECT FileObject, _In_ ULONG FileOffset, _In_ ULONG Length, _In_ ULONG PageCount, _Out_ PVOID Buffer, _Out_ PIO_STATUS_BLOCK IoStatus) { NT_DBGBREAK("UNIMPLEMENTED\n"); } VOID NTAPI CcFastCopyWrite( _In_ PFILE_OBJECT FileObject, _In_ ULONG FileOffset, _In_ ULONG Length, _In_ PVOID InBuffer) { NT_DBGBREAK("UNIMPLEMENTED\n"); }