HalpRegisterDmaController

NTSTATUS __stdcall HalpRegisterDmaController(
        DMA_INITIALIZATION_BLOCK *ControllerDescription,
        UNICODE_STRING *ResourceUnicodeId){
  UNICODE_STRING *p_DestinationString; 
  WCHAR v4; 
  PSTR MemoryInternal; 
  __int64 v6; 
  NTSTATUS result; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  __int64 InternalDataSize; 
  UNICODE_STRING *v11; 
  ULONG v12; 
  __int64 *v13; 
  UINT64 Revision; 
  UINT64 Instance; 
  UINT64 Uid; 
  UINT64 SizeInWords; 
  struct _UNICODE_STRING DestinationString; 
  WCHAR SourceString[80]; 
  p_DestinationString = ResourceUnicodeId;
  DestinationString = 0i64;
  if( *(_QWORD *)&ControllerDescription->Header != 0x5000000001i64 )
    return -1073741811;
  if( !ResourceUnicodeId )
  {
    LODWORD(SizeInWords) = 75;
    LODWORD(Uid) = ControllerDescription->ControllerId;
    LOWORD(Instance) = 0;
    LOWORD(Revision) = 1;
    HalpExtBuildResourceIdString(
      0x5446534Dui64,
      0i64,
      0x4200ui64,
      0i64,
      Revision,
      Instance,
      Uid,
      SizeInWords,
      SourceString);
    p_DestinationString = &DestinationString;
    RtlInitUnicodeString(&DestinationString, SourceString, v4);
  }
  MemoryInternal = HalpMmAllocateMemoryInternal(
                     (((ControllerDescription->InternalDataSize
                      + 7
                      + ((160 * ControllerDescription->ChannelCount + 231) & 0xFFFFFFF8)) & 0xFFFFFFF8)
                    + 9
                    + p_DestinationString->Length) & 0xFFFFFFF8,
                     MmCached);
  v6 = (__int64)MemoryInternal;
  if( !MemoryInternal )
    return -1073741670;
  memset((INT64)MemoryInternal, 0i64);
  v8 = (v6 + 231) & 0xFFFFFFFFFFFFFFF8ui64;
  *(_QWORD *)(v6 + 56) = v8;
  v9 = 160i64 * ControllerDescription->ChannelCount + v8;
  *(_QWORD *)(v6 + 64) = v9;
  InternalDataSize = ControllerDescription->InternalDataSize;
  *(_QWORD *)(v6 + 24) = v6 + 16;
  *(_QWORD *)(v6 + 16) = v6 + 16;
  *(_QWORD *)(v6 + 168) = 0i64;
  *(_QWORD *)(v6 + 200) = (v9 + InternalDataSize + 7) & 0xFFFFFFFFFFFFFFF8ui64;
  memmove(*(UINT8 **)(v6 + 64), (UINT8 *)ControllerDescription->InternalData, ControllerDescription->InternalDataSize);
  *(_WORD *)(v6 + 192) = 0;
  *(_WORD *)(v6 + 194) = p_DestinationString->Length + 2;
  RtlCopyUnicodeString((UNICODE_STRING *)(v6 + 192), p_DestinationString, v11);
  *(_BYTE *)(v6 + 176) = 12;
  *(_BYTE *)(v6 + 72) = ControllerDescription->CacheCoherent;
  v12 = _InterlockedIncrement(&HalpDmaLastControllerId);
  *(_DWORD *)(v6 + 32) = v12;
  ControllerDescription->ControllerId = v12;
  *(_DWORD *)(v6 + 44) = ControllerDescription->ChannelCount;
  *(_DWORD *)(v6 + 76) = ControllerDescription->DmaAddressWidth;
  *(_DWORD *)(v6 + 48) = 1;
  *(_DWORD *)(v6 + 36) = ControllerDescription->MinimumRequestLine;
  *(_DWORD *)(v6 + 40) = ControllerDescription->MaximumRequestLine;
  *(_DWORD *)(v6 + 160) = ControllerDescription->SupportedPortWidths;
  *(_DWORD *)(v6 + 164) = ControllerDescription->MinimumTransferUnit;
  *(_BYTE *)(v6 + 177) = ControllerDescription->GeneratesInterrupt;
  if( ControllerDescription->GeneratesInterrupt )
  {
    *(_DWORD *)(v6 + 180) = ControllerDescription->Gsi;
    *(_DWORD *)(v6 + 184) = ControllerDescription->InterruptPolarity;
    *(_DWORD *)(v6 + 188) = ControllerDescription->InterruptMode;
  }
  *(_QWORD *)(v6 + 80) = ControllerDescription->Operations->InitializeController;
  *(_QWORD *)(v6 + 88) = ControllerDescription->Operations->ValidateRequestLineBinding;
  *(_QWORD *)(v6 + 96) = ControllerDescription->Operations->QueryMaxFragments;
  *(_QWORD *)(v6 + 104) = ControllerDescription->Operations->ProgramChannel;
  *(_QWORD *)(v6 + 112) = ControllerDescription->Operations->ConfigureChannel;
  *(_QWORD *)(v6 + 120) = ControllerDescription->Operations->FlushChannel;
  *(_QWORD *)(v6 + 128) = ControllerDescription->Operations->HandleInterrupt;
  *(_QWORD *)(v6 + 136) = ControllerDescription->Operations->ReadDmaCounter;
  *(_QWORD *)(v6 + 144) = ControllerDescription->Operations->ReportCommonBuffer;
  *(_QWORD *)(v6 + 152) = ControllerDescription->Operations->CancelTransfer;
  v13 = (__int64 *)qword_140C49B08;
  if( *(INT64 **)qword_140C49B08 != &HalpDmaControllers )
    __fastfail(3u);
  *(_QWORD *)(v6 + 8) = qword_140C49B08;
  *(_QWORD *)v6 = &HalpDmaControllers;
  *v13 = v6;
  result = 0;
  qword_140C49B08 = v6;
  return result;
}

Referenced by:

HalpExtRegisterResourceDescriptor