ConvertDevpropertyToString

INT64 __fastcall ConvertDevpropertyToString(
        const _DEVPROPERTY *Property,
        UINT64 PropertyStringSize,
        WCHAR *PropertyString,
        UINT64 *RequiredSize){
  unsigned __int64 v4; 
  wchar_t *v5; 
  const _DEVPROPERTY *v6; 
  size_t v7; 
  unsigned int v8; 
  unsigned __int64 v9; 
  unsigned int Type; 
  unsigned int v11; 
  unsigned int v12; 
  unsigned int v13; 
  unsigned int v14; 
  WCHAR *v15; 
  unsigned int v16; 
  unsigned int v17; 
  unsigned int v18; 
  unsigned int v19; 
  unsigned int v20; 
  unsigned int v21; 
  unsigned int v22; 
  unsigned int v23; 
  unsigned int v24; 
  unsigned int v25; 
  unsigned int v26; 
  unsigned int v27; 
  unsigned int v28; 
  unsigned int v29; 
  __int64 v30; 
  __int64 v31; 
  unsigned int v32; 
  _WORD *Buffer; 
  unsigned int v34; 
  const WCHAR *v35; 
  int v36; 
  double v37; 
  WCHAR *v38; 
  __int64 v39; 
  int v40; 
  __int64 v41; 
  UINT64 v42; 
  int v43; 
  UINT64 BufferSize; 
  size_t *pcbRemaining; 
  UINT64 dwFlags; 
  __int64 v48; 
  __int64 v49; 
  __int64 v50; 
  __int64 v51; 
  __int64 v52; 
  __int64 v53; 
  __int64 v54; 
  __int64 v55; 
  __int64 v56; 
  __int64 v57; 
  __int64 v58; 
  size_t cbDest; 
  NTSTRSAFE_PWSTR ppszDestEnd; 
  __int128 v61; 
  int v63; 
  UINT64 RequiredSizea; 
  UINT64 *v65; 
  v65 = RequiredSize;
  v63 = PropertyStringSize;
  v4 = (unsigned int)PropertyStringSize;
  v5 = PropertyString;
  LODWORD(RequiredSizea) = 0;
  v6 = Property;
  if( (unsigned int)PropertyStringSize >= 2 )
    *PropertyString = 0;
  ppszDestEnd = PropertyString;
  cbDest = (unsigned int)PropertyStringSize;
  v7 = (unsigned int)PropertyStringSize;
  v8 = ConvertDevpropcompkeyToString(
         &Property->CompKey,
         PropertyString,
         (unsigned int)PropertyStringSize,
         &RequiredSizea);
  if( (int)(v8 + 0x80000000) >= 0 && v8 != -1073741789 )
    return v8;
  v8 = 0;
  v9 = (unsigned int)RequiredSizea - 2i64;
  if( v4 >= v9 )
  {
    v7 = 2i64 - (unsigned int)RequiredSizea + v4;
    cbDest = v7;
    v5 += v9 >> 1;
    ppszDestEnd = v5;
  }
  Type = v6->Type;
  if( Type > 0x1003 )
  {
    if( Type == 4109 )
    {
      v15 = (WCHAR *)L"GUID_ARRAY";
    }
    else
    {
      if( Type != 8210 )
        return(unsigned int)-1073741811;
      v15 = L"STRING_LIST";
    }
  }
  else if( Type == 4099 )
  {
    v15 = L"BINARY";
  }
  else if( Type > 0xD )
  {
    if( Type > 0x14 )
    {
      v26 = Type - 21;
      if( v26 )
      {
        v27 = v26 - 1;
        if( v27 )
        {
          v28 = v27 - 1;
          if( v28 )
          {
            v29 = v28 - 1;
            if( v29 )
            {
              if( v29 != 1 )
                return(unsigned int)-1073741811;
              v15 = L"STRING_INDIRECT";
            }
            else
            {
              v15 = L"NTSTATUS";
            }
          }
          else
          {
            v15 = L"ERROR";
          }
        }
        else
        {
          v15 = L"DEVPROPTYPE";
        }
      }
      else
      {
        v15 = L"DEVPROPKEY";
      }
    }
    else if( Type == 20 )
    {
      v15 = L"SECURITY_DESCRIPTOR_STRING";
    }
    else
    {
      v21 = Type - 14;
      if( v21 )
      {
        v22 = v21 - 1;
        if( v22 )
        {
          v23 = v22 - 1;
          if( v23 )
          {
            v24 = v23 - 1;
            if( v24 )
            {
              v25 = v24 - 1;
              if( v25 )
              {
                if( v25 != 1 )
                  return(unsigned int)-1073741811;
                v15 = L"SECURITY_DESCRIPTOR";
              }
              else
              {
                v15 = L"STRING";
              }
            }
            else
            {
              v15 = L"BOOLEAN";
            }
          }
          else
          {
            v15 = L"FILETIME";
          }
        }
        else
        {
          v15 = L"DATE";
        }
      }
      else
      {
        v15 = L"CURRENCY";
      }
    }
  }
  else if( Type == 13 )
  {
    v15 = L"GUID";
  }
  else if( Type > 6 )
  {
    v16 = Type - 7;
    if( v16 )
    {
      v17 = v16 - 1;
      if( v17 )
      {
        v18 = v17 - 1;
        if( v18 )
        {
          v19 = v18 - 1;
          if( v19 )
          {
            v20 = v19 - 1;
            if( v20 )
            {
              if( v20 != 1 )
                return(unsigned int)-1073741811;
              v15 = L"DECIMAL";
            }
            else
            {
              v15 = L"DOUBLE";
            }
          }
          else
          {
            v15 = L"FLOAT";
          }
        }
        else
        {
          v15 = L"UINT64";
        }
      }
      else
      {
        v15 = L"INT64";
      }
    }
    else
    {
      v15 = L"UINT32";
    }
  }
  else if( Type == 6 )
  {
    v15 = L"INT32";
  }
  else if( Type )
  {
    v11 = Type - 1;
    if( v11 )
    {
      v12 = v11 - 1;
      if( v12 )
      {
        v13 = v12 - 1;
        if( v13 )
        {
          v14 = v13 - 1;
          if( v14 )
          {
            if( v14 == 1 )
            {
              v15 = L"UINT16";
              goto LABEL_70;
            }
            return(unsigned int)-1073741811;
          }
          v15 = L"INT16";
        }
        else
        {
          v15 = L"BYTE";
        }
      }
      else
      {
        v15 = L"SBYTE";
      }
    }
    else
    {
      v15 = L"NULL";
    }
  }
  else
  {
    v15 = L"EMPTY";
  }
LABEL_70:
  v30 = -1i64;
  v31 = -1i64;
  do
    ++v31;
  while( v15[v31] );
  v32 = RequiredSizea + 2 * v31;
  if( v32 <= (unsigned int)v4 )
  {
    LODWORD(dwFlags) = 1024;
    v8 = RtlStringCbCopyExW(v5, v7, v15, &ppszDestEnd, &cbDest, dwFlags);
    if( (v8 & 0x80000000) != 0 )
      return v8;
    v5 = ppszDestEnd;
    v7 = cbDest;
  }
  if( v6->BufferSize )
  {
    Buffer = v6->Buffer;
    if( Buffer )
    {
      v34 = v6->Type;
      if( v34 > 0x1003 )
      {
        if( v34 == 4109 )
        {
LABEL_117:
          v42 = 0i64;
          RequiredSizea = 0i64;
          do
          {
            v32 += 80;
            v61 = *(_OWORD *)((char *)v6->Buffer + v42);
            if( v32 <= (unsigned int)v4 )
            {
              LODWORD(v58) = HIBYTE(*((_QWORD *)&v61 + 1));
              LODWORD(v57) = BYTE14(v61);
              LODWORD(v56) = BYTE13(v61);
              LODWORD(v55) = BYTE12(v61);
              LODWORD(v54) = BYTE11(v61);
              LODWORD(v53) = BYTE10(v61);
              LODWORD(v52) = BYTE9(v61);
              LODWORD(v51) = BYTE8(v61);
              LODWORD(v50) = WORD3(v61);
              LODWORD(v49) = WORD2(v61);
              LODWORD(v48) = v61;
              LODWORD(pcbRemaining) = 1024;
              RtlStringCbPrintfExW(
                v5,
                cbDest,
                &ppszDestEnd,
                &cbDest,
                (UINT64)pcbRemaining,
                L"({%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x})",
                v48,
                v49,
                v50,
                v51,
                v52,
                v53,
                v54,
                v55,
                v56,
                v57,
                v58);
              v8 = v43;
              if( v43 < 0 )
                return v8;
              v5 = ppszDestEnd;
              LODWORD(v4) = v63;
              v42 = RequiredSizea;
              v6 = Property;
            }
            BufferSize = v6->BufferSize;
            v42 += 16i64;
            RequiredSizea = v42;
          }
          while( v42 < BufferSize );
        }
        else if( v34 == 8210 )
        {
          while( *Buffer )
          {
            v39 = -1i64;
            do
              ++v39;
            while( Buffer[v39] );
            v32 += 2 * v39 + 4;
            if( v32 <= (unsigned int)v4 )
            {
              LODWORD(pcbRemaining) = 1024;
              RtlStringCbPrintfExW(v5, v7, &ppszDestEnd, &cbDest, (UINT64)pcbRemaining, L"[%s]", Buffer);
              v8 = v40;
              if( v40 < 0 )
                return v8;
              v5 = ppszDestEnd;
            }
            v41 = -1i64;
            do
              ++v41;
            while( Buffer[v41] );
            v7 = cbDest;
            Buffer += v41 + 1;
          }
        }
        else
        {
LABEL_106:
          v8 = -1073741811;
        }
      }
      else if( v34 != 4099 )
      {
        switch( v34 )
        {
          case 0u:
          case 1u:
            return(unsigned int)-1073741811;
          case 2u:
          case 3u:
            v32 += 12;
            if( v32 > (unsigned int)v4 )
              break;
            LODWORD(v48) = *(unsigned __int8 *)Buffer;
            v35 = L"(0x%.2x)";
            goto LABEL_82;
          case 4u:
          case 5u:
            v32 += 16;
            if( v32 > (unsigned int)v4 )
              break;
            LODWORD(v48) = (__int16)*Buffer;
            v35 = L"(0x%.4x)";
            goto LABEL_82;
          case 6u:
          case 7u:
          case 0x16u:
          case 0x17u:
          case 0x18u:
            v32 += 24;
            if( v32 > (unsigned int)v4 )
              break;
            LODWORD(v48) = *(_DWORD *)Buffer;
            v35 = L"(0x%.8x)";
            goto LABEL_82;
          case 8u:
          case 9u:
            v32 += 40;
            if( v32 > (unsigned int)v4 )
              break;
            v48 = *(_QWORD *)Buffer;
            v35 = L"(0x%.16I64x)";
            goto LABEL_82;
          case 0xAu:
          case 0xBu:
            v32 += 32;
            if( v32 > (unsigned int)v4 )
              break;
            if( v34 == 10 )
              v37 = *(float *)Buffer;
            else
              v37 = *(double *)Buffer;
            v48 = *(_QWORD *)&v37;
            v35 = L"(%.6e)";
            goto LABEL_82;
          case 0xCu:
          case 0xEu:
          case 0xFu:
          case 0x10u:
          case 0x13u:
          case 0x15u:
            break;
          case 0xDu:
            goto LABEL_117;
          case 0x11u:
            v38 = L"(TRUE)";
            if( *(_BYTE *)Buffer != 0xFF )
              v38 = (WCHAR *)L"(FALSE)";
            do
              ++v30;
            while( v38[v30] );
            v32 += 2 * v30;
            if( v32 > (unsigned int)v4 )
              break;
            LODWORD(dwFlags) = 1024;
            v36 = RtlStringCbCopyExW(v5, v7, v38, &ppszDestEnd, &cbDest, dwFlags);
            goto LABEL_83;
          case 0x12u:
          case 0x14u:
          case 0x19u:
            do
              ++v30;
            while( Buffer[v30] );
            v32 += 2 * v30;
            if( v32 > (unsigned int)v4 )
              break;
            v48 = (__int64)v6->Buffer;
            v35 = L"(%s)";
LABEL_82:
            LODWORD(pcbRemaining) = 1024;
            RtlStringCbPrintfExW(v5, v7, &ppszDestEnd, &cbDest, (UINT64)pcbRemaining, v35, v48);
LABEL_83:
            v8 = v36;
            if( v36 >= 0 )
              break;
            return v8;
          default:
            goto LABEL_106;
        }
      }
    }
  }
  if( v65 )
    *(_DWORD *)v65 = v32;
  if( v32 > (unsigned int)v4 )
    return(unsigned int)-1073741789;
  return v8;
}

Referenced by:

ExpressionConvertToString