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