HalpDmaForceAllocation

_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaForceAllocation(
        _ADAPTER_OBJECT *ChildAdapter,
        _HALP_DMA_TRANSLATION_BUFFER *TranslationBufferHead,
        _HALP_DMA_TRANSLATION_BUFFER_POSITION *CrashDumpHint,
        UINT64 PageCount,
        INT64 ContiguousAllocation,
        UINT64 *PagesAllocated){
  _HALP_DMA_TRANSLATION_BUFFER *Buffer; 
  int v7; 
  _HALP_DMA_TRANSLATION_ENTRY *v8; 
  int v9; 
  unsigned int v10; 
  _HALP_DMA_TRANSLATION_ENTRY *result; 
  unsigned int Offset; 
  char i; 
  __int64 v14; 
  unsigned int EntryCount; 
  __int64 j; 
  int v17; 
  _HALP_DMA_TRANSLATION_ENTRY *v18; 

  Buffer = CrashDumpHint->Buffer;
  v7 = PageCount;
  if( !CrashDumpHint->Buffer )
  {
    if( CrashDumpHint->Offset == -1 )
    {
      v8 = 0i64;
      v9 = 0;
      v10 = 0;
      goto LABEL_4;
    }
    CrashDumpHint->Offset = 0;
    Buffer = TranslationBufferHead;
    CrashDumpHint->Buffer = TranslationBufferHead;
  }
  Offset = CrashDumpHint->Offset;
  v10 = 0;
  for( i = 1; ; i = 0 )
  {
    v14 = 0i64;
    v8 = 0i64;
    v9 = 0;
    while( Buffer )
    {
      EntryCount = Buffer->EntryCount;
      v10 = Offset;
      for( j = (__int64)&Buffer->Entries[Offset]; v10 < EntryCount; ++v10 )
      {
        if( (*(_QWORD *)(j + 48) & 0xFFFFFFFFFFFFF000ui64) != 0 )
        {
          if( v8 )
            *(_QWORD *)(v14 + 8) = j;
          else
            v8 = (_HALP_DMA_TRANSLATION_ENTRY *)j;
          ++v9;
          v14 = j;
          if( v9 == v7 )
            goto LABEL_4;
        }
        else
        {
          v17 = 0;
          if( !(_BYTE)ContiguousAllocation )
            v17 = v9;
          v9 = v17;
          v18 = 0i64;
          if( !(_BYTE)ContiguousAllocation )
            v18 = v8;
          v8 = v18;
        }
        j += 72i64;
      }
      Buffer = Buffer->Next;
      Offset = 0;
    }
    if( !(_BYTE)ContiguousAllocation )
      break;
    if( !i || CrashDumpHint->Buffer == TranslationBufferHead && !CrashDumpHint->Offset )
    {
      CrashDumpHint->Offset = 0;
      result = 0i64;
      CrashDumpHint->Buffer = TranslationBufferHead;
      return result;
    }
    Offset = 0;
    Buffer = TranslationBufferHead;
  }
LABEL_4:
  CrashDumpHint->Buffer = Buffer;
  CrashDumpHint->Offset = v10;
  if( Buffer )
    goto LABEL_7;
  if( !(_BYTE)ContiguousAllocation )
  {
    CrashDumpHint->Offset = -1;
LABEL_7:
    if( !(_BYTE)ContiguousAllocation )
      *(_DWORD *)PagesAllocated = v9;
  }
  return v8;
}

Referenced by:

HalpDmaAllocateMapRegistersAtHighLevel