PPH_MODULE_ITEM PhReferenceModuleItem( __in PPH_MODULE_PROVIDER ModuleProvider, __in PVOID BaseAddress ) { PH_MODULE_ITEM lookupModuleItem; PPH_MODULE_ITEM lookupModuleItemPtr = &lookupModuleItem; PPH_MODULE_ITEM *moduleItemPtr; PPH_MODULE_ITEM moduleItem; lookupModuleItem.BaseAddress = BaseAddress; PhAcquireFastLockShared(&ModuleProvider->ModuleHashtableLock); moduleItemPtr = (PPH_MODULE_ITEM *)PhFindEntryHashtable( ModuleProvider->ModuleHashtable, &lookupModuleItemPtr ); if (moduleItemPtr) { moduleItem = *moduleItemPtr; PhReferenceObject(moduleItem); } else { moduleItem = NULL; } PhReleaseFastLockShared(&ModuleProvider->ModuleHashtableLock); return moduleItem; }
PPH_THREAD_ITEM PhReferenceThreadItem( __in PPH_THREAD_PROVIDER ThreadProvider, __in HANDLE ThreadId ) { PH_THREAD_ITEM lookupThreadItem; PPH_THREAD_ITEM lookupThreadItemPtr = &lookupThreadItem; PPH_THREAD_ITEM *threadItemPtr; PPH_THREAD_ITEM threadItem; lookupThreadItem.ThreadId = ThreadId; PhAcquireFastLockShared(&ThreadProvider->ThreadHashtableLock); threadItemPtr = (PPH_THREAD_ITEM *)PhFindEntryHashtable( ThreadProvider->ThreadHashtable, &lookupThreadItemPtr ); if (threadItemPtr) { threadItem = *threadItemPtr; PhReferenceObject(threadItem); } else { threadItem = NULL; } PhReleaseFastLockShared(&ThreadProvider->ThreadHashtableLock); return threadItem; }
static BOOLEAN SearchRootQuery( _In_ PWCHAR RemoteAddressString, _In_ PPH_STRING *Result ) { if (!PhTryAcquireFastLockShared(&CacheListLock)) return FALSE; PDNS_RECORD r = _SearchRootQuery(RemoteAddressString, DnsCacheList); PhReleaseFastLockShared(&CacheListLock); if (r) { *Result = GenerateCacheName(r); DnsRecordListFree(r, DnsFreeRecordList); return TRUE; } else { return FALSE; } }
/** * Sleeps on a condition variable. * * \param Condition A condition variable. * \param Lock A pointer to a lock. * \param Flags A combination of flags controlling the operation. * \param Timeout Not implemented. */ VOID FASTCALL PhfWaitForConditionEx( __inout PPH_QUEUED_LOCK Condition, __inout PVOID Lock, __in ULONG Flags, __in_opt PLARGE_INTEGER Timeout ) { ULONG_PTR value; ULONG_PTR currentValue; PH_QUEUED_WAIT_BLOCK waitBlock; BOOLEAN optimize; value = Condition->Value; while (TRUE) { if (PhpPushQueuedWaitBlock( Condition, value, TRUE, &waitBlock, &optimize, &value, ¤tValue )) { if (optimize) { PhpOptimizeQueuedLockListEx(Condition, currentValue, TRUE); } switch (Flags & PH_CONDITION_WAIT_LOCK_TYPE_MASK) { case PH_CONDITION_WAIT_QUEUED_LOCK: if (!(Flags & PH_CONDITION_WAIT_SHARED)) PhReleaseQueuedLockExclusive((PPH_QUEUED_LOCK)Lock); else PhReleaseQueuedLockShared((PPH_QUEUED_LOCK)Lock); break; case PH_CONDITION_WAIT_CRITICAL_SECTION: RtlLeaveCriticalSection((PRTL_CRITICAL_SECTION)Lock); break; case PH_CONDITION_WAIT_FAST_LOCK: if (!(Flags & PH_CONDITION_WAIT_SHARED)) PhReleaseFastLockExclusive((PPH_FAST_LOCK)Lock); else PhReleaseFastLockShared((PPH_FAST_LOCK)Lock); break; } if (!(Flags & PH_CONDITION_WAIT_SPIN)) { PhpBlockOnQueuedWaitBlock(&waitBlock, FALSE, NULL); } else { PhpBlockOnQueuedWaitBlock(&waitBlock, TRUE, NULL); } switch (Flags & PH_CONDITION_WAIT_LOCK_TYPE_MASK) { case PH_CONDITION_WAIT_QUEUED_LOCK: if (!(Flags & PH_CONDITION_WAIT_SHARED)) PhfAcquireQueuedLockExclusive((PPH_QUEUED_LOCK)Lock); else PhfAcquireQueuedLockShared((PPH_QUEUED_LOCK)Lock); break; case PH_CONDITION_WAIT_CRITICAL_SECTION: RtlEnterCriticalSection((PRTL_CRITICAL_SECTION)Lock); break; case PH_CONDITION_WAIT_FAST_LOCK: if (!(Flags & PH_CONDITION_WAIT_SHARED)) PhAcquireFastLockExclusive((PPH_FAST_LOCK)Lock); else PhAcquireFastLockShared((PPH_FAST_LOCK)Lock); break; } break; } } }