HalpDmaCheckMdlAccessibility

CHAR *__stdcall HalpDmaCheckMdlAccessibility(INT64 a1, INT64 *a2, UINT64 a3, UINT64 a4, CHAR *a5, _MDL **a6){
  unsigned int v7; 
  unsigned int v8; 
  INT64 *v9; 
  CHAR v11; 
  CHAR *result; 
  __int64 v13; 
  unsigned int v14; 
  unsigned int v15; 
  int v16; 
  _MDL *Mdl; 
  _MDL *v18; 
  VOID *v19; 
  unsigned int v20; 
  INT64 *v21; 
  unsigned int v22; 
  _MDL *Next; 
  UINT64 v24; 
  UINT64 Priority; 
  VOID *VirtualAddress; 
  _MDL **p_Next; 

  v7 = a4;
  v8 = a3;
  v9 = a2;
  *a6 = 0i64;
  p_Next = 0i64;
  if( KeGetCurrentIrql() > 2u || *(_BYTE *)(a1 + 437) )
  {
LABEL_3:
    if( *a6 )
    {
      do
      {
        Next = (*a6)->Next;
        IoFreeMdl(*a6);
        *a6 = Next;
      }
      while( Next );
    }
    v11 = 0;
  }
  else
  {
    v11 = 1;
    if( a2 )
    {
      while( v7 )
      {
        v13 = *((unsigned int *)v9 + 11);
        v14 = *((_DWORD *)v9 + 10) - v8;
        if( v14 >= v7 )
          v14 = v7;
        v15 = v13 + v8;
        if( !*(_BYTE *)(a1 + 437) )
        {
          v16 = HalpDmaGetAdapterCacheAlignment((_ADAPTER_OBJECT *)a1) - 1;
          if( (v16 & v15) != 0 || (v14 & v16) != 0 )
            goto LABEL_3;
        }
        VirtualAddress = (VOID *)(v8 + v13 + v9[4]);
        Mdl = IoAllocateMdl(VirtualAddress, v14, 0, 0, 0i64);
        v18 = Mdl;
        if( !Mdl )
          goto LABEL_3;
        if( *a6 )
          *p_Next = Mdl;
        else
          *a6 = Mdl;
        p_Next = &Mdl->Next;
        if( (*((_BYTE *)v9 + 10) & 5) != 0 )
        {
          v19 = (VOID *)v9[3];
        }
        else
        {
          LODWORD(Priority) = 1073741856;
          LODWORD(v24) = 0;
          v19 = MmMapLockedPagesSpecifyCache((_MDL *)v9, 0, MmCached, 0i64, v24, Priority);
        }
        if( !v19 )
          goto LABEL_3;
        IoBuildPartialMdl((_MDL *)v9, v18, VirtualAddress, v14);
        v20 = 4096 - (v15 & 0xFFF);
        v21 = &v9[((unsigned __int64)v15 >> 12) + 6];
        if( v14 )
        {
          while( *(_QWORD *)(a1 + 136) >= (unsigned __int64)(*v21 << 12) || *(_DWORD *)(a1 + 512) == 2 )
          {
            ++v21;
            v22 = v14;
            if( v14 >= v20 )
              v22 = v20;
            v20 = 4096;
            v7 -= v22;
            v14 -= v22;
            if( !v14 )
              goto LABEL_27;
          }
          goto LABEL_3;
        }
LABEL_27:
        v9 = (INT64 *)*v9;
        v8 = 0;
        if( !v9 )
          break;
      }
    }
  }
  result = a5;
  *a5 = v11;
  return result;
}

Referenced by:

HalFlushAdapterBuffersEx
HalMapTransferEx