HalAllocateCrashDumpRegisters

VOID *__stdcall HalAllocateCrashDumpRegisters(_ADAPTER_OBJECT *ChildAdapter, UINT64 *NumberOfMapRegisters){
  unsigned int v2; 
  int v5; 
  __int64 v6; 
  VOID *result; 
  _HALP_DMA_TRANSLATION_ENTRY *MapRegistersAtHighLevel; 
  int v9; 
  __int64 v10; 

  v2 = 0;
  if( ChildAdapter->NeedsMapRegisters || !ChildAdapter->CacheCoherent )
  {
    if( HalpDmaHibernateRegisterPhase == 1 )
    {
      v5 = (int)HalpDmaHibernatePhase1RegisterSetIndex;
      v6 = 2i64 * (unsigned int)HalpDmaHibernatePhase1RegisterSetIndex;
      *(_DWORD *)NumberOfMapRegisters = *((_DWORD *)&HalpDmaHibernateRegisterSets
                                        + 4 * (unsigned int)HalpDmaHibernatePhase1RegisterSetIndex
                                        + 2);
      result = (VOID *)*((_QWORD *)&HalpDmaHibernateRegisterSets + v6);
      ChildAdapter->MapRegisterBase = result;
      ChildAdapter->NumberOfMapRegisters = *(_DWORD *)NumberOfMapRegisters;
      LODWORD(HalpDmaHibernatePhase1RegisterSetIndex) = v5 + 1;
      return result;
    }
    if( *(_DWORD *)NumberOfMapRegisters > ChildAdapter->MapRegistersPerChannel )
    {
      ChildAdapter->NumberOfMapRegisters = 0;
      result = 0i64;
      *(_DWORD *)NumberOfMapRegisters = 0;
      return result;
    }
    MapRegistersAtHighLevel = HalpDmaAllocateMapRegistersAtHighLevel(
                                (_HALP_DMA_TRANSLATION_ENTRY *)ChildAdapter,
                                NumberOfMapRegisters);
    ChildAdapter->MapRegisterBase = MapRegistersAtHighLevel;
    if( MapRegistersAtHighLevel )
    {
      v9 = HalpDmaHibernateRegisterSetIndex;
      if( (unsigned int)HalpDmaHibernateRegisterSetIndex < 4 )
      {
        v10 = 2i64 * (unsigned int)HalpDmaHibernateRegisterSetIndex;
        *((_QWORD *)&HalpDmaHibernateRegisterSets + v10) = MapRegistersAtHighLevel;
        *((_DWORD *)&HalpDmaHibernateRegisterSets + 2 * v10 + 2) = *(_DWORD *)NumberOfMapRegisters;
        HalpDmaHibernateRegisterSetIndex = v9 + 1;
      }
    }
    else
    {
      *(_DWORD *)NumberOfMapRegisters = 0;
    }
    v2 = *(_DWORD *)NumberOfMapRegisters;
  }
  else
  {
    ChildAdapter->MapRegisterBase = 0i64;
  }
  ChildAdapter->NumberOfMapRegisters = v2;
  result = ChildAdapter->MapRegisterBase;
  HalpDmaHibernateAdapter = ChildAdapter;
  return result;
}

Referenced by:

VfAllocateCrashDumpRegisters