CmpGetMappingHiveForString
NTSTATUS __stdcall CmpGetMappingHiveForString(_UNICODE_STRING *String, _CMHIVE **CmHive){
NTSTATUS v4;
int v5;
char *v6;
unsigned int v8;
unsigned int v9;
_QWORD *v10;
char *v11;
v4 = 0;
v5 = CmpHashUnicodeComponent(String);
ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 736));
if( CmSIDMappingCacheHit >= 0
&& CmSIDMappingCacheHit < CmpSIDToHiveMappingCount
&& (v6 = (char *)CmpSIDToHiveMapping + 32 * CmSIDMappingCacheHit, *((_DWORD *)v6 + 4) == v5)
&& *(_WORD *)v6 == String->Length
&& !CmpCompareUnicodeString((_UNICODE_STRING *)v6, String, 0i64) )
{
*CmHive = (_CMHIVE *)*((_QWORD *)v6 + 3);
}
else
{
v8 = CmpSIDToHiveMappingCount;
v9 = 0;
if( CmpSIDToHiveMappingCount )
{
while( 1 )
{
v10 = CmpSIDToHiveMapping;
v11 = (char *)CmpSIDToHiveMapping + 32 * v9;
if( *((_DWORD *)v11 + 4) == v5
&& *(_WORD *)v11 == String->Length
&& !CmpCompareUnicodeString((_UNICODE_STRING *)v11, String, 0i64) )
{
break;
}
if( ++v9 >= v8 )
goto LABEL_14;
}
CmSIDMappingCacheHit = v9;
*CmHive = (_CMHIVE *)v10[4 * v9 + 3];
}
else
{
LABEL_14:
v4 = -1073741275;
}
}
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 736));
return v4;
}Referenced by:
CmpGetCmHiveFromVirtualPath
CmpGetVirtualStoreRoot