[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:
parent
47bfb48ebb
commit
62ebdde712
@ -727,7 +727,77 @@ CcPinMappedData(
|
|||||||
IN ULONG Flags,
|
IN ULONG Flags,
|
||||||
IN OUT PCC_BCB Bcb)
|
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
|
BOOLEAN
|
||||||
@ -740,7 +810,68 @@ CcPinRead(
|
|||||||
OUT PVOID *Bcb,
|
OUT PVOID *Bcb,
|
||||||
OUT PVOID *Buffer)
|
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
|
BOOLEAN
|
||||||
|
Loading…
Reference in New Issue
Block a user