[NTOSKRNL:CC] Pin Support Protocols

Added  Function Parameters for:

CcPinFileData
CcMapData
CcMapDataCommon
CcPinMappedData
CcPinRead
CcPreparePinWrite
CcSetBcbOwnerPointer

Functions Implemented:
CcUnpinData
CcUnpinDataForThread
This commit is contained in:
Dibyamartanda Samanta 2024-07-02 16:01:52 +02:00
parent 05cd85be9b
commit 7157abd1f9

View File

@ -83,6 +83,166 @@ CcUnpinFileDataEx(
// Unimplementd // 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);
}