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