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