[NTOSKRNL:CC] Cache Controller Pinsupport :: CcPinRead and CcPinMappedData

Completely implemented CcPinRead and CcPinMappedData

In future Refactor with BCB Iterator with bounds checking.
This commit is contained in:
Dibyamartanda Samanta 2024-08-07 16:09:29 +02:00 committed by CodingWorkshop Signing Team
parent 47bfb48ebb
commit 62ebdde712
Signed by: CodingWorkshop Signing Team
GPG Key ID: 6DC88369C82795D2

View File

@ -727,7 +727,77 @@ CcPinMappedData(
IN ULONG Flags,
IN OUT PCC_BCB Bcb)
{
//Unimplemented
PSHARED_CACHE_MAP SharedCacheMap = nullptr;
LARGE_INTEGER LocalFileOffset = {0};
LARGE_INTEGER BeyondLastByte ={0};
PVOID Buffer = nullptr;
POBCB localbcb = nullptr;
PCC_BCB *localbcbptr = nullptr;
PCC_BCB *Bcbs = nullptr;
bool Result = false;
LocalFileOffset = *FileOffset;
if (!(reinterpret_cast<PULONG>(Bcb) & 1))
return true;
*Bcb = reinterpret_cast<PVOID>(reinterpret_cast<ULONG_PTR>(*Bcb) - 1);
SharedCacheMap = reinterpret_cast<PSHARED_CACHE_MAP>(FileObject->SectionObjectPointer->SharedCacheMap);
InterlockedIncrement(&SharedCacheMap->PinCount);
if (ExAcquireSharedStarveExclusive(&((PCC_BCB)*Bcb)->BcbResource, ((Flags & 1) == 1)))
{
Result = true;
}
else
{
LARGE_INTEGER localoffset = LocalFileOffset;
ULONG RemainingLength = Length;
while (true)
{
if (localbcb)
{
if (localbcbptr == reinterpret_cast<PCC_BCB*>(&localbcb))
{
localbcb = CcAllocateObcb(FileOffset, Length, reinterpret_cast<PCC_BCB>(localbcb));
Bcbs = localbcb->Bcbs;
localbcbptr = localbcb->Bcbs;
}
RemainingLength += localoffset.LowPart - BeyondLastByte.LowPart;
localoffset = BeyondLastByte;
LocalFileOffset = BeyondLastByte;
localbcbptr = ++Bcbs;
}
if (!CcPinFileData(FileObject,&LocalFileOffset,RemainingLength,!(SharedCacheMap->Flags & 0x200),false,Flags,localbcbptr,&Buffer,&BeyondLastByte))
{
Result = false;
break;
}
if ((BeyondLastByte.QuadPart - localoffset.QuadPart) >= RemainingLength)
{
CcFreeVirtualAddress(reinterpret_cast<PVACB>(*Bcb));
*Bcb = localbcb;
Result = true;
break;
}
}
}
if (!Result)
{
*Bcb = reinterpret_cast<PVOID>(reinterpret_cast<ULONG_PTR>(*Bcb) + 1);
if (localbcb)
{
CcUnpinData(localbcb);
}
}
return Result;
}
BOOLEAN
@ -740,7 +810,68 @@ CcPinRead(
OUT PVOID *Bcb,
OUT PVOID *Buffer)
{
//Unimplemented
PSHARED_CACHE_MAP SharedCacheMap = nullptr;
LARGE_INTEGER LocalFileOffset ={0};
LARGE_INTEGER BeyondLastByte ={0};
PVOID LocalBuffer = nullptr;
POBCB localbcb = nullptr;
PCC_BCB *localBcbPtr = nullptr;
bool Result = false;
ULONG RemainingLength = Length;
LocalFileOffset = *FileOffset;
if (Flags & 1) // 1 Signifies Pin is waiting
CcPinReadWait++;
else
CcPinReadNoWait++;
SharedCacheMap = reinterpret_cast<PSHARED_CACHE_MAP>(FileObject->SectionObjectPointer->SharedCacheMap);
/* Main Pinning Loop*/
while (true)
{
if (localbcb)
{
if (localBcbPtr == reinterpret_cast<PCC_BCB*>(&localbcb))
{
localbcb = CcAllocateObcb(FileOffset, RemainingLength, reinterpret_cast<PCC_BCB>(localbcb));
localBcbPtr = localbcb->Bcbs;
*Buffer = LocalBuffer;
}
RemainingLength += LocalFileOffset.LowPart - BeyondLastByte.LowPart;
LocalFileOffset = BeyondLastByte;
++localBcbPtr;
}
if (!CcPinFileData(FileObject,&LocalFileOffset,RemainingLength,(SharedCacheMap->Flags & 0x200) == 0,false,Flags,localBcbPtr,&LocalBuffer,&BeyondLastByte))
{
Result = false;
break;
}
if (BeyondLastByte.QuadPart - LocalFileOffset.QuadPart >= RemainingLength)
{
*Bcb = localbcb;
if (localBcbPtr == reinterpret_cast<PCC_BCB*>(&localbcb))
{
*Buffer = LocalBuffer;
}
Result = true;
break;
}
}
if (!Result && localbcb)
{
CcUnpinData(localbcb);
}
return Result;
}
BOOLEAN