ObpLookupDirectoryUsingHash

VOID *__stdcall ObpLookupDirectoryUsingHash(
        _OBJECT_DIRECTORY *Directory,
        _UNICODE_STRING *Name,
        _OBP_LOOKUP_CONTEXT *LookupContext,
        UINT8 CaseInSensitive){
  unsigned __int8 DirectoryLocked; 
  _OBJECT_DIRECTORY_ENTRY **p_ChainLink; 
  _OBJECT_DIRECTORY_ENTRY *v10; 
  unsigned int HashValue; 
  void *Object; 
  _ADAPTER_OBJECT *v13; 
  VOID *result; 

  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
      && (unsigned __int8)RtlEqualUnicodeString(
                            Name,
                            (PCUNICODE_STRING)((char *)v10->Object
                                             - *((unsigned __int8 *)&dword_140C25D60 + (*((_BYTE *)v10->Object - 22) & 3))
                                             - 40),
                            CaseInSensitive) )
    {
      break;
    }
    p_ChainLink = &v10->ChainLink;
    v10 = v10->ChainLink;
  }
  while( v10 );
  if( v10 )
  {
    Object = v10->Object;
    ObfReferenceObject(Object);
    if( !DirectoryLocked )
    {
      ObpUnlockDirectory(Directory, LookupContext);
      p_ChainLink = 0i64;
    }
    v13 = (_ADAPTER_OBJECT *)LookupContext->Object;
    if( v13 )
      HalPutDmaAdapter(v13);
    LookupContext->Object = Object;
    result = Object;
    LookupContext->EntryLink = p_ChainLink;
  }
  else
  {
LABEL_15:
    if( !DirectoryLocked )
      ObpUnlockDirectory(Directory, LookupContext);
    return 0i64;
  }
  return result;
}

Referenced by:

ObpLookupDirectoryEntryEx