IvtIommuSendCommand
__int64 __fastcall IvtIommuSendCommand(_QWORD *a1, _QWORD *a2, int a3){
unsigned __int8 CurrentIrql;
__int64 v6;
unsigned __int64 v7;
__int64 v8;
__int64 v9;
unsigned int v10;
unsigned int v11;
__int64 v12;
__int64 v13;
__int64 v14;
__int64 result;
int v16[8];
_KLOCK_QUEUE_HANDLE LockQueue[3];
__int64 v18;
memset(LockQueue, 0, 24);
if( a3 == 1 )
{
CurrentIrql = 0;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
LockQueue[0].LockQueue.Next = 0i64;
LockQueue[0].LockQueue.Lock = a1 + 21;
KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, a1 + 21);
}
v6 = a1[1];
v7 = *(_QWORD *)(v6 + 136);
v8 = a1[9];
v18 = v8;
v9 = ((unsigned int)(v7 >> 4) & 0x7FFF) + 1;
v10 = 0;
v11 = 0;
v12 = a1[11] >> 4;
if( (_DWORD)v9 != (_DWORD)v12 )
v11 = ((v7 >> 4) & 0x7FFF) + 1;
v13 = v11;
if( v11 == ((*(_QWORD *)(v6 + 128) >> 4) & 0x7FFFi64) )
{
do
{
if( (++v10 & dword_140C4A13C) != 0 || !qword_140C4A140 )
_mm_pause();
else
qword_140C4A140(v10, v9, v12);
}
while( v13 == ((*(_QWORD *)(v6 + 128) >> 4) & 0x7FFFi64) );
v8 = v18;
}
v14 = 2 * ((v7 >> 4) & 0x7FFF);
*(_QWORD *)(v8 + 8 * v14) = *a2;
result = a2[1];
*(_QWORD *)(v8 + 8 * v14 + 8) = result;
*(_QWORD *)(v6 + 136) = ((unsigned int)v7 ^ (16 * (_DWORD)v13)) & 0x7FFF0 ^ v7;
_InterlockedOr(v16, 0);
if( !a3 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
result = CurrentIrql;
__writecr8(CurrentIrql);
}
return result;
}Referenced by:
IvtInvalidateAllContextEntries
IvtInvalidateContextEntry
IvtInvalidateExtendedContextEntry
IvtInvalidateRemappingTableEntries
IvtIommuWaitCommand