diff --git a/NTOSKRNL/CC/ccpinsupport.cpp b/NTOSKRNL/CC/ccpinsupport.cpp index 4d02ab3..62efc8c 100644 --- a/NTOSKRNL/CC/ccpinsupport.cpp +++ b/NTOSKRNL/CC/ccpinsupport.cpp @@ -83,6 +83,166 @@ CcUnpinFileDataEx( // 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(BcbPtr); + BOOLEAN WRITE_FLAG = NULL; + +if (reinterpret_cast(Bcb) & 1) +{ + WRITE_FLAG = TRUE; + Bcb = reinterpret_cast(reinterpret_cast(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(Bcb) & 1) +{ + WRITE_FLAG = TRUE; + Bcb = reinterpret_cast(reinterpret_cast(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); + +} +