HalpDmaInitializeMasterAdapter

NTSTATUS __stdcall HalpDmaInitializeMasterAdapter(
        _HALP_DMA_MASTER_ADAPTER_OBJECT *MasterAdapter,
        _LARGE_INTEGER ContiguousBase,
        _LARGE_INTEGER ScatterBase,
        UINT8 CanCross64KBoundaries){
  UINT64 LowPart; 
  unsigned int v6; 
  _HALP_ALLOC_CONTEXT *v8; 
  UINT8 *v9; 
  _RTL_BITMAP *v10; 
  _HALP_ALLOC_CONTEXT *v11; 
  _HALP_ALLOC_CONTEXT *v12; 
  _HALP_DMA_TRANSLATION_BUFFER *TranslationBuffer; 
  VOID *v14; 
  VOID *v15; 
  _RTL_BITMAP *ContiguousMapRegisters; 
  int v18; 
  unsigned __int8 v19; 

  MasterAdapter->ContiguousAdapterQueue.Blink = &MasterAdapter->ContiguousAdapterQueue;
  MasterAdapter->ContiguousAdapterQueue.Flink = &MasterAdapter->ContiguousAdapterQueue;
  LowPart = ScatterBase.anonymous_0.LowPart;
  MasterAdapter->ScatterAdapterQueue.Blink = &MasterAdapter->ScatterAdapterQueue;
  v6 = (v18 + 31) & 0xFFFFFFE0;
  MasterAdapter->ScatterAdapterQueue.Flink = &MasterAdapter->ScatterAdapterQueue;
  MasterAdapter->AdapterObject.SpinLock = 0i64;
  MasterAdapter->AdapterObject.GrowLock = 0i64;
  MasterAdapter->AdapterObject.ContiguousMapRegisters = 0i64;
  MasterAdapter->AdapterObject.IsMasterAdapter = 1;
  MasterAdapter->AdapterObject.DmaCanCross64K = v19;
  v9 = HalpMmAllocCtxAlloc((_HALP_ALLOC_CONTEXT *)MasterAdapter, (unsigned __int64)v6 >> 3);
  if( v9 )
  {
    v10 = (_RTL_BITMAP *)HalpMmAllocCtxAlloc(v8, 0x10ui64);
    MasterAdapter->AdapterObject.ContiguousMapRegisters = v10;
    if( v10 )
    {
      v10->SizeOfBitMap = v6;
      v10->Buffer = (unsigned int *)v9;
      RtlSetAllBits(MasterAdapter->AdapterObject.ContiguousMapRegisters);
      if( !(_DWORD)LowPart )
        return 0;
      TranslationBuffer = HalpDmaAllocateTranslationBuffer(v12, &MasterAdapter->AdapterObject.ContiguousTranslationEnd);
      MasterAdapter->AdapterObject.ContiguousTranslations = TranslationBuffer;
      if( TranslationBuffer )
      {
        v14 = MmMapIoSpaceEx(ContiguousBase, (unsigned int)LowPart, 4ui64);
        v15 = v14;
        if( v14 )
        {
          if( HalpDmaCommitContiguousMapBuffers(
                 &MasterAdapter->AdapterObject,
                 v14,
                 ContiguousBase.QuadPart,
                 ((unsigned int)LowPart >> 12) + ((LowPart & 0xFFF) != 0)) )
          {
            MasterAdapter->ContiguousPageLimit = (unsigned int)LowPart >> 13;
            return 0;
          }
          MmUnmapIoSpace(v15, LowPart);
        }
        HalpDmaFreeTranslationBuffer(MasterAdapter->AdapterObject.ContiguousTranslations);
      }
    }
    HalpMmAllocCtxFree(v11, v9);
  }
  ContiguousMapRegisters = MasterAdapter->AdapterObject.ContiguousMapRegisters;
  if( ContiguousMapRegisters )
    HalpMmAllocCtxFree(v8, ContiguousMapRegisters);
  return -1073741670;
}

Referenced by:

HalpDmaInit