| 321 | } |
| 322 | |
| 323 | LOGICAL |
| 324 | ExFastRefAddAdditionalReferenceCounts( |
| 325 | _Inout_ PEX_FAST_REF_S FastRef, |
| 326 | _In_ PVOID Object, |
| 327 | _In_ ULONG RefsToAdd |
| 328 | ) { |
| 329 | EX_FAST_REF_S OldRef, NewRef; |
| 330 | |
| 331 | while (true) { |
| 332 | OldRef = ReadForWriteAccess(FastRef); |
| 333 | |
| 334 | if (OldRef.RefCnt + RefsToAdd > MAX_FAST_REFS || |
| 335 | (ULONG_PTR)Object != (OldRef.Value & ~MAX_FAST_REFS)) { |
| 336 | return FALSE; |
| 337 | } |
| 338 | |
| 339 | NewRef.Value = OldRef.Value + RefsToAdd; |
| 340 | NewRef.Object = InterlockedCompareExchangePointerAcquire(&FastRef->Object, |
| 341 | NewRef.Object, OldRef.Object); |
| 342 | |
| 343 | if (NewRef.Object != OldRef.Object) { |
| 344 | continue; |
| 345 | } |
| 346 | break; |
| 347 | } |
| 348 | return TRUE; |
| 349 | } |
| 350 | |
| 351 | BOOLEAN |
| 352 | ExFastRefObjectNull( |
no outgoing calls
no test coverage detected