ViAllocateContiguousMemory

INT64 __fastcall ViAllocateContiguousMemory(INT64 a1){
  int v2; 
  LARGE_INTEGER v3; 
  INT64 result; 
  unsigned int v5; 
  __int64 v6; 
  UINT64 Protect; 
  UINT64 PreferredNode; 
  LARGE_INTEGER v9; 
  v9.HighPart = 0;
  v2 = 0xFFFF;
  if( *(_BYTE *)(a1 + 203) )
  {
    v3.QuadPart = -1i64;
  }
  else
  {
    if( *(_BYTE *)(a1 + 200) )
    {
      v9.LowPart = -1;
    }
    else
    {
      if( *(_DWORD *)(a1 + 212) == 1 )
        v2 = 0xFFFFFF;
      v9.LowPart = v2;
    }
    v3 = v9;
  }
  *(_DWORD *)(a1 + 296) = 32;
  *(_QWORD *)(a1 + 304) = a1 + 288;
  RtlClearAllBits((RTL_BITMAP *)(a1 + 296));
  result = (INT64)ExAllocatePoolWithTag(NonPagedPoolNx, 0x100ui64, 0x566C6148ui64);
  *(_QWORD *)(a1 + 264) = result;
  if( result )
  {
    v5 = 0;
    v6 = 0i64;
    do
    {
      LODWORD(PreferredNode) = 0x80000000;
      LODWORD(Protect) = 4;
      *(_QWORD *)(v6 + *(_QWORD *)(a1 + 264)) = MmAllocateContiguousNodeMemory(
                                                  0x3000ui64,
                                                  0i64,
                                                  v3,
                                                  0i64,
                                                  Protect,
                                                  PreferredNode);
      if( *(_QWORD *)(v6 + *(_QWORD *)(a1 + 264)) )
      {
        result = 272i64;
      }
      else
      {
        RtlSetBits((RTL_BITMAP *)(a1 + 296), v5, 1ui64);
        result = 276i64;
      }
      _InterlockedIncrement((volatile signed __int32 *)(result + a1));
      ++v5;
      v6 += 8i64;
    }
    while( v5 < 0x20 );
  }
  return result;
}

Referenced by:

ViHookDmaAdapter