[NTOS:CC] Properly return the public BCBs

This commit is contained in:
Jérôme Gardou 2020-12-30 18:25:02 +01:00
parent 33cde28312
commit 02167f2fb3
3 changed files with 14 additions and 14 deletions

View file

@ -308,7 +308,7 @@ CcSetBcbOwnerPointer (
IN PVOID Owner IN PVOID Owner
) )
{ {
PINTERNAL_BCB iBcb = Bcb; PINTERNAL_BCB iBcb = CONTAINING_RECORD(Bcb, INTERNAL_BCB, PFCB);
CCTRACE(CC_API_DEBUG, "Bcb=%p Owner=%p\n", CCTRACE(CC_API_DEBUG, "Bcb=%p Owner=%p\n",
Bcb, Owner); Bcb, Owner);

View file

@ -45,7 +45,7 @@ NTAPI
CcGetFileObjectFromBcb ( CcGetFileObjectFromBcb (
IN PVOID Bcb) IN PVOID Bcb)
{ {
PINTERNAL_BCB iBcb = (PINTERNAL_BCB)Bcb; PINTERNAL_BCB iBcb = CONTAINING_RECORD(Bcb, INTERNAL_BCB, PFCB);
CCTRACE(CC_API_DEBUG, "Bcb=%p\n", Bcb); CCTRACE(CC_API_DEBUG, "Bcb=%p\n", Bcb);

View file

@ -126,8 +126,8 @@ CcpGetAppropriateBcb(
} }
RtlZeroMemory(iBcb, sizeof(*iBcb)); RtlZeroMemory(iBcb, sizeof(*iBcb));
iBcb->PFCB.NodeTypeCode = 0xDE45; /* Undocumented (CAPTIVE_PUBLIC_BCB_NODETYPECODE) */ iBcb->PFCB.NodeTypeCode = 0x2FD; /* As per KMTests */
iBcb->PFCB.NodeByteSize = sizeof(PUBLIC_BCB); iBcb->PFCB.NodeByteSize = 0;
iBcb->PFCB.MappedLength = Length; iBcb->PFCB.MappedLength = Length;
iBcb->PFCB.MappedFileOffset = *FileOffset; iBcb->PFCB.MappedFileOffset = *FileOffset;
iBcb->Vacb = Vacb; iBcb->Vacb = Vacb;
@ -308,8 +308,9 @@ CcpPinData(
} }
_SEH2_END; _SEH2_END;
*Bcb = NewBcb; *Bcb = &NewBcb->PFCB;
*Buffer = (PVOID)((ULONG_PTR)NewBcb->Vacb->BaseAddress + VacbOffset); *Buffer = (PVOID)((ULONG_PTR)NewBcb->Vacb->BaseAddress + VacbOffset);
return TRUE; return TRUE;
} }
@ -411,7 +412,7 @@ CcMapData (
} }
_SEH2_END; _SEH2_END;
*pBcb = iBcb; *pBcb = &iBcb->PFCB;
*pBuffer = (PVOID)((ULONG_PTR)iBcb->Vacb->BaseAddress + VacbOffset); *pBuffer = (PVOID)((ULONG_PTR)iBcb->Vacb->BaseAddress + VacbOffset);
CCTRACE(CC_API_DEBUG, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> TRUE Bcb=%p, Buffer %p\n", CCTRACE(CC_API_DEBUG, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> TRUE Bcb=%p, Buffer %p\n",
@ -451,14 +452,14 @@ CcPinMappedData (
return FALSE; return FALSE;
} }
iBcb = *Bcb; iBcb = *Bcb ? CONTAINING_RECORD(*Bcb, INTERNAL_BCB, PFCB) : NULL;
++CcPinMappedDataCount; ++CcPinMappedDataCount;
Result = CcpPinData(SharedCacheMap, FileOffset, Length, Flags, Bcb, &Buffer); Result = CcpPinData(SharedCacheMap, FileOffset, Length, Flags, Bcb, &Buffer);
if (Result) if (Result)
{ {
CcUnpinData(iBcb); CcUnpinData(&iBcb->PFCB);
} }
return Result; return Result;
@ -542,10 +543,9 @@ CcSetDirtyPinnedData (
IN PVOID Bcb, IN PVOID Bcb,
IN PLARGE_INTEGER Lsn) IN PLARGE_INTEGER Lsn)
{ {
PINTERNAL_BCB iBcb = Bcb; PINTERNAL_BCB iBcb = CONTAINING_RECORD(Bcb, INTERNAL_BCB, PFCB);
CCTRACE(CC_API_DEBUG, "Bcb=%p Lsn=%p\n", CCTRACE(CC_API_DEBUG, "Bcb=%p Lsn=%p\n", Bcb, Lsn);
Bcb, Lsn);
/* Tell Mm */ /* Tell Mm */
MmMakePagesDirty(NULL, MmMakePagesDirty(NULL,
@ -580,7 +580,7 @@ CcUnpinDataForThread (
IN PVOID Bcb, IN PVOID Bcb,
IN ERESOURCE_THREAD ResourceThreadId) IN ERESOURCE_THREAD ResourceThreadId)
{ {
PINTERNAL_BCB iBcb = Bcb; PINTERNAL_BCB iBcb = CONTAINING_RECORD(Bcb, INTERNAL_BCB, PFCB);
CCTRACE(CC_API_DEBUG, "Bcb=%p ResourceThreadId=%lu\n", Bcb, ResourceThreadId); CCTRACE(CC_API_DEBUG, "Bcb=%p ResourceThreadId=%lu\n", Bcb, ResourceThreadId);
@ -601,7 +601,7 @@ NTAPI
CcRepinBcb ( CcRepinBcb (
IN PVOID Bcb) IN PVOID Bcb)
{ {
PINTERNAL_BCB iBcb = Bcb; PINTERNAL_BCB iBcb = CONTAINING_RECORD(Bcb, INTERNAL_BCB, PFCB);
CCTRACE(CC_API_DEBUG, "Bcb=%p\n", Bcb); CCTRACE(CC_API_DEBUG, "Bcb=%p\n", Bcb);
@ -618,7 +618,7 @@ CcUnpinRepinnedBcb (
IN BOOLEAN WriteThrough, IN BOOLEAN WriteThrough,
IN PIO_STATUS_BLOCK IoStatus) IN PIO_STATUS_BLOCK IoStatus)
{ {
PINTERNAL_BCB iBcb = Bcb; PINTERNAL_BCB iBcb = CONTAINING_RECORD(Bcb, INTERNAL_BCB, PFCB);
KIRQL OldIrql; KIRQL OldIrql;
PROS_SHARED_CACHE_MAP SharedCacheMap; PROS_SHARED_CACHE_MAP SharedCacheMap;