EtwpAllocateTraceBuffer

CHAR *__stdcall EtwpAllocateTraceBuffer(INT64 a1, UINT64 a2){
  unsigned __int64 v3; 
  VOID **v4; 
  CHAR *v6; 
  _MDL *PagesForMdl; 
  UINT64 v8; 
  INT64 *CacheType; 
  UINT64 CacheTypea; 
  UINT64 Flags; 
  UINT64 Flagsa; 
  UINT64 Flags_8; 

  v3 = (unsigned int)a2;
  v4 = (VOID **)(a1 + 1304);
  if( *v4 )
    return(CHAR *)EtwpAllocatePartitionMemory(v4, (unsigned int)a2);
  if( (*(_DWORD *)(a1 + 832) & 0x20000000) == 0 )
    return(CHAR *)ExAllocatePoolWithTag(*(unsigned int *)(a1 + 316), (unsigned int)a2, 1115124805i64);
  v6 = 0i64;
  PagesForMdl = (_MDL *)MmAllocatePagesForMdlEx(
                          0i64,
                          (PHYSICAL_ADDRESS)-1i64,
                          (PHYSICAL_ADDRESS)0x200000i64,
                          a2,
                          MmCached,
                          0x65u);
  if( PagesForMdl
    || (PagesForMdl = (_MDL *)MmAllocatePagesForMdlEx(
                                0i64,
                                (PHYSICAL_ADDRESS)-1i64,
                                (PHYSICAL_ADDRESS)0x200000i64,
                                v3,
                                MmCached,
                                0x25u)) != 0i64 )
  {
    qsort((UINT64)&PagesForMdl[1], v3 >> 12, 8ui64, (INT64)EtwpComparePfn, CacheType, Flags, Flags_8);
    LODWORD(Flagsa) = 1073741856;
    LODWORD(CacheTypea) = 0;
    v6 = (CHAR *)MmMapLockedPagesSpecifyCache(PagesForMdl, 0, MmCached, 0i64, CacheTypea, Flagsa);
    if( v6 )
    {
      if( !*(_QWORD *)(a1 + 1312) )
      {
        *(_QWORD *)(a1 + 1312) = PagesForMdl;
        PagesForMdl = 0i64;
      }
    }
    else
    {
      MiFreePagesFromMdl(PagesForMdl, 0i64, v8);
    }
    if( PagesForMdl )
      ExFreePoolWithTag(PagesForMdl, 0);
  }
  return v6;
}

Referenced by:

EtwpAllocateFreeBuffers
EtwpPreserveLogger