HalAllocateCommonBufferVector

NTSTATUS __stdcall HalAllocateCommonBufferVector(
        INT64 a1,
        UINT64 a2,
        UINT64 a3,
        _MEMORY_CACHING_TYPE a4,
        UINT64 a5,
        INT64 a6,
        UINT64 a7,
        INT64 a8,
        INT64 *a9){
  UINT64 v9; 
  _MDL *v10; 
  UINT8 *v11; 
  INT64 v12; 
  UINT64 v13; 
  INT64 v14; 
  unsigned __int8 CurrentIrql; 
  _HALP_ALLOC_CONTEXT *v17; 
  UINT8 *v18; 
  UINT8 *v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  _HALP_ALLOC_CONTEXT *v23; 
  UINT8 *v24; 
  unsigned __int64 v25; 
  _LARGE_INTEGER v26; 
  int v27; 
  __int64 v28; 
  _MEMORY_CACHING_TYPE v29; 
  _MDL *PartitionNodePagesForMdl; 
  char *v31; 
  INT64 v32; 
  char *v33; 
  UINT8 *v34; 
  char *v35; 
  __int64 v36; 
  PDUMPWRITER_FILL_HEADERS *v37; 
  INT64 v38; 
  unsigned __int64 v39; 
  INT64 *v40; 
  _QWORD *v41; 
  __int64 v42; 
  _MDL *v43; 
  _MDL *Next; 
  unsigned __int8 v45; 
  UINT8 **v46; 
  unsigned __int64 v47; 
  __int64 v48; 
  _HALP_ALLOC_CONTEXT *v49; 
  UINT64 v50; 
  PVOID BugCheckParameter4; 
  UINT64 IdealNode; 
  UINT64 IdealNodea; 
  UINT64 Flags; 
  UINT8 *Memory; 
  INT64 v56; 
  INT64 v57; 
  PDUMPWRITER_FILL_HEADERS *v58; 
  UINT64 v60; 
  INT64 v61; 
  _MEMORY_CACHING_TYPE CacheType; 

  CacheType = a4;
  v61 = a3;
  v60 = a2;
  v9 = a3;
  v10 = 0i64;
  v57 = 0i64;
  v11 = 0i64;
  v12 = 0i64;
  v13 = a2;
  v14 = a1;
  CurrentIrql = KeGetCurrentIrql();
  if( CurrentIrql > 2u )
    KeBugCheckEx(0x1DCu, (PVOID)1, (PVOID)CurrentIrql, 0i64, 0i64);
  if( (_DWORD)a6 )
    return -1073741811;
  v56 = *(_QWORD *)(a1 + 504);
  if( HalpDmaReferenceDomainObject(v56, a2, (INT64 *)a3, a4) < 0 )
    return -1073741670;
  v18 = HalpMmAllocCtxAlloc(v17, 0x48ui64);
  v19 = v18;
  if( !v18 )
  {
    v33 = 0i64;
    goto LABEL_42;
  }
  memset(v18, 0i64, 0x48u);
  v20 = (unsigned int)a7;
  v21 = (unsigned int)a7;
  *((_QWORD *)v19 + 4) = v56;
  v22 = 16 * v21;
  v24 = HalpMmAllocCtxAlloc(v23, v22);
  Memory = v24;
  v11 = v24;
  if( !v24 )
    goto LABEL_40;
  memset(v24, 0i64, v22);
  *((_QWORD *)v19 + 8) = v11;
  v25 = (a8 + 4095) & 0xFFFFFFFFFFFFF000ui64;
  if( *(_DWORD *)(v56 + 64) != 2 )
  {
    v27 = 36;
    v28 = 0i64;
    while( 1i64 << v28 < v25 )
    {
      if( (unsigned __int64)++v28 >= 0x40 )
        goto LABEL_15;
    }
    v25 = 1i64 << v28;
LABEL_15:
    if( 1i64 << v28 == v25 )
    {
      v26.QuadPart = v25;
      goto LABEL_17;
    }
    v11 = Memory;
LABEL_40:
    v33 = 0i64;
    goto LABEL_31;
  }
  v26.QuadPart = 0i64;
  v27 = 20;
  v13 = 0i64;
  v9 = -1i64;
LABEL_17:
  LODWORD(Flags) = v27;
  *((_DWORD *)v19 + 6) = a7;
  LODWORD(IdealNode) = a5;
  v29 = CacheType;
  v58 = (PDUMPWRITER_FILL_HEADERS *)(v25 * v20);
  *((_QWORD *)v19 + 2) = v25;
  PartitionNodePagesForMdl = MmAllocatePartitionNodePagesForMdlEx(
                               (_LARGE_INTEGER)v13,
                               (_LARGE_INTEGER)v9,
                               v26,
                               v25 * v20,
                               v29,
                               IdealNode,
                               Flags,
                               0i64);
  v10 = PartitionNodePagesForMdl;
  if( !PartitionNodePagesForMdl )
  {
    v33 = 0i64;
    goto LABEL_30;
  }
  LODWORD(IdealNodea) = 1073741840;
  LODWORD(BugCheckParameter4) = 0;
  v31 = (char *)MmMapLockedPagesSpecifyCache(
                  PartitionNodePagesForMdl,
                  0,
                  CacheType,
                  0i64,
                  (UINT64)BugCheckParameter4,
                  IdealNodea);
  v33 = v31;
  if( !v31 )
    goto LABEL_30;
  *((_QWORD *)v19 + 5) = v10;
  *((_QWORD *)v19 + 6) = v31;
  if( v20 )
  {
    v34 = Memory;
    v35 = v33;
    v36 = v20;
    do
    {
      *(_QWORD *)v34 = v35;
      v35 += v25;
      v34 += 16;
      --v36;
    }
    while( v36 );
  }
  if( *(_DWORD *)(v56 + 64) != 2 )
  {
    if( v20 )
    {
      v41 = Memory + 8;
      v42 = 8 * (v25 >> 12);
      v43 = v10 + 1;
      do
      {
        Next = v43->Next;
        v43 = (_MDL *)((char *)v43 + v42);
        *v41 = (_QWORD)Next << 12;
        v41 += 2;
        --v20;
      }
      while( v20 );
    }
    goto LABEL_35;
  }
  v37 = v58;
  if( HalpDomainLaAllocate(v56, v58, v32, &v60, (INT64)&v61, (INT64)&v57) < 0 )
  {
    v12 = v57;
    goto LABEL_30;
  }
  v39 = (unsigned __int64)v37 + 4095;
  v12 = v57;
  if( HalpIommuDomainMapLogical(*(_QWORD *)(v56 + 40), v38, (INT64)&v10[1], v39 >> 12, v57) < 0 )
  {
LABEL_30:
    v11 = Memory;
LABEL_31:
    v14 = a1;
LABEL_42:
    HalpDmaDereferenceDomainObject((PVOID)v56);
    if( v19 )
      HalpMmAllocCtxFree(v49, v19);
    if( v11 )
      HalpMmAllocCtxFree(v49, v11);
    if( v10 )
    {
      if( v33 )
        MmUnmapLockedPages(v33, v10);
      MiFreePagesFromMdl(v10, 0i64, v50);
      ExFreePoolWithTag(v10, 0);
    }
    if( v12 )
      HalpDomainLaDelete(*(_QWORD *)(v14 + 504), v12);
    return -1073741670;
  }
  if( v20 )
  {
    v40 = (INT64 *)(Memory + 8);
    do
    {
      *v40 = v12;
      v12 += v25;
      v40 += 2;
      --v20;
    }
    while( v20 );
  }
LABEL_35:
  v45 = KeAcquireSpinLockRaiseToDpc((UINT64 *)(v56 + 120));
  v46 = (UINT8 **)(v56 + 104);
  v47 = v45;
  v48 = *(_QWORD *)(v56 + 104);
  if( *(_QWORD *)(v48 + 8) != v56 + 104 )
    __fastfail(3u);
  *((_QWORD *)v19 + 1) = v46;
  *(_QWORD *)v19 = v48;
  *(_QWORD *)(v48 + 8) = v19;
  *v46 = v19;
  KxReleaseSpinLock((UINT64 *)(v56 + 120));
  __writecr8(v47);
  *a9 = (INT64)v19;
  return 0;
}

Referenced by:

No references.