HalpRegisterDmaController

NTSTATUS __stdcall HalpRegisterDmaController(
        _DMA_INITIALIZATION_BLOCK *ControllerDescription,
        _UNICODE_STRING *ResourceUnicodeId){
  _UNICODE_STRING *p_DestinationString; 
  ULONG v4; 
  PSTR MemoryInternal; 
  PSTR v6; 
  NTSTATUS result; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  __int64 InternalDataSize; 
  ULONG v11; 
  PSTR *v12; 
  UINT64 Revision; 
  UINT64 Instance; 
  UINT64 Uid; 
  UINT64 ResourceIdLength; 
  _UNICODE_STRING DestinationString; 
  WCHAR SourceString[80]; 

  p_DestinationString = ResourceUnicodeId;
  DestinationString = 0i64;
  if( *(_QWORD *)&ControllerDescription->Header != 0x5000000001i64 )
    return -1073741811;
  if( !ResourceUnicodeId )
  {
    LODWORD(ResourceIdLength) = 75;
    LODWORD(Uid) = ControllerDescription->ControllerId;
    LOWORD(Instance) = 0;
    LOWORD(Revision) = 1;
    HalpExtBuildResourceIdString(
      0x5446534Dui64,
      0i64,
      0x4200ui64,
      0i64,
      Revision,
      Instance,
      Uid,
      ResourceIdLength,
      SourceString);
    p_DestinationString = &DestinationString;
    RtlInitUnicodeString(&DestinationString, SourceString);
  }
  v4 = (((ControllerDescription->InternalDataSize + 7 + ((160 * ControllerDescription->ChannelCount + 231) & 0xFFFFFFF8)) & 0xFFFFFFF8)
      + 9
      + p_DestinationString->Length) & 0xFFFFFFF8;
  MemoryInternal = HalpMmAllocateMemoryInternal(v4, MmCached);
  v6 = MemoryInternal;
  if( !MemoryInternal )
    return -1073741670;
  memset(MemoryInternal, 0i64, v4);
  v8 = (unsigned __int64)(v6 + 231) & 0xFFFFFFFFFFFFFFF8ui64;
  *((_QWORD *)v6 + 7) = v8;
  v9 = 160i64 * ControllerDescription->ChannelCount + v8;
  *((_QWORD *)v6 + 8) = v9;
  InternalDataSize = ControllerDescription->InternalDataSize;
  *((_QWORD *)v6 + 3) = v6 + 16;
  *((_QWORD *)v6 + 2) = v6 + 16;
  *((_QWORD *)v6 + 21) = 0i64;
  *((_QWORD *)v6 + 25) = (v9 + InternalDataSize + 7) & 0xFFFFFFFFFFFFFFF8ui64;
  memmove(*((VOID **)v6 + 8), ControllerDescription->InternalData, ControllerDescription->InternalDataSize);
  *((_WORD *)v6 + 96) = 0;
  *((_WORD *)v6 + 97) = p_DestinationString->Length + 2;
  RtlCopyUnicodeString((PUNICODE_STRING)v6 + 12, p_DestinationString);
  v6[176] = 12;
  v6[72] = ControllerDescription->CacheCoherent;
  v11 = _InterlockedIncrement(&HalpDmaLastControllerId);
  *((_DWORD *)v6 + 8) = v11;
  ControllerDescription->ControllerId = v11;
  *((_DWORD *)v6 + 11) = ControllerDescription->ChannelCount;
  *((_DWORD *)v6 + 19) = ControllerDescription->DmaAddressWidth;
  *((_DWORD *)v6 + 12) = 1;
  *((_DWORD *)v6 + 9) = ControllerDescription->MinimumRequestLine;
  *((_DWORD *)v6 + 10) = ControllerDescription->MaximumRequestLine;
  *((_DWORD *)v6 + 40) = ControllerDescription->SupportedPortWidths;
  *((_DWORD *)v6 + 41) = ControllerDescription->MinimumTransferUnit;
  v6[177] = ControllerDescription->GeneratesInterrupt;
  if( ControllerDescription->GeneratesInterrupt )
  {
    *((_DWORD *)v6 + 45) = ControllerDescription->Gsi;
    *((_DWORD *)v6 + 46) = ControllerDescription->InterruptPolarity;
    *((_DWORD *)v6 + 47) = ControllerDescription->InterruptMode;
  }
  *((_QWORD *)v6 + 10) = ControllerDescription->Operations->InitializeController;
  *((_QWORD *)v6 + 11) = ControllerDescription->Operations->ValidateRequestLineBinding;
  *((_QWORD *)v6 + 12) = ControllerDescription->Operations->QueryMaxFragments;
  *((_QWORD *)v6 + 13) = ControllerDescription->Operations->ProgramChannel;
  *((_QWORD *)v6 + 14) = ControllerDescription->Operations->ConfigureChannel;
  *((_QWORD *)v6 + 15) = ControllerDescription->Operations->FlushChannel;
  *((_QWORD *)v6 + 16) = ControllerDescription->Operations->HandleInterrupt;
  *((_QWORD *)v6 + 17) = ControllerDescription->Operations->ReadDmaCounter;
  *((_QWORD *)v6 + 18) = ControllerDescription->Operations->ReportCommonBuffer;
  *((_QWORD *)v6 + 19) = ControllerDescription->Operations->CancelTransfer;
  v12 = (PSTR *)qword_140C49B08;
  if( (INT64 *)*qword_140C49B08 != &qword_140C49B00 )
    __fastfail(3u);
  *((_QWORD *)v6 + 1) = qword_140C49B08;
  *(_QWORD *)v6 = &qword_140C49B00;
  *v12 = v6;
  result = 0;
  qword_140C49B08 = v6;
  return result;
}

Referenced by:

HalpExtRegisterResourceDescriptor