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