PiDevCfgAppendMultiSz
NTSTATUS __stdcall PiDevCfgAppendMultiSz(
_UNICODE_STRING *MultiSz,
const VOID **StringAppend,
const VOID **MultiSzAppend,
UINT8 AllowDuplicates){
NTSTATUS v4;
unsigned int v9;
wchar_t *StringRoutine;
wchar_t *v11;
unsigned __int16 v12;
size_t v13;
unsigned __int16 Length;
int v15;
UINT64 v16;
WCHAR v17;
wchar_t *Buffer;
unsigned __int16 v19;
unsigned __int64 v20;
_WORD *i;
__int64 v22;
__int16 v23;
unsigned __int64 v24;
_UNICODE_STRING UnicodeString[3];
v4 = 0;
*(_QWORD *)&UnicodeString[0].Length = 0i64;
UnicodeString[0].Buffer = 0i64;
if( MultiSz->Buffer )
{
Length = MultiSz->Length;
v15 = MultiSz->Length;
if( Length <= 2u )
v15 = 2;
if( StringAppend )
{
v16 = (unsigned int)*(unsigned __int16 *)StringAppend + 2 + v15;
}
else
{
if( !MultiSzAppend )
goto LABEL_40;
v16 = (unsigned int)*(unsigned __int16 *)MultiSzAppend + v15;
if( Length )
v16 = (unsigned int)(v16 - 2);
}
if( (unsigned int)v16 > 0xFFFE )
goto LABEL_4;
UnicodeString[0].Buffer = (wchar_t *)ExpAllocateStringRoutine(v16);
Buffer = UnicodeString[0].Buffer;
if( !UnicodeString[0].Buffer )
goto LABEL_6;
if( MultiSz->Length <= 2u )
{
v19 = 0;
}
else
{
memmove(UnicodeString[0].Buffer, MultiSz->Buffer, MultiSz->Length);
v19 = MultiSz->Length - 2;
}
if( StringAppend )
{
if( AllowDuplicates || !PnpMultiSzContainsString(MultiSz->Buffer, (const WCHAR *)StringAppend[1], v17) )
{
memmove((char *)UnicodeString[0].Buffer + v19, StringAppend[1], *(unsigned __int16 *)StringAppend);
v20 = (unsigned __int64)(unsigned __int16)(v19 + *(_WORD *)StringAppend) >> 1;
v19 += *(_WORD *)StringAppend + 2;
UnicodeString[0].Buffer[v20] = 0;
}
}
else if( MultiSzAppend )
{
if( AllowDuplicates )
{
memmove((char *)UnicodeString[0].Buffer + v19, MultiSzAppend[1], *(unsigned __int16 *)MultiSzAppend);
v19 += *(_WORD *)MultiSzAppend - 2;
}
else
{
for( i = MultiSzAppend[1]; *i; i += v24 >> 1 )
{
v22 = -1i64;
do
++v22;
while( i[v22] );
v23 = 2 * v22 + 2;
v24 = (unsigned int)(2 * v22 + 2);
if( !PnpMultiSzContainsString(MultiSz->Buffer, i, v17) )
{
memmove((char *)UnicodeString[0].Buffer + v19, i, v24);
v19 += v23;
}
}
}
}
UnicodeString[0].Length = v19 + 2;
UnicodeString[0].MaximumLength = v19 + 2;
Buffer[(unsigned __int64)v19 >> 1] = 0;
RtlFreeAnsiString(MultiSz);
*MultiSz = UnicodeString[0];
UnicodeString[0] = 0i64;
goto LABEL_41;
}
if( !StringAppend )
{
if( MultiSzAppend )
{
if( PnpDuplicateUnicodeString((__int64)MultiSz, (__int64)MultiSzAppend) )
goto LABEL_41;
goto LABEL_6;
}
LABEL_40:
v4 = -1073741811;
goto LABEL_41;
}
v9 = *(unsigned __int16 *)StringAppend + 4;
if( v9 > 0xFFFE )
{
LABEL_4:
v4 = -2147483643;
goto LABEL_41;
}
StringRoutine = (wchar_t *)ExpAllocateStringRoutine(v9);
MultiSz->Buffer = StringRoutine;
v11 = StringRoutine;
if( !StringRoutine )
{
LABEL_6:
v4 = -1073741670;
goto LABEL_41;
}
v12 = *(_WORD *)StringAppend;
MultiSz->Length = *(_WORD *)StringAppend;
v13 = *(unsigned __int16 *)StringAppend;
if( (_WORD)v13 )
{
memmove(v11, StringAppend[1], v13);
MultiSz->Buffer[(unsigned __int64)MultiSz->Length >> 1] = 0;
MultiSz->Length += 2;
v12 = MultiSz->Length;
v11 = MultiSz->Buffer;
}
v11[(unsigned __int64)v12 >> 1] = 0;
MultiSz->Length += 2;
MultiSz->MaximumLength = MultiSz->Length;
LABEL_41:
RtlFreeAnsiString(UnicodeString);
return v4;
}Referenced by:
PiDevCfgConfigureDevice
PiDevCfgQueryIncludedDriverConfigurations
PiDevCfgRequestDriverConfigurations
PiDrvDbResolveFilePathKeyValues
PpDevCfgProcessDeviceExtensions