HalpRegisterDmaChannel

NTSTATUS __stdcall HalpRegisterDmaChannel(_DMA_CHANNEL_INITIALIZATION_BLOCK *ChannelDescription){
  INT64 v2; 
  ULONG ControllerId; 
  int v4; 
  INT64 v5; 
  __int64 ChannelNumber; 
  __int64 v7; 

  if( ChannelDescription->Header.TableVersion != 1 )
    return -1073741811;
  if( ChannelDescription->Header.TableSize != 36 )
    return -1073741811;
  v2 = qword_140C49B00;
  if( (INT64 *)qword_140C49B00 == &qword_140C49B00 )
    return -1073741811;
  ControllerId = ChannelDescription->ControllerId;
  while( 1 )
  {
    v4 = *(_DWORD *)(v2 + 32);
    v5 = v2;
    if( v4 == ControllerId )
      break;
    v2 = *(_QWORD *)v2;
    if( (INT64 *)v2 == &qword_140C49B00 )
    {
      if( v4 != ControllerId )
        return -1073741811;
      break;
    }
  }
  ChannelNumber = ChannelDescription->ChannelNumber;
  v7 = *(_QWORD *)(v5 + 56) + 160 * ChannelNumber;
  *(_DWORD *)v7 = ChannelNumber;
  *(_BYTE *)(v7 + 6) = 0;
  *(_WORD *)(v7 + 4) = 1;
  *(_DWORD *)(v7 + 120) = ChannelDescription->CommonBufferLength;
  *(_QWORD *)(v7 + 128) = 0i64;
  *(_QWORD *)(v7 + 136) = 0i64;
  *(_QWORD *)(v7 + 8) = 0i64;
  *(_QWORD *)(v7 + 16) = 0i64;
  *(_QWORD *)(v7 + 24) = 0i64;
  *(_DWORD *)(v7 + 32) = 0;
  *(_QWORD *)(v7 + 64) = HalpDmaControllerDpcRoutine;
  *(_DWORD *)(v7 + 40) = 275;
  *(_QWORD *)(v7 + 72) = v7;
  *(_QWORD *)(v7 + 96) = 0i64;
  *(_QWORD *)(v7 + 56) = 0i64;
  *(_QWORD *)(v7 + 152) = v7 + 144;
  *(_QWORD *)(v7 + 144) = v7 + 144;
  *(_BYTE *)(v7 + 104) = ChannelDescription->GeneratesInterrupt;
  if( ChannelDescription->GeneratesInterrupt )
  {
    *(_DWORD *)(v7 + 108) = ChannelDescription->Gsi;
    *(_DWORD *)(v7 + 112) = ChannelDescription->InterruptPolarity;
    *(_DWORD *)(v7 + 116) = ChannelDescription->InterruptMode;
  }
  if( !*(_DWORD *)(v7 + 120) || *(_QWORD *)(v5 + 144) )
    return 0;
  else
    return -1073741811;
}

Referenced by:

HalpExtRegisterResourceDescriptor