RtlpCallQueryRegistryRoutine

NTSTATUS __stdcall RtlpCallQueryRegistryRoutine(
        VOID *Key,
        _RTL_QUERY_REGISTRY_TABLE *QueryTable,
        _KEY_VALUE_FULL_INFORMATION *KeyValueInformation,
        UINT64 *PKeyValueInfoLength,
        VOID *Context,
        VOID *Environment,
        UINT8 ValidateKeyTrust){
  int v7; 
  NTSTATUS v8; 
  ULONG Type; 
  unsigned int DefaultType; 
  VOID *v13; 
  unsigned __int64 v14; 
  ULONG DataOffset; 
  ULONG DataLength; 
  ULONG NameLength; 
  __int64 v18; 
  signed int v19; 
  char *Name; 
  int v21; 
  _WORD *DefaultData; 
  UINT64 Flags; 
  INT64 v24; 
  NTSTATUS v25; 
  NTSTATUS result; 
  _WORD *v27; 
  bool v28; 
  unsigned __int64 v29; 
  int v30; 
  _WORD *i; 
  UINT64 v33; 
  unsigned int v34; 
  NTSTATUS RegistryDirect; 
  ULONG v37; 
  _WORD *v38; 
  VOID *v40; 
  void *EntryContext; 
  INT64 v42; 
  INT64 v43; 

  v7 = *(_DWORD *)PKeyValueInfoLength;
  v8 = 0;
  *(_DWORD *)PKeyValueInfoLength = 0;
  Type = KeyValueInformation->Type;
  DefaultType = QueryTable->DefaultType;
  v13 = Key;
  v14 = (unsigned __int64)KeyValueInformation;
  if( Type )
  {
    DataOffset = KeyValueInformation->DataOffset;
    if( DataOffset != -1 )
    {
      DataLength = *(_DWORD *)(v14 + 12);
      if( DataLength || Type != (unsigned __int8)DefaultType )
      {
        if( (QueryTable->Flags & 0x20) != 0 )
        {
          Name = (char *)QueryTable->Name;
LABEL_10:
          DefaultData = (_WORD *)((char *)KeyValueInformation + DataOffset);
          goto LABEL_11;
        }
        NameLength = KeyValueInformation->NameLength;
        v18 = DataLength + DataOffset;
        if( !DataLength )
          v18 = NameLength + 20;
        v19 = NameLength + 2;
        Name = (char *)(((unsigned __int64)&KeyValueInformation->Type + v18 + 3) & 0xFFFFFFFFFFFFFFF8ui64);
        if( NameLength < 0xFFFFFFFE )
        {
          v21 = (_DWORD)KeyValueInformation + v7;
          if( v21 - (int)Name < v19 )
          {
            result = -1073741789;
            *(_DWORD *)PKeyValueInfoLength = v19 + (_DWORD)Name - (_DWORD)KeyValueInformation;
            return result;
          }
          memmove(Name, KeyValueInformation->Name, NameLength);
          v13 = Key;
          *(_WORD *)&Name[KeyValueInformation->NameLength] = 0;
          Type = KeyValueInformation->Type;
          DataOffset = KeyValueInformation->DataOffset;
          DataLength = KeyValueInformation->DataLength;
          v14 = (unsigned __int64)&Name[v19 + 7] & 0xFFFFFFFFFFFFFFF8ui64;
          v7 = v21 - v14;
          goto LABEL_10;
        }
        return -1073741764;
      }
    }
  }
  if( !(_BYTE)DefaultType )
  {
    v28 = (QueryTable->Flags & 4) == 0;
    goto LABEL_35;
  }
  DataLength = QueryTable->DefaultLength;
  Type = (unsigned __int8)DefaultType;
  Name = (char *)QueryTable->Name;
  DefaultData = QueryTable->DefaultData;
  if( !DataLength )
  {
    v27 = QueryTable->DefaultData;
    if( (unsigned int)(unsigned __int8)DefaultType - 1 <= 1 )
    {
      if( !DefaultData )
        return -1073741764;
      while( *v27++ )
        ;
      DataLength = (_DWORD)v27 - (_DWORD)DefaultData;
    }
    else if( (unsigned __int8)DefaultType == 7 )
    {
      if( !DefaultData )
        return -1073741764;
      if( *DefaultData )
      {
        do
        {
          while( *v27++ )
            ;
        }
        while( *v27 );
      }
      DataLength = (_DWORD)v27 - (_DWORD)DefaultData + 2;
    }
  }
LABEL_11:
  Flags = QueryTable->Flags;
  v24 = QueryTable->Flags & 0x20;
  if( (QueryTable->Flags & 0x20) == 0 )
    goto LABEL_12;
  if( (Flags & 0x100) == 0 )
  {
    if( (Flags & 0x80u) == 0i64 || Type - 1 > 1 && Type != 7 )
      goto LABEL_12;
    v28 = (Flags & 4) == 0;
LABEL_35:
    if( v28 )
      return 0;
    else
      return -1073741772;
  }
  if( HIBYTE(QueryTable->DefaultType) != Type )
    return -1073741788;
LABEL_12:
  if( (Flags & 0x10) == 0 )
  {
    if( Type == 7 )
    {
      v29 = (unsigned __int64)DefaultData + DataLength - 4;
      v30 = 0;
      for( i = DefaultData; (unsigned __int64)i < v29; DefaultData = i )
      {
        while( *i++ )
          ;
        v33 = QueryTable->Flags;
        v34 = (_DWORD)i - (_DWORD)DefaultData;
        if( (v33 & 0x20) != 0 )
        {
          if( ValidateKeyTrust )
          {
            v30 = RtlpValidateKeyTrust(
                    v13,
                    v33,
                    v24,
                    (INT64)PKeyValueInfoLength,
                    (INT64)v40,
                    (INT64)EntryContext,
                    v42,
                    v43);
            if( v30 < 0 )
              return v30;
          }
          RegistryDirect = RtlpQueryRegistryDirect(1ui64, DefaultData, v34, QueryTable->EntryContext);
          QueryTable->EntryContext = (char *)QueryTable->EntryContext + 16;
        }
        else
        {
          EntryContext = QueryTable->EntryContext;
          v40 = Context;
          RegistryDirect = ((__int64(__fastcall *)(char *, __int64, _WORD *, _QWORD))QueryTable->QueryRoutine)(
                             Name,
                             1i64,
                             DefaultData,
                             v34);
        }
        v30 = 0;
        if( RegistryDirect != -1073741789 )
          v30 = RegistryDirect;
        if( v30 < 0 )
          break;
        v13 = Key;
      }
      return v30;
    }
    if( Type == 2 )
    {
      v37 = DataLength - 2;
      if( DataLength - 2 <= 0xFFFA )
      {
        v38 = DefaultData;
        if( DataLength != 2 )
        {
          while( *v38 != 37 )
          {
            ++v38;
            v37 -= 2;
            if( !v37 )
              goto LABEL_15;
          }
          if( v7 > 0 )
          {
            if( (unsigned __int64)v7 > 0xFFFE )
              *(_WORD *)(v14 + 65532) = 0;
            else
              *(_WORD *)(v14 + 2 * ((unsigned __int64)v7 >> 1) - 2) = 0;
          }
          return -1073741811;
        }
      }
    }
  }
LABEL_15:
  if( (_DWORD)v24 )
  {
    if( ValidateKeyTrust )
    {
      result = RtlpValidateKeyTrust(
                 v13,
                 Flags,
                 v24,
                 (INT64)PKeyValueInfoLength,
                 (INT64)v40,
                 (INT64)EntryContext,
                 v42,
                 v43);
      if( result < 0 )
        return result;
    }
    v25 = RtlpQueryRegistryDirect(Type, DefaultData, DataLength, QueryTable->EntryContext);
  }
  else
  {
    v25 = QueryTable->QueryRoutine(Name, Type, DefaultData, DataLength, Context, QueryTable->EntryContext);
  }
  if( v25 != -1073741789 )
    return v25;
  return v8;
}

Referenced by:

RtlpQueryRegistryValues