PiDevCfgConvertPropertyFromValue

NTSTATUS __stdcall PiDevCfgConvertPropertyFromValue(
        UINT64 ValueType,
        UINT64 ValueSize,
        VOID *ValueData,
        UINT64 TargetPropertyType,
        UINT64 *TargetPropertySize,
        VOID **TargetPropertyData){
  NTSTATUS v6; 
  int v8; 
  _BYTE *v9; 
  int v10; 
  int v12; 
  VOID **v13; 
  int v14; 
  VOID **v15; 
  bool v16; 
  VOID *v17; 
  VOID **v18; 
  bool v19; 
  VOID **PoolWithTag; 
  _UNICODE_STRING GuidString; 

  v6 = 0;
  *(_DWORD *)(&GuidString.MaximumLength + 1) = 0;
  v8 = 0;
  v9 = 0i64;
  if( (unsigned int)TargetPropertyType > 0x1003 )
  {
    if( (_DWORD)TargetPropertyType != 8210 )
      goto LABEL_8;
    v16 = (_DWORD)ValueType == 7;
LABEL_60:
    if( !v16 )
      goto LABEL_8;
    goto LABEL_11;
  }
  if( (_DWORD)TargetPropertyType == 4099 )
  {
LABEL_11:
    v8 = ValueSize;
    goto LABEL_35;
  }
  if( (unsigned int)TargetPropertyType > 0x11 )
  {
    if( (_DWORD)TargetPropertyType != 18 )
    {
      if( (_DWORD)TargetPropertyType == 19 )
      {
        v19 = (_DWORD)ValueType == 3;
        goto LABEL_41;
      }
      if( (_DWORD)TargetPropertyType != 20 )
      {
        if( (unsigned int)TargetPropertyType <= 0x15 )
          goto LABEL_8;
        if( (unsigned int)TargetPropertyType <= 0x18 )
        {
LABEL_57:
          v19 = (_DWORD)ValueType == 4;
          goto LABEL_41;
        }
        if( (_DWORD)TargetPropertyType != 25 )
          goto LABEL_8;
      }
    }
    if( (unsigned int)(ValueType - 1) > 1 )
      goto LABEL_8;
    goto LABEL_11;
  }
  if( (_DWORD)TargetPropertyType != 17 )
  {
    if( (unsigned int)TargetPropertyType > 9 )
    {
      if( (_DWORD)TargetPropertyType == 13 )
      {
        if( !(_DWORD)ValueType )
          goto LABEL_8;
        if( (unsigned int)ValueType <= 2 )
        {
          if( (_DWORD)ValueSize != 78 )
            goto LABEL_8;
          v8 = 16;
          PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x10ui64, 1667526736i64);
          v9 = PoolWithTag;
          if( PoolWithTag )
          {
            GuidString.Buffer = (wchar_t *)ValueData;
            *(_DWORD *)&GuidString.Length = 5111884;
            if( RtlGUIDFromString(&GuidString, (_GUID *)PoolWithTag) < 0 )
            {
              ExFreePoolWithTag(v9, 0);
              v9 = 0i64;
            }
            goto LABEL_8;
          }
          return -1073741670;
        }
        if( (_DWORD)ValueType != 3 )
          goto LABEL_8;
        v19 = (_DWORD)ValueSize == 16;
LABEL_41:
        v8 = ValueSize;
        v9 = ValueData;
        if( !v19 )
        {
          v8 = 0;
          v9 = 0i64;
        }
        goto LABEL_8;
      }
      if( (_DWORD)TargetPropertyType != 16
        || (_DWORD)ValueType != 3 && (_DWORD)ValueType != 11
        || (_DWORD)ValueSize != 8 )
      {
        goto LABEL_8;
      }
      v8 = 8;
LABEL_35:
      v9 = ValueData;
      goto LABEL_8;
    }
    if( (unsigned int)TargetPropertyType < 8 )
    {
      if( (unsigned int)TargetPropertyType < 2 )
        goto LABEL_8;
      if( (unsigned int)TargetPropertyType <= 3 )
      {
        if( (_DWORD)ValueType != 4 )
          goto LABEL_8;
        v14 = *(_DWORD *)ValueData;
        if( *(_DWORD *)ValueData > 0xFFu )
          goto LABEL_8;
        v8 = 1;
        v15 = ExAllocatePoolWithTag(1ui64, 1ui64, 1667526736i64);
        v9 = v15;
        if( v15 )
        {
          *(_BYTE *)v15 = v14;
          goto LABEL_8;
        }
        return -1073741670;
      }
      if( (unsigned int)TargetPropertyType <= 5 )
      {
        if( (_DWORD)ValueType != 4 )
          goto LABEL_8;
        v12 = *(_DWORD *)ValueData;
        if( *(_DWORD *)ValueData > 0xFFFFu )
          goto LABEL_8;
        v8 = 2;
        v13 = ExAllocatePoolWithTag(1ui64, 2ui64, 1667526736i64);
        v9 = v13;
        if( v13 )
        {
          *(_WORD *)v13 = v12;
          goto LABEL_8;
        }
        return -1073741670;
      }
      goto LABEL_57;
    }
    if( (_DWORD)ValueType == 4 )
    {
      v17 = (VOID *)*(unsigned int *)ValueData;
      v8 = 8;
      v18 = ExAllocatePoolWithTag(1ui64, 8ui64, 1667526736i64);
      v9 = v18;
      if( v18 )
      {
        *v18 = v17;
        goto LABEL_8;
      }
      return -1073741670;
    }
    v16 = (_DWORD)ValueType == 11;
    goto LABEL_60;
  }
  if( (_DWORD)ValueType == 4 )
  {
    v10 = *(_DWORD *)ValueData;
    v8 = 1;
    v9 = ExAllocatePoolWithTag(1ui64, 1ui64, 1667526736i64);
    if( v9 )
    {
      *v9 = -(v10 != 0);
      goto LABEL_8;
    }
    return -1073741670;
  }
LABEL_8:
  *(_DWORD *)TargetPropertySize = v8;
  *TargetPropertyData = v9;
  return v6;
}

Referenced by:

PiDevCfgCopyDeviceKey