HalpAllocateCommonBufferThin

INT64 __fastcall HalpAllocateCommonBufferThin(
        PVOID BugCheckParameter3,
        INT64 *a2,
        INT64 *a3,
        UINT64 a4,
        CHAR a5,
        INT64 a6,
        UINT64 IdealNode,
        INT64 a8,
        INT64 a9){
  MDL *v9; 
  UINT64 v12; 
  PVOID v14; 
  int v15; 
  __int64 v16; 
  MEMORY_CACHING_TYPE CacheType; 
  unsigned int v18; 
  LARGE_INTEGER v19; 
  LARGE_INTEGER v20; 
  struct _MDL *PagesForMdl; 
  INT64 v22; 
  UINT64 *p_a4a; 
  INT64 *v24; 
  int v25; 
  INT64 v26; 
  INT64 v27; 
  unsigned int v28; 
  _QWORD *PoolWithTag; 
  UINT64 v30; 
  unsigned __int64 v31; 
  UINT64 *v33; 
  unsigned __int64 *v34; 
  unsigned __int8 v35; 
  unsigned __int64 v36; 
  unsigned __int64 v37; 
  bool v38; 
  unsigned __int64 v39; 
  UINT64 Flags; 
  UINT64 v41; 
  INT64 v42; 
  UINT64 a4a; 
  INT64 v44; 
  v44 = 0i64;
  v9 = 0i64;
  v42 = 0i64;
  a4a = 0i64;
  v12 = (unsigned int)a4;
  v14 = 0i64;
  v15 = HalpDmaReferenceDomainObject((INT64)BugCheckParameter3);
  if( v15 < 0 )
    return(unsigned int)v15;
  v16 = *((_QWORD *)BugCheckParameter3 + 9);
  if( v16 )
    *(_BYTE *)(v16 + 516) = 1;
  CacheType = MmCached;
  if( a6 )
  {
    CacheType = *(_DWORD *)a6;
    if( *(_DWORD *)a6 > 1u )
    {
      v15 = -1073741811;
LABEL_27:
      HalpDmaDereferenceDomainObject(BugCheckParameter3);
      if( v14 )
        MmUnmapLockedPages(v14, v9);
      if( v9 )
        MiFreePagesFromMdl(v9, 0i64);
      return(unsigned int)v15;
    }
  }
  if( (a5 & 1) != 0 )
  {
    v18 = 1;
    v12 = ((_DWORD)v12 + 0x1FFFFF) & 0xFFE00000;
    do
    {
      if( 1i64 << v18 >= (unsigned __int64)(unsigned int)v12 )
        break;
      ++v18;
    }
    while( v18 < 0x3F );
  }
  v19 = *(LARGE_INTEGER *)((char *)BugCheckParameter3 + 24);
  v20 = *(LARGE_INTEGER *)((char *)BugCheckParameter3 + 16);
  if( (_DWORD)IdealNode == 0x80000000 )
  {
    PagesForMdl = MmAllocatePagesForMdlEx(0i64, (MEMORY_CACHING_TYPE)v20.LowPart, v19.LowPart);
  }
  else
  {
    LODWORD(v41) = 20;
    LODWORD(Flags) = IdealNode;
    PagesForMdl = MmAllocatePartitionNodePagesForMdlEx(0i64, v20, v19, v12, CacheType, Flags, v41, 0i64);
  }
  v9 = PagesForMdl;
  if( !PagesForMdl || (v14 = MmMapLockedPagesSpecifyCache(PagesForMdl, 0, CacheType, 0i64, 0, 0x40000010u)) == 0i64 )
  {
    v15 = -1073741670;
    goto LABEL_27;
  }
  p_a4a = 0i64;
  v24 = 0i64;
  if( a2 )
  {
    p_a4a = &a4a;
    a4a = *a2;
  }
  if( a3 )
  {
    v24 = &v44;
    v44 = *a3;
  }
  v25 = HalpDomainLaAllocate((INT64)BugCheckParameter3, v12, v22, p_a4a, (INT64)v24, (INT64)&v42);
  v27 = v42;
  v15 = v25;
  if( v25 < 0
    || (v28 = v9->ByteCount + v9->ByteOffset,
        v15 = HalpIommuDomainMapLogical(
                *((_QWORD *)BugCheckParameter3 + 5),
                v26,
                (INT64)&v9[1],
                (v28 >> 12) + ((v28 & 0xFFF) != 0),
                v42),
        v15 < 0) )
  {
LABEL_25:
    if( v27 )
      HalpDomainLaDelete((INT64)BugCheckParameter3, v27);
    goto LABEL_27;
  }
  PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x28ui64, 0x206C6148ui64);
  v31 = (unsigned __int64)PoolWithTag;
  if( !PoolWithTag )
  {
    v15 = -1073741670;
    goto LABEL_25;
  }
  v33 = (UINT64 *)((char *)BugCheckParameter3 + 96);
  PoolWithTag[3] = v9;
  PoolWithTag[4] = BugCheckParameter3;
  KeAcquireSpinLockRaiseToDpc((UINT64 *)BugCheckParameter3 + 12, v30);
  v34 = (unsigned __int64 *)((char *)BugCheckParameter3 + 80);
  v36 = v35;
  v37 = *v34;
  if( (v34[1] & 1) != 0 && v37 )
    v37 ^= (unsigned __int64)v34;
  v38 = 0;
  if( v37 )
  {
    while( 1 )
    {
      if( *(_QWORD *)(*(_QWORD *)(v37 + 24) + 24i64) <= (unsigned __int64)v14 )
      {
        v39 = *(_QWORD *)(v37 + 8);
        if( (v34[1] & 1) != 0 )
        {
          if( !v39 )
            goto LABEL_47;
          v39 ^= v37;
        }
        if( !v39 )
        {
LABEL_47:
          v38 = 1;
          break;
        }
      }
      else
      {
        v39 = *(_QWORD *)v37;
        if( (v34[1] & 1) != 0 )
        {
          if( !v39 )
            break;
          v39 ^= v37;
        }
        if( !v39 )
          break;
      }
      v37 = v39;
    }
  }
  RtlRbInsertNodeEx(v34, v37, v38, v31);
  KxReleaseSpinLock(v33);
  __writecr8(v36);
  *(_QWORD *)a8 = v27;
  *(_QWORD *)a9 = v14;
  return(unsigned int)v15;
}

Referenced by:

HalAllocateCommonBufferExThin
HalAllocateCommonBufferWithBoundsThin
HalAllocateDomainCommonBufferThin