diff --git a/reactos/ntoskrnl/cc/cacheman.c b/reactos/ntoskrnl/cc/cacheman.c index 3eefc92020b..111170d0cd5 100644 --- a/reactos/ntoskrnl/cc/cacheman.c +++ b/reactos/ntoskrnl/cc/cacheman.c @@ -117,10 +117,14 @@ CcSetBcbOwnerPointer ( IN PVOID Owner ) { + PINTERNAL_BCB iBcb = Bcb; + CCTRACE(CC_API_DEBUG, "Bcb=%p Owner=%p\n", Bcb, Owner); - UNIMPLEMENTED; + if (iBcb->OwnerPointer) + DPRINT1("OwnerPointer was already set?! Old: %p, New: %p\n", iBcb->OwnerPointer, Owner); + iBcb->OwnerPointer = Owner; } /* diff --git a/reactos/ntoskrnl/cc/pin.c b/reactos/ntoskrnl/cc/pin.c index af0e357be74..bb1370f6bf6 100644 --- a/reactos/ntoskrnl/cc/pin.c +++ b/reactos/ntoskrnl/cc/pin.c @@ -242,9 +242,17 @@ CcUnpinDataForThread ( IN PVOID Bcb, IN ERESOURCE_THREAD ResourceThreadId) { + PINTERNAL_BCB iBcb = Bcb; + CCTRACE(CC_API_DEBUG, "Bcb=%p ResourceThreadId=%lu\n", Bcb, ResourceThreadId); - UNIMPLEMENTED; + if (iBcb->OwnerPointer != (PVOID)ResourceThreadId) + { + DPRINT1("Invalid owner! Caller: %p, Owner: %p\n", (PVOID)ResourceThreadId, iBcb->OwnerPointer); + return; + } + + return CcUnpinData(Bcb); } /* diff --git a/reactos/ntoskrnl/include/internal/cc.h b/reactos/ntoskrnl/include/internal/cc.h index 3c7f8d78d15..5d95e6ad576 100644 --- a/reactos/ntoskrnl/include/internal/cc.h +++ b/reactos/ntoskrnl/include/internal/cc.h @@ -194,6 +194,7 @@ typedef struct _INTERNAL_BCB PROS_VACB Vacb; BOOLEAN Dirty; CSHORT RefCount; /* (At offset 0x34 on WinNT4) */ + PVOID OwnerPointer; } INTERNAL_BCB, *PINTERNAL_BCB; VOID