ExtEnvRegisterIommu
NTSTATUS __stdcall ExtEnvRegisterIommu(PVOID arg1, PVOID arg2){
_QWORD *v2;
_QWORD *v3;
int v5;
NTSTATUS v6;
_QWORD *v7;
_QWORD *v8;
char v9;
unsigned int v10;
unsigned __int16 Length;
unsigned int v12;
PSTR MemoryInternal;
PSTR v14;
unsigned __int64 v15;
__int64 v16;
__int64 v17;
size_t v18;
const VOID *v19;
int v20;
PSTR *v21;
UINT64 Revision;
UINT64 Instance;
UINT64 Uid;
UINT64 ResourceIdLength;
_UNICODE_STRING DestinationString;
WCHAR SourceString[80];
v3 = v2;
DestinationString = 0i64;
if( *(_DWORD *)arg1 != 1 )
return -1073741811;
if( *((_DWORD *)arg1 + 1) != 104 )
return -1073741811;
v5 = *((_DWORD *)arg1 + 5);
if( (v5 & 0xFFFF8000) != 0 )
return -1073741811;
v6 = 0;
if( !*((_DWORD *)arg1 + 18) )
return -1073741811;
v7 = (_QWORD *)*((_QWORD *)arg1 + 7);
if( !v7[1] || (v5 & 2) != 0 && !*(_QWORD *)(*((_QWORD *)arg1 + 8) + 72i64) )
return -1073741811;
if( (v5 & 0x40) != 0 && (!v7[14] || !v7[15] || !v7[16]) )
return -1073741811;
if( (v5 & 0x20) != 0 )
{
v8 = (_QWORD *)*((_QWORD *)arg1 + 8);
if( !v8[1] || !v8[2] || !v8[3] || !v8[4] || !v8[5] || !v8[7] || !v8[8] || !v8[10] || !v8[11] || !v8[12] )
return -1073741811;
}
v9 = 0;
if( !*((_DWORD *)arg1 + 4) && *((_QWORD *)arg1 + 1) )
v9 = 1;
LODWORD(ResourceIdLength) = 75;
LODWORD(Uid) = *((_DWORD *)arg1 + 25);
LOWORD(Instance) = 0;
LOWORD(Revision) = 1;
HalpExtBuildResourceIdString(
0x5446534Dui64,
0i64,
0x4300ui64,
*((unsigned __int16 *)arg1 + 36),
Revision,
Instance,
Uid,
ResourceIdLength,
SourceString);
RtlInitUnicodeString(&DestinationString, SourceString);
v10 = 536;
if( !v9 )
v10 = (*((_DWORD *)arg1 + 4) + 543) & 0xFFFFFFF8;
Length = DestinationString.Length;
v12 = (v10 + DestinationString.Length + 9) & 0xFFFFFFF8;
MemoryInternal = HalpMmAllocateMemoryInternal(v12, MmCached);
v14 = MemoryInternal;
if( !MemoryInternal )
return -1073741670;
memset(MemoryInternal, 0i64, v12);
v15 = (unsigned __int64)(v14 + 543) & 0xFFFFFFFFFFFFFFF8ui64;
if( v9 )
{
*((_QWORD *)v14 + 2) = *((_QWORD *)arg1 + 1);
}
else
{
*((_QWORD *)v14 + 2) = v15;
v15 = (*((unsigned int *)arg1 + 4) + 7i64 + v15) & 0xFFFFFFFFFFFFFFF8ui64;
}
*((_QWORD *)v14 + 65) = v15;
v14[40] = 12;
v16 = *((_QWORD *)arg1 + 7);
*(_OWORD *)(v14 + 56) = *(_OWORD *)v16;
*(_OWORD *)(v14 + 72) = *(_OWORD *)(v16 + 16);
*(_OWORD *)(v14 + 88) = *(_OWORD *)(v16 + 32);
*(_OWORD *)(v14 + 104) = *(_OWORD *)(v16 + 48);
*(_OWORD *)(v14 + 120) = *(_OWORD *)(v16 + 64);
*(_OWORD *)(v14 + 136) = *(_OWORD *)(v16 + 80);
*(_OWORD *)(v14 + 152) = *(_OWORD *)(v16 + 96);
*(_OWORD *)(v14 + 168) = *(_OWORD *)(v16 + 112);
*((_QWORD *)v14 + 23) = *(_QWORD *)(v16 + 128);
v17 = *((_QWORD *)arg1 + 8);
if( v17 )
{
*((_OWORD *)v14 + 12) = *(_OWORD *)v17;
*((_OWORD *)v14 + 13) = *(_OWORD *)(v17 + 16);
*((_OWORD *)v14 + 14) = *(_OWORD *)(v17 + 32);
*((_OWORD *)v14 + 15) = *(_OWORD *)(v17 + 48);
*((_OWORD *)v14 + 16) = *(_OWORD *)(v17 + 64);
*((_OWORD *)v14 + 17) = *(_OWORD *)(v17 + 80);
*((_OWORD *)v14 + 18) = *(_OWORD *)(v17 + 96);
*((_OWORD *)v14 + 19) = *(_OWORD *)(v17 + 112);
*((_OWORD *)v14 + 20) = *(_OWORD *)(v17 + 128);
*((_OWORD *)v14 + 21) = *(_OWORD *)(v17 + 144);
*((_QWORD *)v14 + 44) = *(_QWORD *)(v17 + 160);
}
*((_DWORD *)v14 + 6) = *((_DWORD *)arg1 + 4);
*((_DWORD *)v14 + 114) = *((_DWORD *)arg1 + 5);
*((_DWORD *)v14 + 11) = *((_DWORD *)arg1 + 10);
*((_DWORD *)v14 + 13) = *((_DWORD *)arg1 + 12);
*((_DWORD *)v14 + 12) = *((_DWORD *)arg1 + 11);
*((_DWORD *)v14 + 115) = *((_DWORD *)arg1 + 18);
*((_DWORD *)v14 + 116) = *((_DWORD *)arg1 + 19);
*((_DWORD *)v14 + 117) = *((_DWORD *)arg1 + 20);
*((_DWORD *)v14 + 118) = *((_DWORD *)arg1 + 21);
*((_DWORD *)v14 + 124) = *((_DWORD *)arg1 + 22);
*((_DWORD *)v14 + 106) = *((_DWORD *)arg1 + 23);
*((_DWORD *)v14 + 125) = *((_DWORD *)arg1 + 24);
*((_QWORD *)v14 + 47) = v14 + 368;
*((_QWORD *)v14 + 46) = v14 + 368;
*((_DWORD *)v14 + 101) = *((_DWORD *)v14 + 125);
*((_QWORD *)v14 + 51) = *((_QWORD *)v14 + 32);
*((_QWORD *)v14 + 52) = *((_QWORD *)v14 + 31);
*((_QWORD *)v14 + 49) = 0i64;
*((_QWORD *)v14 + 48) = 0i64;
*((_DWORD *)v14 + 100) = 0;
v18 = *((_DWORD *)arg1 + 4);
if( v18 )
{
v19 = (const VOID *)*((_QWORD *)arg1 + 1);
if( v19 )
memmove(*((VOID **)v14 + 2), v19, v18);
}
v20 = *((_DWORD *)arg1 + 25);
*((_WORD *)v14 + 256) = 0;
*((_WORD *)v14 + 257) = Length + 2;
*((_DWORD *)v14 + 126) = v20;
RtlCopyUnicodeString((PUNICODE_STRING)v14 + 32, &DestinationString);
v21 = (PSTR *)qword_140C49B58;
if( (INT64 *)*qword_140C49B58 != &qword_140C49B50 )
__fastfail(3u);
++dword_140C49B24;
*(_QWORD *)v14 = &qword_140C49B50;
*((_QWORD *)v14 + 1) = v21;
*v21 = v14;
qword_140C49B58 = v14;
if( v3 )
*v3 = *((_QWORD *)v14 + 2);
return v6;
}Referenced by:
HalpIommuProcessIvhdEntry
HalpIvtProcessDrhdEntry