HalpDmaAllocateLocalScatterPool

NTSTATUS __stdcall HalpDmaAllocateLocalScatterPool(_ADAPTER_OBJECT *ChildAdapter, UINT64 NumberOfMapRegisters){
  unsigned int v2; 
  _HALP_DMA_TRANSLATION_ENTRY *v4; 
  _MDL *v5; 
  _HALP_ALLOC_CONTEXT *v6; 
  _MDL *Mdl; 
  unsigned int v8; 
  UINT8 *v9; 
  _HALP_ALLOC_CONTEXT *v10; 
  VOID *v11; 
  UINT8 *v12; 
  UINT8 *v13; 
  _HALP_ALLOC_CONTEXT *v14; 
  _HALP_DMA_TRANSLATION_ENTRY *v15; 
  _ADAPTER_OBJECT *v16; 
  unsigned int v17; 
  _HALP_DMA_TRANSLATION_ENTRY *v18; 
  __int64 v19; 
  int v20; 
  _HALP_DMA_TRANSLATION_ENTRY *v21; 
  unsigned int v22; 
  _HALP_DMA_TRANSLATION_ENTRY *v23; 
  __int64 v24; 
  int v25; 
  NTSTATUS result; 
  VOID *VirtualAddress; 
  UINT64 PagesAllocated; 

  VirtualAddress = 0i64;
  LODWORD(PagesAllocated) = 0;
  v2 = NumberOfMapRegisters;
  v4 = 0i64;
  v5 = HalpDmaAllocateScatterMemory((_LARGE_INTEGER *)ChildAdapter, (VOID **)NumberOfMapRegisters, &VirtualAddress);
  Mdl = v5;
  if( v5 )
  {
    v8 = v5->ByteCount >> 12;
    v9 = HalpMmAllocCtxAlloc(v6, 0x18ui64);
    v11 = VirtualAddress;
    v12 = v9;
    if( v9 )
    {
      v13 = HalpMmAllocCtxAlloc(v10, 72i64 * v8);
      v4 = (_HALP_DMA_TRANSLATION_ENTRY *)v13;
      if( v13 )
      {
        *(_QWORD *)v12 = 0i64;
        *((_DWORD *)v12 + 3) = 0;
        memset(v13, 0i64, 72 * v8);
        *((_DWORD *)v12 + 2) = v8;
        *((_QWORD *)v12 + 2) = v4;
        ChildAdapter->AdapterObject.ScatterTranslationEnd.Offset = 0;
        ChildAdapter->AdapterObject.ScatterTranslations = (_HALP_DMA_TRANSLATION_BUFFER *)v12;
        ChildAdapter->AdapterObject.ScatterTranslationEnd.Buffer = (_HALP_DMA_TRANSLATION_BUFFER *)v12;
        v4 = HalpDmaCommitScatterMapBuffers(&ChildAdapter->AdapterObject, v11, 0i64, 0i64, Mdl);
        if( v4 )
        {
          ChildAdapter->AllocationHandle = Mdl;
          ChildAdapter->VirtualAddress = v11;
          goto LABEL_11;
        }
        HalpMmAllocCtxFree(v6, ChildAdapter->AdapterObject.ScatterTranslations->Entries);
      }
      HalpMmAllocCtxFree(v14, v12);
    }
    if( v11 )
      MmUnmapLockedPages(v11, Mdl);
    MmFreePagesFromMdl(Mdl);
    ExFreePoolWithTag(Mdl, 0);
    ChildAdapter->AdapterObject.ScatterTranslations = 0i64;
  }
  v8 = 0;
LABEL_11:
  if( v8 != v2 )
  {
    v15 = HalpDmaAllocateScatterPagesFromScatterPool(
            (_ADAPTER_OBJECT *)v6,
            &ChildAdapter->MasterAdapter->AdapterObject,
            v2 - v8,
            0,
            1u,
            &PagesAllocated);
    if( v15 )
    {
      v17 = PagesAllocated;
      v18 = v15;
      if( (_DWORD)PagesAllocated )
      {
        v19 = (unsigned int)PagesAllocated;
        do
        {
          v18->u.VirtualAddress = (void *)((unsigned __int64)v18->u.VirtualAddress & 0xFFFFFFFFFFFFFFF3ui64 | 8);
          v18 = v18->Next;
          --v19;
        }
        while( v19 );
      }
      v4 = HalpDmaPrependTranslations(v15, (_HALP_DMA_TRANSLATION_ENTRY *)v17);
      v8 += v20;
    }
    if( v8 != v2 )
    {
      v21 = HalpDmaAllocateScatterPagesFromContiguousPool(
              v16,
              &ChildAdapter->MasterAdapter->AdapterObject,
              v2 - v8,
              0,
              1u,
              &PagesAllocated);
      if( v21 )
      {
        v22 = PagesAllocated;
        v23 = v21;
        if( (_DWORD)PagesAllocated )
        {
          v24 = (unsigned int)PagesAllocated;
          do
          {
            v23->u.VirtualAddress = (void *)((unsigned __int64)v23->u.VirtualAddress & 0xFFFFFFFFFFFFFFF3ui64 | 8);
            v23 = v23->Next;
            --v24;
          }
          while( v24 );
        }
        v4 = HalpDmaPrependTranslations(v21, (_HALP_DMA_TRANSLATION_ENTRY *)v22);
        v8 += v25;
      }
      if( !v8 )
        return -1073741670;
    }
  }
  ChildAdapter->MapRegistersPerChannel = v2;
  result = 0;
  ChildAdapter->AdapterObject.ScatterBufferListHead = v4;
  ChildAdapter->AdapterObject.NumberOfFreeScatterBuffers = v8;
  return result;
}

Referenced by:

HalpDmaAllocateChildAdapterV2
HalpDmaAllocateChildAdapterV3