PiDevCfgResolveVariableKeyValue

__int64 __fastcall PiDevCfgResolveVariableKeyValue(_QWORD *a1, void *a2, __int64 a3){
  __int64 v3; 
  int v6; 
  NTSTATUS RegistryValue; 
  unsigned int *v8; 
  char *v9; 
  int v10; 
  unsigned int v11; 
  NTSTATUS v12; 
  NTSTATUS v13; 
  _KEY_VALUE_FULL_INFORMATION *v14; 
  UINT64 DataLength; 
  ULONG Type; 
  UINT8 *PoolWithTag; 
  UINT8 *v18; 
  HANDLE Handle; 
  PVOID v21; 
  PVOID P; 
  v21 = 0i64;
  v3 = a3;
  P = 0i64;
  Handle = 0i64;
  v6 = PiDevCfgResolveVariableKeyHandle(a1, a2, &Handle);
  if( v6 < 0 )
    goto LABEL_31;
  RegistryValue = IopGetRegistryValue(a2, (PWCHAR)L"ValueName", 0i64, (KEY_VALUE_FULL_INFORMATION **)&v21);
  v8 = (unsigned int *)v21;
  v6 = RegistryValue;
  if( RegistryValue >= 0 )
  {
    if( !PnpValidateRegistryString((KEY_VALUE_FULL_INFORMATION *)v21) )
    {
      v6 = -1073741823;
      goto LABEL_29;
    }
    v9 = (char *)v8 + v8[2];
    if( *(_WORD *)v9 != 36 )
    {
LABEL_12:
      v12 = IopGetRegistryValue(Handle, (PWCHAR)v9, 0i64, (KEY_VALUE_FULL_INFORMATION **)&P);
      v6 = v12;
      if( v12 < 0 )
      {
        if( v12 != -1073741772 )
          goto LABEL_17;
        v13 = IopGetRegistryValue(a2, (PWCHAR)L"DefaultValue", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P);
        v6 = v13;
        if( v13 < 0 )
        {
          if( v13 == -1073741772 )
          {
            v6 = 0;
            v14 = 0i64;
            goto LABEL_19;
          }
LABEL_17:
          v14 = (_KEY_VALUE_FULL_INFORMATION *)P;
          goto LABEL_27;
        }
      }
      v14 = (_KEY_VALUE_FULL_INFORMATION *)P;
LABEL_19:
      if( v14 )
      {
        if( !PnpValidateRegistryValue(v14) )
        {
          v6 = -1073741823;
          goto LABEL_27;
        }
        DataLength = v14->DataLength;
        Type = v14->Type;
        PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, DataLength, 0x63647050ui64);
        v18 = PoolWithTag;
        if( !PoolWithTag )
        {
          v6 = -1073741670;
          goto LABEL_27;
        }
        memmove(PoolWithTag, (UINT8 *)v14 + v14->DataOffset, DataLength);
        v3 = a3;
      }
      else
      {
        Type = 0;
        LODWORD(DataLength) = 0;
        v18 = 0i64;
      }
      *(_DWORD *)(v3 + 32) = Type;
      *(_DWORD *)(v3 + 36) = DataLength;
      *(_QWORD *)(v3 + 40) = v18;
LABEL_27:
      if( v14 )
        ExFreePoolWithTag(v14, 0);
      goto LABEL_29;
    }
    v21 = 0i64;
    v10 = PiDevCfgResolveVariable((INT64)a1, (const WCHAR *)v9 + 1, (CHAR **)&v21);
    v6 = v10;
    if( v10 >= 0 )
    {
      v11 = *((_DWORD *)v21 + 8);
      if( v11 && (v11 <= 2 || v11 == 7) )
        v9 = (char *)*((_QWORD *)v21 + 5);
      goto LABEL_12;
    }
    if( v10 == -1073741772 )
      goto LABEL_12;
  }
LABEL_29:
  if( v8 )
    ExFreePoolWithTag(v8, 0);
LABEL_31:
  if( Handle )
    ZwClose(Handle);
  return(unsigned int)v6;
}

Referenced by:

No references.