| 1652 | } |
| 1653 | |
| 1654 | LOGICAL |
| 1655 | ExFastRefAddAdditionalReferenceCounts( |
| 1656 | _Inout_ PEX_FAST_REF FastRef, |
| 1657 | _In_ PVOID Object, |
| 1658 | _In_ ULONG RefsToAdd |
| 1659 | ) { |
| 1660 | EX_FAST_REF OldRef, NewRef; |
| 1661 | |
| 1662 | while (true) { |
| 1663 | OldRef = ReadForWriteAccess(FastRef); |
| 1664 | |
| 1665 | if (OldRef.RefCnt + RefsToAdd > MAX_FAST_REFS || |
| 1666 | (ULONG_PTR)Object != (OldRef.Value & ~MAX_FAST_REFS)) { |
| 1667 | return FALSE; |
| 1668 | } |
| 1669 | |
| 1670 | NewRef.Value = OldRef.Value + RefsToAdd; |
| 1671 | NewRef.Object = InterlockedCompareExchangePointerAcquire(&FastRef->Object, |
| 1672 | NewRef.Object, |
| 1673 | OldRef.Object); |
| 1674 | if (NewRef.Object != OldRef.Object) { |
| 1675 | continue; |
| 1676 | } |
| 1677 | break; |
| 1678 | } |
| 1679 | return TRUE; |
| 1680 | } |
| 1681 | |
| 1682 | PVOID ObFastReferenceObject( |
| 1683 | _In_ PEX_FAST_REF FastRef |
no outgoing calls
no test coverage detected