IvtIommuWaitCommand
INT64 __fastcall IvtIommuWaitCommand(INT64 a1, INT64 rdx0, UINT8 *a3){
void *v3;
int v4;
unsigned __int8 CurrentIrql;
__int64 v7;
__int64 v8;
unsigned int v9;
INT64 result;
_QWORD a2[2];
_BYTE LockHandle[56];
v4 = (int)a3;
memset(LockHandle, 0, 24);
if( (_DWORD)a3 )
{
CurrentIrql = 0;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
*(_QWORD *)LockHandle = 0i64;
*(_QWORD *)&LockHandle[8] = a1 + 168;
KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)(a1 + 168), CriticalWorkQueue, v3);
}
a2[0] = *(_QWORD *)(a1 + 152);
a2[1] = *(_QWORD *)(a1 + 160);
*(_DWORD *)(a1 + 136) = 1;
IvtIommuSendCommand((_QWORD *)a1, a2, 1i64);
v9 = 0;
while( 1 )
{
result = *(unsigned int *)(a1 + 136);
if( !(_DWORD)result )
break;
if( (++v9 & dword_140C4A13C) != 0 || !qword_140C4A140 )
_mm_pause();
else
qword_140C4A140(v9, v7, v8);
}
if( !v4 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
result = CurrentIrql;
__writecr8(CurrentIrql);
}
return result;
}Referenced by:
IvtFlushTbInternal
IvtInvalidateAllContextEntries
IvtInvalidateContextEntry
IvtInvalidateExtendedContextEntry
IvtInvalidateRemappingTableEntries