SHashChain **__stdcall CPIDTable::Lookup(IUnknown *pServer, CObjectContext *pServerCtx, int fAddRef) { unsigned int v3; // eax SHashChain *v4; // eax SHashChain **CIDObjectRet; // eax SHashChain **CIDObjectRetRef; // esi tagPIDData desiredPID; // [esp+4h] [ebp-8h] desiredPID.pServerCtx = pServerCtx; desiredPID.pServer = pServer; v3 = CPSHashTable::Hash((CObjectContext *)pServer, pServerCtx); v4 = CHashTable::Lookup((CHashTable *)&CPIDTable::s_PIDHashTbl.vfptr, v3, &desiredPID); CIDObjectRet = CIDObject::PIDChainToIDObject(v4); CIDObjectRetRef = CIDObjectRet; if ( CIDObjectRet && fAddRef ) ((void (__stdcall *)(SHashChain **))(*CIDObjectRet)->pPrev)(CIDObjectRet); return CIDObjectRetRef; }
SHashChain *__thiscall CHashTable::Lookup(CHashTable *this, unsigned int dwHash, const void *k) { CHashTable *that; // edi unsigned int hashIndex; // ebx SHashChain *bucket; // eax SHashChain *bucketNext; // esi that = this; hashIndex = dwHash % 0x17; bucket = &this->_buckets[hashIndex]; bucketNext = bucket->pNext; while ( 1 ) { JUMPOUT(bucketNext, bucket, &loc_72588617);
//bucketNext=GetCurrentContext();
HRESULT __stdcall ObtainPolicySet(CObjectContext *pClientCtx, CObjectContext *pServerCtx, unsigned int dwState, int *pfCreate, CPolicySet **ppPS) { HRESULT v5; // eax volatile unsigned int v6; // ebx HRESULT hr; // [esp+Ch] [ebp-10h] int fFound; // [esp+10h] [ebp-Ch] CPolicySet *pPS; // [esp+14h] [ebp-8h] CPolicySet *pNewPS; // [esp+18h] [ebp-4h] CRWLock::AcquireReaderLock(&gPSRWLock, CRWLock::s_dwDefaultTimeout); fFound = 0; v5 = CPSTable::Lookup(pClientCtx, pServerCtx, &pPS); v6 = gPSRWLock._dwWriterSeqNum; hr = v5; CRWLock::ReleaseReaderLock(&gPSRWLock); if ( hr < 0 ) { if ( *pfCreate ) { hr = DeterminePolicySet((CObjectContext *)&gPSRWLock, pClientCtx, (IPolicyMaker *)pServerCtx, dwState, &pNewPS); if ( hr >= 0 ) { CRWLock::AcquireWriterLock(&gPSRWLock, CRWLock::s_dwDefaultTimeout); if ( gPSRWLock._dwWriterID == GetCurrentThreadId() ) ++v6; if ( gPSRWLock._dwWriterSeqNum != v6 ) CPSTable::Lookup(pClientCtx, pServerCtx, &pPS); if ( pPS ) { fFound = 1; } else { if ( pClientCtx ) CPolicySet::SetClientContext(pNewPS, pClientCtx); if ( pServerCtx ) CPolicySet::SetServerContext(pNewPS, pServerCtx); CPSTable::Add(&gPSTable, pNewPS); pPS = pNewPS; ((void (__stdcall *)(CPolicySet *))pNewPS->vfptr->AddRef)(pNewPS); } CRWLock::ReleaseWriterLock(&gPSRWLock); ((void (__stdcall *)(CPolicySet *))pNewPS->vfptr->Release)(pNewPS); } } } else { fFound = 1; } *pfCreate = fFound == 0; *ppPS = pPS; return hr; }
if ( that->vfptr->Compare(that, k, bucketNext, dwHash) ) break; bucketNext = bucketNext->pNext; bucket = &that->_buckets[hashIndex]; } return bucketNext; }