PiDevCfgQueryObjectProperties

NTSTATUS __stdcall PiDevCfgQueryObjectProperties(
        WCHAR *ObjectName,
        PNP_OBJECT_TYPE ObjectType,
        VOID *ObjectBaseKey,
        PI_DEVCFG_QUERY_PROPERTY_PARAM *PropertyParams,
        UINT64 PropertyCount,
        UINT64 arg28){
  INT64 v6; 
  int ObjectProperty; 
  VOID **v8; 
  int v9; 
  UINT64 v10; 
  int v11; 
  INT64 v12; 
  _UNICODE_STRING *v13; 
  size_t MaximumLength; 
  void *v15; 
  UINT64 v17; 
  VOID **PoolWithTag; 
  wchar_t *StringRoutine; 
  int v20; 
  int v21; 
  int v22; 
  VOID *Handle; 
  ULONG Tag[2]; 
  INT64 v25; 
  unsigned int v26; 

  v26 = (unsigned int)ObjectBaseKey;
  v25 = *(_QWORD *)&ObjectType;
  v6 = 0i64;
  *(_QWORD *)Tag = *(&stru_140CF2E80 + 607);
  ObjectProperty = 0;
  Handle = 0i64;
  v8 = 0i64;
  v21 = 1;
  v9 = 0;
  if( !PropertyParams )
  {
    v20 = PnpOpenObjectRegKey(
            *(&stru_140CF2E80 + 607),
            *(__int64 *)&ObjectType,
            (unsigned int)ObjectBaseKey,
            33554433,
            0,
            (__int64)&Handle);
    v6 = 0i64;
    ObjectProperty = v20;
    if( v20 < 0 )
      goto LABEL_21;
  }
  v22 = 0;
  if( !(_DWORD)arg28 )
    goto LABEL_21;
  v10 = PropertyCount + 8;
  while( 1 )
  {
    v11 = *(_DWORD *)(v10 + 20);
    v12 = *(_QWORD *)(v10 + 8);
    if( (v11 & 4) != 0 )
    {
      v13 = *(_UNICODE_STRING **)(v10 + 8);
      v12 = *(_QWORD *)(v12 + 8);
      MaximumLength = v13->MaximumLength;
    }
    else
    {
      MaximumLength = *(_DWORD *)(v10 + 16);
      v13 = (_UNICODE_STRING *)v6;
    }
    if( (v11 & 2) != 0 )
    {
      if( !v8 )
      {
        v9 = 260;
        PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x104ui64, 1667526736i64);
        v6 = 0i64;
        v8 = PoolWithTag;
        if( !PoolWithTag )
        {
          ObjectProperty = -1073741670;
          goto LABEL_21;
        }
      }
      v12 = (INT64)v8;
      MaximumLength = v9;
    }
    v15 = Handle;
    if( PropertyParams )
      v15 = PropertyParams;
    ObjectProperty = PnpGetObjectProperty(Tag[0], v25, v26, (INT64)v15, v6, *(_QWORD *)(v10 - 8), (INT64)&v21, v12);
    if( ObjectProperty == -1073741789 )
    {
      if( (*(_DWORD *)(v10 + 20) & 2) != 0 )
        ObjectProperty = -1073741595;
      v6 = 0i64;
      goto LABEL_14;
    }
    v6 = 0i64;
    if( ObjectProperty == -1073741670 )
      goto LABEL_19;
    if( ObjectProperty >= 0 )
    {
      v17 = 0i64;
      if( v21 )
      {
        if( v21 != *(_DWORD *)v10 )
        {
          ObjectProperty = -1073741823;
          goto LABEL_14;
        }
        if( v21 == 18 || v21 == 20 || v21 == 25 )
        {
          if( !PnpValidateStringData(v12, 0) )
            ObjectProperty = -1073741823;
        }
        else if( v21 == 8210 && !PnpValidateMultiSzData((_WORD *)v12, 0) )
        {
          ObjectProperty = -1073741823;
        }
      }
      else
      {
        *(_DWORD *)v10 = 0;
      }
      if( ObjectProperty >= 0 )
      {
        if( v13 && (unsigned int)v17 > 0xFFFE )
          ObjectProperty = -2147483643;
        if( ObjectProperty >= 0 )
          break;
      }
    }
LABEL_14:
    *(_DWORD *)(v10 + 24) = ObjectProperty;
    if( ObjectProperty < 0 )
    {
      if( (*(_DWORD *)(v10 + 20) & 8) == 0 )
      {
LABEL_16:
        if( (*(_DWORD *)(v10 + 20) & 1) != 0 )
          goto LABEL_19;
        ObjectProperty = v6;
        goto LABEL_18;
      }
      if( v13 )
      {
        RtlInitUnicodeString(v13, 0i64);
      }
      else
      {
        if( !v12 )
          goto LABEL_16;
        memset((VOID *)v12, 0i64, MaximumLength);
      }
      v6 = 0i64;
      goto LABEL_16;
    }
LABEL_18:
    v10 += 40i64;
    if( ++v22 >= (unsigned int)arg28 )
      goto LABEL_19;
  }
  if( (*(_DWORD *)(v10 + 20) & 2) == 0 )
    goto LABEL_35;
  if( v13 )
  {
    StringRoutine = (wchar_t *)ExpAllocateStringRoutine(v17);
    v13->Buffer = StringRoutine;
    if( !StringRoutine )
      goto LABEL_62;
    v13->MaximumLength = 0;
    goto LABEL_47;
  }
  StringRoutine = (wchar_t *)ExAllocatePoolWithTag(1ui64, v17, 1667526736i64);
  v12 = (INT64)StringRoutine;
  if( StringRoutine )
  {
LABEL_47:
    memmove(StringRoutine, v8, 0);
    LODWORD(v17) = 0;
    v6 = 0i64;
LABEL_35:
    if( v13 )
    {
      v13->Length = v17;
    }
    else
    {
      if( (*(_DWORD *)(v10 + 20) & 2) != 0 )
      {
        **(_QWORD **)(v10 + 8) = v12;
        LODWORD(v17) = 0;
      }
      *(_DWORD *)(v10 + 16) = v17;
    }
    goto LABEL_14;
  }
LABEL_62:
  ObjectProperty = -1073741670;
LABEL_19:
  if( v8 )
    ExFreePoolWithTag(v8, 0);
LABEL_21:
  if( Handle )
    ZwClose((_HANDLE)Handle);
  return ObjectProperty;
}

Referenced by:

PiDevCfgCheckDeviceNeedsUpdate
PiDevCfgConfigureDevice
PiDevCfgFindDeviceMigrationNode
PiDevCfgGetDriverPackageId
PiDevCfgInitDeviceContext
PiDevCfgLogDeviceConfigured
PiDevCfgLogDeviceStarted
PiDevCfgProcessDevice
PiDevCfgQueryDriverConfiguration
PiDevCfgQueryDriverNode
PpDevCfgInit
PpDevCfgProcessDeviceExtensions
PpDevCfgProcessDeviceReset