207 lines
4.3 KiB
C++
207 lines
4.3 KiB
C++
/*
|
|
* 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<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
|
|
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");
|
|
}
|
|
|
|
|
|
|