AdtpBuildStringListString
__int64 __fastcall AdtpBuildStringListString(
unsigned int *a1,
__int64 a2,
wchar_t **a3,
__int64 a4,
_DWORD *a5,
char *a6){
unsigned int v8;
__int64 v9;
unsigned __int16 *v10;
unsigned int v12;
__int64 v13;
wchar_t *PoolWithTag;
char v15;
unsigned int v16;
unsigned __int16 Length;
__int64 v18;
UNICODE_STRING *v19;
struct _UNICODE_STRING Destination;
*(_DWORD *)(&Destination.MaximumLength + 1) = 0;
v8 = 2;
if( a1 && *a1 )
{
v9 = *a1;
v10 = (unsigned __int16 *)(*((_QWORD *)a1 + 1) + 8i64);
do
{
v8 += *v10 + 8;
v10 += 12;
--v9;
}
while( v9 );
if( v8 > 0xFFFF )
return 3221225485i64;
v12 = v8 >> 1;
v13 = (unsigned int)*a5;
if( (unsigned int)v13 + v12 >= 0x400 )
{
PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 2i64 * v12, 0x6B416553ui64);
if( !PoolWithTag )
return 3221225495i64;
v15 = 1;
}
else
{
*a5 = v13 + v12;
PoolWithTag = (wchar_t *)(a4 + 2 * v13);
v15 = 0;
}
v16 = 0;
*a6 = v15;
Length = 0;
Destination.MaximumLength = 2 * v12;
v18 = *((_QWORD *)a1 + 1);
Destination.Length = 0;
Destination.Buffer = PoolWithTag;
if( *a1 )
{
v19 = (UNICODE_STRING *)(v18 + 8);
do
{
RtlAppendUnicodeToString(&Destination, (PWCHAR)L"\r\n\t\t");
RtlAppendUnicodeStringToString(&Destination, v19);
++v16;
v19 = (UNICODE_STRING *)((char *)v19 + 24);
}
while( v16 < *a1 );
Length = Destination.Length;
}
if( a3 )
{
*a3 = PoolWithTag;
a3[1] = (wchar_t *)((unsigned int)Length + 2);
}
else
{
MEMORY[0] = Destination;
}
}
else if( a3 )
{
a3[1] = (wchar_t *)4;
*a3 = (wchar_t *)"-";
}
return 0i64;
}Referenced by:
AdtpPackageParameters