PiDevCfgBuildDriverConfigurationId
NTSTATUS __stdcall PiDevCfgBuildDriverConfigurationId(
PI_DEVCFG_DRIVER_NODE *DriverNode,
_UNICODE_STRING *DriverConfigurationId){
int v2;
unsigned int v4;
int v6;
unsigned __int16 Length;
INT64 Buffer;
unsigned __int64 v10;
WCHAR *v11;
__int16 v12;
__int64 v13;
const wchar_t *v14;
__int64 v15;
unsigned __int64 v16;
_UNICODE_STRING DestinationString;
_UNICODE_STRING RemainingString;
_TIME_FIELDS TimeFields;
WCHAR *ppszDestEnd;
unsigned __int64 pcchRemaining;
__int64 pcchNewDestLength;
v2 = *((unsigned __int16 *)DriverNode + 20);
*(_QWORD *)&DestinationString.Length = 0i64;
v4 = *((unsigned __int16 *)DriverNode + 36) + v2 + 4;
DestinationString.Buffer = 0i64;
RemainingString = 0i64;
TimeFields = 0i64;
if( *((_QWORD *)DriverNode + 12) )
v4 += *((unsigned __int16 *)DriverNode + 44) + 2;
if( !PnpIsNullGuid(DriverNode + 47) )
v4 += 72;
if( (unsigned __int64)v4 + 2 > 0xFFFE )
{
v6 = -1073741562;
goto LABEL_13;
}
DestinationString.Length = v4;
DestinationString.MaximumLength = v4 + 2;
DestinationString.Buffer = (wchar_t *)ExpAllocateStringRoutine((unsigned __int16)(v4 + 2));
if( !DestinationString.Buffer )
{
v6 = -1073741670;
goto LABEL_13;
}
v6 = RtlUnicodeStringPrintfEx(&DestinationString, &RemainingString, 0x800ui64, (WCHAR *)L"%wZ:%wZ");
if( v6 >= 0 )
{
if( *((_QWORD *)DriverNode + 12) )
{
v6 = RtlUnicodeStringPrintfEx(&RemainingString, &RemainingString, 0x800ui64, (WCHAR *)L",%wZ");
if( v6 < 0 )
goto LABEL_13;
Length = *((_WORD *)DriverNode + 44) + 2 + DestinationString.Length;
DestinationString.Length = Length;
}
else
{
Length = DestinationString.Length;
}
if( PnpIsNullGuid(DriverNode + 47) )
{
LABEL_12:
*DriverConfigurationId = DestinationString;
DestinationString = 0i64;
goto LABEL_13;
}
if( *((_QWORD *)DriverNode + 12) )
{
LABEL_46:
RtlTimeToTimeFields((INT64 *)DriverNode + 14, (WORD *)&TimeFields, Buffer);
v6 = RtlUnicodeStringPrintf(&RemainingString, (WCHAR *)L",%02d/%02d/%04d,%u.%u.%u.%u");
if( v6 < 0 )
goto LABEL_13;
DestinationString.Length = RemainingString.Length + Length;
goto LABEL_12;
}
Buffer = 0i64;
v10 = 0i64;
v6 = 0;
if( (RemainingString.Length & 1) != 0
|| (RemainingString.MaximumLength & 1) != 0
|| RemainingString.Length > RemainingString.MaximumLength
|| RemainingString.MaximumLength == 0xFFFF )
{
v6 = -1073741811;
LABEL_44:
if( v6 < 0 )
goto LABEL_13;
Length += 2;
DestinationString.Length = Length;
goto LABEL_46;
}
if( !RemainingString.Buffer && (RemainingString.Length || RemainingString.MaximumLength) )
{
v6 = -1073741811;
}
else
{
Buffer = (INT64)RemainingString.Buffer;
v10 = (unsigned __int64)RemainingString.MaximumLength >> 1;
}
if( v6 >= 0 )
{
v11 = (WCHAR *)Buffer;
v12 = v10;
v13 = 0i64;
if( v10 )
{
v14 = L",";
v15 = 0x7FFFi64;
v16 = v10;
v6 = 0;
do
{
if( !v15 )
break;
if( !*v14 )
break;
*(const wchar_t *)((char *)v14 + Buffer - (_QWORD)L",") = *v14;
--v15;
++v14;
++v13;
--v16;
}
while( v16 );
if( !v16 && v15 && *v14 )
v6 = -2147483643;
pcchNewDestLength = v13;
v12 = v10 - v13;
v11 = (WCHAR *)(Buffer + 2 * v13);
ppszDestEnd = v11;
pcchRemaining = v10 - v13;
if( v6 < 0 )
{
RtlUnicodeStringExHandleOtherFlags(
(WCHAR *)Buffer,
v10,
Buffer,
(size_t *)&pcchNewDestLength,
&ppszDestEnd,
(size_t *)&pcchRemaining,
0x800u);
v11 = ppszDestEnd;
v12 = pcchRemaining;
LOWORD(v13) = pcchNewDestLength;
}
}
else
{
Buffer = -Buffer;
v6 = Buffer != 0 ? -2147483643 : -1073741811;
}
RemainingString.Length = 2 * v13;
if( (int)(v6 + 0x80000000) < 0 || v6 == -2147483643 )
{
RemainingString.Length = 0;
RemainingString.MaximumLength = 2 * v12;
RemainingString.Buffer = v11;
}
goto LABEL_44;
}
}
LABEL_13:
RtlFreeAnsiString(&DestinationString);
return v6;
}Referenced by:
PiDevCfgQueryDriverConfiguration