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