AdtpBuildObjectTypeStrings

INT64 __fastcall AdtpBuildObjectTypeStrings(
        _UNICODE_STRING *SourceModule,
        _UNICODE_STRING *ObjectTypeName,
        _SE_ADT_OBJECT_TYPE *ObjectTypeList,
        UINT64 ObjectTypeCount,
        _UNICODE_STRING *ResultantString,
        UINT8 *FreeWhenDone){
  _UNICODE_STRING *v6; 
  size_t v7; 
  UINT8 *v9; 
  __int64 v11; 
  ACCESS_MASK v12; 
  USHORT *p_Level; 
  int v14; 
  char v15; 
  int appended; 
  unsigned __int16 v17; 
  UINT8 *v18; 
  int StringIndex; 
  UNICODE_STRING StringIndex_4; 
  __int64 v23; 
  v6 = ObjectTypeName;
  StringIndex = 0;
  v7 = (unsigned int)ObjectTypeCount;
  StringIndex_4 = 0i64;
  LOBYTE(v23) = 0;
  RtlInitUnicodeString(ResultantString, &word_14001B020, (WCHAR)ObjectTypeList);
  v9 = FreeWhenDone;
  *FreeWhenDone = 0;
  if( !(_DWORD)v7 )
    return 0i64;
  qsort((WCHAR *)ObjectTypeList, v7, (const WCHAR *)0x18, CompareObjectTypes);
  v11 = 0i64;
  v12 = ObjectTypeList->AccessMask - 1;
  p_Level = &ObjectTypeList->Level;
  do
  {
    v14 = *(_DWORD *)(p_Level + 1);
    if( v14 != v12 )
    {
      v15 = 0;
      v12 = *(_DWORD *)(p_Level + 1);
      if( v14 )
      {
        appended = AdtpBuildAccessesString(SourceModule, v6, v14, 1, &StringIndex_4, 0i64, 0i64, 0i64, (__int64)&v23);
        if( appended < 0 )
          return(unsigned int)appended;
        v15 = v23;
      }
      else
      {
        RtlInitUnicodeString(&StringIndex_4, L"---\r\n", 0);
        LOBYTE(v23) = 0;
      }
      appended = AdtpAppendString(ResultantString, FreeWhenDone, &StringIndex_4, (UINT64 *)&StringIndex);
      if( v15 )
        ExFreePoolWithTag(StringIndex_4.Buffer, 0);
      if( appended < 0 )
        return(unsigned int)appended;
      v9 = FreeWhenDone;
    }
    v17 = *p_Level;
    if( *p_Level >= 4u )
      v17 = 3;
    appended = AdtpAppendZString(ResultantString, v9, off_1400098D8[v17], (UINT64 *)&StringIndex);
    if( appended < 0 )
      return(unsigned int)appended;
    appended = AdtpBuildGuidString(&ObjectTypeList[v11].ObjectType, &StringIndex_4, v18);
    if( appended < 0 )
      return(unsigned int)appended;
    appended = AdtpAppendString(ResultantString, v9, &StringIndex_4, (UINT64 *)&StringIndex);
    ExFreePoolWithTag(StringIndex_4.Buffer, 0);
    if( appended < 0 )
      return(unsigned int)appended;
    appended = AdtpAppendZString(ResultantString, v9, L"\r\n", (UINT64 *)&StringIndex);
    if( appended < 0 )
      return(unsigned int)appended;
    v6 = ObjectTypeName;
    v11 = (unsigned int)(v11 + 1);
    p_Level += 12;
  }
  while( (unsigned int)v11 < (unsigned int)v7 );
  return 0;
}

Referenced by:

AdtpPackageParameters