HalpAllocateMapRegisters

NTSTATUS __stdcall HalpAllocateMapRegisters(
        _ADAPTER_OBJECT *ChildAdapter,
        UINT64 NumberOfMapRegisters,
        UINT64 BaseAddressCount,
        _MAP_REGISTER_ENTRY *MapRegisterArray){
  _MAP_REGISTER_ENTRY *v4; 
  _HALP_DMA_MASTER_ADAPTER_OBJECT *MasterAdapter; 
  ULONG v6; 
  unsigned int v7; 
  unsigned int MapRegistersPerChannel; 
  unsigned int v11; 
  _MAP_REGISTER_ENTRY *v12; 
  _HALP_DMA_TRANSLATION_ENTRY *MapRegisters; 
  UINT64 v14; 
  _HALP_DMA_TRANSLATION_ENTRY *v15; 
  __int64 v16; 

  v4 = MapRegisterArray;
  MasterAdapter = ChildAdapter->MasterAdapter;
  v6 = NumberOfMapRegisters;
  v7 = BaseAddressCount;
  if( ChildAdapter->RequestLine != -1 )
    return -1073741808;
  if( (_DWORD)BaseAddressCount * (_DWORD)NumberOfMapRegisters && ChildAdapter->NeedsMapRegisters )
  {
    if( (unsigned int)(BaseAddressCount * NumberOfMapRegisters) > 0x800 )
      return -1073741670;
    MapRegistersPerChannel = ChildAdapter->MapRegistersPerChannel;
    if( !MapRegistersPerChannel )
      return -1073741670;
    if( (unsigned int)NumberOfMapRegisters > MapRegistersPerChannel )
      return -1073741811;
    v11 = 0;
    if( (_DWORD)BaseAddressCount )
    {
      v12 = MapRegisterArray;
      do
      {
        MapRegisters = HalpDmaAllocateMapRegisters(ChildAdapter, v6);
        v12->MapRegister = MapRegisters;
        if( !MapRegisters )
        {
          v14 = (v6 + 16) << 12;
          if( ChildAdapter->ScatterGather )
            HalpDmaGrowScatterMapBuffers(&MasterAdapter->AdapterObject, v14);
          else
            HalpDmaGrowContiguousMapBuffers(&MasterAdapter->AdapterObject, v14);
          v15 = HalpDmaAllocateMapRegisters(ChildAdapter, v6);
          v12->MapRegister = v15;
          if( !v15 )
            break;
        }
        ++v11;
        ++v12;
      }
      while( v11 < v7 );
    }
    if( v11 != v7 )
    {
      while( v11 )
        IoFreeMapRegisters(&ChildAdapter->AdapterObject.DmaHeader, v4[--v11].MapRegister, v6);
      return -1073741670;
    }
  }
  else if( (_DWORD)BaseAddressCount )
  {
    v16 = (unsigned int)BaseAddressCount;
    do
    {
      v4->MapRegister = 0i64;
      ++v4;
      --v16;
    }
    while( v16 );
  }
  return 0;
}

Referenced by:

No references.