ConvertDevpropertyToString

NTSTATUS __stdcall ConvertDevpropertyToString(
        const _DEVPROPERTY *Property,
        UINT64 PropertyStringSize,
        WCHAR *PropertyString,
        UINT64 *RequiredSize){
  unsigned __int64 v4; 
  WCHAR *v5; 
  const _DEVPROPERTY *v6; 
  UINT64 v7; 
  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; 
  WCHAR *v35; 
  NTSTATUS v36; 
  WCHAR *v37; 
  __int64 v38; 
  __int64 v39; 
  UINT64 v40; 
  UINT64 BufferSize; 
  size_t *pcbRemaining; 
  UINT64 dwFlags; 
  size_t v45[2]; 
  _NTSTRSAFE_PWSTR ppszDestEnd[2]; 
  __int128 v47; 
  int v49; 
  UINT64 RequiredSizea; 
  UINT64 *v51; 

  v51 = RequiredSize;
  v49 = PropertyStringSize;
  v4 = (unsigned int)PropertyStringSize;
  v5 = PropertyString;
  LODWORD(RequiredSizea) = 0;
  v6 = Property;
  if( (unsigned int)PropertyStringSize >= 2 )
    *PropertyString = 0;
  *(_QWORD *)ppszDestEnd = PropertyString;
  *(_QWORD *)v45 = (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;
    *(_QWORD *)v45 = v7;
    v5 += v9 >> 1;
    *(_QWORD *)ppszDestEnd = v5;
  }
  Type = v6->Type;
  if( Type > 0x1003 )
  {
    if( Type == 4109 )
    {
      v15 = (WCHAR *)L"GUID_ARRAY";
    }
    else
    {
      if( Type != 8210 )
        return -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 -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 -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 -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 -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, (WCHAR **)ppszDestEnd, (UINT64 *)v45, dwFlags);
    if( v8 < 0 )
      return v8;
    v5 = *(WCHAR **)ppszDestEnd;
    v7 = *(_QWORD *)v45;
  }
  if( v6->BufferSize )
  {
    Buffer = v6->Buffer;
    if( Buffer )
    {
      v34 = v6->Type;
      if( v34 > 0x1003 )
      {
        if( v34 == 4109 )
        {
LABEL_114:
          v40 = 0i64;
          RequiredSizea = 0i64;
          do
          {
            v32 += 80;
            v47 = *(_OWORD *)((char *)v6->Buffer + v40);
            if( v32 <= (unsigned int)v4 )
            {
              LODWORD(pcbRemaining) = 1024;
              v8 = RtlStringCbPrintfExW(
                     v5,
                     *(UINT64 *)v45,
                     (WCHAR **)ppszDestEnd,
                     (UINT64 *)v45,
                     (UINT64)pcbRemaining,
                     (WCHAR *)L"({%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x})");
              if( v8 < 0 )
                return v8;
              v5 = *(WCHAR **)ppszDestEnd;
              LODWORD(v4) = v49;
              v40 = RequiredSizea;
              v6 = Property;
            }
            BufferSize = v6->BufferSize;
            v40 += 16i64;
            RequiredSizea = v40;
          }
          while( v40 < BufferSize );
        }
        else if( v34 == 8210 )
        {
          while( *Buffer )
          {
            v38 = -1i64;
            do
              ++v38;
            while( Buffer[v38] );
            v32 += 2 * v38 + 4;
            if( v32 <= (unsigned int)v4 )
            {
              LODWORD(pcbRemaining) = 1024;
              v8 = RtlStringCbPrintfExW(
                     v5,
                     v7,
                     (WCHAR **)ppszDestEnd,
                     (UINT64 *)v45,
                     (UINT64)pcbRemaining,
                     (WCHAR *)L"[%s]");
              if( v8 < 0 )
                return v8;
              v5 = *(WCHAR **)ppszDestEnd;
            }
            v39 = -1i64;
            do
              ++v39;
            while( Buffer[v39] );
            v7 = *(_QWORD *)v45;
            Buffer += v39 + 1;
          }
        }
        else
        {
LABEL_103:
          v8 = -1073741811;
        }
      }
      else if( v34 != 4099 )
      {
        switch( v34 )
        {
          case 0u:
          case 1u:
            return -1073741811;
          case 2u:
          case 3u:
            v32 += 12;
            if( v32 > (unsigned int)v4 )
              break;
            v35 = (WCHAR *)L"(0x%.2x)";
            goto LABEL_82;
          case 4u:
          case 5u:
            v32 += 16;
            if( v32 > (unsigned int)v4 )
              break;
            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;
            v35 = L"(0x%.8x)";
            goto LABEL_82;
          case 8u:
          case 9u:
            v32 += 40;
            if( v32 > (unsigned int)v4 )
              break;
            v35 = L"(0x%.16I64x)";
            goto LABEL_82;
          case 0xAu:
          case 0xBu:
            v32 += 32;
            if( v32 > (unsigned int)v4 )
              break;
            v35 = L"(%.6e)";
            goto LABEL_82;
          case 0xCu:
          case 0xEu:
          case 0xFu:
          case 0x10u:
          case 0x13u:
          case 0x15u:
            break;
          case 0xDu:
            goto LABEL_114;
          case 0x11u:
            v37 = L"(TRUE)";
            if( *(_BYTE *)Buffer != 0xFF )
              v37 = (WCHAR *)L"(FALSE)";
            do
              ++v30;
            while( v37[v30] );
            v32 += 2 * v30;
            if( v32 > (unsigned int)v4 )
              break;
            LODWORD(dwFlags) = 1024;
            v36 = RtlStringCbCopyExW(v5, v7, v37, (WCHAR **)ppszDestEnd, (UINT64 *)v45, dwFlags);
            goto LABEL_83;
          case 0x12u:
          case 0x14u:
          case 0x19u:
            do
              ++v30;
            while( Buffer[v30] );
            v32 += 2 * v30;
            if( v32 > (unsigned int)v4 )
              break;
            v35 = L"(%s)";
LABEL_82:
            LODWORD(pcbRemaining) = 1024;
            v36 = RtlStringCbPrintfExW(v5, v7, (WCHAR **)ppszDestEnd, (UINT64 *)v45, (UINT64)pcbRemaining, v35);
LABEL_83:
            v8 = v36;
            if( v36 >= 0 )
              break;
            return v8;
          default:
            goto LABEL_103;
        }
      }
    }
  }
  if( v51 )
    *(_DWORD *)v51 = v32;
  if( v32 > (unsigned int)v4 )
    return -1073741789;
  return v8;
}

Referenced by:

ExpressionConvertToString