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