ExtEnvRegisterIommu
NTSTATUS __stdcall ExtEnvRegisterIommu(PVOID arg1, PVOID arg2){
_QWORD *v2;
_QWORD *v3;
int v5;
NTSTATUS v6;
_QWORD *v7;
_QWORD *v8;
char v9;
WCHAR v10;
unsigned int v11;
unsigned __int16 Length;
PSTR MemoryInternal;
__int64 v14;
UNICODE_STRING *v15;
unsigned __int64 v16;
__int64 v17;
__int64 v18;
unsigned int v19;
UINT8 *v20;
int v21;
__int64 *v22;
UINT64 Revision;
UINT64 Instance;
UINT64 Uid;
UINT64 SizeInWords;
struct _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(SizeInWords) = 75;
LODWORD(Uid) = *((_DWORD *)arg1 + 25);
LOWORD(Instance) = 0;
LOWORD(Revision) = 1;
HalpExtBuildResourceIdString(
0x5446534Dui64,
0i64,
0x4300ui64,
*((unsigned __int16 *)arg1 + 36),
Revision,
Instance,
Uid,
SizeInWords,
SourceString);
RtlInitUnicodeString(&DestinationString, SourceString, v10);
v11 = 536;
if( !v9 )
v11 = (*((_DWORD *)arg1 + 4) + 543) & 0xFFFFFFF8;
Length = DestinationString.Length;
MemoryInternal = HalpMmAllocateMemoryInternal((v11 + DestinationString.Length + 9) & 0xFFFFFFF8, MmCached);
v14 = (__int64)MemoryInternal;
if( !MemoryInternal )
return -1073741670;
memset((INT64)MemoryInternal, 0i64);
v16 = (v14 + 543) & 0xFFFFFFFFFFFFFFF8ui64;
if( v9 )
{
*(_QWORD *)(v14 + 16) = *((_QWORD *)arg1 + 1);
}
else
{
*(_QWORD *)(v14 + 16) = v16;
v16 = (*((unsigned int *)arg1 + 4) + 7i64 + v16) & 0xFFFFFFFFFFFFFFF8ui64;
}
*(_QWORD *)(v14 + 520) = v16;
*(_BYTE *)(v14 + 40) = 12;
v17 = *((_QWORD *)arg1 + 7);
*(_OWORD *)(v14 + 56) = *(_OWORD *)v17;
*(_OWORD *)(v14 + 72) = *(_OWORD *)(v17 + 16);
*(_OWORD *)(v14 + 88) = *(_OWORD *)(v17 + 32);
*(_OWORD *)(v14 + 104) = *(_OWORD *)(v17 + 48);
*(_OWORD *)(v14 + 120) = *(_OWORD *)(v17 + 64);
*(_OWORD *)(v14 + 136) = *(_OWORD *)(v17 + 80);
*(_OWORD *)(v14 + 152) = *(_OWORD *)(v17 + 96);
*(_OWORD *)(v14 + 168) = *(_OWORD *)(v17 + 112);
*(_QWORD *)(v14 + 184) = *(_QWORD *)(v17 + 128);
v18 = *((_QWORD *)arg1 + 8);
if( v18 )
{
*(_OWORD *)(v14 + 192) = *(_OWORD *)v18;
*(_OWORD *)(v14 + 208) = *(_OWORD *)(v18 + 16);
*(_OWORD *)(v14 + 224) = *(_OWORD *)(v18 + 32);
*(_OWORD *)(v14 + 240) = *(_OWORD *)(v18 + 48);
*(_OWORD *)(v14 + 256) = *(_OWORD *)(v18 + 64);
*(_OWORD *)(v14 + 272) = *(_OWORD *)(v18 + 80);
*(_OWORD *)(v14 + 288) = *(_OWORD *)(v18 + 96);
*(_OWORD *)(v14 + 304) = *(_OWORD *)(v18 + 112);
*(_OWORD *)(v14 + 320) = *(_OWORD *)(v18 + 128);
*(_OWORD *)(v14 + 336) = *(_OWORD *)(v18 + 144);
*(_QWORD *)(v14 + 352) = *(_QWORD *)(v18 + 160);
}
*(_DWORD *)(v14 + 24) = *((_DWORD *)arg1 + 4);
*(_DWORD *)(v14 + 456) = *((_DWORD *)arg1 + 5);
*(_DWORD *)(v14 + 44) = *((_DWORD *)arg1 + 10);
*(_DWORD *)(v14 + 52) = *((_DWORD *)arg1 + 12);
*(_DWORD *)(v14 + 48) = *((_DWORD *)arg1 + 11);
*(_DWORD *)(v14 + 460) = *((_DWORD *)arg1 + 18);
*(_DWORD *)(v14 + 464) = *((_DWORD *)arg1 + 19);
*(_DWORD *)(v14 + 468) = *((_DWORD *)arg1 + 20);
*(_DWORD *)(v14 + 472) = *((_DWORD *)arg1 + 21);
*(_DWORD *)(v14 + 496) = *((_DWORD *)arg1 + 22);
*(_DWORD *)(v14 + 424) = *((_DWORD *)arg1 + 23);
*(_DWORD *)(v14 + 500) = *((_DWORD *)arg1 + 24);
*(_QWORD *)(v14 + 376) = v14 + 368;
*(_QWORD *)(v14 + 368) = v14 + 368;
*(_DWORD *)(v14 + 404) = *(_DWORD *)(v14 + 500);
*(_QWORD *)(v14 + 408) = *(_QWORD *)(v14 + 256);
*(_QWORD *)(v14 + 416) = *(_QWORD *)(v14 + 248);
*(_QWORD *)(v14 + 392) = 0i64;
*(_QWORD *)(v14 + 384) = 0i64;
*(_DWORD *)(v14 + 400) = 0;
v19 = *((_DWORD *)arg1 + 4);
if( v19 )
{
v20 = (UINT8 *)*((_QWORD *)arg1 + 1);
if( v20 )
memmove(*(UINT8 **)(v14 + 16), v20, v19);
}
v21 = *((_DWORD *)arg1 + 25);
*(_WORD *)(v14 + 512) = 0;
*(_WORD *)(v14 + 514) = Length + 2;
*(_DWORD *)(v14 + 504) = v21;
RtlCopyUnicodeString((UNICODE_STRING *)(v14 + 512), &DestinationString, v15);
v22 = (__int64 *)qword_140C49B58;
if( *(INT64 **)qword_140C49B58 != &HalpIommuList )
__fastfail(3u);
++HalpIommuCount;
*(_QWORD *)v14 = &HalpIommuList;
*(_QWORD *)(v14 + 8) = v22;
*v22 = v14;
qword_140C49B58 = v14;
if( v3 )
*v3 = *(_QWORD *)(v14 + 16);
return v6;
}Referenced by:
HalpIommuProcessIvhdEntry
HalpIvtProcessDrhdEntry