ViAllocateContiguousMemory

VOID __stdcall ViAllocateContiguousMemory(_ADAPTER_INFORMATION *AdapterInformation){
  int v2; 
  _LARGE_INTEGER v3; 
  VOID **PoolWithTag; 
  unsigned int v5; 
  __int64 v6; 
  __int64 v7; 
  UINT64 Protect; 
  UINT64 PreferredNode; 
  _LARGE_INTEGER v10; 

  v10.anonymous_0.HighPart = 0;
  v2 = 0xFFFF;
  if( *((_BYTE *)AdapterInformation + 203) )
  {
    v3.QuadPart = -1i64;
  }
  else
  {
    if( *((_BYTE *)AdapterInformation + 200) )
    {
      v10.anonymous_0.LowPart = -1;
    }
    else
    {
      if( AdapterInformation[53] == 1 )
        v2 = 0xFFFFFF;
      v10.anonymous_0.LowPart = v2;
    }
    v3 = v10;
  }
  AdapterInformation[74] = 32;
  *((_QWORD *)AdapterInformation + 38) = AdapterInformation + 72;
  RtlClearAllBits((PRTL_BITMAP)(AdapterInformation + 74));
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x100ui64, 1449943368i64);
  *((_QWORD *)AdapterInformation + 33) = PoolWithTag;
  if( PoolWithTag )
  {
    v5 = 0;
    v6 = 0i64;
    do
    {
      LODWORD(PreferredNode) = 0x80000000;
      LODWORD(Protect) = 4;
      *(_QWORD *)(v6 + *((_QWORD *)AdapterInformation + 33)) = MmAllocateContiguousNodeMemory(
                                                                 0x3000ui64,
                                                                 0i64,
                                                                 v3,
                                                                 0i64,
                                                                 Protect,
                                                                 PreferredNode);
      if( *(_QWORD *)(v6 + *((_QWORD *)AdapterInformation + 33)) )
      {
        v7 = 68i64;
      }
      else
      {
        RtlSetBits((_RTL_BITMAP *)(AdapterInformation + 74), v5, 1ui64);
        v7 = 69i64;
      }
      _InterlockedIncrement(&AdapterInformation[v7]);
      ++v5;
      v6 += 8i64;
    }
    while( v5 < 0x20 );
  }
}

Referenced by:

ViHookDmaAdapter