IommuDomainAttachDevice
NTSTATUS __stdcall IommuDomainAttachDevice(_LONGLONG a1, _DEVICE_OBJECT *a2, INT64 a3, INT64 a4){
__int64 v5;
int v6;
int v7;
int DeviceId;
_HALP_ALLOC_CONTEXT *v9;
UINT8 *v10;
UINT8 *v11;
unsigned __int8 CurrentIrql;
UINT8 **v14;
v5 = *(_QWORD *)&a1;
v6 = a4;
v7 = a3;
DeviceId = HalpIommuGetDeviceId(a2);
if( DeviceId < 0 )
return DeviceId;
if( !v7 && v6 == 1 )
{
DeviceId = HalpIommuCreateDevice(0i64);
if( DeviceId >= 0 )
{
DeviceId = HalpIommuJoinDmaDomain(0i64, v5);
if( DeviceId >= 0 )
{
v10 = HalpMmAllocCtxAlloc(v9, 0x38ui64);
v11 = v10;
if( v10 )
{
*(_QWORD *)v10 = 0i64;
*((_QWORD *)v10 + 1) = 0i64;
*((_DWORD *)v10 + 6) = 0;
*((_QWORD *)v10 + 4) = 0i64;
*((_QWORD *)v10 + 2) = a2;
*((_DWORD *)v10 + 7) = 1;
*((_QWORD *)v10 + 5) = v5;
*((_QWORD *)v10 + 6) = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xCui64);
KxAcquireSpinLock((UINT64 *)&CmpDummyThreadEvent + 514);
v14 = (UINT8 **)*(&CmpDummyThreadEvent + 513);
if( (_UNKNOWN *)**(&CmpDummyThreadEvent + 513) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 4096) )
__fastfail(3u);
*(_QWORD *)v11 = (char *)&CmpDummyThreadEvent + 4096;
*((_QWORD *)v11 + 1) = v14;
*v14 = v11;
*(&CmpDummyThreadEvent + 513) = v11;
KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 514);
__writecr8(CurrentIrql);
}
else
{
return -1073741670;
}
}
}
return DeviceId;
}
return -1073741583;
}Referenced by:
No references.