/* * PROJECT: Alcyone System Kernel * LICENSE: BSD Clause 3 * PURPOSE: Cache Controller:: Lazy Writer * NT KERNEL: 5.11.9360 * COPYRIGHT: 2023-2029 Dibymartanda Samanta <> */ #include #define NTDEBUG #include #include "ccinternal.hpp" extern "C" /*Internal Function*/ BOOLEAN NTAPI CcPinFileData( _In_ PFILE_OBJECT FileObject, _In_ PLARGE_INTEGER FileOffset, _In_ ULONG Length, _In_ BOOLEAN IsNoWrite, _In_ BOOLEAN Flags, _In_ ULONG PinFlags, _Out_ PCC_BCB* Bcb, _Out_ PVOID* Buffer, _Out_ LARGE_INTEGER* BeyondLastByte) { // Unimplemented } BOOLEAN NTAPI CcMapDataCommon( _In_ PFILE_OBJECT FileObject, _In_ PLARGE_INTEGER FileOffset, _In_ ULONG Length, _In_ ULONG Flags, _Out_ PVOID *Bcb, _Out_ PVOID *Buffer ) { if (Flags & FILE_PIN_SEQUENTIAL_READ) InterlockedIncrement(&CcSequentialReadCount); else InterlockedIncrement(&CcRandomReadCount); KeGetCurrentThread()->WaitIrql = PASSIVE_LEVEL; if (Flags & FILE_PIN_SEQUENTIAL_READ) { *Buffer = CcGetVirtualAddress(SharedMap, *FileOffset, (PVACB *)&Bcb, &ReceivedLength); return TRUE; } else { LARGE_INTEGER BeyondLastByte; if (CcPinFileData(FileObject, FileOffset, Length, TRUE, 0, Flags, Bcb, Buffer, &BeyondLastByte)) { return TRUE; } else { InterlockedIncrement(&CCFailedPinReadCount); return FALSE; } } } } VOID NTAPI CcUnpinFileDataEx( _In_ PCC_BCB Bcb, _In_ BOOLEAN WriteStatus, _In_ ULONG Type) { // Unimplementd } BOOLEAN VECTORCALL CcPinFileData( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN IsReadOnly, IN BOOLEAN IsWriteOnly, IN ULONG Flags, OUT PCC_BCB *Bcb, OUT PVOID *BaseAddress, OUT PLARGE_INTEGER BeyondLastByte) { // Unimplemented } BOOLEAN NTAPI CcMapData( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, OUT PVOID *Bcb, OUT PVOID *Buffer) { //Unimplemented } BOOLEAN FASTCALL CcMapDataCommon( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, OUT PVOID *Bcb, OUT PVOID *Buffer) { //Unimplemented } BOOLEAN NTAPI CcPinMappedData( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, IN OUT PCC_BCB Bcb) { //Unimplemented } BOOLEAN NTAPI CcPinRead( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, OUT PVOID *Bcb, OUT PVOID *Buffer) { //Unimplemented } BOOLEAN NTAPI CcPreparePinWrite( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Zero, IN ULONG Flags, OUT PVOID *Bcb, OUT PVOID *Buffer) { //Unimplemented } VOID NTAPI CcSetBcbOwnerPointer( IN PMBCB Bcb, IN PVOID OwnerPointer) { //Unimimplemented } VOID NTAPI CcUnpinData( _In_ PVOID BcbPtr) { PCC_BCB Bcb = reinterpret_cast(BcbPtr); BOOLEAN WRITE_FLAG = NULL; if (reinterpret_cast(Bcb) & 1) { WRITE_FLAG = TRUE; Bcb = reinterpret_cast(reinterpret_cast(Bcb) & ~(1)); CcUnpinFileDataEx(Bcb, WRITE_FLAG, UNPIN_BCB); return; } if (Bcb->NodeTypeCode != 762) { WRITE_FLAG = FALSE; CcUnpinFileDataEx(Bcb, WRITE_FLAG, UNPIN_BCB); return; } for (auto it = ListEntryIterator::begin(&Bcb->BcbLinks); it != ListEntryIterator::end(&Bcb->BcbLinks); ++it) { auto* BCB_CURRENT = CONTAINING_RECORD(it->Blink, CC_BCB, BcbLinks); CcUnpinData(BCB_CURRENT); } ExFreePoolWithTag(Bcb); } VOID NTAPI CcUnpinDataForThread(IN PVOID BcbPtr, IN ERESOURCE_THREAD ResourceThreadId) { PCC_BCB Bcb = BcbPtr; BOOLEAN WRITE_FLAG = NULL; if (reinterpret_cast(Bcb) & 1) { WRITE_FLAG = TRUE; Bcb = reinterpret_cast(reinterpret_cast(Bcb) & ~(1)); CcUnpinFileDataEx(Bcb, WRITE_FLAG, ); return; } if (Bcb->NodeTypeCode != 762) { WRITE_FLAG = FALSE; ExReleaseResourceForThreadLite(&Bcb->Resource, ResourceThreadId); CcUnpinFileDataEx(Bcb, WRITE_FLAG, UNPIN_BCB); return; } for (auto it = ListEntryIterator::begin(&Bcb->BcbLinks); it != ListEntryIterator::end(&Bcb->BcbLinks); ++it) { auto* BCB_CURRENT = CONTAINING_RECORD(it->Blink, CC_BCB, BcbLinks); CcUnpinData(BCB_CURRENT); } ExFreePoolWithTag(Bcb); }