Files
alcyone/NTOSKRNL/CC/ccpinsupport.cpp
Dibyamartanda Samanta 7157abd1f9 [NTOSKRNL:CC] Pin Support Protocols
Added  Function Parameters for:

CcPinFileData
CcMapData
CcMapDataCommon
CcPinMappedData
CcPinRead
CcPreparePinWrite
CcSetBcbOwnerPointer

Functions Implemented:
CcUnpinData
CcUnpinDataForThread
2024-07-02 16:01:52 +02:00

249 lines
4.6 KiB
C++

/*
* PROJECT: Alcyone System Kernel
* LICENSE: BSD Clause 3
* PURPOSE: Cache Controller:: Lazy Writer
* NT KERNEL: 5.11.9360
* COPYRIGHT: 2023-2029 Dibymartanda Samanta <>
*/
#include <ntoskrnl.h>
#define NTDEBUG
#include <debug.h>
#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<PCC_BCB>(BcbPtr);
BOOLEAN WRITE_FLAG = NULL;
if (reinterpret_cast<ULONG_PTR>(Bcb) & 1)
{
WRITE_FLAG = TRUE;
Bcb = reinterpret_cast<PCC_BCB>(reinterpret_cast<ULONG_PTR>(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<ULONG_PTR>(Bcb) & 1)
{
WRITE_FLAG = TRUE;
Bcb = reinterpret_cast<PCC_BCB>(reinterpret_cast<ULONG_PTR>(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);
}