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