HsaGrowPasidTable

INT64 __fastcall HsaGrowPasidTable(INT64 a1, INT64 a2, UINT64 a3){
  unsigned int v3; 
  unsigned __int64 *v6; 
  VOID *PoolWithTag; 
  unsigned int v8; 
  unsigned int v9; 
  VOID *v10; 
  void *v11; 
  v3 = a3;
  if( (unsigned int)a3 >= 0x40000 )
    return 3221225659i64;
  v6 = *(unsigned __int64 **)(a2 + 40);
  if( !v6 )
  {
    PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x2000ui64, 0x61734848ui64);
    *(_QWORD *)(a2 + 40) = PoolWithTag;
    if( !PoolWithTag )
      return 3221225626i64;
    memset((INT64)PoolWithTag, 0i64);
    v6 = *(unsigned __int64 **)(a2 + 40);
  }
  v8 = 0;
  v9 = v3 >> 9;
  do
  {
    if( (*(_BYTE *)v6 & 1) == 0 )
    {
      v10 = ExAllocatePoolWithTag(NonPagedPoolNx, 0x1000ui64, 0x61734848ui64);
      v11 = v10;
      if( !v10 )
        return 3221225626i64;
      memset((INT64)v10, 0i64);
      v6[512] = (unsigned __int64)v11;
      *v6 = *v6 ^ (*v6 ^ MmGetPhysicalAddress(v11).QuadPart & 0xFFFFFFFFFFFFF000ui64) & 0xFFFFFFFFFF000i64 | 1;
    }
    ++v8;
    ++v6;
  }
  while( v8 <= v9 );
  return 0i64;
}

Referenced by:

No references.