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