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