HalpLaAllocateBlt

NTSTATUS __stdcall HalpLaAllocateBlt(
        PINTERRUPT_INITIALIZE_IO_UNIT *a1,
        PDUMPWRITER_FILL_HEADERS *a2,
        INT64 a3,
        UINT64 *a4,
        INT64 a5,
        INT64 a6){
  PINTERRUPT_INITIALIZE_IO_UNIT v8; 
  UINT64 v9; 
  unsigned __int64 i; 
  __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  PINTERRUPT_INITIALIZE_IO_UNIT v14; 
  int v15; 
  unsigned __int64 v16; 
  __int64 *Free; 
  INT64 v18; 
  __int64 v19; 
  _QWORD *v20; 
  INT64 *v21; 
  INT64 *v22; 
  INT64 *v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 

  v8 = a1[2];
  v9 = 0i64;
  if( a2 > (PDUMPWRITER_FILL_HEADERS *)a1[1] )
    return -1073741811;
  for( i = (unsigned __int64)*a1; i < (unsigned __int64)a2; i *= 2i64 )
    ;
  if( a4 )
    v9 = *a4;
  if( a5 )
    v8 = *(PINTERRUPT_INITIALIZE_IO_UNIT *)a5;
  if( ((i - 1) & i) != 0 )
    return -1073741811;
  if( !i )
    return -1073741811;
  v11 = ~(i - 1);
  v12 = v11 & (i + v9 - 1);
  if( v12 < v9 )
    return -1073741811;
  v13 = -1i64;
  if( v8 != (PINTERRUPT_INITIALIZE_IO_UNIT)-1i64 )
  {
    v13 = (v11 & ((unsigned __int64)v8 + 1)) - 1;
    if( v13 > (unsigned __int64)v8 )
      return -1073741811;
  }
  if( v12 > v13 || i > v13 - v12 + 1 && v13 - v12 != -1i64 )
    return -1073741811;
  v14 = a1[7];
  v15 = 0;
  v16 = *((_QWORD *)v14 + 6);
  if( *((_QWORD *)v14 + 8) + v16 - 1 < v12 || v16 > v13 )
    return -1073741811;
  Free = HalpLaBltFindFree(i, (__int64)a1, v12, v13);
  v18 = (INT64)Free;
  if( Free )
  {
    v19 = *Free;
    if( *(_QWORD *)(v19 + 8) != v18 || (v20 = *(_QWORD **)(v18 + 8), *v20 != v18) )
      __fastfail(3u);
    *v20 = v19;
    v21 = (INT64 *)v18;
    *(_QWORD *)(v19 + 8) = v20;
    *(_QWORD *)(v18 + 8) = v18;
    *(_QWORD *)v18 = v18;
    while( *(_QWORD *)(v18 + 64) != i )
    {
      v15 = HalpLapSplitNode((INT64)a1, v18);
      if( v15 < 0 )
        goto LABEL_34;
      v22 = *(INT64 **)(v18 + 24);
      v23 = *(INT64 **)(v18 + 32);
      v18 = (INT64)v22;
      v24 = v22[8] - 1 + v22[6];
      if( v24 < v12 )
        v18 = (INT64)v23;
      if( v24 < v12 )
        v23 = v22;
      HalpLaBltAdd(v23, (INT64)a1);
    }
    v25 = *(_QWORD *)(v18 + 48);
    if( v25 >= v12 && *(_QWORD *)(v18 + 64) + v25 - 1 <= v13 )
    {
      *(_QWORD *)(v18 + 40) = 0i64;
      *(_BYTE *)(v18 + 56) = 1;
      *(_QWORD *)(v18 + 72) = a2;
      a1[4] = (PINTERRUPT_INITIALIZE_IO_UNIT)((char *)a1[4] + (_QWORD)a2);
      a1[5] = (PINTERRUPT_INITIALIZE_IO_UNIT)((char *)a1[5] + *(_QWORD *)(v18 + 64));
      *(_QWORD *)a6 = *(_QWORD *)(v18 + 48);
      return v15;
    }
LABEL_34:
    HalpLapDeleteSubtree((INT64 **)a1, v21);
  }
  return -1073741670;
}

Referenced by:

HalpDomainLaAllocate