IvtIommuWaitCommand
NTSTATUS __stdcall IvtIommuWaitCommand(INT64 a1, INT64 a2, UINT8 *a3){
int v3;
unsigned __int8 CurrentIrql;
__int64 v6;
__int64 v7;
unsigned int v8;
NTSTATUS result;
__int64 v10[2];
_KLOCK_QUEUE_HANDLE LockQueue;
v3 = (int)a3;
memset(&LockQueue, 0, sizeof(LockQueue));
if( (_DWORD)a3 )
{
CurrentIrql = 0;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 168);
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 168));
}
v10[0] = *(_QWORD *)(a1 + 152);
v10[1] = *(_QWORD *)(a1 + 160);
*(_DWORD *)(a1 + 136) = 1;
IvtIommuSendCommand((_QWORD *)a1, v10, 1);
v8 = 0;
while( 1 )
{
result = *(_DWORD *)(a1 + 136);
if( !result )
break;
if( (++v8 & dword_140C4A13C) != 0 || !qword_140C4A140 )
_mm_pause();
else
qword_140C4A140(v8, v6, v7);
}
if( !v3 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
result = CurrentIrql;
__writecr8(CurrentIrql);
}
return result;
}Referenced by:
IvtInvalidateAllContextEntries
IvtInvalidateContextEntry
IvtInvalidateExtendedContextEntry
IvtInvalidateRemappingTableEntries