CPIDTable::Lookup

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;
}

猜你喜欢

转载自blog.csdn.net/oshuangyue12/article/details/80549726