ObpLookupDirectoryUsingHash

VOID *__fastcall ObpLookupDirectoryUsingHash(
        _OBJECT_DIRECTORY *Directory,
        _UNICODE_STRING *Name,
        _OBP_LOOKUP_CONTEXT *LookupContext,
        INT64 CaseInSensitive){
  UINT8 v4; 
  unsigned __int8 DirectoryLocked; 
  _OBJECT_DIRECTORY_ENTRY **p_ChainLink; 
  _OBJECT_DIRECTORY_ENTRY *v10; 
  unsigned int HashValue; 
  void *Object; 
  struct _DMA_ADAPTER *v13; 
  VOID *result; 
  v4 = CaseInSensitive;
  DirectoryLocked = LookupContext->DirectoryLocked;
  p_ChainLink = &Directory->HashBuckets[LookupContext->HashIndex];
  if( !DirectoryLocked )
    ObpLockDirectoryShared(LookupContext, Directory);
  v10 = *p_ChainLink;
  if( !*p_ChainLink )
    goto LABEL_15;
  HashValue = LookupContext->HashValue;
  do
  {
    if( v10->HashValue == HashValue
      && RtlEqualUnicodeString(
           Name,
           (UNICODE_STRING *)((char *)v10->Object
                            - *((unsigned __int8 *)ObpInfoMaskToOffset + (*((_BYTE *)v10->Object - 22) & 3))
                            - 40),
           v4) )
    {
      break;
    }
    p_ChainLink = &v10->ChainLink;
    v10 = v10->ChainLink;
  }
  while( v10 );
  if( v10 )
  {
    Object = v10->Object;
    ObfReferenceObject(Object);
    if( !DirectoryLocked )
    {
      ObpUnlockDirectory((INT64)Directory, (INT64)LookupContext);
      p_ChainLink = 0i64;
    }
    v13 = (struct _DMA_ADAPTER *)LookupContext->Object;
    if( v13 )
      HalPutDmaAdapter(v13);
    LookupContext->Object = Object;
    result = Object;
    LookupContext->EntryLink = p_ChainLink;
  }
  else
  {
LABEL_15:
    if( !DirectoryLocked )
      ObpUnlockDirectory((INT64)Directory, (INT64)LookupContext);
    return 0i64;
  }
  return result;
}

Referenced by:

ObpLookupDirectoryEntryEx