HalpConstructScatterGatherListThin

INT64 __fastcall HalpConstructScatterGatherListThin(INT64 rcx0){
  INT64 v1; 
  int v2; 
  void(__fastcall *v4)(_QWORD, _QWORD, _QWORD, _QWORD); 
  INT64 v5; 
  void *v6; 
  INT64 v7; 
  __int64 *v8; 
  unsigned int v9; 
  __int64 v10; 
  char v11; 
  INT64 v12; 
  __int64 v13; 
  __int64 v14; 
  unsigned int v15; 
  INT64 v16; 
  unsigned __int64 v17; 
  int v18; 
  void(__fastcall *v20)(_QWORD, _QWORD, _QWORD, _QWORD); 
  __int64 v21; 
  __int64 v22; 
  unsigned int v23; 
  INT64 a1; 
  int v25; 
  unsigned int v26; 
  INT64 a6; 
  INT64 v28; 
  v1 = *(_QWORD *)(rcx0 + 24);
  v2 = 0;
  v4 = *(void(__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD))(rcx0 + 64);
  v5 = *(unsigned int *)(rcx0 + 60);
  v6 = *(void **)(rcx0 + 88);
  v7 = *(_QWORD *)(v1 + 504);
  v8 = *(__int64 **)(rcx0 + 48);
  v9 = *(_DWORD *)(rcx0 + 56);
  v10 = *(_QWORD *)(rcx0 + 80);
  v11 = *(_BYTE *)(rcx0 + 96);
  v28 = v7;
  a1 = v1;
  v25 = v5;
  v20 = v4;
  if( *(_BYTE *)(rcx0 + 98) )
    v12 = *(_QWORD *)(v1 + 552);
  else
    v12 = 0i64;
  *(_DWORD *)v10 = 0;
  a6 = v12;
  *(_QWORD *)(v10 + 8) = rcx0;
  if( v8 )
  {
    v13 = 0i64;
    while( v9 )
    {
      v14 = 3 * v13;
      v15 = v9;
      v22 = v14;
      if( *((_DWORD *)v8 + 10) - (int)v5 <= v9 )
        v15 = *((_DWORD *)v8 + 10) - v5;
      v16 = v9 - v15;
      v23 = v15;
      v26 = v16;
      v21 = ((_WORD)v5 + (unsigned __int16)*((_DWORD *)v8 + 11)) & 0xFFF;
      v17 = ((unsigned __int64)v15 + v21 + 4095) >> 12;
      if( !*(_BYTE *)(rcx0 + 98) )
      {
        v18 = HalpDomainLaAllocate(v7, (unsigned int)((_DWORD)v17 << 12), v5, 0i64, 0i64, (INT64)&a6);
        v12 = a6;
        v2 = v18;
        if( v18 < 0 )
          goto LABEL_24;
        LODWORD(v5) = v25;
        v7 = v28;
      }
      v2 = HalpIommuDomainMapLogical(
             *(_QWORD *)(v7 + 40),
             v16,
             (INT64)&v8[((unsigned __int64)(unsigned int)(v5 + *((_DWORD *)v8 + 11)) >> 12) + 6],
             (unsigned int)v17,
             v12);
      if( v2 < 0 )
        goto LABEL_24;
      v5 = 0i64;
      v25 = 0;
      *(_QWORD *)(v10 + 8 * v22 + 32) = 0i64;
      *(_QWORD *)(v10 + 8 * v22 + 16) = v12 + v21;
      *(_DWORD *)(v10 + 8 * v22 + 24) = v23;
      v8 = (__int64 *)*v8;
      v13 = (unsigned int)(*(_DWORD *)v10 + 1);
      *(_DWORD *)v10 = v13;
      if( *(_BYTE *)(rcx0 + 98) )
      {
        v12 += (unsigned __int64)(unsigned int)v17 << 12;
        a6 = v12;
      }
      if( !v8 )
        break;
      v9 = v26;
      v7 = v28;
    }
    v4 = v20;
  }
  if( v6 )
  {
    _m_prefetchw(v6);
    if( (_InterlockedOr((volatile signed __int32 *)v6, 1u) & 2) != 0 )
      v2 = -1073741536;
  }
  v12 = 0i64;
  if( v4 )
    v4(*(_QWORD *)(rcx0 + 32), *(_QWORD *)(rcx0 + 40), v10, *(_QWORD *)(rcx0 + 72));
  if( v2 < 0 )
  {
LABEL_24:
    if( *(_DWORD *)v10 )
      HalpPutScatterGatherListThin(*(_QWORD *)(rcx0 + 24), (_DWORD *)v10);
    if( !*(_BYTE *)(rcx0 + 98) )
    {
      if( v12 )
        HalpDomainLaDelete(v28, v12);
      *(_BYTE *)(rcx0 + 98) = 1;
      if( HalpDmaUseEmergencyLogicalAddressResources(a1, (_QWORD *)rcx0, v11 == 0) )
        return(unsigned int)HalpConstructScatterGatherListThin(rcx0);
      else
        return v11 != 0 ? (unsigned int)v2 : 0;
    }
  }
  return(unsigned int)v2;
}

Referenced by:

HalpBuildScatterGatherListThin
HalpConstructScatterGatherListThin
HalpDmaReturnEmergencyLogicalAddressResources