PiDevCfgResolveVariableDeviceProperty

INT64 __fastcall PiDevCfgResolveVariableDeviceProperty(INT64 *a1, VOID *a2, INT64 a3){
  int RegistryValue; 
  _WORD *v7; 
  UINT64 v8; 
  WCHAR *v9; 
  wchar_t *v10; 
  INT64 v11; 
  int ObjectProperty; 
  unsigned int v13; 
  int v14; 
  _DWORD *PoolWithTag; 
  __int64 v17; 
  UINT8 *v18; 
  INT64 v19; 
  ULONG v20[2]; 
  PVOID v21; 
  PVOID P; 
  UINT64 v23; 
  struct _UNICODE_STRING UnicodeString; 
  UNICODE_STRING GuidString; 
  GUID Guid; 
  int v27; 
  P = 0i64;
  *(_DWORD *)(&GuidString.MaximumLength + 1) = 0;
  LODWORD(v23) = 0;
  v20[0] = 0;
  v21 = 0i64;
  v27 = 0;
  *(_QWORD *)&UnicodeString.Length = 0i64;
  UnicodeString.Buffer = 0i64;
  Guid = 0i64;
  RegistryValue = IopGetRegistryValue(a2, (PWCHAR)L"PropertyGuid", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P);
  if( RegistryValue < 0 )
    goto LABEL_57;
  v7 = P;
  if( !PnpValidateRegistryString((KEY_VALUE_FULL_INFORMATION *)P) )
    goto LABEL_20;
  v8 = *((unsigned int *)v7 + 3);
  v9 = (_WORD *)((char *)v7 + *((unsigned int *)v7 + 2));
  LODWORD(P) = 0;
  PnpRegSzToString(v9, v8, (UINT64 *)&P);
  GuidString.MaximumLength = v7[6];
  v10 = (_WORD *)((char *)v7 + *((unsigned int *)v7 + 2));
  GuidString.Length = (unsigned __int16)P;
  GuidString.Buffer = v10;
  RegistryValue = RtlGUIDFromString(&GuidString, &Guid);
  if( RegistryValue < 0 )
    goto LABEL_15;
  ExFreePoolWithTag(v7, 0);
  P = 0i64;
  RegistryValue = IopGetRegistryValue(a2, (PWCHAR)L"PropertyId", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P);
  if( RegistryValue < 0 )
  {
LABEL_57:
    v7 = P;
  }
  else
  {
    v7 = P;
    if( !PnpValidateRegistryDword((KEY_VALUE_FULL_INFORMATION *)P) )
      goto LABEL_20;
    v11 = *a1;
    LODWORD(v19) = 0;
    v27 = *(_DWORD *)((char *)v7 + *((unsigned int *)v7 + 2));
    ObjectProperty = PnpGetObjectProperty(
                       1198550608i64,
                       0i64,
                       *(_QWORD *)(v11 + 48),
                       1i64,
                       0i64,
                       0i64,
                       (INT64 *)&Guid,
                       (UINT64)&v23,
                       (INT64)&v21,
                       v20,
                       v19);
    RegistryValue = ObjectProperty;
    if( ObjectProperty < 0 )
    {
      if( ObjectProperty == -1073741275 )
      {
        RegistryValue = 0;
        goto LABEL_56;
      }
    }
    else
    {
      if( (unsigned int)v23 > 0x2012 )
        goto LABEL_46;
      if( (_DWORD)v23 == 8210 )
      {
        v13 = v20[0];
        if( PnpValidateMultiSzData((PWCHAR)v21, v20[0]) )
        {
          v14 = 7;
          goto LABEL_13;
        }
        goto LABEL_20;
      }
      if( (unsigned int)v23 > 0xD )
      {
        if( (_DWORD)v23 == 18 )
          goto LABEL_11;
        if( (_DWORD)v23 != 17 )
        {
          if( (_DWORD)v23 == 20 )
            goto LABEL_11;
          if( (unsigned int)v23 > 0x15 )
          {
            if( (unsigned int)v23 > 0x18 )
            {
              if( (_DWORD)v23 != 25 )
                goto LABEL_46;
LABEL_11:
              v13 = v20[0];
              if( PnpValidateStringData((PWCHAR)v21, v20[0]) )
              {
                v14 = 1;
LABEL_13:
                PoolWithTag = v21;
                v21 = 0i64;
LABEL_14:
                *(_DWORD *)(a3 + 32) = v14;
                *(_DWORD *)(a3 + 36) = v13;
                *(_QWORD *)(a3 + 40) = PoolWithTag;
                goto LABEL_15;
              }
              goto LABEL_20;
            }
            goto LABEL_47;
          }
          goto LABEL_46;
        }
        if( v20[0] == 1 )
        {
          v14 = 4;
          v13 = 4;
          PoolWithTag = ExAllocatePoolWithTag(PagedPool, 4ui64, 0x63647050ui64);
          if( PoolWithTag )
          {
            v17 = *(_BYTE *)v21 == 0xFF;
            goto LABEL_29;
          }
          goto LABEL_28;
        }
LABEL_20:
        RegistryValue = -1073741823;
        goto LABEL_15;
      }
      if( (_DWORD)v23 != 13 )
      {
        if( (unsigned int)v23 > 5 )
        {
          if( (unsigned int)v23 <= 7 )
          {
LABEL_47:
            if( v20[0] == 4 )
            {
              v14 = 4;
              v13 = 4;
              goto LABEL_13;
            }
            goto LABEL_20;
          }
          if( (unsigned int)v23 <= 9 )
          {
            v13 = 8;
            if( v20[0] == 8 )
            {
              v14 = 11;
              goto LABEL_13;
            }
            goto LABEL_20;
          }
LABEL_46:
          v13 = v20[0];
          v14 = 3;
          goto LABEL_13;
        }
        if( (unsigned int)v23 >= 4 )
        {
          if( v20[0] != 2 )
            goto LABEL_20;
          v14 = 4;
          v13 = 4;
          PoolWithTag = ExAllocatePoolWithTag(PagedPool, 4ui64, 0x63647050ui64);
          if( PoolWithTag )
          {
            LODWORD(v17) = *(unsigned __int16 *)v21;
            goto LABEL_29;
          }
LABEL_28:
          RegistryValue = -1073741670;
          goto LABEL_15;
        }
        if( (unsigned int)v23 > 1 )
        {
          if( v20[0] != 1 )
            goto LABEL_20;
          v14 = 4;
          v13 = 4;
          PoolWithTag = ExAllocatePoolWithTag(PagedPool, 4ui64, 0x63647050ui64);
          if( PoolWithTag )
          {
            LODWORD(v17) = *(unsigned __int8 *)v21;
LABEL_29:
            *PoolWithTag = v17;
            goto LABEL_14;
          }
          goto LABEL_28;
        }
LABEL_56:
        PoolWithTag = 0i64;
        v13 = 0;
        v14 = 0;
        goto LABEL_14;
      }
      if( v20[0] != 16 )
        goto LABEL_20;
      RegistryValue = RtlStringFromGUIDEx((const _GUID *const)v21, &UnicodeString, 1u);
      if( RegistryValue >= 0 )
      {
        v13 = UnicodeString.Length + 2;
        v14 = 1;
        v18 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v13, 0x63647050ui64);
        PoolWithTag = v18;
        if( v18 )
        {
          memmove(v18, (UINT8 *)UnicodeString.Buffer, v13);
          goto LABEL_14;
        }
        goto LABEL_28;
      }
    }
  }
LABEL_15:
  RtlFreeAnsiString(&UnicodeString);
  if( v21 )
    ExFreePoolWithTag(v21, 0);
  if( v7 )
    ExFreePoolWithTag(v7, 0);
  return(unsigned int)RegistryValue;
}

Referenced by:

No references.