RtlQueryRegistryValueWithFallback

NTSTATUS __stdcall RtlQueryRegistryValueWithFallback(
        _HANDLE PrimaryHandle,
        _HANDLE FallbackHandle,
        PUNICODE_STRING ValueName,
        ULONG ValueLength,
        PULONG ValueType,
        PVOID ValueData,
        PULONG ResultLength){
  VOID *v8; 
  VOID *v9; 
  ULONG v10; 
  unsigned int *PoolWithTag; 
  int v12; 
  UINT64 Length; 
  UINT64 v15; 

  LODWORD(v15) = 0;
  v8 = *(VOID **)&FallbackHandle;
  v9 = *(VOID **)&PrimaryHandle;
  if( __PAIR128__(*(unsigned __int64 *)&PrimaryHandle, *(unsigned __int64 *)&FallbackHandle) == 0 )
    return -1073741811;
  v10 = ValueLength + 16;
  if( ValueLength >= 0xFFFFFFF0 )
    return -1073741675;
  PoolWithTag = (unsigned int *)ExAllocatePoolWithTag(1ui64, v10, 1835824242i64);
  if( !PoolWithTag )
    return -1073741801;
  v12 = -1073741772;
  if( v9 )
  {
    LODWORD(Length) = v10;
    v12 = ZwQueryValueKey(v9, ValueName, KeyValuePartialInformation, PoolWithTag, Length, &v15);
    if( v12 != -1073741772 )
      goto LABEL_8;
  }
  if( v8 )
  {
    LODWORD(Length) = v10;
    v12 = ZwQueryValueKey(v8, ValueName, KeyValuePartialInformation, PoolWithTag, Length, &v15);
LABEL_8:
    if( (int)(v12 + 0x80000000) < 0 || v12 == -2147483643 )
    {
      *ResultLength = PoolWithTag[2];
      if( ValueType )
        *ValueType = PoolWithTag[1];
      if( v12 >= 0 )
        memmove(ValueData, PoolWithTag + 3, PoolWithTag[2]);
    }
  }
  ExFreePoolWithTag(PoolWithTag, 0);
  return v12;
}

Referenced by:

EtwpGetGuidSecurityDescriptor